5

代码git地址

feature

  • [x] 灰度服务
  • [x] 配置中心
  • [x] 动态路由

前言

上篇文章介绍了SpringCloud灰度的实现及流程,每次修改服务的元数据信息metadata-map值需要重新调用一次eureka的RestFul接口,不仅如此当服务重启后又会重新读最初的配置值,这样不仅麻烦而且还不可靠。

在经过与SpringCloud Config 、Disconf、Apollo等配置中心作出对比后,发现被Apollo友好方便的管理端所深深吸引,再加上该配置中心支持配置文件的灰度发布简直不要太完美。

Apollo灰度配置

让多个实例共享一个配置文件,示例配置

spring.application.name = provide-test
server.port = 7770
eureka.client.service-url.defaultZone = http://localhost:1111/eureka/

然后新起一个灰度配置,让对应的服务使用该配置。

eureka.instance.metadata-map.version = v1

主版本

事件监听

监听Apollo事件,当发现配置文件中的eureka.instance.metadata-map.version值若发生改变,则调用eureka接口更改metadata-map元数据

    @ApolloConfigChangeListener("application")
    private void someOnChange(ConfigChangeEvent changeEvent) {
        changeEvent.changedKeys().forEach(key -> {
            ConfigChange change = changeEvent.getChange(key);
            // 灰度配置
            if("eureka.instance.metadata-map.version".equals(change.getPropertyName())) {
                String appname = eurekaInstanceConfig.getAppname();
                String instanceId = eurekaInstanceConfig.getInstanceId();
                String value = StringUtils.isEmpty(change.getNewValue()) ? "" : change.getNewValue();
            
            //TODO 调用eureka更改元数据接口
            }

        });
    }

这样一来,只需要通过修改配置文件然后就会触发监听事件从而自动触发请求eureka更改元数据的值。

动态路由

在网关zuul整合了动态路由功能,监听Apollo配置文件使其修改配置文件后可以马上生效。此处不对此功能做过多的介绍,详情见代码

配置示例

url.map.provide-test = /pt/**

url.map.为固定写法,provide-test为服务名称,/pt/**为映射路径

参考文章

灰度使用

在启动类添加注解

@SpringBootApplication
@EnableDiscoveryClient
@EnableGrayConfig
public class ProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(ProviderApplication.class, args);
    }
}

时光沉旧了少年
95 声望23 粉丝

有些人不离开你,你永远都长不大