Spring-cloud的配置中心Config

发布于:2023-01-20 ⋅ 阅读:(9) ⋅ 点赞:(0) ⋅ 评论:(0)

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