RestTemplateConfig 配置信息
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
RestTemplate restTemplate = new RestTemplateBuilder().build();
restTemplate.setRequestFactory(clientHttpRequestFactory());
return restTemplate;
}
@Bean
public HttpComponentsClientHttpRequestFactory clientHttpRequestFactory() {
try {
HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
SSLContext sslContext = new SSLContextBuilder()
.loadTrustMaterial(null, (TrustStrategy) (arg0, arg1) -> true).build();
httpClientBuilder.setSSLContext(sslContext);
HostnameVerifier hostnameVerifier = NoopHostnameVerifier.INSTANCE;
SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(sslContext,
hostnameVerifier);
// 注册http和https请求
Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()
.register("http", PlainConnectionSocketFactory.getSocketFactory())
.register("https", sslConnectionSocketFactory).build();
// 开始设置连接池
PoolingHttpClientConnectionManager poolingHttpClientConnectionManager = new PoolingHttpClientConnectionManager(
socketFactoryRegistry);
// 最大连接数500
poolingHttpClientConnectionManager.setMaxTotal(500);
// 同路由并发数100
poolingHttpClientConnectionManager.setDefaultMaxPerRoute(100);
// 重试次数
httpClientBuilder.setConnectionManager(poolingHttpClientConnectionManager);
httpClientBuilder.setRetryHandler(new DefaultHttpRequestRetryHandler(3, true));
// httpClient连接配置
CloseableHttpClient httpClient = httpClientBuilder.build();
HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory(
httpClient);
// 连接超时
clientHttpRequestFactory.setConnectTimeout(20000);
// 数据读取超时时间
clientHttpRequestFactory.setReadTimeout(30000);
// 连接不够用的等待时间
clientHttpRequestFactory.setConnectionRequestTimeout(20000);
return clientHttpRequestFactory;
} catch (KeyManagementException | NoSuchAlgorithmException | KeyStoreException e) {
log.error("初始化HTTP连接池出错", e);
}
return null;
}
服务中心相互注册
private static final String APPLICATION = "xxx";
@Autowired
private NacosDiscoveryProperties nacosDiscoveryProperties;
@Autowired
private NacosRegistration registration;
@Value("${register.server.urls:-}")
private String serverUrls;
@Value("${register.server.name:-}")
private String serverName;
@EventListener
public void event(InstanceRegisteredEvent event) throws Exception {
if(serverUrls.equals("-")){
//不需要注册第二个注册中心
return;
}
try {
for (String serverUrl : serverUrls.split(",")) {
nacosDiscoveryProperties.setServerAddr(serverUrl);
String group = nacosDiscoveryProperties.getGroup();
Instance instance = getNacosInstanceFromRegistration(registration);
NamingService namingService = NamingFactory.createNamingService(nacosDiscoveryProperties.getNacosProperties());
namingService.registerInstance(serverName, group, instance);
}
}catch (Exception e){
e.printStackTrace();
}
}
//@EventListener
public void event(ApplicationReadyEvent event) throws Exception {
if("-".equals(serverUrls)){
//不获取总中心的dcim服务列表
return;
}
nacosDiscoveryProperties.setServerAddr(serverName);
String group = nacosDiscoveryProperties.getGroup();
NamingService namingService = NamingFactory.createNamingService(nacosDiscoveryProperties.getNacosProperties());
List<Instance> dcimInstances = namingService.getAllInstances(APPLICATION, group);
LoadBalancerUtil.updateInstances(dcimInstances);
namingService.subscribe(APPLICATION, updateEvent -> {
if (updateEvent instanceof NamingEvent) {
LoadBalancerUtil.updateInstances(((NamingEvent) updateEvent).getInstances());
}
});
}
private Instance getNacosInstanceFromRegistration(Registration registration) {
Instance instance = new Instance();
instance.setIp(registration.getHost());
instance.setPort(registration.getPort());
instance.setWeight(nacosDiscoveryProperties.getWeight());
instance.setClusterName(nacosDiscoveryProperties.getClusterName());
instance.setEnabled(nacosDiscoveryProperties.isInstanceEnabled());
instance.setMetadata(registration.getMetadata());
instance.setEphemeral(nacosDiscoveryProperties.isEphemeral());
return instance;
}
RestTemplate工具类
public static String put(RestTemplate restTemplate, Object entity, String url){
return put(restTemplate,entity,url,String.class);
}
public static <T>T put(RestTemplate restTemplate,Object entity,String url, Class<T> cls){
logParams(RequestMethod.PUT,url,entity);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
HttpEntity<Object> request = new HttpEntity<>(entity,headers);
ResponseEntity<T> exchange = restTemplate.exchange(url, HttpMethod.PUT, request, cls);
T result = exchange.getBody();
log.info("put result:{}",result);
return result;
}
public static String post(RestTemplate restTemplate,Object entity,String url){
return post(restTemplate,url,entity,String.class);
}
/**
* 得到 参数的字符串
* @param entity
* @return
*/
private static String getStringParams(Object entity){
if(entity instanceof String){
return entity.toString();
}
return JSONUtil.toJsonStr(entity);
}
private static void logParams(RequestMethod method, String url, Object entity){
String params=getStringParams(entity);
log.info("{} url:{} params:{}",method,url,params);
}
/**
* json请求,可以指定header
*/
public static <T>T post(RestTemplate restTemplate, String url, Object entity, Map<String,String> headerMap, Class<T> cls){
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
if(!CollectionUtils.isEmpty(headerMap)){
for (Map.Entry<String, String> entry : headerMap.entrySet()) {
headers.set(entry.getKey(),entry.getValue());
}
}
HttpEntity<Object> request = new HttpEntity<>(entity,headers);
return executePost(restTemplate,url,request,cls);
}
/**
* json请求
*/
public static <T>T post(RestTemplate restTemplate,String url, Object entity, Class<T> cls){
return post(restTemplate,url,entity,null,cls);
}
/**
* 表单请求
*/
public static <T>T formPost(RestTemplate restTemplate,String url, Map<String, String> params, Map<String,String> headerMap, Class<T> cls){
HttpHeaders headers = new HttpHeaders();
if(!CollectionUtils.isEmpty(headerMap)){
for (Map.Entry<String, String> entry : headerMap.entrySet()) {
headers.set(entry.getKey(),entry.getValue());
}
}
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
HttpEntity<Object> request = new HttpEntity<>(params,headers);
return executePost(restTemplate,url,request,cls);
}
/**
* post 请求
*/
private static <T>T executePost(RestTemplate restTemplate,String url, HttpEntity<Object> request, Class<T> cls){
logParams(RequestMethod.POST,url,request);
ResponseEntity<T> exchange = restTemplate.exchange(url, HttpMethod.POST, request, cls);
T body = exchange.getBody();
log.info("post result:{}", body);
return body;
}
public static <T>T upload(RestTemplate restTemplate, String url, Map<String, String> updateMap, Map<String,String> headerMap , Class<T> returnClass, Resource resource) {
MultiValueMap<String, Object> parts = new LinkedMultiValueMap<>();
HttpHeaders headers = new HttpHeaders();
if(!CollectionUtils.isEmpty(headerMap)){
for (Map.Entry<String, String> entry : headerMap.entrySet()) {
headers.set(entry.getKey(),entry.getValue());
}
}
parts.add("file",resource);
for (Map.Entry<String, String> entry : updateMap.entrySet()) {
Object value = entry.getValue();
String key = entry.getKey();
log.info("--->upload param key:{},val:{}",key,value);
parts.add(key,value);
}
HttpEntity<Object> httpEntity = new HttpEntity<>(parts, headers);
ResponseEntity<T> exchange = restTemplate.exchange(url, HttpMethod.POST, httpEntity, returnClass);
T body = exchange.getBody();
return body;
}
private static <T>T executeGet(RestTemplate restTemplate,String url, HttpEntity<Object> request, Class<T> cls){
logParams(RequestMethod.GET,url,request);
ResponseEntity<T> exchange = restTemplate.exchange(url, HttpMethod.GET, request, cls);
T body = exchange.getBody();
log.info("get result:{}", body);
return body;
}
public static String get(RestTemplate restTemplate,String url){
return get(restTemplate,url,null,String.class);
}
public static <T>T get(RestTemplate restTemplate,String url, Map<String,String> params,Map<String,String> headerMap, Class<T> cls){
String reqUrl = buildUrl(url,params);
HttpHeaders headers = new HttpHeaders();
if(headerMap != null){
for (Map.Entry<String, String> entry : headerMap.entrySet()) {
headers.set(entry.getKey(),entry.getValue());
}
}
HttpEntity<Object> request = new HttpEntity<>(headers);
return executeGet(restTemplate,reqUrl,request,cls);
}
/**
* get 请求
*/
public static <T>T get(RestTemplate restTemplate,String url, Map<String,String> params, Class<T> cls){
String reqUrl = buildUrl(url,params);
log.info("get url:{}",reqUrl);
T result = restTemplate.getForObject(reqUrl, cls);
log.info("get result:{}", getStringParams(result));
return result;
}
/**
* 设置的url
*/
private static String buildUrl(String url, Map<String,String> params){
StringBuilder urlBuiler=new StringBuilder(url);
if(!url.contains("?")){
urlBuiler.append("?");
}
if(!CollectionUtils.isEmpty(params)){
for (Map.Entry<String, String> entry : params.entrySet()) {
urlBuiler.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
}
}
return urlBuiler.toString();
}