SpringCloud04 服务配置中心、消息总线、远程配置动态刷新
1 环境说明
JDK:1.8
MAVENT:3.5
SpringBoot:2.0.5.RELEASE
SpringCloud:Finchley.SR1

2 创建服务注册中心(Eureka服务端)
说明:本博文仅仅以一个单例的注册中心为例,高可用的服务注册中心请参见
2.1 引入依赖
利用IDEA创建服务注册中心项目时只需要引入 spring-cloud-starter-netflix-eureka-server 一个依赖就可以啦
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId>
<artifactId>eureka</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging> <name>eureka</name>
<description>Demo project for Spring Boot</description> <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.SR1</spring-cloud.version>
</properties> <dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies> <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>
</dependencies>
</dependencyManagement> <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build> </project>
pom.xml
2.2 配置文件
配置服务注册中心端口以及服务服务注册中心的应用名
技巧01:单例模式下的服务注册中心需要关闭向其他服务注册中心注册本服务信息功能和从其他服务注册中心拉取注册服务信息功能

server:
port: 8761 spring:
application:
name: eureka eureka:
client:
fetch-registry: false # 关闭从其他服务注册中心拉取服务信息
register-with-eureka: false # 不向其他服务注册中心注册本服务的信息
application.yml
2.3 引入服务注册中心配置
需要在启动类上利用@EnableEurekaServer将SpringBoot为我们提供的Eureka的相关配置引入到系统应用中,否则Eureka服务注册中心不会生效
技巧01:@EnableEurekaServer的作用就是将某个配置了Eureka相关配置的类引入到应用容器中

2.4 启动服务注册中心
通过IP和端口访问的效果如果所示

3 创建Eureka客户端
3.1 引入依赖
利用IDEA创建SpringBoot项目时引入 spring-boot-starter-web、spring-cloud-starter-netflix-eureka-client即可,我这里同时引入了devtools、lombok只是为了开发方便而已

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId>
<artifactId>consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging> <name>consumer</name>
<description>Demo project for Spring Boot</description> <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.SR1</spring-cloud.version>
</properties> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies> <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>
</dependencies>
</dependencyManagement> <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build> </project>
pom.xml
3.2 配置文件
需要配置应用名和应用端口、配置注册中心连接信息

3.4 启动Eureka客户端
在启动类上利用@EnableEurekaClient将Eureka客户端的相关配置引入到应用容器中

3.5 启动Eureka客户端
Eureka客户端启动成功后就可以在Eureka服务端的控制页面看到注册成功的服务信息,例如

4 创建ConfigServer
技巧01:ConfigServer也是一个Eureka客户端,同样需要向Eureka服务端进行注册;只不过这个服务专门负责管理一些配置文件
4.1 引入依赖
利用IDEA创建SpringBoot项目时引入 spring-cloud-starter-netflix-eureka-client 、spring-cloud-config-server 依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId>
<artifactId>config</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging> <name>config</name>
<description>Demo project for Spring Boot</description> <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.SR1</spring-cloud.version>
</properties> <dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies> <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>
</dependencies>
</dependencyManagement> <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build> </project>
pom.xml
4.2 配置文件
需要配置应用端口、应用名、服务注册中心、远程代码仓库

4.3 引入默认配置
利用@EnableEurekaClient将Eureka客户端的默认配置引入到应用容器中,利用@EnableConfigServer将配置中心的的默认配置引入到应用容器中

4.4 启动配置中心应用
技巧01:启动成功后可以在Eureka的控制面板中查看到相关的服务注册信息,例如

4.5 查看远程仓库中的配置信息
技巧01:配置服务中心启动时会暴露一些URL,可以利用这些URL访问远程仓库中的配置文件信息,例如

4.5.1 访问规则说明
/{name}-{profiles} -> /配置文件-环境
/{label}/{name}-{profiles} -> /git分支/配置文件-环境
技巧01:以上两种格式都同时支持 yml、json、properties三种数据格式
4.5.2 git仓库配置文件命名

4.5.3 通过配置中心访问指定的配置文件信息
技巧01:访问任何一个consumer-xxx.yml 的配置文件时都会和 consumer.yml 进行整合;可以将consumer.yml作为共有配置的存放文件
技巧02:使用 /{name}-{profiles} 访问时默认访问master分支,可以在配置中心的配置文件中指定使用哪一个分支



