package com.se.system.service; import com.alibaba.fastjson.JSONObject; import com.se.system.domain.vo.NacosConfigVo; import com.se.system.utils.CaffeineUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.*; import org.springframework.stereotype.Component; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.web.client.RestTemplate; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.PrintWriter; import java.lang.reflect.Field; import java.util.Map; @Component @SuppressWarnings("ALL") public class NacosService { @Value("${spring.cloud.nacos.config.server-addr}") String serverAddr; @Value("${spring.cloud.nacos.username}") String username; @Value("${spring.cloud.nacos.password}") String password; @Resource RestTemplate restTemplate; final static String key = "nacos:login:token"; private String getToken() throws Exception { Object obj = CaffeineUtils.get(key); if (obj instanceof String) { return (String) obj; } String token = login(); if (null == token) throw new Exception("Nacos令牌为空"); CaffeineUtils.put(key, token); return token; } private String login() { String url = "http://" + serverAddr + "/nacos/v1/auth/users/login"; MultiValueMap map = new LinkedMultiValueMap(); map.add("username", username); map.add("password", password); JSONObject obj = restTemplate.postForObject(url, map, JSONObject.class); if (null == obj || !obj.containsKey("accessToken")) { return null; } return obj.getString("accessToken"); } public void getNacosConfig(String dataId, HttpServletRequest req, HttpServletResponse res) throws Exception { String token = getToken(); // String url = "http://" + serverAddr + "/nacos/v1/cs/configs?dataId=" + dataId + "&group=&appName=&pageNo=1&pageSize=10&search=accurate"; String url = "http://" + serverAddr + "/nacos/v1/cs/configs?dataId=" + dataId + "&group=DEFAULT_GROUP&namespaceId=&tenant=&show=all&username="; HttpHeaders headers = new HttpHeaders(); headers.set("accessToken", token); HttpEntity> requestEntity = new HttpEntity<>(headers); ResponseEntity re = restTemplate.exchange(url, HttpMethod.GET, requestEntity, String.class); res.setContentType("application/json;charset=UTF-8"); PrintWriter out = res.getWriter(); out.print(re.getBody()); out.flush(); out.close(); } public void updateNacosConfig(NacosConfigVo vo, HttpServletRequest req, HttpServletResponse res) throws Exception { if (null == vo || null == vo.getId() || null == vo.getDataId() || null == vo.getContent()) throw new Exception("NacosConfigVo数据不正确"); String token = getToken(); vo.setModifyTime(System.currentTimeMillis()); //vo.setMd5(StringUtils.md5(vo.getContent())); String url = "http://" + serverAddr + "/nacos/v1/cs/configs?username=" + username; HttpHeaders headers = new HttpHeaders(); // headers.setContentType(MediaType.APPLICATION_JSON); // headers.setContentType(new MediaType("application", "json", StandardCharsets.UTF_8)); headers.setContentType(MediaType.valueOf("application/x-www-form-urlencoded")); headers.set("accessToken", token); headers.set("casMd5", vo.getMd5()); MultiValueMap map = createMap(vo); HttpEntity> entity = new HttpEntity<>(map, headers); ResponseEntity re = restTemplate.exchange(url, HttpMethod.POST, entity, String.class); res.setContentType("application/json;charset=UTF-8"); PrintWriter out = res.getWriter(); out.print(re.getBody()); out.flush(); out.close(); } private MultiValueMap createMap(T t) throws Exception { MultiValueMap map = new LinkedMultiValueMap<>(); Field[] fields = t.getClass().getDeclaredFields(); for (Field field : fields) { field.setAccessible(true); map.add(field.getName(), field.get(t)); } return map; } }