6.20.0(JAN 10, 2023)
贡献列表
- 感谢@ruansheng8的贡献 : Discovery Automation基于Java 17 + Spring Boot 3 + GraalVM实现本地镜像化
版本列表
提醒:版本号右边, ↑
表示>=该版本号, ↓
表示<=该版本号
表示维护中 | 表示不维护,但可用,强烈建议升级 | 表示不维护,不可用,已废弃
- 9.x.x版本(适用于2022.x.x)将继续维护
- 8.x.x版本(适用于2021.x.x)将继续维护
- 7.x.x版本(适用于2020.x.x)将继续维护
- 6.x.x版本(同时适用于Finchley、Greenwich和Hoxton)将继续维护
- 5.x.x版本(适用于Greenwich)已废弃
- 4.x.x版本(适用于Finchley)已废弃
- 3.x.x版本(适用于Edgware)不维护,但可用,强烈建议升级
- 2.x.x版本(适用于Dalston)已废弃
- 1.x.x版本(适用于Camden)已废弃
版本变更
① 6.x.x
- 默认集成SkyWalking版本为8.13.0
- 默认集成OpenTelemetry版本为1.22.0
② 7.x.x
- 默认集成SkyWalking版本为8.13.0
- 默认集成OpenTelemetry版本为1.22.0
③ 8.x.x
- 默认集成Spring Boot版本为2.6.13
- 默认集成Spring Cloud版本为2021.0.5
- 默认集成SkyWalking版本为8.13.0
- 默认集成OpenTelemetry版本为1.22.0
④ 9.x.x
- 默认集成Spring Boot版本为3.0.1
- 默认集成Spring Cloud版本为2022.0.0
- 默认集成Spring Cloud Alibaba版本为2022.0.0.0-RC1
功能迭代
修复高危漏洞
① CVE-2022-1471 : Remote Code Execution via SnakeYAML Deserialization Gadgets
解决方案 : 通过com.nepxion.discovery.common.yaml.YamlSafeConstructor构造SnakeYAML对象
② CVE-2022-23463 : Remote Code Execution Vulnerability via SpEL Injection
解决方案 : 使用Spring StandardEvaluationContext类,StandardEvaluationContext支持全部的Spel语法且功能齐全,但GitHub Security报告其存在一定的注入风险,推荐使用SimpleEvaluationContext,而SimpleEvaluationContext并不能满足当前框架的需求。如果未使用验证SPEL表达式方法,可以通过下面开关关闭在方法在策略端点上的暴露,规避风险
- 管理中心配置
spring.application.admin.strategy.endpoint.validate-expression.enabled=true
- 控制台配置
spring.application.console.strategy.endpoint.validate-expression.enabled=true
增加Console端支持静态版本的链路智能编排
静态版本,指服务实例的版本号采用非时间戳或者非数字递增的方式(例如,旧版本的版本号为basic
,新版本的版本号为gray
),导致链路智能编排的时候,无法确认旧的稳定版本。
在Nepxion Discovery 6.20.0版本中,使用者只需要在规则策略上加入版本号排序类型sort: time
,即可支持不可排序版本的链路智能编排
service:
- discovery-guide-service-a
- discovery-guide-service-b
blueGreen:
- expression: "#H['xyz'] == '1'"
route: green
- expression: "#H['xyz'] == '2'"
route: blue
gray:
- expression: "#H['xyz'] == '3'"
weight:
- 90
- 10
- expression: "#H['xyz'] == '4'"
weight:
- 70
- 30
- weight:
- 100
- 0
sort: time
版本号排序类型(sort
),可选值为version
和time
,缺省为version
(不需要配置sort: version
)
- 当排序类型为
version
时,适用于版本号采用时间戳或者数字递增的方式。处理逻辑为将排序后版本号列表的第一个值作为旧的稳定版本 - 当排序类型为
time
时,不限于版本号的格式。处理逻辑为将根据服务实例全局唯一ID的时间戳前缀进行排序,把上线时间最早的服务实例的版本号作为旧的稳定版本
重构全链路自动化模拟流程测试和流量侦测测试
- 全面整合和重构两个自动化测试模块,整合成一个系统工程,见
https://github.com/Nepxion/DiscoveryTool/tree/automation
- 支持本地测试(Application的脚本启动方式)和云上测试(Console的Web服务方式)
云上测试包含如下主要功能
- 并行控制测试用例,通过线程安全的锁组件(本地锁或者分布式锁)并行控制测试用例,根据Key(group@@serviceid)进行判断,不允许有多个Key相同的测试用例同时运行
- 单服务器模式下,通过基于StampedLock的Caffeine实现本地锁,并提供锁过期释放机制
- 集群服务器模式下,通过基于Redis的Redisson实现分布式锁,并提供锁过期释放机制
- 测试用例执行过程中,每一步成功和失败,都提供日志输出,使用者可以实现基于Web界面的测试操作
- 测试控制台提供两种方式的Rest接口,返回为全局唯一的
testcase-id
- 测试控制台需要通过Logback输入带有
testcase-id
的日志 - 整合日志服务器,采集和输出测试日志到指定的分布式存储上
- 通过
testcase-id
获取和显示属于指定Web界面终端的日志
- 测试控制台提供两种方式的Rest接口,返回为全局唯一的
- 支持Properties和Yaml格式的两种调用接口
全链路自动化模拟流程测试
- 工程结构化
- 支持大于2个以上版本的服务
- 支持静态版本,模式
- 支持参数变更
- 支持细粒度断言
适用于测试环境或者开发环境
具体用法,请参考
- Github Wiki :全链路自动化模拟流程测试
https://github.com/Nepxion/Discovery/wiki/全链路自动化模拟流程测试
- Gitee Wiki :全链路自动化模拟流程测试
https://gitee.com/nepxion/Discovery/wikis/pages?sort_id=6481457&doc_id=1124387
全链路自动化流量侦测测试
- 工程结构化
- 支持细粒度断言
适用于生产环境
具体用法,请参考
- Github Wiki :全链路自动化流量侦测测试
https://github.com/Nepxion/Discovery/wiki/全链路自动化流量侦测测试
- Gitee Wiki :全链路自动化流量侦测测试
https://gitee.com/nepxion/Discovery/wikis/pages?sort_id=6481458&doc_id=1124387
增加服务端版本故障转移或者版本偏好的版本号排序类型
当使用者采用上线时间作为版本排序依据的时候,需要把版本号排序类型设置为time
。该方案同时适用于业务服务,Spring Cloud Gateway和Zuul网关
# 版本号排序类型。缺失则默认为version
# 版本故障转移或者版本偏好启动时,需要寻址旧的稳定版本
# 1. 当排序类型为version时,适用于版本号采用时间戳或者数字递增的方式。处理逻辑为将排序后版本号列表的第一个值作为旧的稳定版本
# 2. 当排序类型为time时,不限于版本号的格式。处理逻辑为将根据服务实例全局唯一ID的时间戳前缀进行排序,把上线时间最早的服务实例的版本号作为旧的稳定版本
# spring.application.strategy.version.sort.type=version
spring.application.strategy.version.sort.type=time
增加支持多种元数据设置方式
以Nacos注册中心的版本号元数据为例,装载元数据的优先级顺序由高到底为
- VM arguments方式的启动参数-Dmetadata.version
- 环境装载EnvironmentPostProcessor
- Git编译插件git-commit-id-plugin
- Program arguments方式的启动参数--spring.cloud.nacos.discovery.metadata.version(Spring Cloud Alibaba原生方式)
- 配置文件spring.cloud.nacos.discovery.metadata.version(Spring Cloud Alibaba原生方式)
- Program arguments方式的启动参数--spring.cloud.discovery.metadata.version(Nepxion Discovery统一方式)
- 配置文件spring.cloud.discovery.metadata.version(Nepxion Discovery统一方式)
增加基于环境装载设置的元数据注入方式
public class MyEnvironmentPostProcessor implements EnvironmentPostProcessor, Ordered {
@Override
public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
if (EnvironmentUtil.isStandardEnvironment(environment)) {
PluginMetaDataPreInstallation.getMetadata().put("abc", "123");
}
}
@Override
public int getOrder() {
return Ordered.HIGHEST_PRECEDENCE;
}
}
在src/main/resources/META-INF/spring.factories加上
org.springframework.boot.env.EnvironmentPostProcessor=\
com.xxx.yyy.zzz.MyEnvironmentPostProcessor
增加服务端点和控制台端点风险控制
服务端点增加新的开关配置
# 启动和关闭服务相关操作端点。缺失则默认为true
spring.application.admin.service.endpoint.enabled=true
# 启动和关闭配置相关操作端点。缺失则默认为true
spring.application.admin.config.endpoint.enabled=true
# 启动和关闭版本相关操作端点。缺失则默认为true
spring.application.admin.version.endpoint.enabled=true
# 启动和关闭侦测相关操作端点。缺失则默认为true
spring.application.admin.inspector.endpoint.enabled=true
# 启动和关闭路由相关操作端点。缺失则默认为true
spring.application.admin.router.endpoint.enabled=true
# 启动和关闭策略相关操作端点。缺失则默认为true
spring.application.admin.strategy.endpoint.enabled=true
# 启动和关闭Sentinel相关操作端点。缺失则默认为true
spring.application.admin.sentinel.endpoint.enabled=true
# 启动和关闭Git相关操作端点。缺失则默认为true
spring.application.admin.git.endpoint.enabled=true
# 启动和关闭Spring Cloud Gateway相关操作端点。缺失则默认为true
spring.application.admin.gateway.endpoint.enabled=true
# 启动和关闭Zuul相关操作端点。缺失则默认为true
spring.application.admin.zuul.endpoint.enabled=true
# 启动和关闭策略操作端点的验证SPEL表达式方法。缺失则默认为true
# 该端点方法使用Spring StandardEvaluationContext类,StandardEvaluationContext支持全部的Spel语法且功能齐全,但GitHub Security报告其存在一定的注入风险,推荐使用SimpleEvaluationContext,而SimpleEvaluationContext并不能满足当前框架的需求
# 如果未使用验证SPEL表达式方法,可以通过下面开关关闭在方法在策略端点上的暴露,规避风险
spring.application.admin.strategy.endpoint.validate-expression.enabled=true
控制台端点增加新的开关配置
# 启动和关闭服务相关操作端点。缺失则默认为true
spring.application.console.service.endpoint.enabled=true
# 启动和关闭配置相关操作端点。缺失则默认为true
spring.application.console.config.endpoint.enabled=true
# 启动和关闭版本相关操作端点。缺失则默认为true
spring.application.console.version.endpoint.enabled=true
# 启动和关闭侦测相关操作端点。缺失则默认为true
spring.application.console.inspector.endpoint.enabled=true
# 启动和关闭网关路由相关操作端点。缺失则默认为true
spring.application.console.route.endpoint.enabled=true
# 启动和关闭策略相关操作端点。缺失则默认为true
spring.application.console.strategy.endpoint.enabled=true
# 启动和关闭Sentinel相关操作端点。缺失则默认为true
spring.application.console.sentinel.endpoint.enabled=true
# 启动和关闭无损下线黑名单相关操作端点。缺失则默认为true
spring.application.console.blacklist.endpoint.enabled=true
# 启动和关闭故障转移相关操作端点。缺失则默认为true
spring.application.console.failover.endpoint.enabled=true
# 启动和关闭认证相关操作端点。缺失则默认为true
spring.application.console.authentication.endpoint.enabled=true
# 启动和关闭策略操作端点的验证SPEL表达式方法。缺失则默认为true
# 该端点方法使用Spring StandardEvaluationContext类,StandardEvaluationContext支持全部的Spel语法且功能齐全,但GitHub Security报告其存在一定的注入风险,推荐使用SimpleEvaluationContext,而SimpleEvaluationContext并不能满足当前框架的需求
# 如果未使用验证SPEL表达式方法,可以通过下面开关关闭在方法在策略端点上的暴露,规避风险
spring.application.console.strategy.endpoint.validate-expression.enabled=true
增加注入Header
自定义注入Header,实现StrategyHeadersInjector,允许同时注入多个,每个类里允许多个Header
public class MyStrategyHeadersInjector implements StrategyHeadersInjector {
@Override
public List<HeadersInjectorEntity> getHeadersInjectorEntityList() {
return Arrays.asList(
new HeadersInjectorEntity(HeadersInjectorType.TRANSMISSION, Arrays.asList("test1")),
new HeadersInjectorEntity(HeadersInjectorType.TRACER, Arrays.asList("test2")),
new HeadersInjectorEntity(HeadersInjectorType.ALL, Arrays.asList("test3")));
}
}
参数含义
- HeadersInjectorType.TRANSMISSION表示作用于传递,上面的代码表示对名称为“test1”的Header将自动传递到下游服务
- HeadersInjectorType.TRACER表示作用于调用链,上面的代码表示对名称为“test2”的Header将自动输出埋点到调用链和告警
- HeadersInjectorType.ALL表示同时作用于上述量项,不需要一一设定
增加注入扫描目录
自定义注入扫描目录,实现StrategyPackagesInjector,允许同时注入多个,每个类里允许多个扫描目录
public class MyStrategyPackagesInjector implements StrategyPackagesInjector {
@Override
public List<PackagesInjectorEntity> getPackagesInjectorEntityList() {
return Arrays.asList(
new PackagesInjectorEntity(PackagesInjectorType.RPC, Arrays.asList("com.nepxion.discovery.guide.test.test1")),
new PackagesInjectorEntity(PackagesInjectorType.PROVIDER_ISOLATION, Arrays.asList("com.nepxion.discovery.guide.test.test2")),
new PackagesInjectorEntity(PackagesInjectorType.TRACER, Arrays.asList("com.nepxion.discovery.guide.test.test3")),
new PackagesInjectorEntity(PackagesInjectorType.ALL, Arrays.asList("com.nepxion.discovery.guide.test.test4"))
);
}
}
参数含义
- PackagesInjectorType.RPC表示作用于RPC方式的调用拦截,上面的代码表示对名称为“com.nepxion.discovery.guide.test.test1”的目录下带有@RestController或者@ServiceStrategy注解的类方法将自动执行RPC方式的调用拦截,调用上下文输出到ThreadLocal
- PackagesInjectorType.PROVIDER_ISOLATION作用于提供端的服务隔离,上面的代码表示对名称为“com.nepxion.discovery.guide.test.test2”的目录下带有@RestController或者@ServiceStrategy注解的类方法将自动执行提供端的服务隔离
- PackagesInjectorType.TRACER表示作用于调用链,上面的代码表示对名称为“com.nepxion.discovery.guide.test.test3”的目录下带有@RestController或者@ServiceStrategy注解的类方法将自动输出埋点到调用链和告警
- PackagesInjectorType.ALL表示同时作用于上述三项,不需要一一设定
增加细粒度监控埋点
自定义方法输出到调用链,通过在带有@RestController或者@ServiceStrategy注解的类的方法头部上增加如下注解,即忽略该方法埋点输出、日志输出、告警输出
@ServiceMonitorIgnore
增加日志调试模式下Header输出
支持配置式Header和注入式Header的输出
增加告警的上下文输出
- 增加告警来源的类名和方法名
- 增加注入式Header
增加Lock抽象
- 支持自动化模拟测试的本地锁和分布式锁
重构优化
优化Spel实现逻辑
- 增强DiscoveryExpressionResolver实现
- 修复拼写错误
优化Zuul Header传递
忽略Header传值的时候,有值才忽略,无值不做处理
优化策略拦截器
优化策略拦截器的构造方式,并抽象出获取自定义Header的StrategyHeaderContext
优化日志输出
优化调试模式下,Header以及相关上下文输出,由System.out.println改成LOG.info
优化扫描目录逻辑
- 当扫描目录以“;”结尾,则抛出异常
优化上下文输出
- 当埋点的Key存在,而Value为null的时候,不输出该行埋点
- 当日志的Key存在,而Value为null的时候,不输出该行日志
- 当告警的Key存在,而Value为null的时候,不输出该行告警
优化某些可被继承覆盖的类的成员变量的访问域
DefaultDiscoveryEnabledAdapter
的strategyEnabledFilterList
从private修改为protectedDefaultServiceStrategyMonitor
的serviceStrategyMonitorAdapterList
从private修改为protected@PostConstruct
注解的方法从private修改为protected
优化插件版本号的元数据
- 当插件未引入,则不添加插件版本号到元数据中
优化去除不必要的依赖
discovery-plugin-test-starter-automation
去除不必要的依赖spring-boot-starter-web
优化Discovery相关工程的日志
- 优化logback.xml配置
- 支持彩色日志输出到控制台
- 彩色日志配色方案,参考:
https://logback.qos.ch/manual/layouts.html#coloring
- Windows终端默认不能显示ANSI颜色,需要在注册表HKEY_CURRENT_USER\Console中新建一个DWORD类型的值VirtualTerminalLevel,数值为1
- 彩色日志配色方案,参考:
优化DiscoveryAgent在SDK侧的安装校验
# 启动和关闭DiscoveryAgent安装校验,一旦启动,如果未安装DiscoveryAgent,则抛错退出应用,该配置只适用于Spring Cloud 202x版。缺失则默认为true
spring.application.strategy.agent.validation.enabled=true
缺陷修复
修复开关丢失的缺陷
修复在AbstractServiceStrategyRouteFilter中webClientCoreHeaderTransmissionEnabled开关丢失的缺陷
修复系统参数设置的缺陷
修复非bootstrap场景下,系统参数设置的缺陷
修复旗标文件的缺陷
修复Spring Cloud LoadBalancer的旗标文件目录过长,会导致无法读取的缺陷
相关发布
DiscoveryConsole发布
发布1.0.0版本
DiscoveryAutomationConsole发布
发布1.0.0版本
DiscoverySimulator发布
发布1.0.0版本
DiscoveryInspector发布
发布1.0.0版本
DiscoveryAgent发布
无
DiscoveryDesktop发布
无
相关下载
DiscoveryConsole下载
访问https://github.com/Nepxion/DiscoveryTool/releases
获取最新版本
DiscoveryAutomationConsole下载
访问https://github.com/Nepxion/DiscoveryTool/releases
获取最新版本
DiscoverySimulator下载
访问https://github.com/Nepxion/DiscoveryTool/releases
获取最新版本
DiscoveryInspector下载
访问https://github.com/Nepxion/DiscoveryTool/releases
获取最新版本
DiscoveryAgent下载
访问https://github.com/Nepxion/DiscoveryAgent/releases
获取最新版本
DiscoveryDesktop下载
访问https://github.com/Nepxion/DiscoveryDesktop/releases
获取最新版本