Config的基础认识
Config是SpringCloud的配置中心组件,集中管理配置文件,是客户端和服务器端CS模式,配置文件基于Git的。
Config的基本使用
搭建一个Config服务器
1.导入config的依赖和注册中心的依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
2.启动类添加注解 @EnableConfigServer\@EnableDiscoveryClient
3.在服务名称的配置文件里面配置git的有关配置
spring.application.name=config-server
#是否从注册中心获得数据
eureka.client.fetch-registry=true
#是否注册到注册中心上
eureka.client.register-with-eureka=true
#配置注册中心的地址
eureka.client.serviceUrl.defaultZone=http://127.0.0.1:8888/eureka/
#配置中心git相关配置
spring.cloud.config.server.git.uri=自己的git仓库
spring.cloud.config.server.git.username=自己的账号
spring.cloud.config.server.git.password=自己的密码
#配置文件存放的目录,如果是根目录可以不配置
#spring.cloud.config.server.git.search-paths=xxx
#分支名称
spring.cloud.config.label=master
搭建一个Config客户端
1.引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-client</artifactId>
</dependency>
2.将配置文件application改名为bootstrap,因为bootrap是提前于application加载的。
#应用程序名
spring.application.name=goods-service
#是否从注册中心获得数据
eureka.client.fetch-registry=true
#是否注册到注册中心上
eureka.client.register-with-eureka=true
#配置注册中心的地址
eureka.client.serviceUrl.defaultZone=http://127.0.0.1:8888/eureka/
#配置中心服务器的配置
spring.cloud.config.discovery.service-id=config-server
#启动配置中心的发现机制
spring.cloud.config.discovery.enabled=true
#配置profile 不写profile 填default
spring.cloud.config.profile=dev
#配置分支
spring.cloud.config.label=master
如何动态更新配置文件
如果每次更改配置文件后要重启系统就显得十分繁琐,如何让配置文件更新后,在不重启系统的基础上,客户端自动的获得最新的配置,这里提供三种方式。
手动更新
1.客户端引入依赖 actuator
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
2.在需要进行动态更新配置的类上加 @RefreshScope
3.开启端点
\#开启全部端点
management.endpoints.web.exposure.include=*
4.发送post请求
http://服务ip:端口/actuator/refresh
缺点:虽然他不需要重新启动系统,但是每次更新后,还需要手动发送一次post请求,还是有点让费时间的。
自动更新
在这里可以通过内网穿透来测试,我这里是使用的是natapp,还要在git远程仓库配WebHooks。
如果使用的gittee,此时会报一个400错误,解决方案是编写2哥配置类,并且在启动类上加一个@ServletComponentScan注解。
public class CustometRequestWrapper extends HttpServletRequestWrapper {
public CustometRequestWrapper(HttpServletRequest request) {
super(request);
}
@Override
public ServletInputStream getInputStream() throws IOException {
byte[] bytes = new byte[0];
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
return new ServletInputStream() {
@Override
public boolean isFinished() {
return byteArrayInputStream.read() == -1 ? true:false;
}
@Override
public boolean isReady() {
return false;
}
@Override
public void setReadListener(ReadListener readListener) {
}
@Override
public int read() throws IOException {
return byteArrayInputStream.read();
}
};
}
}
@WebFilter(filterName = "bodyFilter", urlPatterns = "/*")
@Order(1)
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest)servletRequest;
String url = new String(httpServletRequest.getRequestURI());
//只过滤/actuator/refresh请求
if (!url.endsWith("/actuator/refresh")) {
filterChain.doFilter(servletRequest, servletResponse);
return;
}
//使用HttpServletRequest包装原始请求达到修改post请求中body内容的目的
CustometRequestWrapper requestWrapper = new CustometRequestWrapper(httpServletRequest);
filterChain.doFilter(requestWrapper, servletResponse);
}
@Override
public void destroy() {
}
}
缺点:虽然这种方式可以自动更新配置文件,但是它只能更新一个服务的配置文件,如何让一次就把所有的配置文件都更新呢?可以使用下面的第三种方式。
使用消息总线Bus+RabbitMQ实现自动更新
Bus是SpringCloud的消息总线,可以借助消息队列(RabbitMQ)进行消息广播。
实现步骤:
1.安装RabbitMQ,安装过程可以看RabbitMQ的安装_恒哥~Bingo的博客-CSDN博客_rabbitmq安装
2.Config服务和客户端都添加依赖(服务端还需要导入actuator依赖)
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
3.Config服务和客户端都添加配置,也可以不用配置,因为配置的都是默认的。
spring:
rabbitmq:
host: 127.0.0.1
port: 5672
username: guest
password: guest
4.Config服务暴露端点
management.endpoints.web.exposure.include=*
5.Webhook 向Config服务发送post请求
http://ywki8i.natappfree.cc/actuator/bus-refresh