第一部分
Bus:消息总线
主要内容
1.消息总线简介
2.基于消息总线实现全局热刷新
一.消息总线简介
1.什么是Spring Cloud Bus
Soring Cloud Bus继承了市面上常见的RabbitMQ和Kafka等消息代理.其会连接微服务系统值所有拥有Bus总线机制的节点,当有数据变更的时候,会通过消息中间件使用消息广播的方式通知所有的微服务节点同步更新数据.(如:微服务配置更新等)
二.基于消息总线实现热刷新
基于Bus消息总线热刷新功能,需要在所有的Eureka Client端应用中增加spring-cloud-starter-bus-amqp依赖,这个依赖是消息总线集成的RabbitMQ消息同步组件.此启动器包括actuator启动器(spring-boot-starter-actuator,基于消息总线的热刷新同样是通过actuator实现的)
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
1.设计方案
1.1Client端热刷新实现-结构图
1.2Server端热刷新实现-结构图
2.配置文件
在所有的Eureka Client工程配置文件中增加下述配置:
spring:
rabbitmq:
host:192.168.232.132
username: bjsxt
password: bjsxt
management:
endpoints:
enabled-by-default: true
web:
exposure:
include: '*'
3.测试热刷新
消息总线Bus基于Actuator对外提供了热刷新服务,服务地址是:http://ip:port/actuator/bus-refresh.此服务只能使用POST方式请求,可以使用Postman测试
第二部分
Config:分布式配置中心
主要内容
1.分布式配置中心简介
2.在Gitee中创建配置文件
3.新建Config Server
4.搭建Config Client
5.热刷新
一.分布式配置中心简介
1.为什么使用Spring Cloud Config
在常规的开发中,每个微服务都包含代码和配置.器配置包含服务配置,各类开关和业务配置.如果系统结构中的微服务节点较少,Nemo常规的代码+配置的开发方式足以解决问题.当系统逐步迭代,器微服务会越来越复杂,慢慢演化成网状依赖结构,这个时候常规的代码+配置的开发方式就并不合适了,因为还要考虑整体系统的扩展性,伸缩性和耦合性等.这些问题中,配置的管理也是非常麻烦的.
如果还是以常规开发形式管理配置,则要承担反复修改编译代码,重启系统,重新打包等风险.所以,一个可以集中管理,带有版本控制的配置中心应运而生
Spring Cloud Config就是一个分布式配置中心解决方案.其采用集中式管理每个微服务的配置信息,并使用GIT等版本仓库统一存储配置内容,实现版本化管理控制
2.优点(能做什么)
提供服务端和客户端支持(spring cloud config server和spring cloud config client)
集中式管理分布环境中的配置信息(所有配置文件统一放在了gitee中)
基于spring环境提供配置管理,与spring系列框架无缝结合
可用于任何语言开发环境,基于http协议
默认基于GIT仓库实现版本控制
3.总体架构
本课程中以gitee作为远程仓库.也可以使用其他git支持的远程仓库
角色说明,在Spring Cloud Config中包含两个角色:
Spring Cloud Config Server:负责接收Config Client请求,根据请求从Gitee中获取到配置文件
Spring Cloud Config Client:之前所写的包含配置文件的项目都是Config Client
流程如下:
需要把项目的配置文件上传到Gitee中.(此次直接在gitee进行在线编写配置文件,省去使用git上传配置文件到gitee的过程)
Config Client通过Rest访问Config Server,Config Server在去访问Gitee
二.在Gitee中创建配置文件
配置文件可以在本地创建后使用git上传.在学习过程中更加简单的方式是直接在gitee中创建文件,编辑内容
1.新建仓库
仓库名称自己起.实例中仓库名字为config
是否生成readme文件对于Spring Cloud Config没有影响
仓库是public还是private也没有影响.示例中使用public演示
点击创建按钮即可创建一个仓库
2.新建配置文件
编写内容如下:文件名为bjsxt.yml
3.新建带有profile的配置文件
配置中心支持Spring Boot文件格式:文件名-profile.yml.其中profile代表环境,支持完全自定义.常用的有dev,test等
三.搭建Config Server
Config Server主要的任务是从Git(远程或本地仓库)获取到配置文件,Config Client通过REST获取到配置文件的内容
可以使用刚刚搭建好的Gitee上的仓库进行使用
1.添加依赖
如果只是访问远程git仓库,对外暴露url的功能,只需要天啊及spring-cloud-config-server依赖(包含了spring-boot-starter-web)
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.5.RELEASE</version>
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactid>
</dependency>
</dependencies>
2.编写配置文件
此处要注意,先进bootstrap.yml配置文件,该配置文件是Spring Cloud提供的一个专门加载外部资源的配置文件.该配置文件应该在classpath中(resource).加载顺序高于application.yml配置文件.但是application.yml配置文件中内容会覆盖bootstrap.yml中内容
使用SpringCloudConfig配置中心时,需要在bootstrap配置文件中添加链接到配置中心的配置属性来加载外部配置中心的配置信息
spring:
application:
name: config-server-demo
cloud:
config:
server:
git:
uri: https://gitee.com/kelvin_bjsxt/config.git
# username:公开仓库不需要配置
# password:公开仓库不需要配置
server:
port: 9001
3.新建启动类
先进启动类com.bjsxt.ConfigServerApplication
@SpringBootApplication
@EnableConfigServer
public class ConfigServerApplication{
public static void main(String[] args){
SpringApplication.run(ConfigServerApplication.class,args);
}
}
4.访问测试
说明:配置文件结构name-profile.yml.例如:application-redis.yml.其中application是bane,redis是profile
在浏览器地址栏输入http://config-server的ip:config-server端口/name/profile/label进行访问
其中master为默认分支,如果没有新建分支,master为默认分支名(主分支).但是如果访问的是不带proflie的配置文件,master就不能省略.如果访问的是带有profile的配置文件master可以省略.省略后返回json字符串中label属性为null,正常应该为master.
localhost:9001/bjsxt/master 出现下面结果
localhost:9001/bjsxt/test/master
四.搭建Config Client
Config Client对应Spring Cloud Config是客户端,对于Eureka来说可以是Application Server也可以是Application Client,实例中没有想Eureka注册,但要知道在现有代码基础上添加Eureka配置即可
实例代码加载gitee中的bjsxt-test.yml文件进行举例.如果加载到里面my.content表示加载成功
新建项目ConfigClientDemo
1.编写pom.xml
<parent>
<groupId>org/springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.5.RELEASE</version>
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
2.新建配置文件
新建bootstrap.yml
spring.cloud.config中
uri:Config Server访问url.默认值http://localhost:8888
name:gitee中配置文件名称.name-profile.yml中name
profile:配置文件的profile.name-profile.yml中profile,默认值default.如果服务端有一个name-default.yml文件会加载此文件,不在加载name.yml.可以通过配置profile:""形式让其加载name.yml
label:分支,默认master
spring:
cloud:
name: bjsxt
uri: http://localhost:9001/
# local:master
profile: test
3.新建启动类
新建com.bjsxt.ConfigClientApplication
@SpringBootApplication
public class ConfigApplication{
public static void main(String[] args){
SpringApplication.run(ConfigClientApplication.class,args);
}
}
4.新建service及实现类
新建com.bjsxt.service.DemoService
public interface DemoService{
String demo();
}
@Service
public class DemoServiceImpl implements DemoService{
@Value("${my.controller}")
private String content;
@Override
public String demo(){
return content;
}
}
5.新建控制器
新建com.bjsxt.controller.DemoController
@Controller
public class DemoController{
@Autowired
private DemoService demoService;
@RequestMapping("/demo")
@ResponseBody
public String demo(){
return demoService.demo();
}
}
6.访问项目,观察结果
在浏览器地址访问:http://localhost:8080/demo
观察结果是否打印:bjsxt-test
五.热刷新
Config-client客户端服务应用,在启动的时候,会根据bootstrap配置内容远程访问config-server,获取当时的最新的配置内容.如果config-client运行过程中,GIT仓库中的配置内容发生变更,config-client不会自动的加载刷新配置内容.需要人为干预,重启服务,一定会刷新配置.但是重启服务代价太高.这时就可以使用热刷新
热刷新指的是服务不重启,不间断对外提供服务,而是重新加载配置内容,初始化应用环境
因为SpringBoot只有在启动时才加载一次配置问阿金,所以gitee上配置文件修改了,项目也不会实时跟随变化.既然是SpringBoot的问题,可以使用SpringBoot提供的Actuator来实现刷新项目功能
就需要一阿里spring-boot-starter-actuator启动器来实现
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
需要在bootstrap.yml配置文件中增加配置
management:
endpoints:
web:
exposure:
include: refresh
在使用远程配置内容的类上(案例中的Service,放在controller
上无效)增加新注解
@RefreshScope
修改gitee中bjsxt-test.yml中内容,把bjsxt-test修改为bjsxt-test1
Acturtor的refresh需要使用post进行访问,借助postman实现
再次访问:http://localhost:8080/demo后发现浏览器打印效果变成bjsxt-test1了
六.结合Git使用
同学们可能已经返发现,如果直接在Gitee中新建配置文件,提示编译等功能都没有,出现编写错误的可能性比较大.如果我们可以在一个项目中把配置文件编写完成后在提交到远程git仓库的话,大大减少出错的概率,同时提升了开发效率
前提:在本机中安装git
演示时提供了两种方式:
1.使用终端git命令进行操作
2.使用IDEA可视化功能实现
1.新建项目
随意新建一个项目,此项目应该包含分布式配置中心管理项目的全部依赖.只有这样才能保证在当前项目中编写配置文件时有对应提示
在项目的resource下新建文件夹,文件夹的名称要和Gitee中仓库名称对应.实例中叫做testconfig.在testconfig下新建bjsxt-abc.yml的配置文件
2.使用终端git命令进行操作
2.1必须保证IDEA中已经加载GIT
菜单File->Settings->Version Control->Git选择Git安装路径.安装好git后重启IDEA即可自动加载本机GIT
2.2打开终端面板
如果没有Terminal面板可以在菜单View->Tools Windows->Terminal找到
默认路径是项目的根路径,此面板和CMD等效.里面写的是Windows命令
通过cd命令进入到testconfig目录中
2.3依次输入下面命令
强调:
要求仓库是没有readme.md.如果有的还需要进行pull操作
建议:
在gitee上新建不包含readme的仓库.按照仓库主页面命令提示进行操作
1.步骤一
初始化配置,会把信息写入到C:\Users\bjsxt\.gitconfig.只需要写一次.如果之前已经配置过,就不需要配置了
注意改成自己账号的信息
git config --global username "bjsxt"
git config --global user.email "1510403600@qq.com"
2.步骤二
初始化testconfig文件夹,生成git相关信息
git init
把配置问阿金天啊及到本地仓库
git add bjsxt-abc.yml
3.步骤三
添加提交信息
git commit -m "自己写提交信息"
设置远程地址.注意要把红色部分换成自己的
git remote add origin https://gitee.com/kelvin_bjsxt/testconfig3.git
提交远程仓库
git push -u origin master
3.直接使用IDEA操作
3.1添加本地仓库
修改配置文件bjsxt-abc.yml后,右键文件->Git->add添加到本地仓库
3.2提交
选择提交
在弹出框中进行操作
点击push按钮