6.15.0(SEP 5, 2022)
发布日志
发布策略
提醒:版本号右边, ↑
表示>=该版本号, ↓
表示<=该版本号
表示维护中 | 表示不维护,但可用,强烈建议升级 | 表示不维护,不可用,已废弃
- 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)已废弃
版本变更
- 默认集成SkyWalking版本为8.11.0
- 默认集成OpenTelemetry版本为1.17.0
另:
7.0.0商业版版本变更
- 默认升级集成Spring Cloud版本为2020.0.6
8.0.0商业版版本变更
- 默认升级集成Spring Boot版本为2.6.11
功能迭代
新增全链路故障转移
故障转移,即在实施蓝绿灰度发布或者路由时候,消费端调用提供端,无法在提供端找到相应条件的服务实例,转移到指定的服务实例。支持版本、区域、环境、可用区、IP地址和端口五个维度的故障转移
五大维度的故障转移逻辑是可以并行叠加的,有两种实施方式:
- 通过在配置中心修改添加如下规则
<?xml version="1.0" encoding="UTF-8"?>
<rule>
<strategy-failover>
<!-- 版本偏好,非蓝绿灰度发布场景下,路由到指定版本的实例 -->
<version-prefer>{"discovery-guide-service-a":"1.0", "discovery-guide-service-b":"1.0"}</version-prefer>
<!-- 版本故障转移,无法找到相应版本的服务实例,路由到指定版本的实例 -->
<version-failover>{"discovery-guide-service-a":"1.1", "discovery-guide-service-b":"1.1"}</version-failover>
<!-- 区域调试转移,跨区调试路由到指定区域的实例 -->
<region-transfer>qa</region-transfer>
<!-- 区域故障转移,无法找到相应区域的服务实例,路由到指定区域的实例 -->
<region-failover>dev</region-failover>
<!-- 环境故障转移,无法找到相应环境的服务实例,路由到指定环境的实例 -->
<env-failover>common</env-failover>
<!-- 可用区故障转移,无法找到相应可用区的服务实例,路由到指定可用区的实例 -->
<zone-failover>zone1</zone-failover>
<!-- IP地址和端口故障转移,无法找到相应IP地址和端口的服务实例,路由到指定IP地址和端口的实例 -->
<address-failover>*1</address-failover>
</strategy-failover>
</rule>
- 通过如下Header传递
n-d-version-prefer={"discovery-guide-service-a":"1.0", "discovery-guide-service-b":"1.0"}
n-d-version-failover={"discovery-guide-service-a":"1.1", "discovery-guide-service-b":"1.1"}
n-d-region-transfer=qa
n-d-region-failover=dev
n-d-env-failover=common
n-d-zone-failover=zone1
n-d-address-failover=*1
变更全链路隔离路由和故障转移的配置
新的配置如下:
# 版本故障转移,即无法找到相应版本的服务实例,路由到老的稳定版本的实例。其作用是防止蓝绿灰度版本发布人为设置错误,或者对应的版本实例发生灾难性的全部下线,导致流量有损
# 在开启版本故障转移的开关前提下,故障转移有三种策略:
# 1. 如果“version-failover”值已配置,指定版本的故障转移,即找不到实例的时候,直接路由到该版本实例
# 2. 如果“version-failover”值未配置
# 2.1 开启“version.failover.stable.enabled”开关,版本列表排序策略的(取最老的稳定版本的实例)故障转移,即找不到实例的时候,直接路由到最老的稳定版本的实例
# 2.2 关闭“version.failover.stable.enabled”开关,负载均衡策略的故障转移,即找不到实例的时候,执行负载均衡策略
# 启动和关闭版本故障转移。缺失则默认为false
spring.application.strategy.version.failover.enabled=true
# 开启和关闭版本列表排序策略下取稳定版本的版本故障转移。缺失则默认为false
spring.application.strategy.version.failover.stable.enabled=true
# 版本偏好,即非蓝绿灰度发布场景下,路由到老的稳定版本的实例。其作用是防止多个网关上并行实施蓝绿灰度版本发布产生混乱,对处于非蓝绿灰度状态的服务,调用它的时候,只取它的老的稳定版本的实例;蓝绿灰度状态的服务,还是根据传递的Header版本号进行匹配
# 在开启版本偏好的开关前提下,偏好有两种策略:
# 1. 如果“version-prefer”值已配置,指定版本的偏好,即不管存在多少版本,直接路由到该版本实例
# 2. 如果“version-prefer”值未配置,版本列表排序策略的(取最老的稳定版本的实例)偏好,即不管存在多少版本,直接路由到最老的稳定版本的实例
# 启动和关闭版本偏好。缺失则默认为false
spring.application.strategy.version.prefer.enabled=true
# 区域调试转移,即当未对服务指定访问区域的时候,转移到事先指定的区域
# 使用场景示例:
# 开发环境(个人电脑环境)在测试环境(线上环境)进行联调
# 访问路径为A服务 -> B服务 -> C服务,A服务和B服务在开发环境上,C服务在测试环境上
# 调用时候,在B服务上进行如下两个配置,并在最前端传入的Header(n-d-region)指定为B的开发环境区域(用来保证A服务和B服务只在开发环境调用),而B服务会自动转移调用到测试环境上的C服务实例,但不会转移到其它个人电脑的C服务实例
# 该功能的意义,个人电脑环境可以接入到测试环境联调,当多套个人环境接入时候,可以保护不同的个人环境间不会彼此调用
# 通过“region-transfer”值进行区域转移值配置,如果缺失,则报错
# 启动和关闭区域调试转移。缺失则默认为false
spring.application.strategy.region.transfer.enabled=true
# 在开启区域故障转移的开关前提下,故障转移有两种策略:
# 1. 如果“region-failover”值已配置,指定区域的故障转移,即找不到实例的时候,直接路由到该区域实例
# 2. 如果“region-failover”值未配置,负载均衡策略的故障转移,即找不到实例的时候,执行负载均衡策略
# 启动和关闭区域故障转移。缺失则默认为false
spring.application.strategy.region.failover.enabled=true
# 启动和关闭环境故障转移。缺失则默认为false
# 如果“env-failover”值未配置,则默认为common
spring.application.strategy.environment.failover.enabled=true
# 启动和关闭可用区亲和性,即同一个可用区的服务才能调用,同一个可用区的条件是调用端实例和提供端实例的元数据Metadata的zone配置值必须相等。缺失则默认为false
spring.application.strategy.zone.affinity.enabled=true
# 在开启可用区故障转移的开关前提下,故障转移有两种策略:
# 1. 如果“zone-failover”值已配置,指定可用区的故障转移,即找不到实例的时候,直接路由到该可用区实例
# 2. 如果“zone-failover”值未配置,负载均衡策略的故障转移,即找不到实例的时候,执行负载均衡策略
# 启动和关闭可用区故障转移。缺失则默认为false
spring.application.strategy.zone.failover.enabled=true
# 在开启IP地址和端口故障转移的开关前提下,故障转移有两种策略:
# 1. 如果“address-failover”值已配置,指定IP地址或者端口的故障转移,即找不到实例的时候,直接路由到该IP地址或者端口实例
# 2. 如果“address-failover”值未配置,负载均衡策略的故障转移,即找不到实例的时候,执行负载均衡策略
# 启动和关闭IP地址和端口故障转移。缺失则默认为false
spring.application.strategy.address.failover.enabled=true
新增运维平台进行无损下线API接口
- 运维平台下线某个服务实例之前,调用
Nepxion Discovery Console
平台的BlacklistEndpoint如下API,把需要下线的服务实例根据IP地址和端口添加进黑名单,返回全局唯一的该服务实例的UUId,即可实现实时无损下线
String addBlacklist(String serviceId, String host, int port);
- 运维平台每添加一个黑名单后,把返回的服务实例的UUId存储下来(推荐用高可用方案来存储)
- 运维平台下线某个服务实例一段时间之后(大于负载均衡
3
个时钟周期,推荐5
分钟),调用Nepxion Discovery Console
平台的BlacklistEndpoint如下API,把过期的服务实例根据UUId从黑名单里删除掉
boolean deleteBlacklist(String serviceId, String serviceUUId);
需要注意,UUId全局唯一,同样的服务实例重启注册后,UUId会重新产生,不会重复,但追加过多的UUId,虽然不会影响功能,但UUId堆积过多,使规则文本变得臃肿,可能会影响配置订阅的响应效率
新增配置初始化失败往事件总线抛出事件
- 当服务启动取配置中心读取规则策略,如果存在非法输入的问题,会导致解析规则策略失败
- 当在配置中心修改规则策略,如果存在非法输入的问题,推动到服务时候,会导致解析规则策略失败
框架将统一往事件总线抛出RuleFailureEvent事件,以便解耦订阅
订阅方式如下:
@EventBus
public class MySubscriber {
@Subscribe
public void onRuleRuleFailure(RuleFailureEvent ruleFailureEvent) {
System.out.println("========== 规则更新失败, rule=" + ruleFailureEvent.getRule() + ", exception=" + ruleFailureEvent.getException());
}
}
在配置类里@bean方式进行订阅类类创建
@Bean
public MySubscriber mySubscriber() {
return new MySubscriber();
}
重构优化
- 重构DefaultDiscoveryEnabledAdapter
- 去掉discoveryClient.getInstances(String serviceId)作为寻找负载均衡服务列表的方式,改成ZoneAvoidanceRule.getPredicate().getEligibleServers(getLoadBalancer().getAllServers(), key)获取,可以提高不少性能
- 去掉StrategyVersionFilter,DefaultDiscoveryEnabledAdapter过滤机制拆分成StrategyEnabledFilter基准接口的实现类,例如,StrategyVersionEnabledFilter,StrategyRegionEnabledFilter等,使架构更加清晰,可读性更好
- InstanceEntity增加serviceUUId属性
- UserEntity增加序列化方式
缺陷修复
- 修复StrategyVersionFilter中区域、地址和全局唯一ID处理的遗漏项
相关发布
DiscoveryAgent发布
无
DiscoveryDesktop发布
无
相关下载
DiscoveryAgent下载
访问https://github.com/Nepxion/DiscoveryAgent/releases
获取最新版本
DiscoveryDesktop下载
访问https://github.com/Nepxion/DiscoveryUI/releases
获取最新版本