Spring cloud Configuation作为SC的基础服务,在全局化配置和统一运维方面起着不可或缺的作用。相信在做Spring项目的时候也有过很多的配置,像是spring xml文件、.properties文件、或者其他类型的文件。在单机环境中我们一般就把相关配置在项目中,一般会有profile-dev、profile-test、profile-prod,三种配置,有时候也会有一些特殊场景下的配置,这里就不罗列。在分布式的环境中,市面上也有很多开源的优秀的解决方案,像是百度的disconf、携程的Apollo。这些都是好多公司在采用的解决方案,当然一些大厂或者有相应技术团队的公司也会研制适合自己公司环境的配置中心。不管采用何种方案,都是基于解耦和统一配置的思想和目标。
今天主要是记录一下自己学习实践SC的配置中心Spring Cloud Config的心得和总结,用于记录自己成长的点点滴滴,也勉励自己在追求技术的道路上更加坚定和勇毅,不枉自己在探索成长的道路一路奋进。同时文末也会对目前分布式配置中心的各种解决方案进行一下简单的对比总结,方便自己以后做技术选型时有所依据。下面开始~
1、前面了解了Eureka后了解了Eureka分为服务端和客户端,Config也分为客户端和服务端,服务端就是我们对外提供配置中心管理的核心服务(现在是单机配置演示总结,集群的话可以自行搭建配置),客户端就是每一个需要配置数据的业务服务,比如我的用户服务需要连接数据库查询当前用户的数据信息,就需要连接数据库,此时链接数据库的ClassName、Url、UserName、Password等配置信息就配置在配置中心的服务上(客户端服务和服务端服务都可以注册到Eureka上方便管理),这样我们的用户服务再启动的时候就会去目标服务(配置中心服务)上拉取相应的配置文件然后执行数据库连接访问数据等。下面我们先来搭建服务端的服务,按照老惯例,利用SB搭建基础环境,引入相关配置如下
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
这里我们引入了actuator、web、eureka等也是为了整合和测试~
这里我们就采用SC默认的配置支持模式:GIT。当然也持支SVN。所以首先呢你就需要先要搞一个Git账号了(没有的话就没法完成下面的内容了哦~)具体的Git操作就不赘述,毕竟Git也是每一个技术人应该都必须掌握的技术。
下面是服务端的配置内容:
spring.application.name=springCloudConfigServer
server.port=10000
#配置注册中心地址
eureka.client.service-url.defaultZone=http://localhost:8000/eureka
#spring cloud config默认采用git进行管理
###配置远程GitHub路径地址
spring.cloud.config.server.git.uri=https://github.com/${yourGitHub}/${yourGitHubProject}/
###此写法可以做到脱离Git进行开发
#spring.cloud.config.server.git.uri=file://C:/Users/xxx/AppData/Local/Temp/config-repo-8529755125566342108/config-repository
spring.cloud.config.server.git.searchPaths=config-repository
spring.cloud.config.server.git.username=${yourGitHubUserName}
spring.cloud.config.server.git.password=${yourGitHubPassword}
在我们的启动类上添加如下注解:
@EnableConfigServer //激活配置中心
@EnableDiscoveryClient//将服务注册到Eureka上
下面我们就直接启动(前提是你的Eureka Server已经启动好,要不然会出现异常)就OK了,注意查看控制台的日志:
C:/Users/xxx/AppData/Local/Temp/config-repo-8529755125566342108/c
看到会将我们的配置文件内容下载到我们服务机本地路径下作为备份,同理我们在获取到配置数据后也可以配置脱机开发,见上述配置
-----------------------------开始客户端的配置 --------------------------------------
同样引入maven依赖:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.SR1</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<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>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
添加bus是为了动态刷新配置数据内容(详细有关SC Bus 的总结在后续会分享)。
值得注意一点的是,客户端的配置要配置在bootstrap.properties文件中,这是由于Context的加载顺序决定的,若是配置在application.properties上不生效,详情可以了解一下云原生应用的内容。配置如下:
spring.application.name=myConfig
spring.cloud.config.profile=dev
spring.cloud.config.label=master
spring.cloud.config.uri=http://localhost:10000/
###连接服务端异常时快速失败
#spring.cloud.config.fail-fast=true
server.port=10001
eureka.client.service-url.defaultZone=http://localhost:8000/eureka
#配置rabbitmq
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
management.endpoints.web.exposure.include=bus-refresh,health.info,beans,mappings
spring.cloud.bus.trace.enabled=true
同样在启动类上添加相应注解(注册到Eureka上)
测试代码如下:
@Value("${form}")
private String form;
@Autowired
private Environment environment;
//方式一
@GetMapping("/form")
public String getForm(){
return this.form;
}
//方式二
@GetMapping("/envri/form")
public String getFormEnv(){
return this.environment.getProperty("form","not found target object!");
}
启动项目并测试:curl -XGET http://localhost:10001/form 就可以得出在Git上的数据信息。
至此,已经可以上手并且能够应用了,但是这也是无法在实际的工作中应用,因为还缺少相应的安全管理和权限管理。可以利用JCE、Spring Security、OAuth2等进行加密授权等。
下面是学习笔记:
springcloud config 默认采用Git实现configuration,所以先采用当前默认机制实现configuration。在github上创建相应的目录文件作为config-repository。
此时位于github的配置文件对应着访问url的关系要着重理解:
(访问配置信息的URL与配置文件的映射关系如下)
/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
spring cloud config server除了基本的配置外,还要考虑安全 因素,如关键信息的加密、访问权限等。可以参照JCE、spring security、auth2等
可以将spring cloud config server注册到eureka上作为一个基础服务实现高可用,更以管理服务实例
spring cloud config client的配置使用及相关注意事项等
配置:
spring.application.name=myConfig
spring.cloud.config.profile=dev
spring.cloud.config.label=master
spring.cloud.config.uri=http://localhost:10000/
###连接服务端异常时快速失败
#spring.cloud.config.fail-fast=true
server.port=10001
eureka.client.service-url.defaultZone=http://localhost:8000/eureka
#配置rabbitmq
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
management.end
客户端的配置文件的配置属性要配置在bootstrap.properties中,这样才会被spring上下文优先加载配置生效
其中的配置属性和github的文件路径的映射
endpoint
默认是不开启的(直接访问会提示404),所以要在application.properties
中添加相应的配置:management.endpoint.web.exposure.incloud=bus-refresh,health,info,beans,mappings,env....
着重注意自动SB2.0后的改变,以及版本升级带来的兼容性
更多的有关endpoint
的问题可以参考management.endpoint.xxx
的更多配置信息
问题思考:当spring cloud config client 存在较少的服务实例时,可以通过手动刷新设置实现配置 文件的更新通知,当有比较多的实例时又该如何呢?亦可以采用/refresh
或着Git的Hook来实现
Spring cloud bus登场!!! ----------------------------------------下面开始简要分析一下当前配置中心的解决方案的各种对比--------------------------
注册中心 | 配置存储 | 时效性 | 数据模型 | 维护性 | 优点 | 缺点 |
---|---|---|---|---|---|---|
disconf | zookpeer | 实时推送 | 支持传统的配置文件模式,亦支持KV结构数据 | 提供界面操作 | 直接引入应用,基于分布式的Zookeeper来实时推送稳定性、实效性、易用性上均优于其他 | disconf是百度公司开源的,有可能有些公司因业务或者公司原因不能采用、想要基于disconf进行二次开发的话阅读源码的难度也是有一些的~ |
zookpeer | zookpeer | 实时推送 | 支持传统的配置文件模式,亦支持KV结构数 | 命令操作 | 实时推送稳定性、实效性 | 需要在业务代码中添加相应的ZK操作的代码,耦合性较大,且开发量大,还需要开发者能够很好的了解ZK的原理才能更好的coding |
Spring Cloud Config | git | 人工批量刷新,或者采用SC Stream进行全局更新 | 文件模式 | git操作 | 简单、可靠、易用,SC大家族的重要一员 | 依赖配置多,需要依赖GIT、SVN等版本控制,如果想要做到方便配置管理还需要依赖SC Bus和SC Stream相关的内容(这部分有会涉及到RabbitMQ、Kafka及Binder等) |
Apollo相关的配置也是可以参考Apollo的官网配置,也是很简单的,据说Apollo是最容易看懂源码的架构,以后可以参照一下~过两天会分析应用Zookeeper相关的应用(主要涉及的一些命令操作以及客户端API的操作zkClient、Curator等,重点是分布式锁的实现、watch机制等,还有和dubbo组合时的原理应用等。)