Spring Cloud Configuratin

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上作为一个基础服务实现高可用,更以管理服务实例

config-client(普通应用端)

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的文件路径的映射

着重:在SB 2.X之后,endpoint的访问不再跟1.X的访问路径相似,都移到/actuator/路径下,而且有些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组合时的原理应用等。)

本文分享自微信公众号 - BeeFarm(gh_bacb41b1dabe)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-09-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏全栈者

JS数组中那些你知道或不知道的

鱼头注:NewTarget是啥?NewTarget是原生Class FunctionCallbackInfo(函数调用的callback上下文的信息)内的一个不...

8810
来自专栏全栈者

前端数据获取之Ajax与Fetch (一)

Ajax,读作”阿贾克斯“,这个是每一个web开发者必掌握的一门技术,现在咱们打开一个网页,页面上数据多多少少都会有它的一些参与,来获取数据,但也并不是所有的数...

15120
来自专栏全栈者

回调地狱解决方案之Promise

在javascript开发过程中,代码是单线程执行的,同步操作,彼此之间不会等待,这可以说是它的优势,但是也有它的弊端,如一些网络操作,浏览器事件,文件等操作等...

14030
来自专栏全栈者

[JavaScript进阶]从JavaScript原型到面向对象

首先给出结论,JavaScript 的本身是支持面向对象的,它本身具备着强大灵活的 OOP 语言能力。但是对于使用过基于类的语言 (如 Java 或 C++) ...

10910
来自专栏全栈者

构建打包工具Rollup.js入门指南

最近在看Vue源码的时候发现一个新的打包工具Rollup.js,之前没有听说过这个工具,也不了解Rollup.js相比于常用的打包工具webpack有什么异同和...

16640
来自专栏AI科技大本营的专栏

直播回顾 | 关于Apollo 5.0控制在环仿真技术的分享

Apollo 用于模型验证和测试的基于 Web 的仿真平台 Dreamland 已经更新到能使用更强大的场景编辑器和环控制模拟。

22910
来自专栏码匠的流水账

聊聊sharding-jdbc的AbstractDataSourceAdapter

本文主要研究一下sharding-jdbc的AbstractDataSourceAdapter

10820
来自专栏Java识堂

深入理解Condition

建议先看一下这篇分享,深入理解AbstractQueuedSynchronizer,这篇文章主要介绍了AQS的同步队列实现,而本篇文章主要介绍AQS条件队列的实...

7720
来自专栏全栈者

教你从零写一个nodejs包,然后发布至npm源上

随着前端技术发展,现在的前端体系基本离不开nodejs来构建,而nodejs强大的背后,肯定是离不开其开放生态下所诞生的开源库和包,今天主要谈谈这些开源库包的一...

11020
来自专栏全栈者

一个前端失业者的面试之旅

2018年,变动的一年,随着P2P的雷声不断轰鸣,各企业纷纷开始裁员过冬,“开猿节流”一词正式被创造,很不幸,笔者所在的金融公司也不得不进入“冬眠”,而我也在农...

10930

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励