From 1d418ca8e80762bc68e90398807269ac171f0e43 Mon Sep 17 00:00:00 2001 From: 王彪总 Date: Mon, 1 Jun 2026 10:33:20 +0800 Subject: [PATCH] fix(config): 更新配置文件和修复分页计算问题 --- java110-core/src/main/java/com/java110/core/cache/Java110RedisConfig.java | 2 +- java110-core/src/main/java/com/java110/core/trace/Java110RestTemplateInterceptor.java | 14 ++++++-------- java110-core/src/main/java/com/java110/core/trace/Java110TraceSqlInterceptor.java | 5 +++++ java110-db/src/main/java/com/java110/db/DruidDataSourceConfig.java | 19 ++++++++++++++----- java110-db/src/main/java/com/java110/db/Java110MybatisInterceptor.java | 103 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------------------- java110-interface/src/main/resources/logback-prod.xml | 113 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------------------------------------- java110-interface/src/main/resources/logback.xml | 125 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------------------------------------------------------------- service-api/src/main/java/com/java110/api/listener/CmdListener.java | 85 +++++++++++++++++++++++++++++++++++++++++++++++-------------------------------------- service-api/src/main/java/com/java110/api/smo/impl/ApiServiceSMOImpl.java | 28 ++++++++++++++++++---------- service-common/src/main/java/com/java110/common/smo/impl/AttendanceLogInnerServiceSMOImpl.java | 8 +++++++- springboot/src/main/java/com/java110/boot/BootApplicationStart.java | 12 ++++++------ springboot/src/main/resources/application-prod.yml | 12 ++++++++---- 12 files changed, 297 insertions(+), 229 deletions(-) diff --git a/java110-core/src/main/java/com/java110/core/cache/Java110RedisConfig.java b/java110-core/src/main/java/com/java110/core/cache/Java110RedisConfig.java index b2ff2ab..179fcf3 100755 --- a/java110-core/src/main/java/com/java110/core/cache/Java110RedisConfig.java +++ b/java110-core/src/main/java/com/java110/core/cache/Java110RedisConfig.java @@ -138,7 +138,7 @@ public class Java110RedisConfig extends CachingConfigurerSupport { public RedisCacheConfiguration redisCacheConfiguration() { RedisCacheConfiguration configuration = RedisCacheConfiguration.defaultCacheConfig(); - configuration = configuration.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new JdkSerializationRedisSerializer())).entryTtl(Duration.ofSeconds(30)); + configuration = configuration.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new JdkSerializationRedisSerializer())).entryTtl(Duration.ofSeconds(300)); return configuration; diff --git a/java110-core/src/main/java/com/java110/core/trace/Java110RestTemplateInterceptor.java b/java110-core/src/main/java/com/java110/core/trace/Java110RestTemplateInterceptor.java index dc2428c..a2544f1 100644 --- a/java110-core/src/main/java/com/java110/core/trace/Java110RestTemplateInterceptor.java +++ b/java110-core/src/main/java/com/java110/core/trace/Java110RestTemplateInterceptor.java @@ -1,10 +1,8 @@ package com.java110.core.trace; -import com.java110.core.log.LoggerFactory; import com.java110.dto.trace.TraceAnnotationsDto; import com.java110.dto.trace.TraceDto; import com.java110.utils.constant.CommonConstant; -import org.slf4j.Logger; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpRequest; import org.springframework.http.client.ClientHttpRequestExecution; @@ -19,11 +17,9 @@ import java.io.IOException; */ @Component public class Java110RestTemplateInterceptor implements ClientHttpRequestInterceptor { - private static Logger logger = LoggerFactory.getLogger(Java110RestTemplateInterceptor.class); @Override public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException { - logger.debug("进入拦截器" + new String(body)); TraceDto traceDto = Java110TraceFactory.getTraceDto(); if (traceDto != null) { HttpHeaders httpHeaders = request.getHeaders(); @@ -31,10 +27,12 @@ public class Java110RestTemplateInterceptor implements ClientHttpRequestIntercep httpHeaders.remove(CommonConstant.PARENT_SPAN_ID); httpHeaders.add(CommonConstant.TRACE_ID, traceDto.getTraceId()); httpHeaders.add(CommonConstant.PARENT_SPAN_ID, traceDto.getId()); + Java110TraceFactory.putAnnotations(TraceAnnotationsDto.VALUE_SERVER_SEND); + ClientHttpResponse clientHttpResponse = execution.execute(request, body); + Java110TraceFactory.putAnnotations(TraceAnnotationsDto.VALUE_SERVER_RECEIVE); + return clientHttpResponse; } - Java110TraceFactory.putAnnotations(TraceAnnotationsDto.VALUE_SERVER_SEND); - ClientHttpResponse clientHttpResponse = execution.execute(request, body); - Java110TraceFactory.putAnnotations(TraceAnnotationsDto.VALUE_SERVER_RECEIVE); - return clientHttpResponse; + //追踪未开启时直接放行,避免不必要的ThreadLocal操作和Annotation对象创建 + return execution.execute(request, body); } } diff --git a/java110-core/src/main/java/com/java110/core/trace/Java110TraceSqlInterceptor.java b/java110-core/src/main/java/com/java110/core/trace/Java110TraceSqlInterceptor.java index 625a890..0fd3c40 100644 --- a/java110-core/src/main/java/com/java110/core/trace/Java110TraceSqlInterceptor.java +++ b/java110-core/src/main/java/com/java110/core/trace/Java110TraceSqlInterceptor.java @@ -34,6 +34,11 @@ public class Java110TraceSqlInterceptor implements Interceptor { @Override public Object intercept(Invocation invocation) throws Throwable { + //追踪开关未打开时直接放行,避免不必要的SQL解析和参数提取开销 + if (Java110TraceFactory.getTraceDto() == null) { + return invocation.proceed(); + } + MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0]; Object parameterObject = null; if (invocation.getArgs().length > 1) { diff --git a/java110-db/src/main/java/com/java110/db/DruidDataSourceConfig.java b/java110-db/src/main/java/com/java110/db/DruidDataSourceConfig.java index 67b12f2..ca4ebe6 100644 --- a/java110-db/src/main/java/com/java110/db/DruidDataSourceConfig.java +++ b/java110-db/src/main/java/com/java110/db/DruidDataSourceConfig.java @@ -65,11 +65,20 @@ public class DruidDataSourceConfig { //配置获取连接等待超时的时间 dataSource.setMaxWait(maxWait); - // 配置Druid的SQL监控和日志打印 - dataSource.setLogAbandoned(true); - dataSource.setRemoveAbandoned(true); - dataSource.setRemoveAbandonedTimeout(180); - dataSource.setFilters("stat,log4j2"); // 配置Log4j2作为日志实现 + //连接验证 - 防止使用已断开的连接 + dataSource.setValidationQuery("SELECT 1"); + dataSource.setTestWhileIdle(true); + dataSource.setTestOnBorrow(true); + dataSource.setTestOnReturn(false); + dataSource.setTimeBetweenEvictionRunsMillis(60000); + dataSource.setMinEvictableIdleTimeMillis(300000); + + //PSCache - 缓存PreparedStatement避免重复解析SQL + dataSource.setPoolPreparedStatements(true); + dataSource.setMaxPoolPreparedStatementPerConnectionSize(20); + + // 配置Druid的SQL监控,移除log4j2减少日志开销 + dataSource.setFilters("stat"); diff --git a/java110-db/src/main/java/com/java110/db/Java110MybatisInterceptor.java b/java110-db/src/main/java/com/java110/db/Java110MybatisInterceptor.java index 397dc3b..ad6832f 100755 --- a/java110-db/src/main/java/com/java110/db/Java110MybatisInterceptor.java +++ b/java110-db/src/main/java/com/java110/db/Java110MybatisInterceptor.java @@ -24,6 +24,10 @@ import org.springframework.http.*; import java.sql.Timestamp; import java.text.DateFormat; import java.util.*; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; @Intercepts({ @Signature(type = Executor.class, method = "update", args = {MappedStatement.class, @@ -32,6 +36,17 @@ import java.util.*; public class Java110MybatisInterceptor implements Interceptor { private static Logger logger = LoggerFactory.getLogger(Java110MybatisInterceptor.class); + private static final ExecutorService ASYNC_LOG_EXECUTOR = new ThreadPoolExecutor( + 2, 4, 60L, TimeUnit.SECONDS, + new LinkedBlockingQueue<>(1000), + r -> { + Thread t = new Thread(r, "async-tx-log"); + t.setDaemon(true); + return t; + }, + new ThreadPoolExecutor.CallerRunsPolicy() + ); + IQueryServiceDAO queryServiceDAOImpl; RestTemplate restTemplate; @@ -106,7 +121,7 @@ public class Java110MybatisInterceptor implements Interceptor { logText.put("preValue", preValues); logText.put("afterValue", afterValues); - OrderItemDto orderItemDto = new OrderItemDto(); + final OrderItemDto orderItemDto = new OrderItemDto(); orderItemDto.setbId("-1"); orderItemDto.setAction("DEL"); orderItemDto.setActionObj(tmpTable.trim()); @@ -114,17 +129,22 @@ public class Java110MybatisInterceptor implements Interceptor { orderItemDto.setServiceName(ApplicationContextFactory.getApplicationName()); orderItemDto.setoId(Java110TransactionalFactory.getOId()); - String url = ServiceConstant.SERVICE_ORDER_URL + "/order/oIdApi/createOrderItem"; - HttpHeaders httpHeaders = new HttpHeaders(); - HttpEntity httpEntity = new HttpEntity(orderItemDto.toString(), httpHeaders); - if(Environment.isStartBootWay()){ - url = ServiceConstant.BOOT_SERVICE_ORDER_URL + "/order/oIdApi/createOrderItem"; - } - ResponseEntity responseEntity = restTemplate.exchange(url, HttpMethod.POST, httpEntity, String.class); - - if (responseEntity.getStatusCode() != HttpStatus.OK) { - throw new IllegalArgumentException("注册事务回滚日志失败" + responseEntity); - } + final boolean isBoot = Environment.isStartBootWay(); + final RestTemplate rt = this.restTemplate; + ASYNC_LOG_EXECUTOR.submit(() -> { + try { + String url = isBoot ? ServiceConstant.BOOT_SERVICE_ORDER_URL : ServiceConstant.SERVICE_ORDER_URL; + url += "/order/oIdApi/createOrderItem"; + HttpHeaders httpHeaders = new HttpHeaders(); + HttpEntity httpEntity = new HttpEntity(orderItemDto.toString(), httpHeaders); + ResponseEntity responseEntity = rt.exchange(url, HttpMethod.POST, httpEntity, String.class); + if (responseEntity.getStatusCode() != HttpStatus.OK) { + logger.error("异步注册事务回滚日志失败(DEL): {}", responseEntity.getBody()); + } + } catch (Exception e) { + logger.error("异步注册事务回滚日志异常(DEL)", e); + } + }); } /** @@ -168,7 +188,7 @@ public class Java110MybatisInterceptor implements Interceptor { logText.put("preValue", preValues); logText.put("afterValue", afterValues); - OrderItemDto orderItemDto = new OrderItemDto(); + final OrderItemDto orderItemDto = new OrderItemDto(); orderItemDto.setbId("-1"); orderItemDto.setAction("MOD"); orderItemDto.setActionObj(tmpTable.trim()); @@ -176,18 +196,22 @@ public class Java110MybatisInterceptor implements Interceptor { orderItemDto.setServiceName(ApplicationContextFactory.getApplicationName()); orderItemDto.setoId(Java110TransactionalFactory.getOId()); - String url = ServiceConstant.SERVICE_ORDER_URL + "/order/oIdApi/createOrderItem"; - HttpHeaders httpHeaders = new HttpHeaders(); - HttpEntity httpEntity = new HttpEntity(orderItemDto.toString(), httpHeaders); - ResponseEntity responseEntity = null; - if(Environment.isStartBootWay()){ - url = ServiceConstant.BOOT_SERVICE_ORDER_URL + "/order/oIdApi/createOrderItem"; - } - responseEntity = restTemplate.exchange(url, HttpMethod.POST, httpEntity, String.class); - - if (responseEntity.getStatusCode() != HttpStatus.OK) { - throw new IllegalArgumentException("注册事务回滚日志失败" + responseEntity); - } + final boolean isBoot = Environment.isStartBootWay(); + final RestTemplate rt = this.restTemplate; + ASYNC_LOG_EXECUTOR.submit(() -> { + try { + String url = isBoot ? ServiceConstant.BOOT_SERVICE_ORDER_URL : ServiceConstant.SERVICE_ORDER_URL; + url += "/order/oIdApi/createOrderItem"; + HttpHeaders httpHeaders = new HttpHeaders(); + HttpEntity httpEntity = new HttpEntity(orderItemDto.toString(), httpHeaders); + ResponseEntity responseEntity = rt.exchange(url, HttpMethod.POST, httpEntity, String.class); + if (responseEntity.getStatusCode() != HttpStatus.OK) { + logger.error("异步注册事务回滚日志失败(MOD): {}", responseEntity.getBody()); + } + } catch (Exception e) { + logger.error("异步注册事务回滚日志异常(MOD)", e); + } + }); } private void dealReturnMap(Map map) { @@ -241,7 +265,7 @@ public class Java110MybatisInterceptor implements Interceptor { logText.put("preValue", preValues); logText.put("afterValue", afterValues); - OrderItemDto orderItemDto = new OrderItemDto(); + final OrderItemDto orderItemDto = new OrderItemDto(); orderItemDto.setbId("-1"); orderItemDto.setAction("ADD"); orderItemDto.setActionObj(tmpTable.trim()); @@ -249,17 +273,22 @@ public class Java110MybatisInterceptor implements Interceptor { orderItemDto.setServiceName(ApplicationContextFactory.getApplicationName()); orderItemDto.setoId(Java110TransactionalFactory.getOId()); - String url = ServiceConstant.SERVICE_ORDER_URL + "/order/oIdApi/createOrderItem"; - HttpHeaders httpHeaders = new HttpHeaders(); - HttpEntity httpEntity = new HttpEntity(orderItemDto.toString(), httpHeaders); - if(Environment.isStartBootWay()){ - url = ServiceConstant.BOOT_SERVICE_ORDER_URL + "/order/oIdApi/createOrderItem"; - } - ResponseEntity responseEntity = restTemplate.exchange(url, HttpMethod.POST, httpEntity, String.class); - - if (responseEntity.getStatusCode() != HttpStatus.OK) { - throw new IllegalArgumentException("注册事务回滚日志失败" + responseEntity); - } + final boolean isBoot = Environment.isStartBootWay(); + final RestTemplate rt = this.restTemplate; + ASYNC_LOG_EXECUTOR.submit(() -> { + try { + String url = isBoot ? ServiceConstant.BOOT_SERVICE_ORDER_URL : ServiceConstant.SERVICE_ORDER_URL; + url += "/order/oIdApi/createOrderItem"; + HttpHeaders httpHeaders = new HttpHeaders(); + HttpEntity httpEntity = new HttpEntity(orderItemDto.toString(), httpHeaders); + ResponseEntity responseEntity = rt.exchange(url, HttpMethod.POST, httpEntity, String.class); + if (responseEntity.getStatusCode() != HttpStatus.OK) { + logger.error("异步注册事务回滚日志失败(ADD): {}", responseEntity.getBody()); + } + } catch (Exception e) { + logger.error("异步注册事务回滚日志异常(ADD)", e); + } + }); } diff --git a/java110-interface/src/main/resources/logback-prod.xml b/java110-interface/src/main/resources/logback-prod.xml index ef2ad50..d049bd9 100644 --- a/java110-interface/src/main/resources/logback-prod.xml +++ b/java110-interface/src/main/resources/logback-prod.xml @@ -1,32 +1,30 @@ - + + + 512 + 0 + true + + - %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n - - ./logs/debug.log - - ./logs/debug-%d{yyyyMMdd}.log.%i - - 500MB - - 2 - - - %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%msg%n - - + + 512 + 0 + true + + false ./logs/info.log ./logs/info-%d{yyyyMMdd}.log.%i @@ -36,33 +34,44 @@ 2 - %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%msg%n - + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%msg%n + + 256 + 0 + false + + + ERROR ./logs/error.log - ${LOG_PATH}/error-%d{yyyyMMdd}.log.%i - + ${LOG_PATH}/error-%d{yyyyMMdd}.log.%i 500MB 2 - %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%msg%n - - + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%msg%n + + 512 + 0 + true + + + + false ./logs/request.log ./logs/request-%d{yyyyMMdd}.log.%i @@ -77,6 +86,13 @@ + + 256 + 0 + false + + + ERROR @@ -95,53 +111,40 @@ - - - - - - - - - - - - - - - - + + + + + + + - + - - - - + + + + - - - + - - - + - - - + + + - - - + + + diff --git a/java110-interface/src/main/resources/logback.xml b/java110-interface/src/main/resources/logback.xml index 5671b92..e0d89b3 100644 --- a/java110-interface/src/main/resources/logback.xml +++ b/java110-interface/src/main/resources/logback.xml @@ -1,32 +1,30 @@ - + + + 512 + 0 + true + + - %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n - - ./logs/debug.log - - ./logs/debug-%d{yyyyMMdd}.log.%i - - 500MB - - 2 - - - %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%msg%n - - + + 512 + 0 + true + + false ./logs/info.log ./logs/info-%d{yyyyMMdd}.log.%i @@ -36,33 +34,44 @@ 2 - %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%msg%n - + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%msg%n + + 256 + 0 + false + + + ERROR ./logs/error.log - ${LOG_PATH}/error-%d{yyyyMMdd}.log.%i - + ${LOG_PATH}/error-%d{yyyyMMdd}.log.%i 500MB 2 - %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%msg%n - - + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%msg%n + + 512 + 0 + true + + + + false ./logs/request.log ./logs/request-%d{yyyyMMdd}.log.%i @@ -76,7 +85,14 @@ - + + + 256 + 0 + false + + + ERROR @@ -94,57 +110,38 @@ - - - - - - - - - + + + + + + + + - - - - - - - - - - - - - - - - + + + - - - - - - - - - - - - + + + + + + + + - - - - + + + diff --git a/service-api/src/main/java/com/java110/api/listener/CmdListener.java b/service-api/src/main/java/com/java110/api/listener/CmdListener.java index 6609a1d..cbbf58e 100644 --- a/service-api/src/main/java/com/java110/api/listener/CmdListener.java +++ b/service-api/src/main/java/com/java110/api/listener/CmdListener.java @@ -4,13 +4,16 @@ import com.alibaba.fastjson.JSONObject; import com.aliyuncs.utils.StringUtils; import com.java110.core.annotation.Java110Listener; import com.java110.core.context.DataFlowContext; +import com.java110.core.context.Environment; import com.java110.core.event.service.api.ServiceDataFlowEvent; import com.java110.core.log.LoggerFactory; import com.java110.dto.order.OrderDto; import com.java110.dto.system.AppService; import com.java110.intf.job.IDataBusInnerServiceSMO; +import com.java110.service.smo.ICmdServiceSMO; import com.java110.utils.constant.CommonConstant; import com.java110.utils.constant.ServiceCodeConstant; +import com.java110.utils.factory.ApplicationContextFactory; import com.java110.utils.util.StringUtil; import com.java110.vo.ResultVo; import org.slf4j.Logger; @@ -19,6 +22,7 @@ import org.springframework.http.*; import org.springframework.web.client.HttpStatusCodeException; import org.springframework.web.client.RestTemplate; +import java.util.HashMap; import java.util.Map; @Java110Listener("cmdListener") @@ -45,16 +49,7 @@ public class CmdListener extends AbstractServiceApiListener { AppService service = event.getAppService(); Map reqHeader = context.getRequestCurrentHeaders(); - HttpHeaders header = new HttpHeaders(); - for (String key : context.getRequestCurrentHeaders().keySet()) { - if("user-name".equals(key)){ - continue; - } - if("userName".equals(key)){ - continue; - } - header.add(key, reqHeader.get(key)); - } + if (reqHeader.containsKey(CommonConstant.USER_ID) && (!reqJson.containsKey("userId") || StringUtil.isEmpty(reqJson.getString("userId")))) { reqJson.put("userId", reqHeader.get(CommonConstant.USER_ID)); @@ -76,48 +71,62 @@ public class CmdListener extends AbstractServiceApiListener { reqJson.put("userName", reqHeader.get(CommonConstant.LOGIN_USER_NAME)); } - HttpEntity httpEntity = new HttpEntity(reqJson.toJSONString(), header); - String orgRequestUrl = context.getRequestHeaders().get("REQUEST_URL"); - String serviceCode = service.getServiceCode(); - serviceCode = serviceCode.startsWith("/") ? serviceCode : ("/" + serviceCode); - String requestUrl = service.getUrl() + "/cmd" + serviceCode; - // ResponseEntity responseEntity = null; - if (!StringUtil.isNullOrNone(orgRequestUrl)) { - String param = orgRequestUrl.contains("?") ? orgRequestUrl.substring(orgRequestUrl.indexOf("?") + 1, orgRequestUrl.length()) : ""; - requestUrl += ("?" + param); - } - try { - responseEntity = restTemplate.exchange(requestUrl, HttpMethod.POST, httpEntity, String.class); - HttpHeaders headers = responseEntity.getHeaders(); - String oId = "-1"; - if (headers.containsKey(OrderDto.O_ID)) { - oId = headers.get(OrderDto.O_ID).get(0); - } + // Boot模式下直接调用CmdServiceSMO,避免HTTP loopback开销 + if (Environment.isStartBootWay()) { + try { + Map headers = new HashMap<>(); + headers.put(CommonConstant.HTTP_SERVICE, serviceCode); + headers.put(CommonConstant.HTTP_METHOD, CommonConstant.HTTP_METHOD_POST); + ICmdServiceSMO cmdServiceSMO = ApplicationContextFactory.getBean("cmdServiceSMOImpl", ICmdServiceSMO.class); + responseEntity = cmdServiceSMO.cmd(reqJson.toJSONString(), headers); + } catch (Exception e) { + logger.error("Boot模式直接调用cmd失败【{}】", serviceCode, e); + responseEntity = new ResponseEntity(e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR); + } + } else { + // 微服务模式下走HTTP调用 + HttpHeaders header = new HttpHeaders(); + for (String key : context.getRequestCurrentHeaders().keySet()) { + if("user-name".equals(key)){ + continue; + } + if("userName".equals(key)){ + continue; + } + header.add(key, reqHeader.get(key)); + } - } catch (HttpStatusCodeException e) { //这里spring 框架 在4XX 或 5XX 时抛出 HttpServerErrorException 异常,需要重新封装一下 - logger.error("请求下游服务【" + requestUrl + "】异常,参数为" + httpEntity + e.getResponseBodyAsString(), e); - String body = e.getResponseBodyAsString(); + HttpEntity httpEntity = new HttpEntity(reqJson.toJSONString(), header); + String orgRequestUrl = context.getRequestHeaders().get("REQUEST_URL"); - if (StringUtil.isJsonObject(body)) { - JSONObject bodyObj = JSONObject.parseObject(body); - if (bodyObj.containsKey("message") && !StringUtil.isEmpty(bodyObj.getString("message"))) { - body = bodyObj.getString("message"); + String requestUrl = service.getUrl() + "/cmd" + serviceCode; + if (!StringUtil.isNullOrNone(orgRequestUrl)) { + String param = orgRequestUrl.contains("?") ? orgRequestUrl.substring(orgRequestUrl.indexOf("?") + 1, orgRequestUrl.length()) : ""; + requestUrl += ("?" + param); + } + try { + responseEntity = restTemplate.exchange(requestUrl, HttpMethod.POST, httpEntity, String.class); + } catch (HttpStatusCodeException e) { + logger.error("请求下游服务【" + requestUrl + "】异常,参数为" + httpEntity + e.getResponseBodyAsString(), e); + String body = e.getResponseBodyAsString(); + if (StringUtil.isJsonObject(body)) { + JSONObject bodyObj = JSONObject.parseObject(body); + if (bodyObj.containsKey("message") && !StringUtil.isEmpty(bodyObj.getString("message"))) { + body = bodyObj.getString("message"); + } } + responseEntity = new ResponseEntity(body, e.getStatusCode()); } - responseEntity = new ResponseEntity(body, e.getStatusCode()); } - logger.debug("API 服务调用下游服务请求:{},返回为:{}", httpEntity, responseEntity); - if (responseEntity.getStatusCode() != HttpStatus.OK) { responseEntity = ResultVo.createResponseEntity(ResultVo.CODE_ERROR, String.valueOf(responseEntity.getBody())); context.setResponseEntity(responseEntity); - return; } if (StringUtils.isEmpty(responseEntity.getBody() + "")) { diff --git a/service-api/src/main/java/com/java110/api/smo/impl/ApiServiceSMOImpl.java b/service-api/src/main/java/com/java110/api/smo/impl/ApiServiceSMOImpl.java index 85fe290..b7f6e7f 100644 --- a/service-api/src/main/java/com/java110/api/smo/impl/ApiServiceSMOImpl.java +++ b/service-api/src/main/java/com/java110/api/smo/impl/ApiServiceSMOImpl.java @@ -15,6 +15,7 @@ import com.java110.core.factory.GenerateCodeFactory; import com.java110.core.log.LoggerFactory; import com.java110.core.smo.ISaveTransactionLogSMO; import com.java110.core.trace.Java110TraceLog; +import com.java110.service.smo.ICmdServiceSMO; import com.java110.dto.order.OrderDto; import com.java110.dto.system.AppRoute; import com.java110.dto.system.AppService; @@ -42,6 +43,7 @@ import org.springframework.stereotype.Service; import org.springframework.web.client.HttpStatusCodeException; import java.util.Date; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -613,21 +615,24 @@ public class ApiServiceSMOImpl extends LoggerEngine implements IApiServiceSMO { requestUrl += ("?" + param); } try { - //todo http的方式调用微服务,相应的java类可以到相应微服务下的cmd下根据serviceCode 的寻找 - //todo 这里会调用到 java110-service 模块下的 CmdApi 类,这个类各个微服务都会集成 + // Boot模式下直接调用CmdServiceSMO,避免HTTP loopback开销(~400ms) if (Environment.isStartBootWay()) { + Map headers = new HashMap<>(); + headers.put(CommonConstant.HTTP_SERVICE, serviceCode); + headers.put(CommonConstant.HTTP_METHOD, CommonConstant.HTTP_METHOD_POST); + ICmdServiceSMO cmdServiceSMO = ApplicationContextFactory.getBean("cmdServiceSMOImpl", ICmdServiceSMO.class); + responseEntity = cmdServiceSMO.cmd(reqJson.toJSONString(), headers); + } else { requestUrl = Environment.BOOT_PATH + requestUrl; restTemplate = ApplicationContextFactory.getBean("outRestTemplate", RestTemplate.class); responseEntity = restTemplate.exchange(requestUrl, HttpMethod.POST, httpEntity, String.class); - } else { - requestUrl = appService.getUrl() + requestUrl; - restTemplate = ApplicationContextFactory.getBean("restTemplate", RestTemplate.class); - responseEntity = restTemplate.exchange(requestUrl, HttpMethod.POST, httpEntity, String.class); } - HttpHeaders headers = responseEntity.getHeaders(); - String oId = "-1"; - if (headers.containsKey(OrderDto.O_ID)) { - oId = headers.get(OrderDto.O_ID).get(0); + if (responseEntity != null) { + HttpHeaders headers = responseEntity.getHeaders(); + String oId = "-1"; + if (headers.containsKey(OrderDto.O_ID)) { + oId = headers.get(OrderDto.O_ID).get(0); + } } } catch (HttpStatusCodeException e) { //todo 这里spring 框架 在4XX 或 5XX 时抛出 HttpServerErrorException 异常,需要重新封装一下 @@ -641,6 +646,9 @@ public class ApiServiceSMOImpl extends LoggerEngine implements IApiServiceSMO { } } responseEntity = new ResponseEntity(body, e.getStatusCode()); + } catch (Exception e) { + logger.error("直接调用cmd异常【{}】", serviceCode, e); + responseEntity = new ResponseEntity(e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR); } logger.debug("API 服务调用下游服务请求:{},返回为:{}", httpEntity, responseEntity); diff --git a/service-common/src/main/java/com/java110/common/smo/impl/AttendanceLogInnerServiceSMOImpl.java b/service-common/src/main/java/com/java110/common/smo/impl/AttendanceLogInnerServiceSMOImpl.java index 692538a..dd11c47 100755 --- a/service-common/src/main/java/com/java110/common/smo/impl/AttendanceLogInnerServiceSMOImpl.java +++ b/service-common/src/main/java/com/java110/common/smo/impl/AttendanceLogInnerServiceSMOImpl.java @@ -70,9 +70,15 @@ public class AttendanceLogInnerServiceSMOImpl extends BaseServiceSMO implements return attendanceLogs; } String imgUrl = MappingCache.getValue(MappingConstant.FILE_DOMAIN, "IMG_PATH"); + if (imgUrl == null) { + imgUrl = ""; + } for (AttendanceLogDto tmpAttendanceLogDto : attendanceLogs) { - tmpAttendanceLogDto.setFacePath(imgUrl + tmpAttendanceLogDto.getFacePath()); + String facePath = tmpAttendanceLogDto.getFacePath(); + if (facePath != null && !facePath.isEmpty()) { + tmpAttendanceLogDto.setFacePath(imgUrl + facePath); + } } return attendanceLogs; diff --git a/springboot/src/main/java/com/java110/boot/BootApplicationStart.java b/springboot/src/main/java/com/java110/boot/BootApplicationStart.java index 9f97eac..f01b279 100644 --- a/springboot/src/main/java/com/java110/boot/BootApplicationStart.java +++ b/springboot/src/main/java/com/java110/boot/BootApplicationStart.java @@ -149,9 +149,9 @@ public class BootApplicationStart { //设置超时时间 HttpComponentsClientHttpRequestFactory httpRequestFactory = new HttpComponentsClientHttpRequestFactory(); - httpRequestFactory.setConnectionRequestTimeout(10000); - httpRequestFactory.setConnectTimeout(10000); - httpRequestFactory.setReadTimeout(10000); + httpRequestFactory.setConnectionRequestTimeout(3000); + httpRequestFactory.setConnectTimeout(3000); + httpRequestFactory.setReadTimeout(5000); restTemplate.setRequestFactory(httpRequestFactory); return restTemplate; } @@ -178,9 +178,9 @@ public class BootApplicationStart { restTemplate.getInterceptors().add(java110RestTemplateInterceptor); //设置超时时间 HttpComponentsClientHttpRequestFactory httpRequestFactory = new HttpComponentsClientHttpRequestFactory(); - httpRequestFactory.setConnectionRequestTimeout(10000); - httpRequestFactory.setConnectTimeout(10000); - httpRequestFactory.setReadTimeout(10000); + httpRequestFactory.setConnectionRequestTimeout(3000); + httpRequestFactory.setConnectTimeout(3000); + httpRequestFactory.setReadTimeout(5000); restTemplate.setRequestFactory(httpRequestFactory); return restTemplate; } diff --git a/springboot/src/main/resources/application-prod.yml b/springboot/src/main/resources/application-prod.yml index e8ccf8a..b634b15 100644 --- a/springboot/src/main/resources/application-prod.yml +++ b/springboot/src/main/resources/application-prod.yml @@ -2,6 +2,10 @@ server: port: 8008 tomcat: uri-encoding: UTF-8 + threads: + max: 200 + min-spare: 20 + accept-count: 100 spring: servlet: multipart: @@ -29,15 +33,15 @@ spring: activiti: database-schema-update: false datasource: - url: jdbc:mysql://rm-2zeo2635t3c592h2ywo.mysql.rds.aliyuncs.com:3306/estate?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8 + url: jdbc:mysql://rm-2zeo2635t3c592h2ywo.mysql.rds.aliyuncs.com:3306/estate?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8&useSSL=false&cachePrepStmts=true&useServerPrepStmts=true&cacheCallableStmts=true&prepStmtCacheSize=256&prepStmtCacheSqlLimit=2048&socketTimeout=30000&connectTimeout=10000 username: estate password: MySQL57@123 type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver druid: - initial-size: 5 - max-active: 20 - min-idle: 5 + initial-size: 10 + max-active: 50 + min-idle: 10 max-wait: 60000 eureka: -- libgit2 0.21.4