Commit 03f180f2 authored by lihaipeng's avatar lihaipeng

restTemplate、spring-task、rocketmq外部配置

parent 19d0b3d8
package com.unififi.api;
import com.unififi.model.User;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.http.MediaType;
......@@ -9,6 +10,7 @@ import org.springframework.web.bind.annotation.*;
import java.util.List;
@FeignClient(value = "unififi-demo2-service")
@Api(tags = "用户操作")
public interface UserApi {
@RequestMapping(value = "/echo/{string}", method = RequestMethod.GET)
......
package com.unififi.config.controller;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.commons.codec.Charsets;
import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpInputMessage;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.http.converter.HttpMessageNotWritableException;
import java.io.IOException;
import java.lang.reflect.Type;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
......@@ -25,7 +16,12 @@ import java.util.List;
public class HttpMessageConverterConfig {
@Bean
public HttpMessageConverters fastJsonHttpMessageConverters() {
public HttpMessageConverters fastJsonHttpMessageConverters(FastJsonHttpMessageConverter fastJsonHttpMessageConverter) {
return new HttpMessageConverters(fastJsonHttpMessageConverter);
}
@Bean
public FastJsonHttpMessageConverter fastJsonHttpMessageConverter() {
FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
FastJsonConfig fastJsonConfig = new FastJsonConfig();
SerializerFeature[] serializerFeatures = new SerializerFeature[]{
......@@ -34,46 +30,14 @@ public class HttpMessageConverterConfig {
// 循环引用
SerializerFeature.DisableCircularReferenceDetect
};
fastJsonConfig.setSerializerFeatures(serializerFeatures);
fastJsonConfig.setCharset(Charset.forName("UTF-8"));
fastJsonConfig.setCharset(Charsets.UTF_8);
fastConverter.setFastJsonConfig(fastJsonConfig);
List<MediaType> fastjsonSupportedMediaTypes = new ArrayList<>();
fastjsonSupportedMediaTypes.add(MediaType.TEXT_PLAIN);
fastjsonSupportedMediaTypes.add(MediaType.APPLICATION_JSON);
fastConverter.setSupportedMediaTypes(fastjsonSupportedMediaTypes);
return new HttpMessageConverters(fastConverter);
return fastConverter;
}
private static class UnififiFastJsonHttpMessageConverter extends FastJsonHttpMessageConverter {
private static final Logger logger = LoggerFactory.getLogger("ControllerLog");
@Override
public Object read(Type type, Class<?> contextClass, HttpInputMessage inputMessage) throws IOException,
HttpMessageNotReadableException {
Object obj = super.read(type, contextClass, inputMessage);
if (logger.isInfoEnabled()) {
logger.info("Unififi-REQ-[{}] {}", type.getTypeName(), JSON.toJSONString(obj));
}
return obj;
}
@Override
public void write(Object t, Type type, MediaType contentType, HttpOutputMessage outputMessage)
throws IOException, HttpMessageNotWritableException {
if (type.getTypeName().endsWith("ListResp")) {
if (logger.isInfoEnabled()) {
logger.info("Unififi-RESP-[{}] {}", type.getTypeName(), "LIST_IGNORE");
}
} else {
if (logger.isInfoEnabled()) {
logger.info("Unififi-RESP-[{}] {}", type.getTypeName(), JSON.toJSONString(t));
}
}
super.write(t, type, contentType, outputMessage);
}
}
}
......@@ -4,17 +4,16 @@ import com.unififi.config.logger.LoggerConfig;
import feign.Request;
import feign.Response;
import feign.Util;
import org.apache.commons.codec.Charsets;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.nio.charset.Charset;
import static feign.Util.decodeOrDefault;
public class UnififiFeignLogger extends feign.Logger {
private static final Logger logger = LoggerFactory.getLogger("FeignLog");
public static final Charset UTF_8 = Charset.forName("UTF-8");
// private final Logger logger;
private LoggerConfig.Setting setting;
......@@ -27,7 +26,7 @@ public class UnififiFeignLogger extends feign.Logger {
protected void logRequest(String configKey, Level logLevel, Request request) {
if (logger.isInfoEnabled() && setting.isEnabled()) {
if (!setting.getSkipMethodSigns().contains(configKey)) {
logger.info("FEIGN-REQ-[{}] {} --> {} {}", configKey, request.body() != null ? new String(request.body(), UTF_8) : "", request.httpMethod(), request.url());
logger.info("FEIGN-REQ-[{}] {} --> {} {}", configKey, request.body() != null ? new String(request.body(), Charsets.UTF_8) : "", request.httpMethod(), request.url());
}
}
}
......@@ -41,7 +40,7 @@ public class UnififiFeignLogger extends feign.Logger {
if (setting.getIgnoreResponseDataMethodSigns().contains(configKey)) {
logger.info("FEIGN-RESP-[{}] IGNORE_DATA size:{} spend:{}ms", configKey, (bodyData != null ? bodyData.length : 0), elapsedTime);
} else {
logger.info("FEIGN-RESP-[{}] {} size:{} spend:{}ms", configKey, decodeOrDefault(bodyData, UTF_8, ""), (bodyData != null ? bodyData.length : 0), elapsedTime);
logger.info("FEIGN-RESP-[{}] {} size:{} spend:{}ms", configKey, decodeOrDefault(bodyData, Charsets.UTF_8, ""), (bodyData != null ? bodyData.length : 0), elapsedTime);
}
}
}
......
package com.unififi.config.rest;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import com.google.common.base.Charsets;
import com.unififi.config.logger.LoggerConfig;
import org.apache.http.client.HttpClient;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
......@@ -9,8 +11,15 @@ import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.BufferingClientHttpRequestFactory;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.http.converter.json.GsonHttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.client.RestTemplate;
import java.util.Iterator;
import java.util.List;
@Configuration
public class RestTemplateConfig {
......@@ -30,10 +39,25 @@ public class RestTemplateConfig {
@LoadBalanced
@Bean
public RestTemplate restTemplate(ClientHttpRequestFactory httpRequestFactory, LoggerConfig loggerConfig) {
public RestTemplate restTemplate(ClientHttpRequestFactory httpRequestFactory, LoggerConfig loggerConfig, FastJsonHttpMessageConverter fastJsonHttpMessageConverter) {
BufferingClientHttpRequestFactory bufferingClientHttpRequestFactory = new BufferingClientHttpRequestFactory(httpRequestFactory);
RestTemplate restTemplate = new RestTemplate(bufferingClientHttpRequestFactory);
restTemplate.getInterceptors().add(new RestTemplateLogInterceptor(loggerConfig.getRest()));
//fastjson 替换 jackson
List<HttpMessageConverter<?>> messageConverters = restTemplate.getMessageConverters();
Iterator<HttpMessageConverter<?>> iterator = messageConverters.iterator();
while (iterator.hasNext()) {
HttpMessageConverter<?> converter = iterator.next();
if (converter instanceof StringHttpMessageConverter) {
iterator.remove();
}
if (converter instanceof GsonHttpMessageConverter || converter instanceof MappingJackson2HttpMessageConverter) {
iterator.remove();
}
}
messageConverters.add(new StringHttpMessageConverter(Charsets.UTF_8));
messageConverters.add(fastJsonHttpMessageConverter);
return restTemplate;
}
}
package com.unififi.config.rest;
import com.unififi.config.logger.LoggerConfig;
import org.apache.commons.codec.Charsets;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpRequest;
......@@ -12,13 +13,11 @@ import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URI;
import java.nio.charset.Charset;
import java.util.concurrent.TimeUnit;
public class RestTemplateLogInterceptor implements ClientHttpRequestInterceptor {
private static final Logger logger = LoggerFactory.getLogger("RestTemplateLog");
public static final Charset UTF_8 = Charset.forName("UTF-8");
private LoggerConfig.Setting setting;
public RestTemplateLogInterceptor(LoggerConfig.Setting setting) {
......@@ -31,7 +30,7 @@ public class RestTemplateLogInterceptor implements ClientHttpRequestInterceptor
if (logger.isInfoEnabled() && setting.isEnabled()) {
if (!setting.getSkipMethodSigns().contains(methodTag)) {
logger.info("REST-REQ-[{}] {} --> {} {}", methodTag, body != null ? new String(body, UTF_8) : "", request.getMethod(), request.getURI());
logger.info("REST-REQ-[{}] {} --> {} {}", methodTag, body != null ? new String(body, Charsets.UTF_8) : "", request.getMethod(), request.getURI());
}
}
long start = System.nanoTime();
......@@ -41,7 +40,7 @@ public class RestTemplateLogInterceptor implements ClientHttpRequestInterceptor
long elapsedTime = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - start);
if (logger.isInfoEnabled()) {
StringBuilder inputStringBuilder = new StringBuilder();
try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(response.getBody(), UTF_8))) {
try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(response.getBody(), Charsets.UTF_8))) {
String line = bufferedReader.readLine();
while (line != null) {
inputStringBuilder.append(line);
......
......@@ -3,9 +3,12 @@ package com.unififi.controller;
import com.unififi.api.UserApi;
import com.unififi.config.AppConfig;
import com.unififi.model.TicketingOrder;
import com.unififi.model.User;
import com.unififi.service.UserService;
import com.unififi.task.UnififiTask;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
......@@ -34,6 +37,10 @@ public class Demo1Controller {
private LoadBalancerClient loadBalancer;
@Autowired
private UserService userService;
@Autowired
private UnififiTask unififiTask;
@Autowired
private RocketMQTemplate rocketMQTemplate;
@GetMapping("/echo/{string}")
......@@ -70,6 +77,8 @@ public class Demo1Controller {
@GetMapping("/sleep")
public String sleep() {
try {
unififiTask.testAsync();
log.info("testAsync finish");
long ms = (new Random().nextInt(10) + 1) * 1000;
Thread.sleep(ms);
System.out.println("sleep " + ms);
......@@ -96,4 +105,12 @@ public class Demo1Controller {
public String redisGet(String name) {
return stringRedisTemplate.opsForValue().get(name);
}
@GetMapping("/sendmq")
public void sendMQ() {
TicketingOrder order = new TicketingOrder();
order.setOrderNo("ticketing11111111111");
rocketMQTemplate.convertAndSend("order-push:ticketing", order);
}
}
package com.unififi.task;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.*;
import org.springframework.stereotype.Component;
import java.util.concurrent.Future;
@EnableAsync
@EnableScheduling
@Component
@Slf4j
public class UnififiTask {
@Async
public Future<String> testAsync() throws InterruptedException {
Thread.sleep(2000);
log.info("test async");
return new AsyncResult<>("test");
}
@Scheduled(cron = "0 */10 * * * ?")
public void testSchedule() {
log.info("test schedule");
}
}
......@@ -29,13 +29,35 @@ spring:
- data-id: unififi-jdbc.yaml
refresh: false
group: DEFAULT_GROUP
- data-id: unififi-rocketmq.yaml
refresh: false
group: DEFAULT_GROUP
discovery:
metadata:
unififi.mode: ${unififi.mode}
unififi.service.version: '@unififi-service.version@'
unififi.env: ${spring.profiles.active}
rocketmq:
name-server: 39.106.6.97:9876
producer:
group: unififi-demo1-service
\ No newline at end of file
task:
execution:
thread-name-prefix: task-
pool:
max-size: 8
core-size: 8
queue-capacity: 50
keep-alive: 60s
allow-core-thread-timeout: true
scheduling:
thread-name-prefix: scheduling-
pool:
size: 1
#rocketmq:
# name-server: 39.106.6.97:9876
# producer:
# group: ${spring.application.name}
# 测试时使用配置服务列表
#unififi-demo2-service:
# ribbon:
# NIWSServerListClassName: com.netflix.loadbalancer.ConfigurationBasedServerList
# listOfServers: 39.106.6.97:18080
\ No newline at end of file
......@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import org.apache.commons.codec.Charsets;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
......@@ -17,7 +18,6 @@ import org.springframework.http.converter.HttpMessageNotWritableException;
import java.io.IOException;
import java.lang.reflect.Type;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
......@@ -26,7 +26,7 @@ public class HttpMessageConverterConfig {
@Bean
public HttpMessageConverters fastJsonHttpMessageConverters() {
FastJsonHttpMessageConverter fastConverter = new UheFastJsonHttpMessageConverter();
FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
FastJsonConfig fastJsonConfig = new FastJsonConfig();
SerializerFeature[] serializerFeatures = new SerializerFeature[]{
// Date的日期转换器
......@@ -36,7 +36,7 @@ public class HttpMessageConverterConfig {
};
fastJsonConfig.setSerializerFeatures(serializerFeatures);
fastJsonConfig.setCharset(Charset.forName("UTF-8"));
fastJsonConfig.setCharset(Charsets.UTF_8);
fastConverter.setFastJsonConfig(fastJsonConfig);
List<MediaType> fastjsonSupportedMediaTypes = new ArrayList<>();
......
package com.unififi.config;
import org.apache.commons.codec.Charsets;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpRequest;
......@@ -11,20 +12,18 @@ import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URI;
import java.nio.charset.Charset;
import java.util.concurrent.TimeUnit;
public class UnififiRestTemplateLogInterceptor implements ClientHttpRequestInterceptor {
private static final Logger logger = LoggerFactory.getLogger(UnififiRestTemplateLogInterceptor.class);
public static final Charset UTF_8 = Charset.forName("UTF-8");
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
String methodTag = getMethodTag(request.getURI());
if (logger.isInfoEnabled()) {
logger.info("REST-REQ-[{}] {} --> {} {}", methodTag, body != null ? new String(body, UTF_8) : "", request.getMethod(), request.getURI());
logger.info("REST-REQ-[{}] {} --> {} {}", methodTag, body != null ? new String(body, Charsets.UTF_8) : "", request.getMethod(), request.getURI());
}
long start = System.nanoTime();
ClientHttpResponse response = null;
......@@ -33,7 +32,7 @@ public class UnififiRestTemplateLogInterceptor implements ClientHttpRequestInter
long elapsedTime = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - start);
if (logger.isInfoEnabled()) {
StringBuilder inputStringBuilder = new StringBuilder();
try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(response.getBody(), UTF_8))) {
try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(response.getBody(), Charsets.UTF_8))) {
String line = bufferedReader.readLine();
while (line != null) {
inputStringBuilder.append(line);
......
......@@ -29,11 +29,12 @@ spring:
refresh: false
group: DEFAULT_GROUP
discovery:
#ip: 39.106.6.97
metadata:
unififi.mode: ${unififi.mode}
unififi.service.version: '@unififi-service.version@'
user.home: ${user.home}
rocketmq:
name-server: 39.106.6.97:9876
producer:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment