一.配置中心概念
当有多个微服务时,他们各自的配置文件都需要单独配置,十分复杂,有些公共配置,例如数据库连接池等,如果有一个服务提供配置中心,那么他可以配置所有的服务,其他服务从配置中心中读取所需要的配置信息即可
可以用Git,MySql,Redis来建立配置中心
二.Git上创建配置
1.配置中心服务端
(1).新建一个仓库config-server,在仓库中创建一个文件config-client-dev.yml
(2).创建一个新项目cloud-config-server-git
(3).引入依赖
<!-- 配置中心-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
</dependencies>
(4).修改配置文件
spring:
application:
name: config-server-git
cloud:
nacos:
server-addr: localhost:8848
#配置中心配置
config:
server:
git:
uri: https://gitee.com/ji_jiahao/config-server.git
username: 1046407954@qq.com
password: jjh123456
#访问超时时间
timeout: 15
(5).在启动类上添加注解@EanbleConfigServer
(6).访问localhost:8888/config-client-dev.yml
成功访问配置文件的信息!
2.创建配置客户端
(1)创建一个config-client项目,
(2)引入客户端依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-client</artifactId>
</dependency>
(3)修改配置文件bootstrap.yml
spring:
cloud:
nacos:
server-addr: localhost:8848
config:
discovery:
enabled: true
service-id: config-server-git
profile: dev
label: master
application:
name: config-client
(4)测试接口
@RestController
@RequestMapping
public class TestConfigController {
@Value("${testKey}")
private String testKey;
/**
* 测试从git中获取配置信息
* @return
*/
@GetMapping("/testKey")
public String getConfigByGit(){
return testKey;
}
}
访问获取信息
3.配置的手动刷新
如果想让配置中心的客户端感知到gitee上的变化,需要改造一下client项目,
(1)在Controller上添加注解@RefreshScope
(2)在pom中添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
(3)修改bootstrap.yml,开启刷新节点
management:
endpoints:
web:
exposure:
#yml加双引号,properties不要加
include: "*"
当在gitee上修改文件时,在Postman上向cloud-config-client发送一个post请求
http://localhost:8889/actuator/refresh
再次请求testKey时,就跟新了
4.配置的自动刷新
当有很多微服务时,就需要自动刷新了,需要在gitee上设置钩子函数
流程:
(1)gitee上的修改会触发钩子函数,请求一个配置中心服务端的地址URL-A
(2)URL-A调用服务的端点actuator/bus-refresh
(3)通过步骤(2),将配置更新的消息发送给消息队列RabbitMQ
(4)其他所有定义RabbitMQ的服务监听到消息后,更新自己的配置
(1)在pom中引入依赖
<!--服务端开启refresh端口-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- 总线-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
(2)修改application.yml
spring:
rabbitmq:
host: localhost
port: 5672
username: jjh123
password: 123456
(3)写接收钩子函数调用的接口
@RestController
@RequestMapping("/git-webhook")
public class WebhookController {
@Resource
private RestTemplate restTemplate;
@PostMapping("/bus-refresh")
public String refresh(){
HttpHeaders httpHeaders = new org.springframework.http.HttpHeaders();
httpHeaders.add(HttpHeaders.CONTENT_TYPE,"application/json");
HttpEntity<String> request = new HttpEntity<>(httpHeaders);
ResponseEntity<String> stringResponseEntity = restTemplate.postForEntity(
"http://localhost:8889/actuator/bus-refresh",request,String.class
) ;
return "webhook刷新成功!";
}
}
(4)设置钩子函数
三.MySQL上创建配置
1.创建config_server表
2.在pom中引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
3.修改bootstrap.yml文件
spring:
cloud:
config:
server:
default-lable: dev
jdbc:
sql: SELECT config_key,config_value, FROM config_server where application_name
=? and config_profile=? and config_lable=?
datasource:
nacos:
server-addr: localhost:8848
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/config?characterEncoding=UTF-8&serverTimeZone=Asia/Shanghai
username: root
password: 123456
profiles:
active: jdbc
application:
name: config-client
这样就脱离了gitee,将配置信息存储在Mysql中了
四.Nacos配置中心
1.新建配置
2.添加依赖
<!-- 配置中心-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-client</artifactId>
</dependency>
</dependencies>
3.修改bootstrap.yml
cloud:
nacos:
server-addr: localhost:8848
#配置中心
config:
# 从nacos中获取
file-extension: yaml
group: DEFAULT_GROUP
3.编写接口测试
@Value("${name}")
private String name;
/**
* 测试从nacos获取配置信息
* @return
*/
@GetMapping("/testname")
public String getConfigMsg(){
return name;
}
4.命名空间环境隔离
不同的命名空间之间互相隔离,创建一个命名空间namespace
在yml上吧id写上
cloud:
nacos:
server-addr: localhost:8848
#配置中心
config:
# 从nacos中获取
file-extension: yaml
group: DEFAULT_GROUP
namespace: 30270da9-b363-4e6f-b88e-5e70c5889f37