Skip to content

6.15.0(SEP 5, 2022)

Compare
Choose a tag to compare
@HaojunRen HaojunRen released this 05 Sep 04:21
· 405 commits to 6.x.x since this release

发布日志

发布策略

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

版本 状态 SC SB SCA
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.15.0 H.SR5 ↑
H
G
F
2.3.x
2.2.x
2.1.x
2.0.x
2.2.7.RELEASE ↑
6.12.3 ↓ 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.32.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

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

  • 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获取最新版本