微服务之配置中心

简介

        在项目中,我们可以简单的理解程序=代码+配置。代码这个没什么好说的,你懂的,对于配置来说,由于我们需要对程序中的一些参数进行自定义配置,不想直接硬编码在代码中,方便以后更改,使得系统具有良好的拓展性,为此可以将一些信息写入配置文件(数据库连接、日志配置、系统环境、系统常用参数等),其实说白了,可以将配置文件理解为一个小型的数据库,存储信息,然后程序可以读取使用。

图片发自简书App

        举个配置的简单使用例子,系统上线后日志级别默认为INFO,突然某一天系统出问题了,访问不正常了,我们想查看更多的日志信息,于是可以将日志输出级别动态地调整为DEBUG或TRACE级别,而无需重启应用,相信这样会很容易理解配置的作用。

        在单体应用中,多多少少都存在配置文件,以常见的Spring应用来说,大家立马会想到application.xml、log4j.properties等文件,可以方便地进行配置。但是,在微服务架构体系中,由于微服务众多(成百上千,如下图),服务之间又有互相调用关系,这个微服务怎么知道被调用微服务的地址呢,万一被调用微服务地址变了咋办?我们如何方便地进行修改,且实时自动刷新,而不至于需要重启应用。也就是说,微服务的配置管理需要解决以下几个问题:

1.配置集中管理:统一对应用中各个微服务进行管理。

2.在系统运行期间可动态配置:根据系统运行情况(微服务负载情况等)进行配置调整,在不停止服务的情况下。

3.配置修改自动刷新:当修改配置后,能够支持自动刷新。

        所以,对于微服务架构而言,一个通用的分布式配置管理是必不可少的。在大多数微服务系统中,都会有一个名为配置文件的功能模块来提供统一的分布式配置管理。

图片发自简书App

图片发自简书App

配置管理中心(Spring Cloud Config)

        在目前的配置中心解决方案里,有Spring Cloud Config、disconf等等,这两种都与Spring框架能够很好的集成,也提供了获取应用配置的一系列API,这里以Spring自家的Config为例进行说明。

原理

        Spring Cloud Config主要分为Config Server和Config Client两部分:

1.Config Server可以理解为分布式配置中心,是一个单独的微服务应用,主要是用来连接配置仓库(一般使用Git),同时为客户端提供获取配置信息;

2.Config Client则是我们应用中的各个微服务,它在系统启动或需要获取配置信息时从配置中心进行获取、加载,并可缓存以提高性能。

图片发自简书App

        Spring Cloud Config实现了对服务端和客户端中环境变量和属性配置的抽象映射,所以它除了适用于Spring构建的应用程序之外,也可以在任何其他语言运行的应用程序中使用。由于Spring Cloud Config实现的配置中心默认采用Git来存储配置信息,所以使用Spring Cloud Config构建的配置服务器,天然就支持对微服务应用配置信息的版本管理,并且可以通过Git客户端工具来方便的管理和访问配置内容。当然它也提供了对其他存储方式的支持,比如:SVN仓库、本地化文件系统。

 

图片发自简书App

 

配置步骤

编写Config Server

(1)添加Config Server依赖,非常简单:

图片发自简书App

(2)在启动类添加@EnableConfigServer注解,开启配置服务:

图片发自简书App

(3)配置文件application.yml:

图片发自简书App

        备注(Git仓库配置):在https://gitee.com/cxzheng/SpringCloud-Learning创建了一个 config-repo目录作为配置仓库,并根据不同环境新建下面4个配置文件:

图片发自简书App

配置文件内容分别为:

 

图片发自简书App

图片发自简书App

图片发自简书App

图片发自简书App

(4)这里先说明下访问配置信息的URL与配置文件的映射关系,如下所示:

访问URL

(1)/{application}/{profile} [/{label}]

对应配置文件

(1)/{application}-{profile}.yml

(2)/{label}/{application}-{profile}.yml

(3)/{application}-{profile}.properties

(4)/{label}/{application}-{profile}.properties

        所以,现在想访问eureka-config-client应用的dev环境(master分支),可以使用:http://localhost:8889/eureka-config-client/dev/master,如图:

图片发自简书App

 

图片发自简书App

编写Config Client

(1)添加Config Client依赖,非常简单:

图片发自简书App

(2)在启动类添加注解:

 

图片发自简书App

(3)配置文件bootstrap.yml:

图片发自简书App

        配置说明备注

图片发自简书App

(4)编写Controller:

图片发自简书App

(5)测试,访问:http://localhost:3331/host,如图:

图片发自简书App

        因为配置文件中的profile为prod,故会去:http://eureka-config-client-prod.properties读取配置信息,结果为apps.caac.net。

        至此,一个简单的Spring Cloud Config应用就基本形成了。

配置解密

        在上面的配置文件中,我们是使用明文进行传输的,这样会比较不安全,因为里面的内容肯定还涉及到数据库的用户名、密码等参数,对此我们最好对配置内容进行加密,保障系统的安全性。当然,在Spring Cloud Config中就提供了加解密功能,配置步骤如下:

(1)安装JCE:JCE 功能在JRE中自带,但是默认使用的是有长度限制的版本,为启用加解密功能,我们需要在配置中心的运行环境中安装不限长度的 JCE 版本。下载解压后,将JDK/jre/lib/security目录中的两个jar文件替换为JCE中的jar文件:

 

图片发自简书App

(2)在上面的服务端程序中,添加bootstrap.yml文件,设置加密密钥:

 

图片发自简书App

(3)重新启动服务端、客户端,查看配置中心加密状态,访问:http://localhost:8889/encrypt/status,结果正常,如图:

图片发自简书App

        备注:配置中心特有的端点,如下:

1./encrypt/status: 查看加密功能状态的端点。

2./key: 查看密钥的端点。

3./encrypt: 对请求的 body 内容进行加密的端点。

4./decrypt: 对请求的 body 内容进行解密的端点。

(4)此时,配置中心的加密功能可以正常使用了。现在我们要将上文文件:

eureka-config-client-prod.properties的host:apps.caac.net内容进行加密,可以使用curl工具模拟post请求(根据/encryt和/decrypt 端点来使用加密和解密):

加密:

 

图片发自简书App

解密:

 

图片发自简书App

(5)现在,我们要将加密运用到系统中,只要将配置文件中的明文改为{cipher}密文即可,即将:apps.caac.net改为{cipher}0ed991db84f279bbd2e249c7577f248939402f9452077c19de128e052d25785d,如图:

 

图片发自简书App

        重启应用,访问:http://localhost:3331/host,可以得到解密后的信息,如图:

图片发自简书App

与Eureka结合使用

        我们知道Eureka作为一个服务注册中心,系统中的各个微服务可以进行注册,作为配置中心微服务也一样,我们也可以将其注册到Eureka中,方便其它微服务获取。

配置步骤

(1)修改服务端配置文件,如图:

图片发自简书App

(2)修改客户端配置文件(备注:需要放在bootstrap.xml文件中),如图:

图片发自简书App

(3)启动类加上必要的注解,你懂得,主要是服务端、客户端启动类,需加上:@EnableEurekaClient,如图:

图片发自简书App

(4)启动注册中心、配置中心、客户端,如图:

 

图片发自简书App

        至此,与Eureka的集成完毕。

        暂时先写到这里,后面加以完善,还需加上自动刷新配置。



作者:守候流星雨
链接:https://www.jianshu.com/p/0f84f2c66cf5
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值