欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

springcloud config在Git端修改配置后,在不重启服务中如何让客户端生效

程序员文章站 2022-07-12 13:14:39
...

springcloud config在Git端修改配置后,在不重启服务中如何让客户端生效

1、使用git后,由于需要加载git中的配置文件,所以客户端的配置文件需要更换为bootstrap.properties。
springcloud config在Git端修改配置后,在不重启服务中如何让客户端生效

2、在客户端的pom文件中添加actuator的依赖jar包,实现刷新的必要依赖

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
  </dependency>

或者

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
  </dependency>

3、在全局配置文件中添加配置信息
(1)yml格式的配置文件

management:
  endpoints:
    web:
      exposure:
        include: shutdown,refresh #暴漏shutdown,refresh端点服务
  endpoint:
    shutdown:
      enabled: true

(2)properties格式的配置文件

# 服务名称、端口
spring.application.name=config-client
server.port=9051

#设置服务注册中心地址,指向另一个注册中心
eureka.client.service-url.defaultZone=http://admin:admin@eureka1:8761/eureka/,http://admin:admin@eureka2:8761/eureka/

#暴露shutdown端点服务
management.endpoints.web.exposure.include=shutdown,refresh
#启用shutdown,优雅停服`
management.endpoint.shutdown.enabled=true

#默认 false,这里设置 true,表示开启读取配置中心的配置
spring.cloud.config.discovery.enabled=true
#对应 eureka 中的配置中心 serviceId,默认是 configserver
spring.cloud.config.discovery.serviceId=config-server
#指定环境
spring.cloud.config.profile=dev
#git 标签
spring.cloud.config.label=master

注意:因为spring容器的对象是单例模式,创建后不会重新创建,所以要在需要重新注入的类上加上刷新作用域的注解。

@RestController
@RefreshScope   //刷新作用域
public class ConfigController {

    @Value("${e-book}")
    private String msg;

    @RequestMapping("/show")
    public String show(){
        return msg;
    }
}

4、实现自动刷新的方式一:

可以利用工具类发送refresh请求实现自动刷新git本地仓库的配置文件。

注意:实现自动刷新必须使用dopost请求发送。

http://ip:port/actuator/refresh

http工具类:

public class HttpClientUtil {

	public static String doGet(String url, Map<String, String> param) {

		// 创建Httpclient对象
		CloseableHttpClient httpclient = HttpClients.createDefault();

		String resultString = "";
		CloseableHttpResponse response = null;
		try {
			// 创建uri
			URIBuilder builder = new URIBuilder(url);
			if (param != null) {
				for (String key : param.keySet()) {
					builder.addParameter(key, param.get(key));
				}
			}
			URI uri = builder.build();

			// 创建http GET请求
			HttpGet httpGet = new HttpGet(uri);

			// 执行请求
			response = httpclient.execute(httpGet);
			// 判断返回状态是否为200
			if (response.getStatusLine().getStatusCode() == 200) {
				resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (response != null) {
					response.close();
				}
				httpclient.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return resultString;
	}

	public static String doGet(String url) {
		return doGet(url, null);
	}

	public static String doPost(String url, Map<String, String> param) {
		// 创建Httpclient对象
		CloseableHttpClient httpClient = HttpClients.createDefault();
		CloseableHttpResponse response = null;
		String resultString = "";
		try {
			// 创建Http Post请求
			HttpPost httpPost = new HttpPost(url);
			// 创建参数列表
			if (param != null) {
				List<NameValuePair> paramList = new ArrayList<>();
				for (String key : param.keySet()) {
					paramList.add(new BasicNameValuePair(key, param.get(key)));
				}
				// 模拟表单
				UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList,"utf-8");
				httpPost.setEntity(entity);
			}
			// 执行http请求
			response = httpClient.execute(httpPost);
			resultString = EntityUtils.toString(response.getEntity(), "utf-8");
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				response.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

		return resultString;
	}

	public static String doPost(String url) {
		return doPost(url, null);
	}
	
	public static String doPostJson(String url, String json) {
		// 创建Httpclient对象
		CloseableHttpClient httpClient = HttpClients.createDefault();
		CloseableHttpResponse response = null;
		String resultString = "";
		try {
			// 创建Http Post请求
			HttpPost httpPost = new HttpPost(url);
			// 创建请求内容
			StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON);
			httpPost.setEntity(entity);
			// 执行http请求
			response = httpClient.execute(httpPost);
			resultString = EntityUtils.toString(response.getEntity(), "utf-8");
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				response.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

		return resultString;
	}
	
	public static void main(String[] args) {
		String url ="http://127.0.0.1:9051/actuator/refresh";
		//该url必须要使用dopost方式来发送
		HttpClientUtil.doPost(url);
	}
}

5、实现自动刷新的方式二:

利用idea工具实现自动刷新
(1)点击控制台上的endpoints
springcloud config在Git端修改配置后,在不重启服务中如何让客户端生效
(2)点击mappings
springcloud config在Git端修改配置后,在不重启服务中如何让客户端生效
(3)点击refresh,运行,则可以实现自动刷新配置文件版本。

springcloud config在Git端修改配置后,在不重启服务中如何让客户端生效

相关标签: 个人