4.6 配置本地仓库路径和远程仓库分支
技巧01:配置中心服务从远程仓库获取到配置文件后会存放到本地的一个默认目录,可以在配置中心服务的配置文件中配置这个本地仓库地址
技巧02:配置中心配置远程仓库地址信息时可以指定使用远程仓库的哪一个分支;如果配置了分支后再使用 /{name}-{profiles} 这种格式获取配置文件信息时就会返回配置分支中的配置文件信息;当然亦可以使用 /label/ /{name}-{profiles} 这种格式访问指定分支的配置文件信息

5 配置中心客户端
技巧01:需要从配置中心服务获取配置信息的服务都可叫作配置中心客户端
5.1 引入依赖
修改第三节的Eureka客户端,只需要再引入 spring-cloud-config-client 即可
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-client</artifactId>
</dependency>
5.2 修改配置
将原有的配置全部剪切到远程仓库中对应的consumer.yml配置文件中,并将这个cnsumer.yml多复制几份并制定环境

5.3 配置启动配置文件
场景:config是服务配置中心、consumer是一个需要从config服务中获取配置信息的服务、eureka是服务注册中心
技巧01:config和consumer都必须在eureka中心注册,consumer是通过eureka从config中获取服务的;所以不能直接将配置中心的连接信息配置到application.yml中,而是需要新建一个启动配置文件bootsttap.yml,需要将应用名、配置中心信息、注册中心信息中心配置到bootstrap.yml中
技巧02:在bootstrap.yml中配置的应用名必须和远程仓库中的配置文件保持一致,因为需要通过应用名到配置中心去获取该应用的配置信息

5.4 启动consumer服务
技巧01:启动consumer服务时控制台会打印出配置中心的信息,例如

5.4 使用远程git中的配置文件
技巧01:和使用在 application.yml 中配置的信息一样,例如


5.5 高可用配置中心搭建
将配置中心打包后分别部署就可以啦,版案例利用IDEA通过不同端口启动实现

启动了两个配置中心后,多次重启consumer服务时就会从不同的配置中心获取数据,例如

6 整合消息中线
说明:虽然consumer可以通过配置中心获取到远程仓库中的配置信息,但是我们修改远程仓库中的配置文件时并不能生效;想用时远程仓库的配置生效我们必须一起重启config服务和consumer服务;如果不想通过从前来实现的话就需要使用消息总线来实现。
6.1 集成消息总线
6.1.1 安装RabbitMQ
rabbitMQ控制台

6.1.2 添加依赖
分别在consumer和config服务中添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
6.1.3 添加RabbitMQ配置
技巧01:consumer服务可以配置到远程服务的consumer.yml文件中
技巧02:config服务必须在application.yml中进行配置

6.1.4 配置config服务
开启config服务的所有映射端口,想要让修改远程仓库中的仓库生效,在修改后必须向config服务发送一个post请求,请求路径为: /actuator/bus-refresh

6.1.5 添加@RefreshScope
在用到了远程配置的类级别添加@RefreshScope注解,否则修改远程仓库后及时向config的 /actuator/bus-refresh 发送了post请求也不会进行更新

6.1.6 启动config和consumer服务
启动服务后会自动在RabbitMQ中创建每个服务各自的queue,和一个springcloudbus对应exchange


6.1.7 修改刷新
》修改远程仓库的配置信息,修改后通过config可以获取到最新的配置,但是其他服务不会拿到配置;这时ocnfig服务必须触发一个事件将配置更新放到总线队列中去
》想config服务的 /actuator/bus-refresh 发送一个post请求就可以让consumer服务也获取到最新的配置信息
6.1.8 利用远程仓库向config服务的 /actuator/bus-refresh 发送POST请求
》利用natapp在远程仓库配置webhooks

》在config服务中引入依赖(如果不引入这个依赖就不会自动刷新,必须手动向config服务发送post请求才能实现动态刷新)
<!--自己添加的依赖:解决了利用github+rabbitmq实现配置动态刷新的功能-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-monitor</artifactId>
</dependency>
》修改仓库配置信息并提交后config控制台会输出日志信息,同时rabbitMQ中也会出现消息的推送和订阅
7 本博文源代码

