通过Acutator和SpringCloudConfig完成"灰度部署"——动态刷新网关路由配置

先声明下,我这个可能是冒牌的灰度部署,技术有限,纯粹个人笔记分享。

前段时间接到了头头给我的一个任务,让我研究下“灰度部署”,说是保证一个服务要升级的时候,不能停掉服务。操作步骤是,比如老版本的服务端口号是9002,新版本的服务是9003。在运行9002的时候,启动9003,修改网关路由配置9002→9003,确保流量走到9003后成功运行,停掉9002服务,这就算大功告成了。

接下来分享下我通过学习实践后可行的两种方案 1. 通过SpringCloudConfig配置分布式配置中心,连接GitHub、GitLab加上Acutator来实现刷新技术。 2. 轻量级——通过Acutator来刷新,抛弃SpringCloudConfig。仅仅本地修改就OK,不用去Git上修改。

方式一:通过SpringCloudConfig搭建分布式配置中心

概要:这种方式呢,就是通过一个服务(配置中心),连接上GitHub或者GitLab(因为公司是用lab管理代码的)的仓库,然后读取里面的配置文件(各个服务的各种配置文件都在这里放着),运维人员或者其他人吧,就可以在仓库在线修改配置文件。然后通过例如github、lab的WebHook;Actoator监控工具(手动刷新)的技术等完成刷新。这样就不用重启服务了。

1.创建一个项目,作为这个配置中心服务。 引入对应依赖。

         <!-- springCloud Config -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency> <!-- 图形化监控 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

2. 然后创建application.yml配置文件。配置示例如下:

这个服务的端口号是3344,其次通过配置可以看出。连接git的uri是如下(这就是你的git仓库的地址),如果是私有的或者有权限的就在下面不上username和password,和uri并列就可以了。

server:
port: 3344 spring:
application:
name: microservicecloud-config
cloud:
config:
server:
git:
uri: https://github.com/*********r-repo.git

3.目前为止分布式配置中心的搭建基本就差不多了,但是别忘了去启动类加上启用的注解。(@EnabledConfigServer)

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer; @EnableConfigServer
@SpringBootApplication
public class ConfigServerApplication { public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class, args);
} }

4.截止到这里分布式配置中心已经搭建完成。

5.将网关服务的配置文件放置在GitHub或者GitLab上的仓库上(就是上面刚刚配置的git地址)。

6.这时候分布式配置中心的服务端配置完了,改配置客户端了,这里网关服务就相当于客户端。所以我就在网关服务中添加如下依赖:

acutator是用来刷新监控的,config是客户端,注意上面服务端的依赖是-server。

        <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>

7. 在网关(配置中心客户端)添加bootstrap.yml,这个配置文件将优先于application.yml,因为它是配置中心的文件,它需要连接服务端,以及获取仓库中的文件路径等详细信息去在仓库中茫茫多的文件读取到属于自己的配置文件。

下面是网关项目的bootstrap.yml配置文件,name是指你想读取的配置文件的名称(当然还有指定路径的配置,具体就不详细了,现在就当做是一级目录下的文件),label是指master节点,uri自然就是git的地址,如果出现权限等问题记得加上username,password。

spring:
cloud:
config:
name: zuulConfig
label: master
uri: https://github.com/*********r-repo.git

8. 到此SpringCloudConfig的配置就结束了,当修改git上的配置文件后,通过手动刷新(或者绑定webhook,这里就不提了)后,服务就更新成最新的配置了。手动刷新的方式是利用Actuator,在下面的方式最后一起描述。当然这里的关于Actuator的配置文件也应该写在application.yml或者bootstrap.yml中。

方式二:利用Actuator实现动态更新配置文件

1. 导入依赖

        <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

2. 配置文件

这里展示properties格式的,最简单的就是加入include = refresh,因为默认是没有refresh的,这里就用"*"都导入了,第二行的配置是指用什么路径,原路径/acutator/refresh,经过配置后/manager/refresh,如果本地端口失效等问题还可以加上server.port设置端口,用这个端口再试试....

management.endpoints.web.exposure.include=*
management.endpoints.web.base-path=/mannager

3. 配置Java代码(这里只是关心网关的配置的刷新,至于其他的,自行百度或者 加上@RefreshScope注解等)

第一段代码主要是配置的一个接口,调用这个接口可以查看当前网关的配置文件信息,和咱们这个动态刷新没什么大的关系。

主要是第二段代码,首先@Primary等那几个注解都是必须的,别问为什么,初学的我也是看别人博客这么说的....其次就是哪里要刷新哪里用@RefreshScope

@Configuration
@Lazy(value = false)
@EnableZuulProxy
@EnableConfigurationProperties({ZuulProperties.class})
@RestController
public class ZuulConfig { @Autowired
ZuulProperties p; @GetMapping("/config")
public Map<String, ZuulProperties.ZuulRoute> config() {
return p.getRoutes();
} }
@EnableZuulProxy
@SpringBootApplication
@EnableConfigurationProperties({ZuulProperties.class})
public class ZuulServiceApplication { public static void main(String[] args) {
SpringApplication.run(ZuulServiceApplication.class, args);
} @Bean(name = "zuul.CONFIGURATION_PROPERTIES")
@RefreshScope
@ConfigurationProperties("zuul")
@Primary
public ZuulProperties zuulProperties() {
ZuulProperties p = new ZuulProperties();
return p;
} }

4.到这里简单的动态刷新监听配置就完成了。

操作步骤:

