Spring Cloud自动推送配置到Consul配置中心

Consul是一个集配置管理、服务注册和发现于一体的微服务基础组件,它提供的这些功能我们在微服务开发中都用到了。在实践中,我们发现Spring Cloud没有提供在启动时自动加载某一个配置文件到Consul配置中心的功能,于是参照Consul社区的一个开源项目cfg4j-pusher进行了二次开发,实现了Spring Boot应用启动时自动加载指定配置文件到Consul配置中心的功能。以下是软件环境:

  • JDK 1.8
  • Maven 3.3.9
  • Spring Boot 2.0.0.RELEASE
  • Spring Cloud Finchley.M8
  • Consul 1.2.2

实现过程

在这里我新建一个工程来说明实现过程,整个工程的结构如下:

整个工程依照Spring Boot工程的目录结构创建,在com.consul.pusher包下有四个类,其中ConsulApplication的作用就不用说了,它是整个服务的启动类。剩下的三个类说明如下:

  • ConsulConfig:提供加载配置到Consul中的操作。它定义了一个私有的init方法,这个方法被@PostConstruct注解所标记,主要作用是在ConsulConfig依赖注入完成之后读取指定配置文件,将文件里的配置信息推送到Consul配置中心中。该方法在整个应用生命周期中只执行一次,定义为私有的主要是不允许外部调用,保证安全性

  • ConsulServiceConsulServiceImplConsulServiceImpl实现了ConsulService接口,主要提供Consul配置中心业务逻辑操作,它主要封装了consul java client的一些方法。

resources目录下的bootstrap.ymlapplication.yml分别为微服务全局配置文件和业务信息配置文件。在服务启动期间,application.yml配置文件的内容会被ConsulConfig类的init方法读取并推送到Consul配置中心。在这里我们没有将bootstrap.yml的文件内容推送到Consul配置中心,主要是考虑到:

  • bootstrap.yml里定义的配置信息不经常修改

  • Spring Boot天生不支持动态修改数据库、ES连接信息。bootstrap.yml里的定义的数据库连接、ES连接等信息通过Consul配置中心修改后不能生效,还需要重启应用才能生效。并且,需要修改数据库连接、ES连接信息的场景大部分是因为当前服务不可用产生的,服务的高可用不应由Consul来维护

重构升级

经过与团队成员讨论,开发配置自动推送功能的初衷有两个:

  • 方便devops团队进行自动化运维。微服务部署过程中,配置的管理和修改是一件让人头疼的事情,无论是开发和运维,都希望减少手动修改配置的次数,通过自动推送配置功能,可以轻松解决这个问题。Consul官方虽然提供了HTTP API供使用者加载指定配置到Consul中,但是需要开发给运维提供配置文件,再由运维手动执行命令加载这些配置文件到Consul中,不仅容易出错,管理也不便

  • 无论是分布式服务还是微服务,都应该有一套工具化、通用化的公共服务类库。服务开发中,有很多重复的、可以封装成工具类的代码,我们可以构建一个公共服务类库,将这些代码组织起来,供大家使用。这样既解决了代码重复的问题,也使服务更加健壮和高可用。业内优秀的例子比如Apache CommonsGoogle Guava系列类库

基于第二点初衷,产品发布了几版之后,我将自动推送配置的代码抽取了出来,封装成一个公共服务类库。封装之后,工程目录结构如下:

因为公共服务类库不是一个可运行的微服务应用,它以jar包的形式嵌入到微服务应用中,所以需要去除ConsulApplication类,基础库单元测试通过之后,就可以推送到我们的maven私服中。接下来,就是使用这个基础库了,使用步骤如下:

(1) 首先确保服务引入了Consul依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-consul-config</artifactId>
</dependency>

(2) 将自定义的配置统一提取到application.yml里。注意:yml文件里如果有空的value值,请用单引号''代替,否则yml解析会报错

(3)pom文件里引入consul-pusher公共服务类库,consul-pusher类库的Consul配置加载类在服务启动时自动加载配置到Consul中:

<dependency>
	<groupId>com.consul.pusher</groupId>
	<artifactId>consul-pusher</artifactId>
	<version>1.0</version>
</dependency>

