本文采用Spring cloud本文为2.1.8RELEASE,version=Greenwich.SR3
本文基于前面的文章eureka-server的实现。
参考
在分布式系统中,由于服务数量巨多,为了方便服务配置文件统一管理,所以需要分布式配置中心组件。Spring Cloud Config为分布式系统中的外部化配置提供服务器和客户端支持。
本篇涉及项目的结构为一个Config Server单机模式和适用于链接Git仓库,一个Config Client通过server来展示配置文件数据。 同时使用两个bus来模拟配置文件刷新。
Config-server功能
<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>
#加载本地文件配置 spring: application: name: config-server profiles: active: native #加载本地配置 cloud: config: server: native: #加载本地目录文件 search-locations: /Users/xxxx/config-server server: port: 13081 eureka: instance: hostname: eureka1.client.com lease-renewal-interval-in-seconds: 5 lease-expiration-duration-in-seconds: 10 client: service-url: defaultZone: http://eureka1.server.com:8701/eureka/,http://eureka2.server.com:8702/eureka/,http://eureka3.server.com:8703/eureka/
package spring.cloud.demo.configserver; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.config.server.EnableConfigServer; @EnableConfigServer @SpringBootApplication public class ConfigServerApplication { public static void main(String[] args) { SpringApplication.run(ConfigServerApplication.class, args); } }
至此,一个单机本地config-server就搭建完成
<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>
bootstrap.yml
spring: application: name: config-client cloud: config: label: master profile: dev fail-fast: true uri: http://localhost:13081 #通过域名访问配置中心服务端 discovery: enabled: true eureka: instance: hostname: eureka1.client.com lease-renewal-interval-in-seconds: 5 lease-expiration-duration-in-seconds: 10 client: service-url: defaultZone: http://eureka1.server.com:8701/eureka/,http://eureka2.server.com:8702/eureka/,http://eureka3.server.com:8703/eureka/
客户端从服务端获取资源配置的路径规则:
本文采用第二种规则。
配置内容:
spring: application: name: config-client server: port: 52601 eureka: instance: hostname: eureka1.client.com lease-renewal-interval-in-seconds: 5 lease-expiration-duration-in-seconds: 10 client: service-url: defaultZone: http://eureka1.server.com:8701/eureka/,http://eureka2.server.com:8702/eureka/,http://eureka3.server.com:8703/eureka/ info: local-config-client-dev
将新建的config-client-dev.yml放到config-server配置的/Users/xxxx/config-server目录下,如果config-server没有配置目录,默认使用resources目录下。
package spring.cloud.demo.configclient; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @EnableDiscoveryClient @SpringBootApplication public class ConfigClientApplication { public static void main(String[] args) { SpringApplication.run(ConfigClientApplication.class, args); } }
在config-client创建测试Controller:ConfigClientController
package spring.cloud.demo.configclient.controller; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * 测试是否能获取到配置信息的controller * @auther: maomao * @DateT: 2019-09-17 */ @RestController public class ConfigClientController { @Value("${info}") private String info; @RequestMapping("/config/info") public String info() { return info; } }
分别启动eureka-server、config-server、config-client。访问: http://localhost :52601/config/info,显示如下
证明本地配置文件已经生效。
修改config-server的application.yml配置文件:
##加载本地文件配置 #spring: # application: # name: config-server # profiles: # active: native #加载本地配置 # cloud: # config: # server: # native: #加载本地目录文件 # search-locations: /Users/fengfujie/config-server #加载远程git仓库资源文件 spring: application: name: config-server cloud: config: server: git: # 配置git仓库的地址 uri: https://github.com/fengfujie25/sping-cloud-config # git仓库的账号 username: xxxxxx # git仓库的密码 password: xxxxxx server: port: 13081 eureka: instance: hostname: eureka1.client.com lease-renewal-interval-in-seconds: 5 lease-expiration-duration-in-seconds: 10 client: service-url: defaultZone: http://eureka1.server.com:8701/eureka/,http://eureka2.server.com:8702/eureka/,http://eureka3.server.com:8703/eureka/
重新启动config-server服务。然后刷新 http://localhost :52601/config/info地址,显示如下
证明已经成功获取了远程git资源的配置信息。
以上配置都是通过域名访问的config-server,为了保证系统的高可用,因为生产环境的配置服务中心都是集群配置,所有客户端才通过服务名称来访问。
修改config-client的bootstrap.yml
spring: application: name: config-client cloud: config: label: master profile: dev fail-fast: true #uri: http://localhost:13081 #通过域名访问配置中心服务端 discovery: enabled: true service-id: config-server #通过服务访问配置中心服务端 eureka: instance: hostname: eureka1.client.com lease-renewal-interval-in-seconds: 5 lease-expiration-duration-in-seconds: 10 client: service-url: defaultZone: http://eureka1.server.com:8701/eureka/,http://eureka2.server.com:8702/eureka/,http://eureka3.server.com:8703/eureka/
spring.cloud.config.discovery.service-id:通过服务名称访问配置中心服务端
重新启动config-client.并访问 http://localhost :5301/config/info,显示结果同【2.2】则代表配置信息已生效,证明是通过服务名称访问的config-server.
至此,spring cloud集成config的配置就全部完成。但是存在一个问题,如果修改远程git仓库的资源配置,项目并不会刷新,所以配置信息是不生效的。
动态刷新config-serve配置方式
本文采用比较简单的原生刷新方式。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
package spring.cloud.demo.configclient.controller; 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; /** * @auther: maomao * @DateT: 2019-09-17 */ @RestController @RefreshScope public class ConfigClientController { @Value("${info:error}") private String info; @RequestMapping("/config/info") public String info() { return info; } }
此方式同时还要修改@Value注解内容为@Value("${info:error}"),因为刷新的时候需要配置信息有默认值,否则会报错。
访问 http://localhost :5301/config/info,看服务是否可以正常访问。
然后可以修改git资源仓库中的配置信息。
证明refresh已经生效。
此方式每次都需要手动刷新一下才行,比较麻烦。GitHub提供一种Webhooks方法可以实现不用每次手动刷新。
Payload URL: 触发后回调的URL
Content type: 数据格式,两种一般使用json
Secret: 用作给POST的Body加密的字符串,采用HMAC算法
Events: 触发的事件列表
事件类型 | 描述 |
---|---|
Just the push
event |
仓库有push的时候触发,默认事件 |
Send me everything | 派我来一切 |
Let me select individual events | 选择个别事件 |
这样我们就可以利用Webhook的机制去触发客户端的更新,但是当客户端越来越多的时候,Webhook机制也不够优雅,每次增加客户端都需要改动Webhook也不现实。
其实,Spring cloud给了我们更好的解决方案-spring cloud bus。
spring cloud bus后续更新。
本文简单的实现了config-server和config-client的单机和远程git仓库的配置的调用以及配置信息的简单的动态更新。
<center><font color=red>《Srping Cloud 2.X小白教程》目录</font></center>