004-config学习笔记

config学习笔记

一、创建config-server

1.1 在git 创建一个公开项目。

我这里是在gitee上创建的公开项目 https://gitee.com/zhoust123/config.git,

创建文件夹:spring.cloud.parend

在里面创建两个文件 config-dev.yml,config-test.yml创建要以 applocation-profile.yml创建。

内容:

# config-dev.yml

username: zhangsan
keyword: are you ok ?



# config-test.yml

profile: test
username: test
keyword: are you ok test ?

1.2 创建 spring 项目

引入核心依赖

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

配置:

server:
  port: 8600

spring:
  application:
    name: config-server
  cloud:
    config:
      server:
        git:
          uri: https://gitee.com/zhoust123/config
          search-paths: spring.cloud.parent # 如果是在指定的文件夹下在这里指定,也可以模糊匹配ru: sprin*
#          username:  # git上非公开的项目需要指定用户名密码
#          password: # git上非公开的项目需要指定用户名密码

启动类 添加 @EnableConfigServer

@SpringBootApplication
@EnableConfigServer
public class ConfigServerApp {

    public static void main(String[] args) {
        SpringApplication.run(ConfigServerApp.class, args);
    }

}

1.3 启动

1.3.1 相关端点

/{application}/{profile}[/{label}]
/{application}-{profile}.yml
{label}/{application}/{profile}.propertities
/{application}-{profile}.propertities

/label 是git 的分支

1.3.2 测试

localhost:8600/config/dev/master

localhost:8600/config/test/master

localhost:8600/config/dev,test

localhost:8600/config-dev.yml

localhost:8600/config-dev.properties

能获取到相应信息

二、使用配置config-client

2.1 新建项目 config-client

新建spring项目 config-client

2.1.1 依赖

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-config-client</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!--2020 后的版本默认禁用 bootstrap.yml配置文件,如要使用加上这个依赖-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-bootstrap</artifactId>
    </dependency>
</dependencies>

2.1.2 配置

新建bootstrap.yml , 因为bootstrap中的优先级更高,且uri:# 默认是 localhost:8888,不使用bootstrap 可能会被覆盖

server:
  port: 8601

spring:
  application:
    name: config-client
  cloud:
    config:
      name: config # git 上起的application名字,不填写默认 本项目名,是git上起的名字,不是config-server 的名字
      uri: http://localhost:8600/ # 默认是 localhost:8888 在bootstrap.yml
      profile: dev # git 上的 -profile
      label: master # 分支名

myKeyWord: ${keyword} # 测试从git拉取到本地赋值

2.1.3 测试controller

@RestController
public class TestController {


    /**
     * 测试 直接从git 上获取 username
     */
    @Value("${username}")
    private String username;

    /**
     * 测试 keyword 从git 上获取后转成本地的 myKeyWord
     */
    @Value("${myKeyWord}")
    private String myKeyWord;


    @GetMapping("/getName")
    public String getName(){
        return username;
    }

    @GetMapping("/getMyKeyWord")
    public String getMyKeyWord(){
        return myKeyWord;
    }

}

启动了

普通启动类,不需要@EnableConfigServer

@SpringBootApplicationpublic class ConfigClientApp {    public static void main(String[] args) {        SpringApplication.run(ConfigClientApp.class, args);    }}

报错

Application failed to start due to an exceptionorg.springframework.cloud.config.client.ConfigServerConfigDataMissingEnvironmentPostProcessor$ImportException: No spring.config.import set

需要将 bootstrap 设置为可用,2020 之后默认禁用bootstrap,若要使用需要开启。通过引入依赖的方式。

参见博文:(41条消息) Spring Cloud配置中心遇到No spring.config.import set问题_lwd18175239125的博客-CSDN博客

三、动态参数拉取

配合spring-boot-starter-actuator

修改config-client

3.1 引入依赖

