Releases: Nepxion/Discovery
6.3.2(OCT 12, 2020)
发布日志
发布策略
提醒:版本号右边, ↑
表示>=该版本号, ↓
表示<=该版本号
提醒:Spring Boot版本和Spring Cloud Alibaba版本需要在版本号后面加上.RELEASE
版本 | 状态 | SC版本 | SB版本 | SCA版本 |
---|---|---|---|---|
6.3.2 | H.SR5 ↑ H G F |
2.3.x 2.2.x 2.1.x 2.0.x |
2.2.x 2.2.x 2.1.x 2.0.x |
|
G | 2.1.x | 2.1.x | ||
F | 2.0.x | 2.0.x | ||
3.20.2 | E | 1.5.x | 1.5.x | |
D | 1.x.x | N/A | ||
C | 1.x.x | N/A |
表示维护中 | 表示不维护,但可用,强烈建议升级 | 表示不维护,不可用,已废弃
- 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)已废弃
版本变更
无中间件版本变更
功能迭代
增加新的灰度蓝绿环境隔离路由触发方式
① 基于Http Query Parameter灰度蓝绿环境隔离路由
通过取值Query Parameter方式,即可实现既定功能
http://localhost:5001/discovery-guide-service-a/invoke/gateway?a=1
http://localhost:5001/discovery-guide-service-a/invoke/gateway?a=2
② 基于Http Cookie灰度蓝绿环境隔离路由
通过取值Cookie方式,即可实现既定功能
③ 基于域名灰度蓝绿环境隔离路由
通过取值域名前缀等方式,即可实现既定功能
本地测试,为验证结果,请事先在hosts文件中配置如下
127.0.0.1 common.nepxion.com
127.0.0.1 env1.nepxion.com
127.0.0.1 env2.nepxion.com
以根据域名全链路环境隔离为例,根据域名前缀中的环境名路由到相应的全链路环境中
- 根据env1.nepxion.com域名路由到env1环境
- 根据common.nepxion.com域名路由到common环境
④ 基于RPC Method灰度蓝绿
通过取值RPC调用中的方法入参方式,即可实现既定功能
只适用于服务侧
增加新的灰度蓝绿表达式参数
① 支持Http Header、Http Query Parameter、Http Cookie三种参数。例如,下面表达式,a、b、c的值可以来自Http Header、Http Query Parameter、Http Cookie中的任何一种。为兼容老的用法,统一以header节点来描述
② 支持Http Header、Http Query Parameter、Http Cookie混合策略表达式,例如,下面表达式,a的值可以来自于Http Header,b的值可以来自于Http Query Parameter,c的值可以来自于Http Cookie。如果同一个值同时存在于Http Header、Http Query Parameter、Http Cookie,优先级Http Header > Http Query Parameter > Http Cookie
<condition id="condition2" header="#H['a'] == '1' && #H['b'] == '2' && #H['c'] == '3'" version-id="version-route1"/>
增加新的过滤器中自定义方式
① 过滤器中自定义基于Http Query Parameter灰度蓝绿环境隔离路由
② 过滤器中自定义基于Http Cookie灰度蓝绿环境隔离路由
③ 过滤器中自定义环境隔离路由策略
参考如下代码
public class MyGatewayStrategyRouteFilter extends DefaultGatewayStrategyRouteFilter {
private static final Logger LOG = LoggerFactory.getLogger(MyGatewayStrategyRouteFilter.class);
private static final String DEFAULT_A_ROUTE_VERSION = "{\"discovery-guide-service-a\":\"1.0\", \"discovery-guide-service-b\":\"1.1\"}";
private static final String DEFAULT_B_ROUTE_VERSION = "{\"discovery-guide-service-a\":\"1.1\", \"discovery-guide-service-b\":\"1.0\"}";
private static final String DEFAULT_A_ROUTE_REGION = "{\"discovery-guide-service-a\":\"dev\", \"discovery-guide-service-b\":\"qa\"}";
private static final String DEFAULT_B_ROUTE_REGION = "{\"discovery-guide-service-a\":\"qa\", \"discovery-guide-service-b\":\"dev\"}";
private static final String DEFAULT_A_ROUTE_ADDRESS = "{\"discovery-guide-service-a\":\"3001\", \"discovery-guide-service-b\":\"4002\"}";
private static final String DEFAULT_B_ROUTE_ADDRESS = "{\"discovery-guide-service-a\":\"3002\", \"discovery-guide-service-b\":\"4001\"}";
@Value("${a.route.version:" + DEFAULT_A_ROUTE_VERSION + "}")
private String aRouteVersion;
@Value("${b.route.version:" + DEFAULT_B_ROUTE_VERSION + "}")
private String bRouteVersion;
@Value("${a.route.region:" + DEFAULT_A_ROUTE_REGION + "}")
private String aRouteRegion;
@Value("${b.route.region:" + DEFAULT_B_ROUTE_REGION + "}")
private String bRouteRegion;
@Value("${a.route.address:" + DEFAULT_A_ROUTE_ADDRESS + "}")
private String aRouteAddress;
@Value("${b.route.address:" + DEFAULT_B_ROUTE_ADDRESS + "}")
private String bRouteAddress;
// 自定义根据Header全链路版本匹配路由
@Override
public String getRouteVersion() {
String user = strategyContextHolder.getHeader("user");
LOG.info("自定义根据Header全链路版本匹配路由, Header user={}", user);
if (StringUtils.equals(user, "zhangsan")) {
LOG.info("执行全链路版本匹配路由={}", aRouteVersion);
return aRouteVersion;
} else if (StringUtils.equals(user, "lisi")) {
LOG.info("执行全链路版本匹配路由={}", bRouteVersion);
return bRouteVersion;
}
return super.getRouteVersion();
}
// 自定义根据Parameter全链路区域匹配路由
@Override
public String getRouteRegion() {
String user = strategyContextHolder.getParameter("user");
LOG.info("自定义根据Parameter全链路区域匹配路由, Parameter user={}", user);
if (StringUtils.equals(user, "zhangsan")) {
LOG.info("执行全链路区域匹配路由={}", aRouteRegion);
return aRouteRegion;
} else if (StringUtils.equals(user, "lisi")) {
LOG.info("执行全链路区域匹配路由={}", bRouteRegion);
return bRouteRegion;
}
return super.getRouteRegion();
}
// 自定义根据Cookie全链路IP地址和端口匹配路由
@Override
public String getRouteAddress() {
String user = strategyContextHolder.getCookie("user");
LOG.info("自定义根据Cookie全链路IP地址和端口匹配路由, Cookie user={}", user);
if (StringUtils.equals(user, "zhangsan")) {
LOG.info("执行全链路IP地址和端口匹配路由={}", aRouteAddress);
return aRouteAddress;
} else if (StringUtils.equals(user, "lisi")) {
LOG.info("执行全链路IP地址和端口匹配路由={}", bRouteAddress);
return bRouteAddress;
}
return super.getRouteEnvironment();
}
@Autowired
private GatewayStrategyContextHolder gatewayStrategyContextHolder;
// 自定义根据域名全链路环境隔离
@Override
public String getRouteEnvironment() {
String host = gatewayStrategyContextHolder.getURI().getHost();
if (host.contains("nepxion.com")) {
LOG.info("自定义根据域名全链路环境隔离, URL={}", host);
String environment = host.substring(0, host.indexOf("."));
LOG.info("执行全链路环境隔离={}", environment);
return environment;
}
return super.getRouteEnvironment();
}
}
服务侧功能增强
① 增加服务侧直接生效灰度蓝绿环境隔离路由策略,完全脱离网关而单独生效所有功能,即网关将不是全链路灰度蓝绿环境隔离路由的必要组件
② 支持基于内置Header的定时Job的服务调用灰度蓝绿
③ 修复服务侧未从内置Header获取条件Header的Bug
相关测试
自动化测试
① 增加自定义根据Http Header全链路版本匹配的测试用例
② 增加自定义根据Http Parameter全链路区域匹配的测试用例
③ 增加自定义根据Http Cookie全链路环境隔离的测试用例
④ 增加基于Http Header、Http Query Parameter、Http Cookie混合策略的测试用例
相关下载
DiscoveryAgent下载
访问https://github.com/Nepxion/DiscoveryAgent/releases
获取最新版本
DiscoveryDesktop下载
访问https://github.com/Nepxion/DiscoveryUI/releases
获取最新版本
3.20.2(OCT 12, 2020)
见 Nepxion Discovery 6.3.2 发布
6.3.1(OCT 6, 2020)
发布日志
- 本次发布版本,深入和
Spring Cloud Alibaba
、Nacos
团队进行探讨、合作、测试,并结合若干家公司的落地实践,进行优化和重构,以更强大的功能,解决使用者的真正痛点,以更开放的方式,供使用者灵活扩展 - 欢迎使用Nepxion Polaris集成式脚手架,极大降低Nepxion Discovery接入成本,请访问 Polaris【北极星】企业级云原生微服务框架 :
https://github.com/Nepxion/Polaris
发布策略
提醒:版本号右边, ↑
表示>=该版本号, ↓
表示<=该版本号
提醒:Spring Boot版本和Spring Cloud Alibaba版本需要在版本号后面加上.RELEASE
版本 | 状态 | SC版本 | SB版本 | SCA版本 |
---|---|---|---|---|
6.3.1 | H.SR5 ↑ H G F |
2.3.x 2.2.x 2.1.x 2.0.x |
2.2.x 2.2.x 2.1.x 2.0.x |
|
G | 2.1.x | 2.1.x | ||
F | 2.0.x | 2.0.x | ||
3.20.1 | E | 1.5.x | 1.5.x | |
D | 1.x.x | N/A | ||
C | 1.x.x | N/A |
表示维护中 | 表示不维护,但可用,强烈建议升级 | 表示不维护,不可用,已废弃
- 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)已废弃
重大变更
为未来更健康的持续性演进框架,使框架结构更趋合理,并在阅读性上更良好,本版本做了如下变更
① 框架结构变更
- 平行结构改造成树状结构
② 依赖引入变更
- Sentinel插件依赖引入变更
<dependency>
<groupId>com.nepxion</groupId>
<!-- 旧的 -->
<artifactId>discovery-plugin-strategy-sentinel-starter-opentracing</artifactId>
<!-- 新的 -->
<artifactId>discovery-plugin-strategy-starter-sentinel-opentracing</artifactId>
</dependency>
<dependency>
<groupId>com.nepxion</groupId>
<!-- 旧的 -->
<artifactId>discovery-plugin-strategy-sentinel-starter-skywalking</artifactId>
<!-- 新的 -->
<artifactId>discovery-plugin-strategy-starter-sentinel-skywalking</artifactId>
</dependency>
<dependency>
<groupId>com.nepxion</groupId>
<!-- 旧的 -->
<artifactId>discovery-plugin-strategy-sentinel-starter-nacos</artifactId>
<!-- <artifactId>discovery-plugin-strategy-sentinel-starter-apollo</artifactId> -->
<!-- <artifactId>discovery-plugin-strategy-sentinel-starter-local</artifactId> -->
<!-- 新的 -->
<artifactId>discovery-plugin-strategy-starter-sentinel-nacos</artifactId>
<!-- <artifactId>discovery-plugin-strategy-starter-sentinel-apollo</artifactId> -->
<!-- <artifactId>discovery-plugin-strategy-starter-sentinel-local</artifactId> -->
</dependency>
- 自动化测试插件依赖引入变更
<dependency>
<groupId>com.nepxion</groupId>
<!-- 旧的 -->
<artifactId>discovery-plugin-test-starter</artifactId>
<!-- 新的 -->
<artifactId>discovery-plugin-test-starter-automation</artifactId>
</dependency>
- 自动化测试包名变更
<!-- 旧的 -->
com.nepxion.discovery.plugin.test
<!-- 新的 -->
com.nepxion.discovery.plugin.test.automation
③ 第三方版本变更
- 升级Swagger到2.9.2
缺陷修复
修复异步调用链丢失的缺陷
- 修复@async异步调用埋点Span输出到Skywalking的缺陷
修复异步调用链日志的缺陷
- 修复日志频繁打印的缺陷
功能迭代
支持Nacos动态元数据
- 支持未来Nacos 1.4.0的动态元数据批量修改、删除、复原功能
支持异步Agent扩展
该扩展支持一切Java异步场景,不限于任何Java技术栈和框架
涵盖所有Java框架的异步场景,解决如下6个异步场景下丢失线程上下文的问题
-
@
Async -
Hytrix Thread Pool Isolation
-
Runnable
-
Callable
-
Single Thread
-
Thread Pool
-
根据规范开发一个插件,插件提供了钩子函数,在某个类被加载的时候,可以注册一个事件到线程上下文切换事件当中,实现业务自定义ThreadLocal的跨线程传递。参考:discovery-plugin-strategy-starter-agent-plugin模块的com.nepxion.discovery.plugin.strategy.starter.agent.plugin.service下的实现方式
-
plugin目录为放置需要在线程切换时进行ThreadLocal传递的自定义插件。业务自定义插件开发完后,放入到plugin目录下即可
具体步骤介绍,如下
- 新建一个模块,引入如下依赖
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>discovery-plugin-strategy-starter-agent</artifactId>
<scope>provided</scope>
</dependency>
- 新建一个ThreadLocalHook类继承AbstractThreadLocalHook,参考GatewayStrategyContextHook
public class GatewayStrategyContextHook extends AbstractThreadLocalHook {
@Override
public Object create() {
// 从主线程的ThreadLocal里获取并返回上下文对象
return GatewayStrategyContext.getCurrentContext().getExchange();
}
@Override
public void before(Object object) {
// 把create方法里获取到的上下文对象放置到子线程的ThreadLocal里
if (object instanceof ServerWebExchange) {
GatewayStrategyContext.getCurrentContext().setExchange((ServerWebExchange) object);
}
}
@Override
public void after() {
// 线程结束,销毁上下文对象
GatewayStrategyContext.clearCurrentContext();
}
}
- 新建一个Plugin类继承AbstractPlugin,参考DiscoveryGatewayPlugin
public class DiscoveryGatewayPlugin extends AbstractPlugin {
@Override
protected String getMatcherClassName() {
// 返回存储ThreadLocal对象的类名,由于插件是可以插拔的,所以必须是字符串形式,不允许是显式引入类
return "com.nepxion.discovery.plugin.strategy.gateway.context.GatewayStrategyContext";
}
@Override
protected String getHookClassName() {
// 返回ThreadLocalHook类名
return GatewayStrategyContextHook.class.getName();
}
}
- 定义SPI扩展,在src/main/resources/META-INF/services目录下定义SPI文件
名称为固定如下格式
com.nepxion.discovery.plugin.strategy.agent.plugin.Plugin
内容为Plugin类的全路径(以DiscoveryGatewayPlugin为例)
com.nepxion.discovery.plugin.strategy.agent.plugin.gateway.DiscoveryGatewayPlugin
- 上述自定义插件的方式,即可解决使用者在线程切换时丢失ThreadLocal上下文的问题
支持反向去除核心依赖
- 支持使用者反向去除管理中心模块的依赖
相关测试
自动化测试
- 增加Nacos 1.4.0 Open API批量修改动态元数据自动化测试用例
- 增加Nacos 1.4.0 Open API批量删除动态元数据自动化测试用例
- 增加Nacos 1.4.0 Open API批量复原动态元数据自动化测试用例
相关下载
DiscoveryAgent下载
访问https://github.com/Nepxion/DiscoveryAgent/releases
获取最新版本
DiscoveryDesktop下载
访问https://github.com/Nepxion/DiscoveryUI/releases
获取最新版本
3.20.1(OCT 6, 2020)
见 Nepxion Discovery 6.3.1 发布
6.2.0(SEP 20, 2020)
发布日志
- 本次发布版本,深入和
Spring Cloud Alibaba
、Nacos
团队进行探讨、合作、测试,并结合若干家公司的落地实践,进行优化和重构,以更强大的功能,解决使用者的真正痛点,以更开放的方式,供使用者灵活扩展 - 欢迎使用Nepxion Polaris集成式脚手架,极大降低Nepxion Discovery接入成本,请访问 Polaris【北极星】企业级云原生微服务框架 :
https://github.com/Nepxion/Polaris
发布策略
提醒:版本号右边, ↑
表示>=该版本号, ↓
表示<=该版本号
提醒:Spring Boot版本和Spring Cloud Alibaba版本需要在版本号后面加上.RELEASE
版本 | 状态 | SC版本 | SB版本 | SCA版本 |
---|---|---|---|---|
6.2.0 | H.SR5 ↑ H G F |
2.3.x 2.2.x 2.1.x 2.0.x |
2.2.x 2.2.x 2.1.x 2.0.x |
|
G | 2.1.x | 2.1.x | ||
F | 2.0.x | 2.0.x | ||
3.19.0 | E | 1.5.x | 1.5.x | |
D | 1.x.x | N/A | ||
C | 1.x.x | N/A |
表示维护中 | 表示不维护,但可用,强烈建议升级 | 表示不维护,不可用,已废弃
- 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)已废弃
版本变更
本次版本升级了很多中间件的版本号,但不需要担心,都可以降级。使用者保持老的中间件版本号即可,无缝兼容老版本
① 不兼容项
- 旧的注册中心插件引入方式,如下
<dependency>
<groupId>com.nepxion</groupId>
<artifactId>discovery-plugin-starter-nacos</artifactId>
<!-- <artifactId>discovery-plugin-starter-eureka</artifactId> -->
<!-- <artifactId>discovery-plugin-starter-consul</artifactId> -->
<!-- <artifactId>discovery-plugin-starter-zookeeper</artifactId> -->
</dependency>
- 新的注册中心插件引入方式,如下(中间多了
register-center
,即显式表达为注册中心的含义)
<dependency>
<groupId>com.nepxion</groupId>
<artifactId>discovery-plugin-register-center-starter-nacos</artifactId>
<!-- <artifactId>discovery-plugin-register-center-starter-eureka</artifactId> -->
<!-- <artifactId>discovery-plugin-register-center-starter-consul</artifactId> -->
<!-- <artifactId>discovery-plugin-register-center-starter-zookeeper</artifactId> -->
</dependency>
② 框架变更
- 默认集成Spring Cloud Hoxton.SR8(
可降级
) - 默认集成Spring Boot到2.3.4.RELEASE(只支持Hoxton.SR5及以上的版本),该版本支持Docker分层,极大提高部署效率(
可降级
) - 默认集成Spring Cloud Alibaba 2.2.3.RELEASE(
可降级
) - 默认集成Nacos 1.3.3(
可降级
) - 默认集成Sentinel 1.8.0(
可降级
) - 默认集成Apollo 1.7.0(
可降级
) - 默认集成Skywalking 8.1.0(
可降级
) - 默认集成Spring Boot Admin 2.3.0(
可降级
) - 默认集成Guava到29.0-jre(
可降级
) - 默认集成Caffeine到2.8.5(
可降级
) - 升级Matrix到2.0.8
- 升级Eventbus到2.0.13
- 优化Sentinel的引入
- 移除Opentracing Spring Cloud Starter的引入,缩小引入范围,只引入Opentracing Api
- 移除Opentracing Skywalking Version的引入,改为Skywalking Version,可读性更强一些
- 移除Nacos和Sentinel版本在Pom里的显式定义,避免换Sring Cloud Alibaba版本时候引起冲突
- 移除jboss-logging相关日志包的引用
- 移除未用到的log4j2和disruptor相关日志包的引用
- 改进了一些中间件版本的潜在冲突,尽量跟主流版本对齐
③ 版本升降
- 通过如下方式,对Spring Cloud、Spring Boot和Spring Cloud Alibaba版本进行升降级
<properties>
<!-- Spring Cloud Hoxton compatible versions -->
<spring.cloud.version>Hoxton.SR8</spring.cloud.version>
<spring.cloud.alibaba.version>2.2.3.RELEASE</spring.cloud.alibaba.version>
<spring.boot.version>2.3.4.RELEASE</spring.boot.version>
<!-- Spring Cloud Greenwich compatible versions -->
<!-- <spring.cloud.version>Greenwich.SR6</spring.cloud.version>
<spring.cloud.alibaba.version>2.1.3.RELEASE</spring.cloud.alibaba.version>
<spring.boot.version>2.1.16.RELEASE</spring.boot.version> -->
<!-- Spring Cloud Finchley compatible versions -->
<!-- <spring.cloud.version>Finchley.SR4</spring.cloud.version>
<spring.cloud.alibaba.version>2.0.3.RELEASE</spring.cloud.alibaba.version>
<spring.boot.version>2.0.9.RELEASE</spring.boot.version> -->
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring.cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring.cloud.alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring.boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
③ 指南示例变更
- 引入Opentracing Concurrent包支持异步埋点
- 去掉Jaeger Client显式引入,通过Opentracing Spring Jaeger Starter引入它,避免造成不兼容
- 简化Jaeger埋点包引入,只需要引入下面两个包即可
<dependency>
<groupId>io.opentracing.contrib</groupId>
<artifactId>opentracing-spring-cloud-starter</artifactId>
</dependency>
<dependency>
<groupId>io.opentracing.contrib</groupId>
<artifactId>opentracing-spring-jaeger-starter</artifactId>
</dependency>
功能迭代
增加动态变更元数据的灰度路由策略
该功能在Spring Cloud Alibaba的新版本上才被支持
利用注册中心的Open API接口动态变更服务实例的元数据,达到稳定版本和灰度版本流量灰度控制的目的。以Nacos的版本匹配为例
老的稳定版本的服务实例配置版本元数据,如下
spring.cloud.nacos.discovery.metadata.version=stable
新的稳定版本的服务实例配置版本元数据,如下
spring.cloud.nacos.discovery.metadata.version=gray
灰度路由策略,如下
表示所有的服务流量走灰度版本
<?xml version="1.0" encoding="UTF-8"?>
<rule>
<strategy>
<version>gray</version>
</strategy>
</rule>
表示a服务流量走灰度版本,b服务流量走稳定版本
<?xml version="1.0" encoding="UTF-8"?>
<rule>
<strategy>
<version>{"discovery-guide-service-a":"gray", "discovery-guide-service-b":"stable"}</version>
</strategy>
</rule>
也可以通过全链路传递Header方式实现
n-d-version=gray
n-d-version={"discovery-guide-service-a":"gray", "discovery-guide-service-b":"stable"}
新上线的服务实例版本为gray,即默认是灰度版本。等灰度成功后,通过注册中心的Open API接口变更服务版本为stable,或者在注册中心界面手工修改
- Nacos Open API变更元数据
curl -X PUT 'http://ip:port/nacos/v1/ns/service?serviceName={appId}&metadata=version%3stable'
- Eureka Open API变更元数据
curl -X PUT 'http://ip:port/eureka/apps/{appId}/{instanceId}/metadata?version=stable'
- Consul Open API变更元数据
自行研究
- Zookeeper Open API变更元数据
自行研究
① 并非所有的注册中心都支持动态元数据变更方式,需要使用者自行研究
② 动态元数据变更方式利用第三方注册中心的Open API达到最终目的,其可能具有一定的延迟性,不如本框架那样具有灰度路由实时生效的特征,但比本框架动态变更灰度路由策略简单了一些
③ 动态元数据变更方式只是让新的元数据驻留在内存里,并不持久化。当服务重启后,服务的元数据仍旧会以初始值为准
增加全局唯一ID元数据
全局唯一ID对应于元数据spring.application.uuid字段,并为每个服务实例分配一个,注册到注册中心
增加服务下线实时性的流量绝对无损策略
服务下线场景中,由于Ribbon负载均衡组件存在着缓存机制,当被调用的服务实例已经下线,而调用的服务实例还暂时缓存着它,直到下个心跳周期才会把已下线的服务实例剔除,在此期间,会造成流量有损
框架提供流量的实时性的绝对无损。采用下线之前,把服务实例添加到屏蔽名单中,负载均衡不会去寻址该服务实例。下线之后,清除该名单。实现该方式,需要通过DevOps调用注册中心的Open API推送或者在注册中心界面手工修改,通过全局订阅方式实现,Group为discovery-guide-group,Data Id为discovery-guide-group(全局发布,两者都是组名)
- 配置全局唯一ID屏蔽策略
通过服务全局唯一ID进行屏蔽。此用法适用于Docker和Kubernetes上IP地址不确定的场景,策略内容如下,采用如下两种方式之一均可
<?xml version="1.0" encoding="UTF-8"?>
<rule>
<strategy-blacklist>
<!-- 单个ID形式。如果多个用“;”分隔,不允许出现空格 -->
<id value="e92edde5-0153-4ec8-9cbb-b4d3f415aa33;af043384-c8a5-451e-88f4-457914e8e3bc"/>
<!-- 多个ID节点形式 -->
<!-- <id value="e92edde5-0153-4ec8-9cbb-b4d3f415aa33"/>
<id value="af043384-c8a5-451e-88f4-457914e8e3bc"/> -->
</strategy-blacklist>
</rule>
也可以通过全链路传递Header方式实现:n-d-id-blacklist
- 配置IP地址和端口屏蔽策略
通过IP地址或者端口或者IP地址+端口进行屏蔽,支持通配符方式。此用法适用于IP地址确定的场景,策略内容如下,采用如下两种方式之一均可
<?xml version="1.0" encoding="UTF-8"?>
<rule>
<strategy-blacklist>
<!-- 单个Address形式。如果多个用“;”分隔,不允许出现空格 -->
<address value="192.168.43.101:1201;192.168.*.102;1301"/>
<!-- 多个Address节点形式 -->
<!-- <address value="192.168.43.101:1201"/>
<address value="192.168.*.102"/>
<address value="1301"/> -->
</strategy-blacklist>
</rule>
也可以通过全链路传递Header方式实现:n-d-address-blacklist
增加Zone的全链路可用区亲和性隔离和路由
- 可用区亲和性隔离。基于调用端实例和提供端实例的元数据Metadata的zone配置值相等实现隔离
- 可用区亲和性路由。基于调用端实例找不到符合条件的提供端实例,把流量路由到其它可用区
# 启动和关闭可用区亲和性,即同一个可用区的服务才能调用,同一个可用区的条件是调用端实例和提供端实例的元数据Metadata的zone配置值必须相等。缺失则默认为false
# spring.application.zone.affinity.enabled=false
# 启动和关闭可用区亲和性失败后的路由,即调用端实例没有找到同一个可用区的提供端实例的时候,当开关打开,可路由到其它可用区或者不归属任何可用区,当开关关闭,则直接调用失败。缺失则默认为true
# spring.application.zone.route.enabled=true
增加数据库和消息队列灰度发布
通过订阅业务参数的变化,实现参数化灰度发布,例如,基于多Datasource的数据库灰度发布,基于多Queue的消息队列灰度发布
增加参数化灰度规则,Group为discovery-guide-group,Data Id为discovery-guide-group(全局发布,两者都是组名),规则内容如下,实现功能
- 服务a在版本为1.0的时候,数据库的数据源指向db1;服务a在版本为1.1的时候,数据库的数据源指向db2
- 服务b在区域为dev的时候,消息队列指向queue1;服务b在区域为dev的时候,消息队列指向queue2
- 服务c在环境为env1的时候,数据库的数据源指向db1;服务c在环境为env2的时候,数据库的数据源指向db2
- 服务d在可用区为zone1的时候,消息队列指向queue1;服务d在可用区为zone2的时候,消息队列指向queue2
- 服务c在IP地址和端口为192.168.43.101:1201的时候,数据库的数据源指向db1;服务c在IP地址和端口为192.168.43.102:1201的时候,数据库的数据源指向db2
<?xml version="1.0" encoding="UTF-8"?>
<rule>
<parameter>
<service service-name="discovery-springcloud-example-a" tag-key="version" tag-value="1.0" key="ShardingSphere" value="db1"/>
<service service-name="discovery-springcloud-example-a" tag-key="version" tag-value...
3.19.0(SEP 20, 2020)
见 Nepxion Discovery 6.2.0 发布
6.0.7(AUG 18, 2020)
Nepxion Discovery 6.0.7 发布
发布日志
发布新框架:
Nepxion Polaris 企业级云原生微服务开源解决方案,围绕Nepxion Discovery【探索】框架打造,面向企业级生产需求精雕细琢,赋能和助力企业快速搭建基础架构的底层云原生微服务框架,有效的降低企业的生产和落地成本
版本更新:
- 支持Edgware版的3.16.7版,为最后一个版本,该分支和版本将不在维护,但分支代码保留,请使用者自行维护
优化改进:
- 基于服务实例的元数据Metadata的env参数和全链路传递的环境Header值进行比对实现隔离,当从网关传递来的环境Header(n-d-env)值和提供端实例的元数据Metadata环境配置值相等才能调用。环境隔离下,调用端实例找不到符合条件的提供端实例,把流量路由到一个通用或者备份环境
整个隔离和路由的逻辑变更如下:
1.如果存在子环境,优先寻址子环境的服务实例
2.如果不存在子环境,则寻址Common环境的服务实例(未设置元数据Metadata的env参数的服务实例也归为Common环境)
3.如果Common环境也不存在,则调用失败
4.如果没有传递环境Header(n-d-env)值,则执行Spring Cloud Ribbon轮询策略 - 新增discovery-plugin-strategy-sentinel-monitor模块,独立出Sentinel埋点,以支持扩展
- 优化spring.application.default.properties内置默认值读取逻辑,当Spring Environment或者System Properties或者System ENV存在对应值的时候,内置默认值则失效
- 优化Pom结构
源码主页
https://github.com/Nepxion/Discovery
指南主页
https://github.com/Nepxion/DiscoveryGuide
文档主页
https://gitee.com/Nepxion/Docs/tree/master/web-doc
其它版本
同时发布的版本,还包括:
- Nepxion Discovery 3.16.7,支持Edgware版
3.16.7(AUG 18, 2020)
见 Nepxion Discovery 6.0.7 发布
6.0.6(JUL 25, 2020)
Nepxion Discovery 6.0.6 发布
发布日志
版本更新:
- 升级Spring Cloud OpenTracing到0.5.5
- 升级Skywalking Opentracing到8.0.1
- 升级Opentracing Spring Jaeger到3.1.2
- 升级Jaeger Client到1.3.1
缺陷修复:
- 去掉异步调用线程切换丢失Header的频繁的日志提示:The ServletRequestAttributes object is lost for thread switched probably
- 微小优化代码逻辑
源码主页
https://github.com/Nepxion/Discovery
指南主页
https://github.com/Nepxion/DiscoveryGuide
文档主页
https://gitee.com/Nepxion/Docs/tree/master/web-doc
其它版本
同时发布的版本,还包括:
- Nepxion Discovery 3.16.6,支持Edgware版
3.16.6(JUL 25, 2020)
见 Nepxion Discovery 6.0.6 发布