Skip to content

Releases: Nepxion/Discovery

6.3.2(OCT 12, 2020)

12 Oct 01:54
Compare
Choose a tag to compare

发布日志

发布策略

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

提醒: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
5.6.0 G 2.1.x 2.1.x
4.15.0 F 2.0.x 2.0.x
3.20.2 E 1.5.x 1.5.x
2.0.x D 1.x.x N/A
1.0.x 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)已废弃

版本变更

无中间件版本变更

功能迭代

基于RESTful层面的功能全景

增加新的灰度蓝绿环境隔离路由触发方式

① 基于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' &amp;&amp; #H['b'] == '2' &amp;&amp; #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)

12 Oct 01:51
Compare
Choose a tag to compare

见 Nepxion Discovery 6.3.2 发布

6.3.1(OCT 6, 2020)

06 Oct 03:39
Compare
Choose a tag to compare

发布日志

  • 本次发布版本,深入和Spring Cloud AlibabaNacos团队进行探讨、合作、测试,并结合若干家公司的落地实践,进行优化和重构,以更强大的功能,解决使用者的真正痛点,以更开放的方式,供使用者灵活扩展
  • 欢迎使用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
5.6.0 G 2.1.x 2.1.x
4.15.0 F 2.0.x 2.0.x
3.20.1 E 1.5.x 1.5.x
2.0.x D 1.x.x N/A
1.0.x 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)

06 Oct 03:36
Compare
Choose a tag to compare

见 Nepxion Discovery 6.3.1 发布

6.2.0(SEP 20, 2020)

20 Sep 07:05
Compare
Choose a tag to compare

发布日志

  • 本次发布版本,深入和Spring Cloud AlibabaNacos团队进行探讨、合作、测试,并结合若干家公司的落地实践,进行优化和重构,以更强大的功能,解决使用者的真正痛点,以更开放的方式,供使用者灵活扩展
  • 欢迎使用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
5.6.0 G 2.1.x 2.1.x
4.15.0 F 2.0.x 2.0.x
3.19.0 E 1.5.x 1.5.x
2.0.x D 1.x.x N/A
1.0.x 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...
Read more

3.19.0(SEP 20, 2020)

20 Sep 06:53
Compare
Choose a tag to compare

见 Nepxion Discovery 6.2.0 发布

6.0.7(AUG 18, 2020)

17 Aug 18:48
Compare
Choose a tag to compare

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)

17 Aug 18:43
Compare
Choose a tag to compare

见 Nepxion Discovery 6.0.7 发布

6.0.6(JUL 25, 2020)

24 Jul 20:06
Compare
Choose a tag to compare

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)

24 Jul 20:02
Compare
Choose a tag to compare

见 Nepxion Discovery 6.0.6 发布