SpringCloud04 服务配置中心、消息总线、远程配置动态刷新的更多相关文章
- [转]springcloud(九):配置中心和消息总线(配置中心终结版)
https://www.cnblogs.com/ityouknow/p/6931958.html springcloud(九):配置中心和消息总线(配置中心终结版) 我们在springcloud(七) ...
- kubernetes实战-配置中心(三)配置服务使用apollo配置中心
使用配置中心,需要开发对代码进行调整,将一些配置,通过变量的形式配置到apollo中,服务通过配置中心来获取具体的配置 在配置中心修改新增如下配置: 项目信息: 配置: 重新打包镜像,使用apollo ...
- Spring Cloud(七):配置中心(Git 版与动态刷新)【Finchley 版】
Spring Cloud(七):配置中心(Git 版与动态刷新)[Finchley 版] 发表于 2018-04-19 | 更新于 2018-04-24 | Spring Cloud Confi ...
- springcloud(九):配置中心和消息总线(配置中心终结版)
我们在springcloud(七):配置中心svn示例和refresh中讲到,如果需要客户端获取到最新的配置信息需要执行refresh,我们可以利用webhook的机制每次提交代码发送请求来刷新客户端 ...
- SpringCloud基于消息总线的配置中心
@https://www.cnblogs.com/ityouknow/p/6931958.html Spring Cloud Bus Spring cloud bus通过轻量消息代理连接各个分布的节点 ...
- spring cloud深入学习(十)-----配置中心和消息总线(配置中心终结版)
如果需要客户端获取到最新的配置信息需要执行refresh,我们可以利用webhook的机制每次提交代码发送请求来刷新客户端,当客户端越来越多的时候,需要每个客户端都执行一遍,这种方案就不太适合了.使用 ...
- SpringCloud的分布式配置及消息总线
1.在搭建分布式配置时,我们大概看下分布式配置的流程 如图所示: 当一个系统中的配置文件发生改变的时候,我们需要重新启动该服务,才能使得新的配置文件生效,spring cloud config可以实现 ...
- SpringCloud学习之Bus消息总线实现配置自动刷新(九)
前面两篇文章我们聊了Spring Cloud Config配置中心,当我们在更新github上面的配置以后,如果想要获取到最新的配置,需要手动刷新或者利用webhook的机制每次提交代码发送请求来刷新 ...
- zookeeper配置中心实战--solrcloud zookeeper配置中心原理及源码分析
程序的发展,需要引入集中配置: 随着程序功能的日益复杂,程序的配置日益增多:各种功能的开关.参数的配置.服务器的地址…… 并且对配置的期望也越来越高,配置修改后实时生效,灰度发布,分环境.分集群管理配 ...
- Java配置分离之Spring远程配置
访问我的博客 前言 集群应用的配置文件如果写在项目的 resources 目录下面,当遇到需要修改某一个配置值时,需要将集群的所有应用的配置信息进行修改,并且将机密的配置信息比如数据库账号密码如果不进 ...
随机推荐
- php+ajax+jquery 定时刷新页面数据
testajax.php <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http: ...
- 关于CSS单位:rem vh vw vmin vmax
rem(root em) 如果你给body设置了font-size字体大小,那么body的任何子元素的1em就是等于body设置的font-size demo: body { font-size: ...
- xunsearch之php索引维护(四)
1.添加文档 $xs = new XS('njw'); $index = $xs->index; $data = array( 'pid' => 234, // 此字段为主键,必须指定 ' ...
- 轻量级封装DbUtils&Mybatis之一概要
Why 一时兴起,自以为是的对Jdbc访问框架做了一个简单的摸底,近期主要采用Mybatis,之前也有不少采用Dbutils,因此希望能让这两个框架折腾的更好用. DbUtils:非常简单的Jdbc访 ...
- 简述FPGA项目之前的一些事
FPGA的设计是一个系统工程,是一种道,会编程会仿真会调试可能更多是一种术.很多这方面的书籍,写什么自顶向下之类的很多,还是停留在方法学上,而对于一个公司的项目来说,FPGA的设计是从立项开始的. 拿 ...
- Linux系统性能检测
转自:http://www.cnblogs.com/itech/archive/2011/06/08/2075145.html 一 .uptime uptime命令用于查看服务器运行了多长时间以及有多 ...
- Docker for windows 7 - 加载 docker images
背景 由于之前一直是在 Linux 上面跑,所以对于docker for windows 部分不是很熟. 由于我们的合作伙伴需要在windows 上面跑我们的docker image, 所以在自己的w ...
- canvas之旋转一条线段
<canvas id="canvas" width="600" height="500" style="background ...
- Error: listen EACCES 0.0.0.0:8080 错误解决记录
live-server -- 热加载利器 实现本地服务器,可及时刷新. 1.通过npm install -g live-server进行安装 2.npm init 初始化项目3.在所需要的文件夹内运行 ...
- HTTP之Tcp/Ip协议的工作原理
计算机与网络设备要相互通信,双方就必须基于相同的方法.比如,如何探测到通信目标.由哪一边先发起通信.使用哪种语言进行通信.怎样结束通信等规则都需要事先确定.不同的硬件.操作系统之间的通信,所有的这一切 ...