是SpringCloud的配置中心组件,集中管理配置文件,是客户端和服务器端CS模式,配置文件基于Git的。
Config的使用
在git仓库中提交goods-service服务的配置文件 goods-service-dev.properties
命名规则:服务名称-profile名称(dev/test/prod).properties或yml
spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/eshop?serverTimezone=UTC spring.datasource.username=root spring.datasource.password=root
搭建Config服务器
1.引入依赖
<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
3.配置
server.port=6666 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加载 )
server.port=8011 #应用程序名 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
3. 注入配置内容
@Value("${spring.datasource.driver-class-name}") private String driverName; @Value("${spring.datasource.url}") private String url; @Value("${spring.datasource.username}") private String username; @Value("${spring.datasource.password}") private String password;
动态更新配置
配置文件更新后,客户端需要获得最新的配置,在不重启系统的基础上
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
Webhock问题解决方案
启动类加@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() {
}
}