远程协助
当前位置:重庆拓磊计算机运营维护中心 > 文档中心 > 服务器 >
标题:Spring Cloud微服务架构的构建:分布式配置中心(加密解密功能)    日期:2018-08-15

要会用,首先要了解。图懒得画,借鉴网上大牛的图吧,springcloud组建架构如图:

Spring Cloud微服务架构的构建:分布式配置中心(加密解密功能)

微服务架构的应用场景:

      1、系统拆分,多个子系统

      2、每个子系统可部署多个应用,应用之间负载均衡实现

      3、需要一个服务注册中心,所有的服务都在注册中心注册,负载均衡也是通过在注册中心注册的服务来使用一定策略来实现。

      4、所有的客户端都通过同一个网关地址访问后台的服务,通过路由配置,网关来判断一个URL请求由哪个服务处理。请求转发到服务上的时候也使用负载均衡。

      5、服务之间有时候也需要相互访问。例如有一个用户模块,重庆电脑外包,重庆电脑维修,重庆打印机维修,其他服务在处理一些业务的时候,要获取用户服务的用户数据。

      6、需要一个断路器,及时处理服务调用时的超时和错误,防止由于其中一个服务的问题而导致整体系统的瘫痪。

      7、还需要一个监控功能,监控每个服务调用花费的时间等。

引言

在微服务架构中,我们通常都会采用DevOps的组织方式来降低因团队间沟通造成的巨大成本,以加速微服务应用的交付能力。这就使得原本由运维团队控制的线上信息将交由微服务所属组织的成员自行维护,其中将会包括大量的敏感信息,比如:数据库的账户与密码等。很显然,如果我们直接将敏感信息以明文的方式存储于微服务应用的配置文件中是非常危险的。针对这个问题,Spring Cloud Config提供了对属性进行加密解密的功能,以保护配置文件中的信息安全。比如下面的例子:

spring.datasource.username=didi
spring.datasource.password={cipher}dba6505baa81d78bd08799d8d4429de499bd4c2053c05f029e7cfbf143695f5b

在Spring Cloud Config中通过在属性值前使用{cipher}前缀来标注该内容是一个加密值,当微服务客户端来加载配置时,配置中心会自动的为带有{cipher}前缀的值进行解密。通过该机制的实现,运维团队就可以放心的将线上信息的加密资源给到微服务团队,而不用担心这些敏感信息遭到泄露了。下面我们来具体介绍如何在配置中心使用该项功能。

使用前提

在使用Spring Cloud Config的加密解密功能时,有一个必要的前提需要我们注意。为了启用该功能,我们需要在配置中心的运行环境中安装不限长度的JCE版本(Unlimited Strength Java Cryptography Extension)。虽然,JCE功能在JRE中自带,但是默认使用的是有长度限制的版本。我们可以从Oracle的官方网站中下载到它,它是一个压缩包,解压后可以看到下面三个文件:

README.txt
local_policy.jar
US_export_policy.jar

我们需要将local_policy.jar和US_export_policy.jar两个文件复制到$JAVA_HOME/jre/lib/security目录下,覆盖原来的默认内容。到这里,加密解密的准备工作就完成了。

相关端点

在完成了JCE的安装后,可以尝试启动配置中心。在控制台中,将会输出了一些配置中心特有的端点,主要包括:

  • /encrypt/status:查看加密功能状态的端点
  • /key:查看密钥的端点
  • /encrypt:对请求的body内容进行加密的端点
  • /decrypt:对请求的body内容进行解密的端点
  • 可以尝试通过GET请求访问/encrypt/status端点,我们将得到如下内容:

    {
     "description": "No key was installed for encryption service",
     "status": "NO_KEY"
    }

    该返回说明当前配置中心的加密功能还不能使用,因为没有为加密服务配置对应的密钥。

    配置密钥

    我们可以通过encrypt.key属性在配置文件中直接指定密钥信息(对称性密钥),比如:

    encrypt.key=didispace

    加入上述配置信息后,重启配置中心,再访问/encrypt/status端点,我们将得到如下内容:

    {
     "status": "OK"
    }

    此时,我们配置中心的加密解密功能就已经可以使用了,不妨尝试访问一下/encrypt和/decrypt端点来进行加密和解密的功能。注意,这两个端点都是POST请求,加密和解密信息需要通过请求体来发送。比如,以curl命令为例,我们可以通过下面的方式调用加密与解密端点:

    $ curl localhost:7001/encrypt -d didispace
    3c70a809bfa24ab88bcb5e1df51cb9e4dd4b8fec88301eb7a18177f1769c849ae9c9f29400c920480be2c99406ae28c7
    
    $ curl localhost:7001/decrypt -d 3c70a809bfa24ab88bcb5e1df51cb9e4dd4b8fec88301eb7a18177f1769c849ae9c9f29400c920480be2c99406ae28c7
    didispace
    下一篇:详解nginx 301跳转到带www域名方法
    
    联系我们
    • 客服热线:023-63522929(7 x 24h)
    • 在线客服:
    • 微信公众号 官方微博