SpringCloud"灰度部署"——动态刷新网关配置
通过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"灰度部署"——动态刷新网关配置的更多相关文章
- 服务网关zuul----zuul中的动态刷新路由配置
Spring Cloud实战小贴士:Zuul处理Cookie和重定向 所以解决该问题的思路也很简单,我们只需要通过设置sensitiveHeaders即可,设置方法分为两种: 全局设置: zuul.s ...
- 服务网关zuul之七:zuul中的动态刷新路由配置
<spring扩展点之三:Spring 的监听事件 ApplicationListener 和 ApplicationEvent 用法,在spring启动后做些事情> <服务网关zu ...
- 【微服务】之六:轻松搞定SpringCloud微服务-API网关zuul
通过前面几篇文章的介绍,我们可以轻松搭建起来微服务体系中比较重要的几个基础构建服务.那么,在本篇博文中,我们重点讲解一下,如何将所有微服务的API同意对外暴露,这个就设计API网关的概念. 本系列教程 ...
- springcloud(十一):服务网关Zuul高级篇
时间过的很快,写springcloud(十):服务网关zuul初级篇还在半年前,现在已经是2018年了,我们继续探讨Zuul更高级的使用方式. 上篇文章主要介绍了Zuul网关使用模式,以及自动转发机制 ...
- SpringBoot SpringCloud 热部署 热加载 热调试
疯狂创客圈 Java 高并发[ 亿级流量聊天室实战]实战系列 [博客园总入口 ] 架构师成长+面试必备之 高并发基础书籍 [Netty Zookeeper Redis 高并发实战 ] Crazy-Sp ...
- SpringCloud系列之API网关(Gateway)服务Zuul
1.什么是API网关 API网关是所有请求的入口,承载了所有的流量,API Gateway是一个门户一样,也可以说是进入系统的唯一节点.这跟面向对象设计模式中的Facet模式很像.API Gatewa ...
- Java学习-032-JavaWeb_001 -- Tomcat环境部署及基本配置
首先到 Tomcat 官网,下载对应的版本,我本机的系统是 WIN7 64BIT 的,因而我选择的是64bit 的zip包,如下图所示:
- JBOSS EAP 6 系列五 Managed domains 管理域最主要的功能是“统一部署,统一配置”
摘要 本文首先介绍Managed Domain的概念,管理域最主要的功能是"统一部署,统一配置".接下来通过一个实例在"统一配置"部分实现一个双机配置起来的域, ...
- centos6.5中部署Zeppelin并配置账号密码验证
centos6.5中部署Zeppelin并配置账号密码验证1.安装JavaZeppelin支持的操作系统如下图所示.在安装Zeppelin之前,你需要在部署的服务器上安装Oracle JDK 1.7或 ...
随机推荐
- linux内核是如何支持深度睡眠(deep sleep)方式的?
1. 硬件架构 arm64 2. 内核版本 4.19 3. 分析相关函数 setup_arch() -> psci_dt_init() -> psci_0_2_init() -> g ...
- python 过滤 b'及提取 cmd命令返回值
#!/usr/bin/env python # -*- coding:utf-8 -*- import subprocess import datetime plist = [] p = subpro ...
- 阶段5 3.微服务项目【学成在线】_day09 课程预览 Eureka Feign_13-课程预览功能开发-CMS页面预览接口测试
5.2 CMS页面预览测试 CMS已经提供了页面预览功能,课程预览功能要使用CMS页面预览接口实现,下边通过cms页面预览接口测试课 程预览的效果. 1.向cms_page表插入一条页面记录或者从cm ...
- 阶段5 3.微服务项目【学成在线】_day07 课程管理实战_05-课程修改实战分析
3 课程信息修改 3.1 需求分析 课程添加成功进入课程管理页面,通过课程管理页面修改课程的基本信息.编辑课程图片.编辑课程营销信息等. 本小节实现修改课程. 3.2 课程管理页面说明 3.2.1 页 ...
- java如何获取访问真实IP地址?
java如何获取访问真实IP地址 解决方法: 获取请求主机IP地址,如果通过代理进来,则透过防火墙获取真实IP地址,如果没有代理,则获取真实ip public static String getIp( ...
- poi导出excel2007版本
/** * 导出excel2007版本 * * @param titles * 表头集合 * @param sheetNames * sheet名称 * @param datas * 数据集合 * @ ...
- Redis键通知机制
Redis键通知机制 一.概念 自从redis2.8.0以后出了一个新特性,Keyspace Notifications 称为“键空间通知”. 这个特性大概是,凡是实现了Redis的Pub/Sub的客 ...
- 比较SSO协议: WS-Fed, SAML, and OAuth
真实比喻 在我们获得技术之前,让我们用完全非技术性的东西来解决这个问题.作为工程师,我们非常注重将事情分解为组件和流程.这有助于我们了解事情,以便我们可以排除故障或构建复杂的系统.当你去机场登机时,你 ...
- mysql 按照配置文件启动
有时,我们的机器上面装了很多个mysql,但只有一个3306端口,其余的mysql服务器需要重新指定端口.我们需要多个配置文件来启动它们.那么我们怎么通过指定配置文件的方式来启动呢? 例如,按 ...
- 1、1通过maven建立spring boot项目(不用联网)
1.把以前spring boot项目的pom.xml导入进来 2.修改pom.xml 里面项目名改成自己项目名 3.复制配置文件 spring: datasource: url: jdbc:mysq ...