为什么需要统一配置中心config
◆不方便维护(多个开发者修改同一个配置文件)
◆配置内容安全与权限
◆更新配置项目需重启。
首先,在IDEA中通过Spring Initializr选择Spring Cloud Discovery 中的Eureka Discovery Client 组件,创建一个Spring Boot项目,添加pom依赖在主类添加@EnableEurekaClient注解,在application.yml中添加相应配置。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-Config—Server</artifactId>
</dependency>
config中的application.yml
spring:
application:
name:config
cloud:
config:
server:
git:
uri: https://github.com/xxxx/xxxx
username: xxx
password: xxx
basedir: /user/a/b/c/ #本地Git存放配置的路径
spring:
application:
name: order
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
env:
dev #test
lable:
release
访问 locahost:8080/{name}-{profiles}.yml或 locahost:8080/{label}/{name}-{profiles}.yml
其中,name表示服务名,profiles环境,label分支(branch)默认为master
输入locahost:8080/release/order-dev.yml即可访问上述配置文件;
若无环境信息,则order-a或order-b.yml都可,但不能为空;
也可.json或.properties,则可自动转换格式显示在浏览器上;
若Git工程上yml文件格式错误则访问报错。
spring:
application:
name: order #通过这两个找到自己的配置
cloud:
config:
discovery:
enabled: true
service-id: CONFIG
profile: dev #通过这两个找到自己的配置
必须修改yml文件名为bootstrap.yml,否则系统自动寻找application.yml而报错,bootstrap.yml则可以引导系统从Git上pull相应配置
@RestController
@RequestMapping("/env")
public class EnvController {
@Value("${env}")
private String env;
@GetMapping("/print")
public String print() {
return env;
}
}
启动项目,发现已获取远端git上的配置,项目正常运行
修改Eureka-Server的端口地址为8762,也修改Config和order远端git的注册地址为8762,发现启动报错,且只有config注册在了注册中心上,是由于order默认注册在8761注册中心上,其还未注册在注册中心8762上,就无法访问到config,从而无法pull到配置。
解决方法:如若不使用默认的8761地址,就将注册地址的配置写在bootstrap.yml
注意:上述两个重要参数起到的作用等用于locahost:8080/release/order-dev.yml,而如此访问的话config默认是将远端的order.yml与order-dev.yml合并后展示;一般将order-dev.yml、order-test.yml等公用部分放在order.yml中。
实现了Spring Cloud Bus组件和config组件的服务,在更新了远程配置后,会通过bus-refresh接口通知消息队列MQ,再由消息队列通知订阅的服务。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
启动后,可在eureka中看到注册的两个服务,可在MQ看到生成的两个消息队列
config服务的application.yml添加
management:
endpoints:
web:
expose: "*"
修改远程order配置内容,然后访问localhost:8080/actuator/bus-refresh,config服务发布消息给消息队列(在MQ中的config队列中可看到一个向上的小三角)。
在order服务的测试配置的EnvController上添加@RefreshScope,即可看到更新后的配置内容。
在远程git上添加配置
girl:
name: xxx
age: 18
在order服务中新建GirlConfig类
@Data
@Component
@ConfigurationProperties("girl")
@RefreshScope
public class GirlConfig {
private String name;
private Integer age;
}
新建GirlController
@RestController
public class GirlController {
@Autowired
private GirlConfig girlConfig;
@GetMapping("/girl/print")
public String print() {
return "name:" + girlConfig.getName() + " age:" + girlConfig.getAge();
}
}
修改远程order配置内容,然后访问localhost:8080/actuator/bus-refresh,再访问localhost:8080/girl/print,即可看到更新后的内容。
一般git管理工具都自带WebHook工具,将在push代码即更新的时候将自动触发bus-refresh接口,无须每次手动访问,真正实现全自动配置。
在GitHub上配置的路由是localhost:8080/monitor,其中可以用内网穿透工具nateapp,映射在本地网址,即http://5a38i8.natappfree.cc/monitor