<!--利用监控提供的端点来进行刷新--><dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-actuator</artifactId></dependency>

3.2 添加配置

核心 management

server:  port: 8601spring:  application:    name: config-client  cloud:    config:      name: config # git 上起的application名字,不填写默认 本项目名      uri: http://localhost:8600/ # 默认是 localhost:8888 在bootstrap.yml      profile: dev # git 上的 -profile      label: master # 分支名myKeyWord: ${keyword} # 测试从git拉取到本地赋值management:  security:    enabled: false # 不需要权限认证  endpoints:    web:      exposure:        include: "*" # 所有的接口  endpoint:    health:      show-details: always

3.3 测试controller

核心 添加@RefreshScope注解

@RestController@RefreshScopepublic class TestRefreshController {    /**     * 测试 keyword 从git 上获取后转成本地的 myKeyWord     */    @Value("${myKeyWord}")    private String myKeyWord;    @GetMapping("/refresh")    public String refresh(){        return myKeyWord;    }}

3.4 测试

3.4.1 启动 server 跟client 。

3.4.2 在git 上修改 config-dev 的配置,修改 keyword。

3.4.3 先调用actuator/refresh从git上拉取信息

post http://localhost:8601/actuator/refresh

3.4.4 在调用 refresh 查看myKeyWord,属性是否被修改

http://localhost:8601/refresh

结果 属性被修改

四、高可用

通过配置 config-serve r集群,配合uereka 来实现高可用

4.1 新建一个eureka服务

名为 config-eureka-server 端口 7008

4.2 新建config-colony-server

新建名为 config-colony-server的server,该server 创建多个注册到eureka上来保证高可用。

这里以一个为例

依赖

<dependencies>    <dependency>        <groupId>org.springframework.cloud</groupId>        <artifactId>spring-cloud-config-server</artifactId>    </dependency>    <!--注册到注册中心-->    <dependency>        <groupId>org.springframework.cloud</groupId>        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>    </dependency></dependencies>

配置

server:  port: 8601spring:  application:    name: config-colony-server  cloud:    config:      server:        git:          uri: https://gitee.com/zhoust123/config          search-paths: spring.cloud.parent # 如果是在指定的文件夹下在这里指定,也可以模糊匹配ru: sprin*          force-pull: true # 强制拉取资源文件#          username:  # git上非公开的项目需要指定用户名密码#          password: # git上非公开的项目需要指定用户名密码eureka:  instance:    hostname: localhost  client:    register-with-eureka: true # 是否将自己注册到eureka上 不配置默认是true    fetch-registry: true # 是否从eureka服务上拉取拉取 服务信息 不配置默认是true    serviceUrl:      defaultZone: http://localhost:7008/eureka # 注册到eureka服务上。(也可以是集群)

启动类

@SpringBootApplication@EnableConfigServer@EnableEurekaClientpublic class ConfigServerApp {    public static void main(String[] args) {        SpringApplication.run(ConfigServerApp.class, args);    }}

4.3 创建client

依赖

在之前的基础上增加了 eureka

<dependencies>    <dependency>        <groupId>org.springframework.cloud</groupId>        <artifactId>spring-cloud-config-client</artifactId>    </dependency>    <dependency>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-web</artifactId>    </dependency>    <!--2020 后的版本默认禁用 bootstrap.yml配置文件,如要使用加上这个依赖-->    <dependency>        <groupId>org.springframework.cloud</groupId>        <artifactId>spring-cloud-starter-bootstrap</artifactId>    </dependency>    <!--利用监控提供的端点来进行刷新-->    <dependency>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-actuator</artifactId>    </dependency>    <!--注册中心-->    <dependency>        <groupId>org.springframework.cloud</groupId>        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>    </dependency></dependencies>

配置

通过discovery.service-id 来配置服务名,取代之前写死的uri

