一、序
上篇文章配置好了Eureka服务注册中心,接下来需要搭建分布式配置中,这里想的是最基础的配置文件直接在各模块中写好,其他的一些扩展配置直接放在github上,这样可以实现动态的加载而不需要重启项目,要实现动态的加载就需要用到Spring Cloud Bus来实现消息的传递。这里使用RabbitMQ来作为消息队列。而对于rabbitMQ的配置可以放在github上,实现动态加载。
二、具体搭建
(一)configserver
首先是新建项目configserver,引入以下包:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</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.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
接下来是在yml中配置:
spring:
application:
name: config-server
cloud:
config:
server:
git:
uri: https://gitee.com/ZhongWanYuXi/hfz-config
search-paths: release
username: name
password: pass
label: master
rabbitmq:
host: ip地址
port: 5672
username: name
password: pwd
server:
port: 8888
eureka:
client:
serviceUrl:
defaultZone: http://${security.user.name}:${security.user.password}@${eureka.instance.hostname}/eureka/
instance:
ip-address: IP
prefer-ip-address: true
security:
basic:
enabled: true
user:
name: name
password: pwd
这里无论是注册中心还是configserver都添加了密码,可以根据自己的需求修改密码,rabbitmq的ip地址也需要改成自己的地址,在spring.cloud.config.server.git.uri后面改为自己的地址即可。eureka.instance.ip-address后写上自己的IP地址,在部署到服务器上时需要根据自己服务器上的公网IP来设置,不然后出现在注册中心通过名字无法访问的情况。
(二)configClient
接下来通过配置一个客户端来读取配置中心的文件实现动态更新。pom文件内容如下:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
<version>RELEASE</version>
</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-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
其中有些包是后面要用到的断路器和链路追踪,接下来是yml文件,需要说明的是需要新建一个bootstrap.yml,项目启动时会优先加载bootstrap.yml中的配置内容,如果还是使用application.yml,就可能会出现无法读取配置内容的情况,因为默认的配置中心地址是localhost:8888,之前遇到一个坑就是在本地测试成功,但是将configserver部署到服务器上时就报错,找了好久,最后发现是配置文件的问题。bootstrap.yml内容如下:
eureka:
client:
serviceUrl:
defaultZone: http:// \${security.user.name}:\${security.user.password}@${eureka.instance.hostname}/eureka/
instance:
ip-address: ip地址
prefer-ip-address: true
spring:
application:
name: server-hi
cloud:
config:
discovery:
enabled: true
service-id: CONFIG-SERVER
label: master
profile: dev
name: name
username: name
password: pass
server:
port: 8763
在spring.cloud.config.name 和spring.cloud.config.profile配置读取的文件名字,username和password设置在configserver中配置的密码。
spring.cloud.config.server.git.uri:配置git仓库地址
spring.cloud.config.server.git.searchPaths:配置仓库路径
spring.cloud.config.label:配置仓库的分支
spring.cloud.config.server.git.username:访问git仓库的用户名
spring.cloud.config.server.git.password:访问git仓库的用户密码
http请求地址和资源文件映射如下:
/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
然后可以通过localhost:8763测试,测试动态刷新可以先更改github上文件内容然后访问http://localhost:8763/bus/refresh刷新,在需要刷新的文件上需要加上@RefreshScope注解才能刷新,否则不会生效。