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

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

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

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
在这里插入图片描述
(2)点击mappings
在这里插入图片描述
(3)点击refresh,运行,则可以实现自动刷新配置文件版本。

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

你可能感兴趣的:(个人)