springcloud组件之五:Config实现分布式配置(远程配置&加密解密&手动刷新&用户验证)

一、分布式配置

发现问题:
每个服务都有自己的配置文件,很多公共的配置信息
更改配置信息都需要重新发布服务

问题解决:
Spring Cloud Config

  • 公共信息都保存到远程仓库
  • 连接Config Server,无需重启更新配置参数
  • 统一加密解密

二、Spring Cloud Config

配置管理工具:
本地存储
Subversion
Git
体系:
Config Server
Config Client

三、编写 Config Server项目

1.在gitee创建配置文件
https://gitee.com/

在码云中创建仓库env-project

在env-project项目中创建sprint2.0_dev分支

master是主分支,一般不直接在主分支里面写项目,后期公司会把各个子分支的内容汇总到主分支。
创建好仓库后,在master旁边单击管理,以master为起点新建分支sprint2.0_dev,提交。

在sprint2.0_dev分支下创建config-repo文件夹

在config-repo下新建文件client-dev.properties(dev代表是开发环境)
在client-dev.properties填入内容:eureka.port=9006。提交。

2.编写 Config Server
创建项目springboot项目(web类型)dm-config-server

pom降版本为1.5.9,添加依赖springcloud、Eureka client、config server

<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Dalston.SR4</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
</dependencyManagement>

 <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
            <version>1.3.5.RELEASE</version>
</dependency>

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
</dependency>

添加注解:@EnableDiscoveryClient、@EnableConfigServer

3.修改配置文件application.yml

server:
  port: 7900
spring:
  cloud:
    config:
      server:
        git:
          uri: Git仓库地址
          username: 账号名称
          password: 账号密码
          search-paths: config-repo
  application:
    name: dm-config-server
eureka:
  client:
    service-url:
      defaultZone: http://root:123456@localhost:7776/eureka/
      instance:
  lease-expiration-duration-in-seconds: 2
  lease-renewal-interval-in-seconds: 2
  instance-id: ${spring.cloud.client.ipAddress}:${server.port}


4.启动服务访问端点
启动 eureka-server-demo
启动 dm-config-server

访问端点:http://localhost:7900/client/dev/sprint2.0_dev
查看刚才码云上config-repo下配置文件的名字

映射规则:/{application}/{profile}/{label}
{application}:Git仓库中文件名的前缀, 通常使用微服务名称
{profile}:{application}-后面的数值
在同一个分支下可以有多个{application}名称相同的文件
{label}:Git仓库的分支名,默认为master

5.打开Zuul网关项目zuul-server
pom导config依赖

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
</dependency>

码云修改远程配置文件名称为zuul-server-dev.properties
6.项目zuul-server中新建配置文件bootstrap.yml
(注意:bootstrap.yml 先于 application.yml 加载)

bootstrap.yml(bootstrap.properties)用来在程序引导时执行,应用于更加早期配置信息读取,如可以使用来配置application.yml中使用到参数等。
application.yml(application.properties) 应用程序特有配置信息,可以用来配置后续各个模块中需使用的公共参数等。bootstrap.yml 先于 application.yml 加载。

bootstrap.yml配置文件内容如下:

spring:
  application:
    name: zuul-server
  cloud:
    config:
      label: sprint2.0_dev
      uri: http://localhost:7900
      profile: dev


application.yml文件内容如下:

server:
  port: 8086
eureka:
  client:
    service-url:
      defaultZone: http://root:root@localhost:7776/eureka
  instance:
    lease-expiration-duration-in-seconds: 2
    lease-renewal-interval-in-seconds: 2
    instance-id: ${spring.cloud.client.ipAddress}:${server.port}
