本文是Spring Cloud专栏的第十篇文章,了解前九篇文章内容有助于更好的理解本文:
-
Spring Cloud第一篇 | Spring Cloud前言及其常用组件介绍概览
-
Spring Cloud第二篇 | 使用并认识Eureka注册中心
-
Spring Cloud第三篇 | 搭建高可用Eureka注册中心
-
Spring Cloud第四篇 | 客户端负载均衡Ribbon
-
Spring Cloud第五篇 | 服务熔断Hystrix
-
Spring Cloud第六篇 | Hystrix仪表盘监控Hystrix Dashboard
-
Spring Cloud第七篇 | 声明式服务调用Feign
-
Spring Cloud第八篇 | Hystrix集群监控Turbin
-
Spring Cloud第九篇 | 分布式服务跟踪Sleuth
一、介绍
系统流小说 wap.kuwx.netSpring Cloud Config是Spring Cloud团队创建的一个全新项目,用来为分布式系统中的基础设施和微服务应用提供集中化的外部配置支持,它分为服务端(config server)与客户端(config client)两个部分。其中服务端也称为分布式配置中心,它是一个独立的微服务应用,用来连接配置仓库并为客户端提供获取配置信息、加密/解密信息等访问接口,而客户端则是微服务架构中的各个微服务应用或基础设施,它们通过指定的配置中心来管理应用资源与业务相关的配置内容, 并在启动的时候从配置中心获取和加载配置信息。Spring Cloud Config实现了对服务端和客户端中环境变量和属性配置的抽象映射,所以它除了适用于Spring构建的应用程序之外, 也可以在任何其他语言运行的应用程序中使用。由于Spring Cloud Config实现的配置中心默认采用Git来存储配置信息,所以使用Spring Cloud Config构建的配置服务器,天然就支持对微服务应用配置信息的版本管理,并且可以通过Git客户端工具来方便地管理和访问配置内容。当然它也提供了对其他存储方式的支持,比如SVN仓库、本地化文件系统。
二、构建Config Server
1、添加依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency>
2、在启动类上添加注解@EnableConfigServer
3、在application.yml文件中添加配置
spring: application: name: springcloud-config-server cloud: config: server: git: #配置git仓库地址 uri: https://gitee.com/coding-farmer/config-center #配置仓库路径 search-paths: "{profile}" #访问git仓库的用户名 username: #访问git仓库的密码 password: #配置中心通过git从远程git库,有时本地的拷贝被污染, #这时配置中心无法从远程库更新本地配置,设置force-pull=true,则强制从远程库中更新本地库 force-pull: true #默认从git仓库克隆下载的在C:/Users/<当前用户>/AppData/Local/Temp #basedir: server: port: 8888
如果Git仓库为公开仓库,可以不填写用户名和密码,如果是私有仓库需要填写,本案例使用的是码云公开仓库。
4、配置中心仓库目录结构为:按环境拆分
远程码云仓库https://gitee.com/coding-farmer/config-center中有3个文件夹,分别是dev,prod,test,里面存放着相应环境的配置文件
5、测试返回数据
http请求地址和资源文件映射如下:
/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
此时启动我们的配置中心,通过/{application}/{profile}/[{label}]就能访问到我们的配置文件了,其中application表示配置文件的名字,对应我们上面的配置文件就是config;profile表示环境,我们有dev、test、prod还有默认,label表示分支,默认我们都是放在master分支上
访问:http://localhost:8888/configclient/dev,默认分支为master分支
如下图则证明配置服务中心可以从远程程序获取配置信息:
从浏览器上可以看到我们放在仓库中的配置文件信息。JSON中的name表示配置文件名application的部分,profiles表示环境部分,label表示分支,多了一个version,实际上就是我们码云上提交信息时产生的版本号,当我们访问成功后,我们还可以看到控制台打印了如下日志:
INFO 6600 --- [nio-8888-exec-1] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@5c4fca8a: startup date [Thu Aug 15 15:12:07 CST 2019]; root of context hierarchy
INFO 6600 --- [nio-8888-exec-1] o.s.c.c.s.e.NativeEnvironmentRepository : Adding property source: file:/C:/Users/Administrator/AppData/Local/Temp/config-repo-6372945341655107732/dev/configclient-dev.yml
INFO 6600 --- [nio-8888-exec-1] s.c.a.AnnotationConfigApplicationContext : Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@5c4fca8a: startup date [Thu Aug 15 15:12:07 CST 2019]; root of context hierarchy
实际上是配置中心通过git clone命令将配置文件在本地保存了一份,这样可以确保在git仓库挂掉的时候我们的应用还可以继续运行,当微服务A/B尝试去从Config Server中加载配置信息的时候,Config Server会先通过git clone命令克隆一份配置文件保存到本地,此时我们断掉网络,再访问http://localhost:8888/configclient/dev一样还可以拿到数据,此时的数据就是从本地获取的。
如果有两个前缀名相同文件,例如一个configclient.yml,一个configclient-dev.yml。那么在访问相同前缀的文件时,config-server会对这两个文件进行一个合并。例如configclient.yml有一段配置是configclient-dev.yml没有的,理应访问configclient-dev.yml的时候是没有那段配置的,但最终的访问的结果却是它俩合并之后的内容,即configclient-dev.yml会拥有configclient.yml里所配置的内容。
到此config server构建完成。
三、构建Config Client
Config Client也就是你的微服务应用例如(springcloud-service-consumer、springcloud-service-feign、springcloud-service-provider等等,这些模块相对于Config Server来说都是Config Client),但是为了保持其他案例模块的纯洁干净,这里就单独构建一个Config Client命名为:springcloud-config-client
1、引入依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-client</artifactId> </dependency>
2、新建bootstrap.yml
不了解bootstrap.yml可以参考,SpringCloud入门之常用的配置文件application.yml和 bootstrap.yml区别:https://www.cnblogs.com/BlogNetSpace/p/8469033.html
spring:
application:
name: springcloud-config-client
cloud:
config:
#uri则表示配置中心的地址
uri: http://localhost:8888
#注:config 客户端在没有 spring.cloud.config.name属性的时候,服务端{application} 获取的是客户端
#spring.application.name的值,否则,获取的是 spring.cloud.config.name的值。
#1)、当没有spring.cloud.config.name时,客户端获取的是spring.application.name 所对应的git库中的文件,并且只能获取一个文件
#2)、当一个项目中有需求要获取多个文件时,就需要用到spring.cloud.config.name这个属性,以逗号分割
name: configclient
profile: dev
#label对应了label部分
label: master
server:
port: 8881
3、编写Controller
@RestController public class MyController { //配置中心里面配置的env属性 @Value("${env}") private String env; @RequestMapping("/index") public String env(){ return env; } }
4、访问http://localhost:8881/index
四、安全保护
开发环境中我们的配置中心肯定是不能随随便便被人访问的,我们可以加上适当的保护机制,由于微服务是构建在Spring Boot之上,所以整合Spring Security是最方便的方式。
1、添加依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>
2、默认情况下,我们可以获得一个名为user的用户,并且在配置中心启动的时候,在日志中打印出该用户的随机密码
来源:CSDN
作者:胖子依然6
链接:https://blog.csdn.net/sinat_34560749/article/details/103643944