本文基于前面的文章eureka-server的实现。
参考
- eureka-server
在分布式系统中,由于服务数量巨多,为了方便服务配置文件统一管理,所以需要分布式配置中心组件。Spring Cloud Config为分布式系统中的外部化配置提供服务器和客户端支持。
本篇涉及项目的结构为一个Config Server单机模式和适用于链接Git仓库,一个Config Client通过server来展示配置文件数据。 同时使用两个bus来模拟配置文件刷新。
Config-server功能
用于外部配置的http,基于资源的api 加密和解密属性 使用可嵌入spring boot的应用程序至此,一个单机本地config-server就搭建完成
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/客户端从服务端获取资源配置的路径规则:
- /{application}/{profile}[/{label}]
- /{application}-{profile}.yml
- /{label}/{application}-{profile}.yml
- /{application}-{profile}.properties
- /{label}/{application}-{profile}.properties
本文采用第二种规则。
配置内容:
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目录下。
在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配置方式
基于RabbitMQ动态刷新 原生刷新(伪动态刷新)本文采用比较简单的原生刷新方式。
此方式同时还要修改@Value注解内容为@Value("${info:error}"),因为刷新的时候需要配置信息有默认值,否则会报错。
访问http://localhost:5301/config/info,看服务是否可以正常访问。
然后可以修改git资源仓库中的配置信息。
通过post访问:http://localhost:5301/actuator/refresh,显示如下: 刷新http://localhost:5301/config/info,结果显示:证明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仓库的配置的调用以及配置信息的简单的动态更新。
------
《Srping Cloud 2.X小白教程》目录 spring cloud 2.x版本 Eureka Server服务注册中心教程 spring cloud 2.x版本 Eureka Client服务提供者教程 spring cloud 2.x版本 Ribbon服务发现教程(内含集成Hystrix熔断机制) spring cloud 2.x版本 Feign服务发现教程(内含集成Hystrix熔断机制) spring cloud 2.x版本 Zuul路由网关教程 spring cloud 2.x版本 config分布式配置中心教程 spring cloud 2.x版本 Hystrix Dashboard断路器教程------转载请注明出处,
联系方式:4272231@163.com