SpringCloud config分布式配置中心
前言
SpringCloud config分布式配置中心
SpringCloud Config为微服务架构中的微服务提供集中化的外部配置支持,配置服务器为各个不同微服务应用的所有环节提供了一个中心化的外部配置
SpringCloud Config分为客户端和服务端:
- 服务端:分布式配置中心,它是一个独立的微服务应用,用来连接配置服务器并为客户端提供获取配置信息,加密,解密信息等访问接口
- 客户端:通过指定的配置中心来管理应用资源以及业务的相关配置内容,并在启动的时候从配置中心获取和加载配置信息。
- 配置服务器默认采用Git来存储配置信息,这样就有助于对环境配置进行版本管理,并且可以通过git客户端工具来方便的管理和访问配置内容
为什么需要SpringCloud config
微服务意味着要把业务拆成一个个小模块,每个小模块都需要单独的配置信息才能运行,那么一旦业务多了,那么配置文件也很多,当需要进行修改的时候是非常麻烦的,因此,一套集中式的、动态的配置管理设施必不可少!
SpringCloud config能做什么
- 集中管理配置文件
- 不同环境,不同配置,动态化更新,分环境部署
- 运行期间动态更新配置
- 服务不需要重启,但是需要热部署
- 将配置信息以Rest接口的形式暴露
新建Git仓库以及配置
由于国内访问GitHub较慢,因此我们使用码云来作为我们的远程配置仓库
我们进入码云新建一个仓库
创建成功之后,我们需要把仓库部署到本地
我们使用Git,将远程仓库的配置文件连接到本地
新建文件夹,在这里放你的配置文件,然后使用命令来连接远程仓库
git clone 仓库地址
当然,你需要先配置Git的用户名和邮箱还有生成SSH密钥
如何生成SSH密钥
如何生成公钥
配置完成之后就可以跟远程建立连接了
接着我们新建一个application.yml并编辑
Spring:
profiles:
active: dev
---
spring:
profiles: dev
application:
name: springcloud-config-dev
---
spring:
profiles: test
application:
name: springcloud-config-test
最后提交到码云上面
提交修改文件
- 进入文件夹
这里就是进入你放配置文件的目录 - 添加修改的文件
使用命令git add .
添加所有修改后的文件 - 查看文件状态
使用命令git status
查看文件上传状态,发现有一个文件即将被提交 - 提交文件
使用命令git commit -m "first commit"
提交文件
- 上传到云端
使用命令git push origin master
config服务端连接Git配置
新建Module
在IDEA中新建一个module
springcloud-config-server-3344
导入依赖
<dependencies>
<!--config-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
编写配置
server:
port: 3344
spring:
application:
name: springcloud-config-server
# 连接远程仓库
cloud:
config:
server:
git:
uri: https://gitee.com/xxx/springcloud-config.git # https,不是git
注意这里的uri,是自己的远程仓库地址,自行修改,用的是https协议
编写启动类
package com.cjh.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;
@SpringBootApplication
@EnableConfigServer
public class Config_Server_3344 {
public static void main(String[] args) {
SpringApplication.run(Config_Server_3344.class,args);
}
}
启动测试
总结
通过我们的config-sever我们可以连接到git访问其中的资源以及配置,我们可以用客户端去读取配置
客户端连接config服务端访问远程
编写客户端配置文件
我们在本地配置中心中配置我们客户端配置文件,然后通过服务端远程访问
spring:
profiles:
active: dev
---
server:
port: 8201
#spring配置
spring:
profiles: dev
application:
name: springcloud-provider-dept
#eureka的配置,服务注册到哪里
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka/
---
server:
port: 8202
#spring配置
spring:
profiles: test
application:
name: springcloud-provider-dept
#eureka的配置,服务注册到哪里
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka/
提交到远程仓库
编写客户端
编写一个module
springcloud-config-client-3355
导入依赖
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
<version>3.0.3</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
编写配置
bootstrap.yml
# 系统级的配置
spring:
cloud:
config:
name: config-client #需要从git读取的资源名称,不需要后缀
uri: http://localhost:3344
profile: dev
label: master
# http://localhost:3344/config-client-dev.yml/master
application.yml
# 用户级别的配置
spring:
application:
name: springcloud-config-client-3355
编写Controller
ConfigClientController
这里我们写一个controller来测试是否从服务端拿到远程的数据了
package com.cjh.springcloud.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ConfigClientController {
@Value("${spring.application.name}")
private String applicationName;
@Value("${eureka.client.service-url.defaultZone}")
private String eurekaServer;
@Value("${server.port}")
private String port;
@RequestMapping("/config")
public String getConfig(){
return "applicationName="+applicationName+"eurekaServer="+eurekaServer+"port="+port;
}
}
编写启动类
package com.cjh.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ConfigClient_3355 {
public static void main(String[] args) {
SpringApplication.run(ConfigClient_3355.class,args);
}
}
测试
我们启动服务端3344和客户端3355
我们要先确保服务端可以拿到我们git云端的数据
然后启动客户端,我们发现客户端已经连接到服务端,并且拿到了远程的配置文件
注意:我们的客户端没有写端口号,因此是默认从服务端拿到了端口号8201
我们只是开启了两个服务,内存就占用高达92%
bootstrap.yml
bootstrap.yml和application.yml都是属于配置文件
但是bootstrap.yml属于系统级配置文件,而application.yml属于用户级配置文件,必然是系统级配置文件优先级更高
bootstrap.properties比application.properties的优先级要高
由于bootstrap.properties是系统级的资源配置文件,是用在程序引导执行时更加早期配置信息读取;
而application.properties是用户级的资源配置文件,是用来后续的一些配置所需要的公共参数。
但是在SpringCloud 2020. 版本把bootstrap禁用了,导致在读取文件的时候读取不到而报错,所以我们只要把bootstrap从新导入进来就会生效了。*
因此,我们要导入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
<version>3.0.3</version>
</dependency>
总结
我们实现了配置与编码解耦,客户端固定连接服务端配置中心即可,需要修改配置只需要在远程修改即可,但是这也出现了安全性的问题,代码不用变化,配置在远程修改就可以。
改造项目
我们现在想把我们之前的配置文件全部放在远程云端,怎么操作呢?
- 把对应的配置文件放在云端
- 项目的原有的配置文件删除,并建立bootstrap.yml和application.yml,分别对应连接config服务端以及配置项目名字
- 启动即可