server:  port: 8602spring:  application:    name: config-colony-client  cloud:    config:      name: config # git 上起的application名字,不填写默认 本项目名      # uri: http://localhost:8600/ # 默认是 localhost:8888 在bootstrap.yml      discovery:        enabled: true        service-id: config-colony-server # 配合eureka使用,替换 uri      profile: dev # git 上的 -profile      label: master # 分支名myKeyWord: ${keyword} # 测试从git拉取到本地赋值management:  security:    enabled: false # 不需要权限认证  endpoints:    web:      exposure:        include: "*" # 所有的接口  endpoint:    health:      show-details: alwayseureka:  client:    register-with-eureka: true # 是否将自己注册到eureka上 不配置默认是true    fetch-registry: true # 是否从eureka服务上拉取拉取 服务信息 不配置默认是true    serviceUrl:      defaultZone: http://localhost:7008/eureka # 注册到eureka服务上。

启动类

添加 @EnableEurekaClient 注解往eureka中获取服务

测试 跟之前结果一样。

五、加密

5.1 准备工作

看自己的jdk 是否支持加解密

The unlimited policy files are required only for JDK 8, 7, and 6 updates earlier than 8u161, 7u171, and 6u181. On those versions and later, the stronger cryptographic algorithms are available by default.#大致是说 在 8u161、7u171 和 6u181 之前需要替换 jce

java -version 查看自己的jdk版本是否支持,如果是在在8u161、7u171 和 6u181 之前的需要替换,我的是jdk8在8u161之前,所以需要替换。

下载地址:Java 密码学扩展 (JCE) 用于 JDK/JRE 下载的无限强度管辖权政策文件 (oracle.com)

替换jce : 下载的文件解压 \jce_policy-8.zip\UnlimitedJCEPolicyJDK8路径在,替换jdk中D:\codersoft\jdk1.8.0_20\jre\lib\security 目录下的文件。

替换jce

5.2 演示

5.2.1 基础演示

config-server中添加bootstrap.yml文件,配置encrypt.key属性,这个值就是加密串。

注意:若是新版cloud 记得引入 spring-cloud-starter-bootstrap依赖才可以使用 bootstrap.yml

启动 测试

常用端点

get  http://localhost:8600/encrypt/status # 代表已经可以用加密了post http://localhost:8600/encrypt  # 加密,如下图 raw 中放的是明文,测试返回密文post http://localhost:8600/decrypt # 解密,raw 中放的是密文,调用返回明文

加密

5.2.2 加密一个属性,保存到git中

在项目 config-colony 中进行

5.2.2.1 在git中添加属性

{cipher} 属性来告诉config 我这个属性需要解密

speak: '{cipher}8d029aee1322a5e730045dc271a1c15911f5ae5b1aa4132afc2e6013704426329396ecc517f328dca08d729062485aa4'
5.2.2.2 server配置

同上 5.2.1 。

5.2.2.3 client测试

在测试类 TestRefreshController中添加

/** * 获取解密后的属性 */@Value("${speak}")private String speak;@GetMapping("/speak")public String speak(){    return speak;}
启动测试

启动日志可以看到,去git 上拉取文件了

调用接口 localhost:8602/speak

返回中文 “你好,我是加密”

config-server中拉取配置文件 http://localhost:8601/config-dev.yml

六、应用

在生产环境的应用

6.1 环境隔离

日常环境

预发环境

生产环境,

这些环境都可以通过 profile(后缀),path(路径),branch(分支)来指定。

6.2 业务开关+定向推送

如某些业务在什么时候不能做,可以动态配置,方便调整。

6.3 修改业务逻辑

比如汇率换算,是一个易变的属性,就需要动态调整

设置熔断参数等。

思考:当有大量的服务节点时,我们在一个个的去刷新显得不是那么现实了,所以我们就要考虑批量刷新了,可以借助bus组件实现批量刷新。

posted @ 2021-11-01 19:58  神经哇  阅读(192)  评论(0)    收藏  举报