调用/config接口查看网关配置信息,在发布目录(targer)下的配置文件里修改配置信息,然后调用/manager/refersh接口,会返回给你修改了的配置信息的key,然后调用/config接口你会发现你修改的配置信息已经刷新了。当然如果觉得不可信,可以修改端口号啊等等,这也算是“灰度部署”了吧,可能有点粗糙,因为流量是直接全部导向新服务的。

做个笔记吧,以后可能还会用上,可能有很多说错的地方....hah

SpringCloud"灰度部署"——动态刷新网关配置的更多相关文章

  1. 服务网关zuul----zuul中的动态刷新路由配置

    Spring Cloud实战小贴士:Zuul处理Cookie和重定向 所以解决该问题的思路也很简单,我们只需要通过设置sensitiveHeaders即可,设置方法分为两种: 全局设置: zuul.s ...

  2. 服务网关zuul之七:zuul中的动态刷新路由配置

    <spring扩展点之三:Spring 的监听事件 ApplicationListener 和 ApplicationEvent 用法,在spring启动后做些事情> <服务网关zu ...

  3. 【微服务】之六:轻松搞定SpringCloud微服务-API网关zuul

    通过前面几篇文章的介绍,我们可以轻松搭建起来微服务体系中比较重要的几个基础构建服务.那么,在本篇博文中,我们重点讲解一下,如何将所有微服务的API同意对外暴露,这个就设计API网关的概念. 本系列教程 ...

  4. springcloud(十一):服务网关Zuul高级篇

    时间过的很快,写springcloud(十):服务网关zuul初级篇还在半年前,现在已经是2018年了,我们继续探讨Zuul更高级的使用方式. 上篇文章主要介绍了Zuul网关使用模式,以及自动转发机制 ...

  5. SpringBoot SpringCloud 热部署 热加载 热调试

    疯狂创客圈 Java 高并发[ 亿级流量聊天室实战]实战系列 [博客园总入口 ] 架构师成长+面试必备之 高并发基础书籍 [Netty Zookeeper Redis 高并发实战 ] Crazy-Sp ...

  6. SpringCloud系列之API网关(Gateway)服务Zuul

    1.什么是API网关 API网关是所有请求的入口,承载了所有的流量,API Gateway是一个门户一样,也可以说是进入系统的唯一节点.这跟面向对象设计模式中的Facet模式很像.API Gatewa ...

  7. Java学习-032-JavaWeb_001 -- Tomcat环境部署及基本配置

    首先到 Tomcat 官网,下载对应的版本,我本机的系统是 WIN7 64BIT 的,因而我选择的是64bit 的zip包,如下图所示:

  8. JBOSS EAP 6 系列五 Managed domains 管理域最主要的功能是“统一部署,统一配置”

    摘要 本文首先介绍Managed Domain的概念,管理域最主要的功能是"统一部署,统一配置".接下来通过一个实例在"统一配置"部分实现一个双机配置起来的域, ...

  9. centos6.5中部署Zeppelin并配置账号密码验证

    centos6.5中部署Zeppelin并配置账号密码验证1.安装JavaZeppelin支持的操作系统如下图所示.在安装Zeppelin之前,你需要在部署的服务器上安装Oracle JDK 1.7或 ...

随机推荐

  1. VUE知识点小记

    .if里面不能用import方式导入,只能用require方式引入 判断长度大于0 getIssues (vue, data) { let label = '' ) { label = `+label ...

  2. ubuntu系统调整时区和时间

    date: 2019-05-30  10:14:23 author:headsen  chen 个人原创博客,转录需要注明作者和出处. 1,安装ntpdate,同步标准时间 root@hk-confl ...

  3. OpenNebula概述

    OpenNebula概述 OpenNebula是专门为云计算打造的开源系统,用户可以使用Xen.KVM.VMware等虚拟化软件一起打造企业云.利用OpenNebula可以轻松构建私有云.混合云.公开 ...

  4. 用python查看文件是否存在的三种方式

    目录 1.使用os模块 判断文件是否可做读写操作 2.使用Try语句 3. 使用pathlib模块 正文 通常在读写文件之前,需要判断文件或目录是否存在,不然某些处理方法可能会使程序出错.所以最好在做 ...

  5. winform软件版本检测自动升级开发流程(转)

    注:按此博文试验OK 基于C/S的开发有开发效率高,对于业务逻辑复杂,且不需要外网使用具有较大优势,但是弊端也不可忽视,就是升级麻烦,不可能每写一个版本就要拿着安装包给每个人去替换,这样不仅搞得自己很 ...

  6. tcpdump抓包代码

    tcpdump - tcp[:]=:]=0x4854 or tcp 抓出来的包可以导入wireshark分析 以上代码曾经在ios越狱机器上使用,用于抓包,具体也记不起来了 导入wireshark效果

  7. linux EXT4格式分区扩容

    1.查看现有的分区大小  2.关机增加磁盘大小为100G  3.查看磁盘扩容后状态 lsblk或dh -TH 4.进行分区扩展磁盘,保留根目录的起止位置.  5.删除根分区,不要保存  6.创建分区, ...

  8. react如何在网页上编辑并运行代码?

    最近想做个能在网站,能在网页上运行代码,并且保存这个组件,看了一下element-react的组件和官方的实例,发现都是可以编辑运行的,因为之前没有这方面的经验,所以看下各位大佬能不能给点意见

  9. MVC之自定义过滤器(ActionFilterAttribute)

    一.自定义Filter 自定义Filter需要继承ActionFilterAttribute抽象类,重写其中需要的方法,来看下ActionFilterAttribute类的方法签名. //表示所有操作 ...

  10. js 数组去重、去空(收藏)

    function unique (arr) { return Array.from(new Set(arr)) } var arr = [1,1,'true','true',true,true,15, ...