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.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,属性是否被修改
结果 属性被修改
四、高可用
通过配置 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 目录下的文件。

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组件实现批量刷新。

浙公网安备 33010602011771号