#spring:
#  application:
#    name: zuul-server
#zuul网关 动态路由
zuul:
  routes:
    eureka-consumer-demo: /user/**

7.项目zuul-server中新建InfoController类,并编写如下内容:

@RestController
@RefreshScope
public class InfoController {
    @Value("${eureka.port}")
    public String port;

    @GetMapping("/port")
    public String getPort(){
        return "配置文件中的端口为:"+this.port;
    }
}

8.验证测试
启动zuul-server(eureka-server-demo和 dm-config-server已启动)
访问地址http://localhost:8086/port,成功拿到远程配置文件中的信息
(8086是zuul-server的端口)

dm-config-server从码云上取,zuul-server从dm-config-server,所以访问zuul-server可以拿到码云上的信息。

四、加密解密

问题分析:数据在配置文件中明文保存,有安全隐患。

问题解决:数据存储加密,使用时解密。
Spring Cloud Config组件
JCE组件

1.JCE介绍
JRE中自带
默认有长度限制
可以安装不限制长度版本
安装:
下载JCE(对应JDK版本)
local_policy.jar
US_export_policy.jar
覆盖JDK或JRE的security目录下原文件

2.查找到jdk的安装路径

打开终端,输入:/usr/libexec/java_home -V
Windows系统输入mvn -V

打开对应的jdk目录,然后打开jdk-jre-lib-security,一定要找到local_policy.jar和US_export_policy.jar2个jar包,用下载下来的JCE中的jar进行替换。

3. 3个项目都启动,访问localhost:7900/encrypt/status查看加密状态

/encrypt/status:查看加密功能状态的端点
/key:查看密钥的端点
/encrypt:对请求的Body内容进行加密的端点
/decrypt:对请求的Body内容进行解密的端点

dm-config-server项目新建文件bootstrap.yml,配置key

encrypt:
  key: dm

再次验证http://localhost:7900/encrypt/status,变为ok,成功。

4.打开postman对数据进行加密解密测试
发送加密请求
http://localhost:7900/encrypt
POST请求
需加密的内容通过请求体发送

发送解密请求
http://localhost:7900/decrypt
POST请求
密文通过请求体发送

5.在远程配置文件中的操作
在zuul-server-dev.properties中添加加密后的配置:{cipher},重启zuul-server(每重启一次就相当于从gitee上拉取了一次文件)

查看的端点 http://localhost:7900/zuul-server/dev/sprint2.0_dev,密文显示为123456,成功。

五、手动刷新

问题分析:每次修改了gitee远程配置文件上的内容,如果想同步生效还得重启zuul-server项目,过于繁琐

问题解决:配置手动刷新,只需在postman访问一下刷新端点http://localhost:8086/refresh,就可刷新查看到http://localhost:8086/port的同步更新

1.zuul-server项目pom加依赖actuator用于手动刷新

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

2.配置文件application.yml关闭安全配置:

management:
  security:
    enabled: false


3.类InfoController添加注解@RefreshScope
@RefreshScope:配置文件刷新

当遇到生产环境配置参数需要调整,但又没有配置中心的支持的情况下,只能重启应用以加载新参数,可能会影响业务系统运行,太暴力不优雅。
@ RefreshScope 注解能帮助我们做局部的参数刷新。
但侵入性较强,需要开发阶段提前预知可能的刷新点,并且该注解底层是依赖于cglib进行代理的,所以不要掉入cglib的坑,出现刷了也不更新情况。

4.重启项目zuul-server,修改gitee配置文件内容,在postman访问http://localhost:8086/refresh。

到网页刷新http://localhost:8086/port,在无需重启项目的情况下完成和gitee上的同步更新。

六、用户验证

同Eureka注册时配置的用户认证一样。
1.添加依赖
为dm-config-server项目,为其添加依赖security

<dependency>
	<groupId>org.springframework.boot</groupId>   
	<artifactId>spring-boot-starter-security</artifactId>
</dependency>

2.application.yml中添加配置

security:
  basic:
    enabled: true
  user:
    password: 123456
    name: root

3.客户端连接认证,修改连接配置

eureka:
  client:
    service-url:
      defaultZone: http://root:root@localhost:7776/eureka

内容太多了 我做了模块内容分离,springcloud的5个组件:feign、hystrix、ribbon、zuul、config都有博文分别介绍,如有需要请查看:
springcloud组件之一:feign(client)

springcloud组件之二:hystrix(容错&Hystrix处理容错&Feign项目的监控&Hystrix Dashboard可视化监控&Turbine聚合监控)

springcloud组件之三:Ribbon(轮询和随机负载)

springcloud组件之四:Zuul(zuul网关&网关过滤器)

springcloud组件之五:Config实现分布式配置

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值