CEL
language评估
CEL(Common Expression Language) 是一种表达式语言,它快速、可移植且安全,适用于在性能关键应用程序中执行。 CEL旨在嵌入在应用程序中,具有特定于应用程序的扩展,并且非常适合扩展您的应用程序可能已经使用的声明性配置。
在执行表达式语言时,如果盲目调用eval()会导致非常严重的安全问题,但是你可以安全地执行客户的CEL代码。
CEL是构建在Protobuf之上的,所以内置多种数据类型支持,包括Map/List等,也包括Protobuf Message。 这些类型都是基于Protobuf的,所以性能特别高,非常适合高性能场景。 如果CloudEvents场景,你就可以在ECL使用CloudEvents Protobuf格式进行各种操作。
在实际的开发中,CEL也有非常多的场景,如基于角色访问(RBAC)的权限判断,处理消息时的过滤等,这些都是高并发的场景, 可能还会介入客户的代码,所以CEL是一个非常好的选择。 这里列举一下场景:
- 权限验证:RBAC, ABAC,JWT Claims验证
- Filter: 尤其是消息和事件的场景,如CloudEvents, EventBridge等
- HTTP: 对HTTP请求进行过滤、验证和路由
- 数据处理:主要用于数据过滤和验证

表达式语言(Expression Language)在开发中使用也比较广泛,如Java程序员都非常熟悉的Spring Expression Language - SpEL, 各种模板引擎也都会包含表达式语言,如Velocity,JSP/JSF EL等等,可以说使用场景非常普遍。
除了目标引擎外,还有就是表达式计算场景,如mXparser,如果不是特别复杂的话,那么也可以使用CEL进行基本的数学计算。
CEL & Friends
- Spring Expression Language - SpEL:https://docs.spring.io/spring-framework/reference/core/expressions.html
- Apache Commons OGNL:https://commons.apache.org/dormant/commons-ognl/
- CloudEvents SQL Expression Language: https://github.com/cloudevents/spec/blob/main/cesql/spec.md
- QLExpress: https://github.com/alibaba/QLExpress
- mXparser: Math Expression Evaluator/Parser - https://mathparser.org/
References
- CEL(Common Expression Language): https://cel.dev/
- cel-java: https://github.com/google/cel-java
- cel-go: https://github.com/google/cel-go
- cel-js: https://github.com/thesayyn/cel-js
- cel-rust: https://github.com/clarkmcc/cel-rust