在开发过程中遇到的一些配置问题,记录下来以供参考
spring-gateway版本是2.2.9-release,使用的spring cloud dependence 是 Hoxton.SR12
在依赖eureka 服务发现并自动将发现服务器加入到router中的时候,需要指定对应的服务进行添加,根据文档描述可以使用spring.cloud.gateway.discovery.locator.include-expression
参数允许接收一个 spel表达式,用于判定当前的service instance是否允许进行自动路由,我所遇到的问题是不清楚可以依靠那些字段进行判断,根据报错信息,可以定位到,spel表达式执行的上下文是ServiceInstance
,具体的逻辑代码在org.springframework.cloud.gateway.discovery.DiscoveryClientRouteDefinitionLocator#getRouteDefinitions
代码如下
SpelExpressionParser parser = new SpelExpressionParser();Expression includeExpr = parser.parseExpression(this.properties.getIncludeExpression());Expression urlExpr = parser.parseExpression(this.properties.getUrlExpression());Predicate includePredicate;if (this.properties.getIncludeExpression() != null && !"true".equalsIgnoreCase(this.properties.getIncludeExpression())) {includePredicate = (instance) -> {Boolean include = (Boolean)includeExpr.getValue(this.evalCtxt, instance, Boolean.class);return include == null ? false : include;};} else {includePredicate = (instance) -> {return true;};}
urlExpr
的的默认值是 “lb://”+serverId,即spring.cloud.gateway.routes[0].uri的值 ,使用的不同服务发现具体得到的ServiceInstance会不一致,比如eureka的支持
这里提供了metadata,假设我们在配置文件中设置了对应值,那么这里就可以用
spring.cloud.gateway.discovery.locator.include-expression=metadata[xxx] == 1
这种形式进行引用,比如线上服务通过给metadata文件添加版本号表示当前服务实例非稳定版本,不让它对外提供服务。配合上springbus,springconfig 可以非常方面的进行调整