Skip to content

6.20.0(JAN 10, 2023)

Compare
Choose a tag to compare
@HaojunRen HaojunRen released this 10 Jan 09:33
· 49 commits to 6.x.x since this release

贡献列表

  • 感谢@ruansheng8的贡献 : Discovery Automation基于Java 17 + Spring Boot 3 + GraalVM实现本地镜像化

版本列表

提醒:版本号右边, 表示>=该版本号, 表示<=该版本号

版本 状态 SC SB SCA
9.0.0 (商业版) 2022.x.x 3.0.x 2022.x.x.x
8.0.0 (商业版) 2021.x.x 2.7.x
2.6.x
2021.x.x.x
7.0.0 (商业版) 2020.x.x 2.5.x
2.4.1 ↑
2021.x
6.20.0 H.SR5 ↑
H
G
F
2.3.x
2.2.x
2.1.x
2.0.x
2.2.7.RELEASE ↑
6.12.10 ↓ H.SR5 ↑
H
G
F
2.3.x
2.2.x
2.1.x
2.0.x
2.2.6.RELEASE ↓
2.1.x
2.0.x
5.6.0 G 2.1.x 2.1.x
4.15.0 F 2.0.x 2.0.x
3.37.0 E 1.5.x 1.5.x
2.0.x D 1.x.x 1.5.x
1.0.x C 1.x.x 1.5.x

表示维护中 | 表示不维护,但可用,强烈建议升级 | 表示不维护,不可用,已废弃

  • 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),可选值为versiontime,缺省为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界面终端的日志
  • 支持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的时候,不输出该行告警

优化某些可被继承覆盖的类的成员变量的访问域

  • DefaultDiscoveryEnabledAdapterstrategyEnabledFilterList从private修改为protected
  • DefaultServiceStrategyMonitorserviceStrategyMonitorAdapterList从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获取最新版本