(4) 在对应服务的Application启动类上,加入@ComponentScan(value = "com.consul.pusher"),使公共类库相关的类被Spring Boot扫描到,比如:

@SpringBootApplication
@EnableDiscoveryClient
@EnableScheduling // 启用定时调度功能,Consul需要使用此功能来监控配置改变
@ComponentScan(value="com.consul.pusher")
public class ExampleApplication {
    public static void main(String[] args) {
        SpringApplication.run(ExampleApplication.class);
    }
}

(5) 加载配置:

使用@Value注入配置,在类上添加@RefreshScope实现业务参数的热更新:

@RefreshScope
@Service
public class StockMarketServiceImpl implements StockMarketService {
 
	private Logger logger = LoggerFactory.getLogger(this.getClass());
	 
	@Value(value = "${kline.host}")
	private String kLineHost;
 
}

至此,整个工程的重构和使用完成。引入consul-pusher的服务启动后,在Consul配置中心创建的配置信息截图如下,以consul-pusher服务本身为例:

源码下载&参考资料

源码链接:

GitHub:consul-pusher

码云:consul-pusher

Consul整合参考链接:

Spring Cloud(二)Consul 服务治理实现

快递中心的spring cloud实践

consul配置中心使用指南

课程介绍 【完善体系+精品资料】本课程总计115课时,打造全网最全的微服务体系课程;从微服务是什么、能够做什么开始讲起,绝对零基础入门到精通类型。课程整体脉络十分清晰,每个章节一个知识点,画图+源码+运行讲解,不信你学不会。1、课程先讲解了什么是单体架构、什么是微服务架构、他们之间有什么区别和联系,各自有什么优缺点。2、从本质入手,使用最简单的Spring Boot搭建微服务,让你认清微服务是一种思想和解决问题的手段,而不是新兴技术。3、讲解Spring Boot 与 Spring Cloud 微服务架构之间的联系,原生的RestTemplate工具,以及Actuator监控端点的使用。4、带着微服务所带来的各种优缺点,为大家引入服务发现与注册的概念和原理,从而引入我们的第一个注册中心服务Eureka。5、引入负载均衡的理念,区分什么是服务端负载均衡,什么是客户端负载均衡,进而引入Ribbon负载均衡组件的详细使用。6、为了解决微服务之间复杂的调用,降低代码的复杂度,我们引入了Feign声明式客户端,让你几行代码学习服务的远程调用。7、为了解决服务之间的稳定性,避免发生雪崩问题,我们引入了Hystrix断路器,服务降级和熔断机制。8、微服务集群十分庞大,监控起来是十分困难的,尤其是对每一个接口的熔断情况进行监控,因此我们引入了Turbine微服务监控。9、微服务的调用是杂乱无章的,可以网状调用,怎么做到统一的入口出口,统一的授权、加密、解密、日志过滤,我们引入了第一代网关Zuul。10、微服务的配置分散,每次要修改配置都要重启服务,因此我们引入了Config配置中心。11、跟上主流,Consul是当前主流的服务注册与发现、配置中心一体化的解决方案。12、阿里的Nacos服务注册与发现、配置中心在国内炙手可热,Nacos 经历过双十一的微服务中间件。13、Turbin做微服务监控还是太弱,我们需要更强大,可视化,操作性更强的监控系统,因此我引入了Spring Boot Admin体系。14、Zuul已经停止更新支持,Spring Cloud官方推荐的二代网关Spring Cloud Gateway更加强大。15、微服务的安全架构体系虽然复杂,但是是有学习条例的,什么是认证授权、什么是OAuth2.0的原理、 JWT、怎么样去开发实现。 课程资料 【独家资料】1、课程附带全部63个项目源码,其中Hoxton版本项目源码37个,Edgware版本项目26个,2、230页高清PDF正版课件。3、附带nacos、consul、cmder等视频配套软件。学习方法1、每一节课程均有代码,较好的方式为一边听我的讲解,一边使用我提供的项目代码进行观察和运行。2、课程体系庞大,但是并不杂乱,每个章节只针对一个知识点,减轻学习压力。3、坚持每天学习1~2个章节,可以在地铁、公交上用手机学习。【完善知识体系图】
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值