SpringCloud Config是微服务架构中的微服务提供的集中化外部配置支持,配置服务器为各个不一样的微服务的全部环境提供一个中心化的外部配置。Config分为客户端和服务端两部分,服务端是分布式配置中心,是一个独立的微服务,用来链接配置服务器并为客户端提供获取配置信息,加密解密信息等访问接口。客户端则经过指定的配置中心来管理应用资源,以及与业务相关的配置内容,并在启动的时候从配置中心获取和加载信息配置服务默认采用git来存储配置信息。git
1,集中管理配置文件
2,不一样的环境不一样的配置,动态化的配置更新,分环境部署好比dev/test/prod/beta/release
3,运行期间动态调整配置,再也不须要在每一个服务部署的机器上编写配置文件,服务会向配置中心统一拉取配置本身的信息。
4,当配置发生变更的时候,服务再也不须要重启来感知自身配置的变化而且及时地应用新的配置。
5,将配置信息以Rest接口的形式暴露。github
1,建立Config服务端。添加依赖。web
<dependencies> <!--config server--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency> <!--common模块--> <dependency> <groupId>cn.izzer</groupId> <artifactId>cloud-api-common</artifactId> <version>1.0</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--监控--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!--eureka client--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
接下来是yml的配置,Config会默认加载github上的配置文件,但是目前在国内上GitHub的话仍是挺慢的,因此这里最好用码云,就不会受网络的限制。
2,建立配置仓库。
3,将仓库经过git clone到本地,将配置文件上传到码云。
4,在yml里面使用HTTPS或者SSH的方式引入仓库地址,这里我使用的是HTTPS。spring
server: port: 3344 spring: application: name: cloud-config-center cloud: config: server: git: uri: https://gitee.com/Yintianhao/SpringCloudConfigCenter.git search-paths: - SpringCloudConfigCenter username: Yintianhao(帐号) password: XXXXX(帐号密码) force-pull: true label: master eureka: client: service-url: defaultZone: http://localhost:7001/eureka
5,建立启动类。主要是须要注意加上@EnableConfigServer的注解。
6,测试是否可以经过localhost:3344正常访问git上的配置文件。bootstrap
http://localhost:3344/master/config-dev.yml master是分支,config-dev表示文件名,这里是指开发环境的配置文件,通常还有生产环境等等。
与application不一样的是bootstrap通常用来表示系统级的配置项,优先级比application高。SpringCloud会建立一个BootstrapContext,做为Spring应用的ApplicationContext的父上下文,初始化的时候,BootstrapContext负责从外部资源加载配置属性而且解析配置,这两个上下文共享一个从外部获取的Environment。Bootstrap的属性具备高优先级,默认状况下他们都不会被本地配置覆盖,Bootstrap context和Application Context有着不一样的约定,因此新增一个Bootstrap.yml文件,保证BootstrapContext和application Context配置的分离。api
依赖跟服务端不一样的地方主要是这里引用的是客户端的依赖。其他都和服务端差很少。服务器
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <dependency> <groupId>cn.izzer</groupId> <artifactId>cloud-api-common</artifactId> <version>1.0</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--监控--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!--eureka client--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <!--热部署--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
在这以后新建Bootstrap.yml文件。网络
# bootstrap.yml server: port: 3355 spring: application: name: config-client cloud: config: label: master name: config #配置文件名称 profile: dev #读取后缀名称 uri: http://localhost:3344 #配置中心地址 eureka: client: service-url: defaultZone: http://localhost:7001/eureka management: endpoints: web: exposure: include: "*"
启动类就不写了,在这以后,经过Controller层调用服务端的接口来得到配置信息。架构
@RestController @RefreshScope public class ConfigClientController { @Value("${config.info}") private String configInfo; @GetMapping("/configinfo") public String getConfigInfo(){ return configInfo; } }
进行简单的测试:
app
这里带来的问题就是客户端没法和同步更新服务端检测到的git上的配置信息的改变,因此须要配置动态刷新。这里就须要用到actuator的监控功能了,从而能够避免每次都须要重启客户端来同步服务端的配置信息。须要的配置信息就是上面yml文件中的最后的management节点中的内容。除此以外就是须要在controller层加入@RefreshScope的注解来开启刷新。可是这里我我的以为仍是有一点不方便,尽管这不须要重启客户端,可是与此同时又须要利用curl来发送post请求来激活刷新,若是客户端数量很少那还好,但若是在生产环境中有须要个客户端服务,那么这里的工做量也是不小的。我想应该后面会有相应的技术解决方案,以后学到了再把这个坑填上。
curl测试很简单。
在执行完这个命令以后就可使用动态刷新了。