一、分布式配置中心
1、为什么使用spring Cloud Config
常规开发中,每个微服务都包含代码和配置。其配置包含服务配置、各类开关和业务配置。如果系统结构中的微服务节点较少,那么常规的代码+配置的开发方式足以解决问题。当系统逐步迭代,其微服务会越来越复杂,慢慢演化成网状依赖结构,这时常规代码+配置的开发方式并不合适了,因为嗨哟啊考虑整体系统的拓展性、伸缩性和耦合性。这些问题中,配置的管理也是非常麻烦的。
如果还是以常规开发形式管理配置,则要承担反复修改编译代码、重启系统、重新打包等的风险。所以,一个可以集中管理,带有版本控制的配置中心应运而生。
Spring Cloud Config就是一个分布式配置中心解决方案。其采用集中管理每个微服务的配置信息,并使用Git等版本仓库统一存储配置内容,实现版本化管理控制。
但是由于分布式配置中心需要结合Git等版本控制,实现起来比正常开发多了一些流程,所以部分公司在技术选型时,可能并不适用SpringCloudConfig
2、优点
- 提供服务端和客户端支持(Spring cloud config server 和 Spring cloud config client)
- 集中管理分布式环境中的配置信息(所有配置文件统一放在了gitee中)
- 基于spring环境提供配置管理,与spring系列框架无缝结合。
- 可用于任何语言开发环境,基于http协议。
3、架构
二、在Gitee中创建配置文件
1、新建仓库
- 仓库名称随意。
- 是否生成readme文件对SpringCloudConfig没有影响。
- 仓库是public还是private也没有影响。
- 点击创建按钮即可新建仓库。
三、创建config-server
步骤一:添加文件application.yml
步骤二:创建config-server
resources中配置bootstrap.yml文件
spring:
application:
name: config-server
cloud:
config:
server:
git:
uri: https://gitee.com/linkjack/spring-cloud-config-test.git
# username:公开仓库不需要配置
# password:公开仓库不需要配置
server:
port: 1234
步骤三:启动类添加注解@EnableConfigServer
在浏览器地址栏输入http://config-server的ip:config-server端口/name/profile/label进行访问.
name为配置文件名,profile为配置文件,label为git分支类型
如果访问带有profile的配置文件master可以省略,省略后返回json字符串中label属性为null,正常应该为master。
访问:http://localhost:1234/application/master
四、创建config-client
Config Client对于Spring Cloud Config是客户端,对于Eureka来说可以是Application Server也可以是Application Client。
步骤一:导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
步骤二:配置文件bootstrap.yml配置
spring:
cloud:
config:
name: application
uri: http://localhost:1234/
#label: master #默认为主分支master
#profile: default #默认为default
步骤三:service和serviceimpl中书写业务代码,如:获取端口号
public interface UserService {
public String demo();
}
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserService userService;
//@Value("${}")注解从配置文件读取值的用法
@Value("${server.port}")
private String port;
@Override
public String demo() {
System.out.println(port);
return port;
}
}
步骤四:controller
@RestController
public class MyController {
@Autowired
private UserService userService;
@RequestMapping("/demo01")
public String demo01(){
return userService.demo();
}
}
访问http://localhost:8787/demo01结果打印8787
五、热刷新
Config-client客户端服务应用,在启动的时候,会根据bootstrap配置内容远程访问config-server,获取当时的最新的配置内容。如果config-client运行过程中,Git仓库中的配置内容发生变更,config-client不会自动的加载刷新配置内容。需要认为干预。重启服务,一定会刷新配置。但是重启服务代价太高。这时就可以使用热刷新。
热刷新是指的是服务不重启,不间断对外提供服务,而是重新加载配置内容,初始化应用环境。
因为SpringBoot只有在启动时才加载一次配置文件,所以gitee上配置文件修改了,项目也不会实时跟随变化,既然是SpringBoot的问题,可以使用spring boot提供的Actuator来实现刷新项目的功能。
就需要依赖springbootstarteracuator启动器来实现刷新项目功能。
步骤一:添加actuator启动器
<!--热刷新启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
步骤二:bootstrap.yml配置文件中增加配置。
spring:
cloud:
config:
name: application
uri: http://localhost:1234/
#label: master #默认为主分支master
#profile: default #默认为default
management:
endpoints:
web:
exposure:
include: refresh
步骤三:serviceimp中添加注解。注意:不能添加到controller中,否则不生效
public interface UserService {
public String demo();
}
@Service
@RefreshScope
public class UserServiceImpl implements UserService {
@Autowired
private UserService userService;
@Value("${server.port}")
private String port;
@Override
public String demo() {
System.out.println(port);
return port;
}
}
步骤四:Actuator的refresh需要使用post进行访问,借助postman实现<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/22310212/1636812737062-f4924bec-3e79-4dfd-a9d4-06cf33e5c833.png#clientId=ua50496e6-623f-4&from=paste&height=72&id=ud5f4289b&margin=%5Bobject%20Object%5D&name=image.png&originHeight=143&originWidth=632&originalType=binary&ratio=1&size=10747&status=done&style=none&taskId=u43190442-b708-4182-8017-cc6fb2c24e5&width=316)<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/22310212/1636812751285-2de1a9a4-a246-4d50-9d9e-203cabf15ec8.png#clientId=ua50496e6-623f-4&from=paste&height=630&id=u8fdd8735&margin=%5Bobject%20Object%5D&name=image.png&originHeight=1259&originWidth=1796&originalType=binary&ratio=1&size=134775&status=done&style=none&taskId=u4a7e6f5b-6c0c-4736-9195-b34acf6f913&width=898)<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/22310212/1636812770619-e4b358a4-010b-48c4-aa31-1f9fdd91fa17.png#clientId=ua50496e6-623f-4&from=paste&height=494&id=ua0f1e492&margin=%5Bobject%20Object%5D&name=image.png&originHeight=988&originWidth=1674&originalType=binary&ratio=1&size=111900&status=done&style=none&taskId=u248c8fbe-c187-4804-85b1-c858bc4128c&width=837)