版本说明:
springboot:2.5.4 springcloud:2020.0.3
这两个我用的都是现在最新版本的,如果你的版本较低,此教程可能不适用你,建议和我保持一致,然后再往下看
实现原理:
(盗一张别人的图,稍微修改了下,原理大概就是下面这样子)
简单说下整个流程:
1,git上配置文件发生变更,触发git上的webhook发送请POST请求到配置中心服务器,告诉配置中心配置文件被修改了
2,配置中心发送配置更新消息到消息总线
3,消息总线通知所有订阅的微服务,告诉他们配置文件被更新了
4,微服务收到消息之后请求配置中心,拉取最新的配置文件并完成更新
实现步骤:
配置中心客户端实现:
1,添加下方依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
2,创建bootstrap.yml配置文件,添加下方配置
spring:
application:
name: euraka-provider #服务名
#配置中心相关配置
cloud:
config:
discovery:
enabled: true
service-id: config-server #这里是配置中心服务名
profile: dev #这里是配置文件环境名,一般是dev,test,prod这些
label: master #这里是配置文件在git上的所在分支
#rabbitmq相关配置,这个用做消息总线发送消息通知
rabbitmq:
host: 192.168.109.132
username: admin
password: admin
server:
port: 8081
#注册中心相关配置
eureka:
client:
service-url:
default-zone: http://localhost:8761
instance:
prefer-ip-address: true
instance-id: ${spring.application.name}:${spring.cloud.client.ip-address}:${server.port}
#这里定义暴露actuator的那些接口,*代表暴露所有接口
management:
endpoints:
web:
exposure:
include: '*'
3,启动类上添加下方注解:
@EnableEurekaClient
至此配置中心客户端完成
配置中心服务端实现:
添加下方依赖:
<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.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-monitor</artifactId>
</dependency>
2,application.yml文件添加下方配置:(注意有些配置项内容需要自己去修改,如git的url和用户名密码等)
spring:
application:
name: config-server
#配置中心服务端git相关配置
cloud:
config:
server:
git:
uri: https://gitee.com/xxxx/xxxx.git 配置中心git仓库地址
username: git用户名
password: git密码
search-paths: / 配置文件在分支下的所在路径
#消息队列的配置
rabbitmq:
host: 192.168.109.132
username: admin
password: admin
#注册中心相关配置
eureka:
client:
service-url:
default-zone: http://localhost:8761/euraka
instance:
prefer-ip-address: true
instance-id: ${spring.application.name}:${spring.cloud.client.ip-address}:${server.port}
#应用的启动端口
server:
port: 8080
#设置暴露actuator的那些接口,*为暴露全部接口
management:
endpoints:
web:
exposure:
include: '*'
3,启动类上添加下方的注解:
@EnableEurekaClient @EnableConfigServer
至此,配置中心服务端搭建完成
测试效果:
1,在git的master分支上创建配置文件:euraka-provider-dev.yml
文件名中的:euraka-provider 是客户端的服务名
dev是profile的值
文件名称一定要按照这个规则去命名,否则会找不到
2,在配置文件里面加入配置项:
test: 90809809发送到发送到方式
3,配置webhook
我用的是gitee码云,配置路径:你的项目git仓库-》管理-》webhooks
进入后点击添加webhook,输入url http://配置中心外网地址/monitor?path=*后点直接点添加即可完成配置
(这里要注意的是,url是你的配置中心服务端的地址,且必须是外网地址 如果没有外网,可以使用内网映射来解决:推荐 ngrok ,免费,不推荐natapp,因为免费通道需要实名认证,容易泄露个人隐私)
4,在客户端新建controller测试获取配置
这里特别注意,一定要在类上加上@RefreshScope这个注解,只有加了这个注解才能刷新底下的配置
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RefreshScope
public class TestController {
@Value("${test}")
private String profile;
@RequestMapping("/getProfile")
public String getProfile() {
return profile;
}
}
5,使用postman请求上面的 getProfile接口
6,修改git上配置文件的test为:123456
7,重新请求上面的 getProfile接口,成功获取到最新的配置