微服务之配置中心

简介

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

图片发自简书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的集成完毕。

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,393评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,790评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,391评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,703评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,613评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,003评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,507评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,158评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,300评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,256评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,274评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,984评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,569评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,662评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,899评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,268评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,840评论 2 339

推荐阅读更多精彩内容