版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/shenzhen_zsw/article/details/89442253
目录
服务通信组件RestTemplate
HttpClientAutoConfiguration和RestAutoConfig添加@Configuration注解,启动工程会自动加载和创建对应的bean;
Spring RestTemplate介绍
RestTemplate接入
创建httpclient bean
package com.mooc.house.api.config;
import org.apache.http.client.HttpClient;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.impl.client.HttpClientBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.zalando.logbook.httpclient.LogbookHttpRequestInterceptor;
import org.zalando.logbook.httpclient.LogbookHttpResponseInterceptor;
@Configuration
@ConditionalOnClass({HttpClient.class})
@EnableConfigurationProperties(HttpClientProperties.class)
public class HttpClientAutoConfiguration {
private final HttpClientProperties properties;
public HttpClientAutoConfiguration(HttpClientProperties properties){
this.properties = properties;
}
@Autowired
private LogbookHttpRequestInterceptor logbookHttpRequestInterceptor;
@Autowired
private LogbookHttpResponseInterceptor logbookHttpResponseInterceptor;
/**
* httpclient bean 的定义
* @return
*/
@Bean
@ConditionalOnMissingBean(HttpClient.class)
public HttpClient httpClient() {
RequestConfig requestConfig = RequestConfig.custom()
.setConnectTimeout(properties.getConnectTimeOut())
.setSocketTimeout(properties.getSocketTimeOut()).build();// 构建requestConfig
HttpClient client = HttpClientBuilder.create().setDefaultRequestConfig(requestConfig)
.setUserAgent(properties.getAgent())
.setMaxConnPerRoute(properties.getMaxConnPerRoute())
.setMaxConnTotal(properties.getMaxConnTotaol())
.addInterceptorFirst(logbookHttpRequestInterceptor)
.addInterceptorFirst(logbookHttpResponseInterceptor)
.build();
return client;
}
}
创建RestTemplate bean
package com.mooc.house.api.config;
import java.nio.charset.Charset;
import java.util.Arrays;
import org.apache.http.client.HttpClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.web.client.RestTemplate;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter4;
@Configuration
public class RestAutoConfig {
public static class RestTemplateConfig {
/**
* 负载均衡
* @param httpclient
* @return
*/
@Bean
@LoadBalanced //spring 对restTemplate bean进行定制,加入loadbalance拦截器进行ip:port的替换
RestTemplate lbRestTemplate(HttpClient httpclient) {
RestTemplate template = new RestTemplate(new HttpComponentsClientHttpRequestFactory(httpclient));
template.getMessageConverters().add(0,new StringHttpMessageConverter(Charset.forName("utf-8")));
template.getMessageConverters().add(1,new FastJsonHttpMessageConvert5());
return template;
}
/**
* 直连
* @param httpclient
* @return
*/
@Bean
RestTemplate directRestTemplate(HttpClient httpclient) {
RestTemplate template = new RestTemplate(new HttpComponentsClientHttpRequestFactory(httpclient));
template.getMessageConverters().add(0,new StringHttpMessageConverter(Charset.forName("utf-8")));
template.getMessageConverters().add(1,new FastJsonHttpMessageConvert5());
return template;
}
public static class FastJsonHttpMessageConvert5 extends FastJsonHttpMessageConverter4 {
static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
public FastJsonHttpMessageConvert5(){
setDefaultCharset(DEFAULT_CHARSET);
setSupportedMediaTypes(Arrays.asList(MediaType.APPLICATION_JSON,new MediaType("application","*+json")));
}
}
}
}
说明:
1)创建负载均衡的RestTemplate,添加注解@LoadBalanced;
2)创建直连RestTemplate;
服务接口通信协议
RestResponse
package com.mooc.house.api.common;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
@JsonInclude(Include.NON_NULL)
public class RestResponse<T> {
private int code;
private String msg;
private T result;
public static <T> RestResponse<T> success() {
return new RestResponse<T>();
}
public static <T> RestResponse<T> success(T result) {
RestResponse<T> response = new RestResponse<T>();
response.setResult(result);
return response;
}
public static <T> RestResponse<T> error(RestCode code) {
return new RestResponse<T>(code.code,code.msg);
}
public RestResponse(){
this(RestCode.OK.code, RestCode.OK.msg);
}
public RestResponse(int code,String msg){
this.code = code;
this.msg = msg;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public T getResult() {
return result;
}
public void setResult(T result) {
this.result = result;
}
@Override
public String toString() {
return "RestResponse [code=" + code + ", msg=" + msg + ", result=" + result + "]";
}
}
==============================
QQ群:143522604
群里有相关资源
欢迎和大家一起学习、交流、提升!
==============================