一,Spring Cloud Config
示意图
git仓库
示例: config-repo 各位同学要创建自己的repo。
创建步骤简要描述:
- 创建仓库
- 创建文件夹
- 在文件夹中创建 user-dev.yml文件
- 回到仓库首页,点击管理
- 在管理页面下方找到开源选项并选中
- 提交后即可访问
二,Config服务端配置
新建config项目
添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
入口类加注解
@EnableConfigServer
配置文件添加
spring:
cloud:
config:
server:
git: #配置存储信息的Git仓库
#username: xxx
#password: 123456
uri: https://gitee.com/nixf/config-repo.git # 仓库地址
clone-on-start: true # 启动时直接从gitee获取数据
search-paths: unit_5 # 搜索目录
default-label: master # 默认的分支
label: master #分支信息
测试
测试config服务器配置是否生效,以如下所示格式访问
http://localhost:8888/application_name/profile/branch_name
application_name: 指应用的注册名 profile: 环境(dev,test,product) branch_name: git分支名
以我们创建git仓库时建的文件user-dev.yml为例,对它的内容访问路径为:
http:localhost:8888/user/dev/master
可以在user-dev.yml中添加内容后再查看效果。
三,客户端配置
添加依赖
<!--此jar包会读取bootstrap.yml,给应用使用config服务的机会 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
<version>3.1.1</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-client</artifactId>
</dependency>
新建bootstrap.yml
server:
port: 9092 #修改为你安排的端口
spring:
application:
name: message # 修改为你应用的注册名
cloud:
config:
profile: dev # 指定开发环境,还可以是test product等。
label: master # git分支
uri: http://localhost:8888 #config 服务地址
name: user #当前应用名,用于匹配git内的配置文件
演示对git中配置文件定义的属性的访问。
//(6-1)
@RestController
@RefreshScope
public class ConfigController {
//读取配置中的值,此值只在git内有
@Value("${my-name}")
private String myName;
@GetMapping("/my-name")
public String getConfigName() {
return myName;
}
}
刷新
刷新需要使用actuator的refresh端口。 http://localhost:8888/actuator/refresh
添加actuator依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
同时打开refresh端口
management:
endpoints:
web:
exposure:
include: 'refresh'
也可以打开全部端口:
management:
endpoints:
web:
exposure:
include: '*'
@RefreshScope
注意上面例子(6-1)的@RefreshScope注解,它对于使用自定义变量在通过接口通知后自动刷新本地变量至关重要。
四,config 高可用
配置config高可用后,就不能再指定一个url路径了,需要使用eureka的帮助自动匹配服务地址。
cloud:
config:
profile: dev
lable: master
# uri: http://localhost:8888
name: user
discovery: # 启用自动寻址
enabled: true # 打开为TRUE
service-id: config # config的服务ID--即eureka的注册名
eureka:
instance:
prefer-ip-address: true
ip-address: 127.0.0.1
# instance-id: user
client:
register-with-eureka: true # 注册到eureka
fetch_registry: true #从服务器获取注册信息
service-url:
defaultZone: http://localhost:8761/eureka/ # 注册中心地址
五,Spring Cloud Bus
Spring Cloud Bus需要使用RabbitMQ帮助。 参见 Rabbit安装
RabbitMQ的相关概念
- Broker 消息队列服务
- Connection publisher 和 consumer 与broker的tcp连接
- Channel 逻辑连接
- Exchange 分发消息 p2p topic multicast/fanout
- Queue 真正的消息队列
- Binding exchange和queue之间的虚拟连接
MQ通用概念:
graph LR Publisher --发送消息--> Broker Broker --推消息--> Receiver Receiver --拉消息--> Broker
Config服务和Config客户端接入Spring Cloud Bus后,我们可以只通知Config服务更新配置,即可实现所有的客户端都自动更新配置的目的。 步骤如下:
config server配置
服务端需要接入rammbitMQ,所以增加以下依赖:
<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>
同时,配置文件中添加rabbitMQ的配置。同时打开bus-refresh端口,通过此端口通知Config服务刷新配置。
spring:
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
management:
endpoints:
web:
exposure:
include: 'bus-refresh' # config服务端开发端口,通过post访问
config client配置
Config 客户端也需要接入RabbitMQ。添加依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
添加配置文件:
spring:
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
测试
更改git的配置后,使用Post方法调用 http://localhost:8888/actuator/bus-refresh 即可更新所有通过bus链接到config服务的配置。
六,Config服务器安全
引进安全jar包:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
设置服务的用户名和密码:
spring:
application:
name: config
security:
user:
name: admin
password: 123456
放开刷新接口的访问:
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().anyRequest()
.authenticated()
.and().httpBasic().and().csrf().disable();
}
}
客户端添加安全配置:
cloud:
config: # house-dev.yml
profile: dev # 指定开发环境,还可以是test product等。
label: master # git分支
# uri: http://localhost:8888 #config 服务地址
name: house #当前应用名,用于匹配git内的配置文件
discovery: # 启用自动寻址
enabled: true # 打开为TRUE
service-id: config # config的服务ID--即eureka的注册名
username: admin
password: 123456
使用Postman刷新: