Bladeren bron

bug修改 查询订单项目引入日志,排除数据源

张均强 4 jaren geleden
bovenliggende
commit
dffcfb3ab2

+ 5 - 0
common/fire-common/pom.xml

@@ -42,6 +42,11 @@
             <groupId>cn.hutool</groupId>
             <artifactId>hutool-all</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
+        </dependency>
+
     </dependencies>
 
     <artifactId>fire-common</artifactId>

+ 120 - 0
common/fire-common/src/main/java/com/fire/common/http/HttpClientUtil.java

@@ -0,0 +1,120 @@
+package com.fire.common.http;
+
+import lombok.extern.slf4j.Slf4j;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpHost;
+import org.apache.http.HttpStatus;
+import org.apache.http.NameValuePair;
+import org.apache.http.client.HttpRequestRetryHandler;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.client.utils.URIBuilder;
+import org.apache.http.conn.routing.HttpRoute;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.impl.client.StandardHttpRequestRetryHandler;
+import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
+import org.apache.http.message.BasicNameValuePair;
+import org.apache.http.util.EntityUtils;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+@Slf4j
+public class HttpClientUtil {
+    private static CloseableHttpClient httpClient;
+
+    static {
+        PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
+        // 总连接池数量
+        connectionManager.setMaxTotal(150);
+        // 可为每个域名设置单独的连接池数量
+        connectionManager.setMaxPerRoute(new HttpRoute(new HttpHost("xx.xx.xx.xx")), 80);
+        // setConnectTimeout:设置建立连接的超时时间
+        // setConnectionRequestTimeout:从连接池中拿连接的等待超时时间
+        // setSocketTimeout:发出请求后等待对端应答的超时时间
+        RequestConfig requestConfig = RequestConfig.custom()
+                .setConnectTimeout(1000)
+                .setConnectionRequestTimeout(2000)
+                .setSocketTimeout(3000)
+                .build();
+        // 重试处理器,StandardHttpRequestRetryHandler
+        HttpRequestRetryHandler retryHandler = new StandardHttpRequestRetryHandler();
+
+        httpClient = HttpClients.custom().setConnectionManager(connectionManager).setDefaultRequestConfig(requestConfig)
+                .setRetryHandler(retryHandler).build();
+    }
+
+    public static String doHttpGet(String uri, Map<String, String> getParams) {
+        CloseableHttpResponse response = null;
+        try {
+            URIBuilder uriBuilder = new URIBuilder(uri);
+            if (null != getParams && !getParams.isEmpty()) {
+                List<NameValuePair> list = new ArrayList<>();
+                for (Map.Entry<String, String> param : getParams.entrySet()) {
+                    list.add(new BasicNameValuePair(param.getKey(), param.getValue()));
+                }
+                uriBuilder.setParameters(list);
+            }
+            HttpGet httpGet = new HttpGet(uriBuilder.build());
+            response = httpClient.execute(httpGet);
+            int statusCode = response.getStatusLine().getStatusCode();
+            if (HttpStatus.SC_OK == statusCode) {
+                HttpEntity entity = response.getEntity();
+                if (null != entity) {
+                    return EntityUtils.toString(entity, "utf-8");
+                }
+            }
+        } catch (Exception e) {
+            log.error("CloseableHttpClient-get-请求异常", e);
+        } finally {
+            try {
+                if (null != response)
+                    response.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+        return null;
+    }
+
+    public static String doHttpPost(String uri, Map<String, String> getParams) {
+        CloseableHttpResponse response = null;
+        try {
+            HttpPost httpPost = new HttpPost(uri);
+            if (null != getParams && !getParams.isEmpty()) {
+                List<NameValuePair> list = new ArrayList<>();
+                for (Map.Entry<String, String> param : getParams.entrySet()) {
+                    list.add(new BasicNameValuePair(param.getKey(), param.getValue()));
+                }
+                HttpEntity httpEntity = new UrlEncodedFormEntity(list, "utf-8");
+                httpPost.setEntity(httpEntity);
+            }
+            response = httpClient.execute(httpPost);
+            int statusCode = response.getStatusLine().getStatusCode();
+            if (HttpStatus.SC_OK == statusCode) {
+                HttpEntity entity = response.getEntity();
+                if (null != entity) {
+                    return EntityUtils.toString(entity, "utf-8");
+                }
+            }
+        } catch (Exception e) {
+            log.error("CloseableHttpClient-post-请求异常", e);
+        } finally {
+            try {
+                if (null != response)
+                    response.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+        return null;
+    }
+
+
+}

+ 2 - 1
modules/get-order/src/main/java/com/fire/getorder/GetOrderApplication.java

@@ -3,10 +3,11 @@ package com.fire.getorder;
 import com.spring4all.swagger.EnableSwagger2Doc;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
 import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
 import org.springframework.scheduling.annotation.EnableScheduling;
 
-@SpringBootApplication(scanBasePackages = {"com.fire.getorder","com.fire.common.redis"})
+@SpringBootApplication(scanBasePackages = {"com.fire.getorder", "com.fire.common.redis"}, exclude = {DataSourceAutoConfiguration.class})
 @EnableDiscoveryClient
 @EnableSwagger2Doc
 @EnableScheduling

+ 65 - 0
modules/get-order/src/main/resources/logback-spring.xml

@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 当scan属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。 -->
+<configuration scan="true" scanPeriod="60 seconds" debug="false">
+    <!-- 定义变量值,也可以定义成一个路径,可以使“${}”来使用变量 -->
+    <property name="log_path" value="/data/fire-log/get-order"/>
+    <!--<springProperty scope="context" name="modelName" source="spring.application.name"/>-->
+    <property name="log_encoder_code" value="[%d{yyyy-MM-dd HH:mm:ss}] [%thread] [%-5level] [%logger] %msg%n"/>
+    <!-- 设置上下文名称,用于区分不同应用程序的记录,一旦设置,不能修改 -->
+    <contextName>elk_log</contextName>
+    <!-- 获取时间戳字符串 -->
+    <timestamp key="now_time" datePattern="yyyyMMdd'T'HHmmss"/>
+    <!-- 负责写日志的组件,它有两个必要属性name和class。name指定appender名称,class指定appender的全限定名 -->
+    <!--输出到控制台-->
+    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
+        <!-- 对日志进行格式化 -->
+        <encoder>
+            <pattern>${log_encoder_code}</pattern>
+        </encoder>
+    </appender>
+
+    <appender name="log_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 按天回滚 daily -->
+            <fileNamePattern>${log_path}/info-log-%d{yyyy-MM-dd}.log</fileNamePattern>
+            <!-- 日志最大的历史 120天 -->
+            <maxHistory>120</maxHistory>
+        </rollingPolicy>
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
+        </encoder>
+    </appender>
+    <appender name="log_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <!-- 过滤器,只记录ERROR级别的日志 -->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>DEBUG</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+        <!-- 最常用的滚动策略,它根据时间来制定滚动策略.既负责滚动也负责出发滚动 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!--日志输出位置  可相对、和绝对路径 -->
+            <fileNamePattern>${log_path}/error-log-%d{yyyy-MM-dd}.log</fileNamePattern>
+            <!-- 可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件假设设置每个月滚动,且<maxHistory>是6,
+            则只保存最近6个月的文件,删除之前的旧文件。注意,删除旧文件是,那些为了归档而创建的目录也会被删除-->
+            <maxHistory>120</maxHistory>
+        </rollingPolicy>
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
+        </encoder>
+    </appender>
+
+    <!-- SQL相关日志输出-->
+    <logger name="org.apache.ibatis" level="INFO" additivity="false"/>
+    <logger name="org.mybatis.spring" level="INFO" additivity="false"/>
+    <logger name="com.github.miemiedev.mybatis.paginator" level="INFO" additivity="false"/>
+    <!-- 把>=DEBUG级别的日志都输出到控制台 -->
+    <root level="INFO">
+        <appender-ref ref="console"/>
+        <!--<appender-ref ref="file" />-->
+        <appender-ref ref="log_info"/>
+        <appender-ref ref="log_error"/>
+    </root>
+    <!-- 屏蔽心跳日志-->
+    <logger name="com.alibaba.nacos" level="error" additivity="false"/>
+</configuration>

+ 2 - 2
modules/make-order/src/main/java/com/fire/order/rest/MakeOrderRest.java

@@ -6,6 +6,7 @@ import com.fire.order.service.CacheService;
 import com.fire.order.service.MakeOrderService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.rocketmq.spring.core.RocketMQTemplate;
 import org.springframework.messaging.support.MessageBuilder;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -15,8 +16,6 @@ import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
 
-import static com.fire.common.constants.RocketTopic.UPDATE_TOPIC;
-
 /**
  * 下单接口rest类
  *
@@ -24,6 +23,7 @@ import static com.fire.common.constants.RocketTopic.UPDATE_TOPIC;
  */
 @Api(tags = "开放接口-下单")
 @RestController
+@Slf4j
 public class MakeOrderRest {
 
     @Resource

+ 7 - 9
modules/make-order/src/main/java/com/fire/order/service/impl/MakeOrderServiceImpl.java

@@ -296,15 +296,15 @@ public class MakeOrderServiceImpl implements MakeOrderService {
             }
         }
 
-
+        long time1 = System.currentTimeMillis();
         //自增id 取自redis,长度17位,后面加两位00 为主订单号,后面分发订单号后两位从 01开始
         Long orderIncr = jedisCluster.incr(ORDER_ID_INCR.key());
         Long orderId = orderIncr * 100;
-
+        long time2 = System.currentTimeMillis();
         //客户订单id校验 这里订单id拼接上客户id,保证唯一
         String customerOrder = content.getExtOrder() + "." + flowAppInfo.getCustomerId();
         String checkOrder = redisOrderIdScript.checkOrderId(customerOrder, String.valueOf(orderId));
-
+        long time3 = System.currentTimeMillis();
         //0表示订单号重复
         if ("0".equals(checkOrder)) {
             orderResp.setRCode(ORDER_ID_ERROR.status());
@@ -348,6 +348,7 @@ public class MakeOrderServiceImpl implements MakeOrderService {
         }
         //扣减
         Long afterAmount = redisAmountScript.changeAmount(CUSTOMER_AMOUNT.key(), flowAppInfo.getCustomerId(), SUB.oper(), product.getPrice(), customerInfo.getCreditAmount());
+        long time4 = System.currentTimeMillis();
         if (afterAmount == null) {
             orderResp.setRCode(BALANCE_NOT_ENOUGH.status());
             orderResp.setRMsg(BALANCE_NOT_ENOUGH.message());
@@ -358,9 +359,11 @@ public class MakeOrderServiceImpl implements MakeOrderService {
             //订单入redis
             long hKey = orderId / 10000000;
             jedisCluster.hset(ORDER_INFO.key() + hKey, String.valueOf(orderId), orderStr);
-
+            long time5 = System.currentTimeMillis();
             //订单入队列
             rocketMQTemplate.syncSendOrderly(ORDER_TOPIC + ":" + MAKE_TAG, MessageBuilder.withPayload(orderStr).build(), String.valueOf(orderId));
+            long time6 = System.currentTimeMillis();
+            log.info("取id" + (time2 - time1) + " 校验id" + (time3 - time2) + " 扣减" + (time4 - time3) + " 订单入redis" + (time5 - time4) + " 消息入队列" + (time6 - time5)+" 总"+(time6-time1));
         } catch (Exception e) {
             //其他异常 扣减补偿
             log.error("订单存储或者发送到队列失败", e);
@@ -372,9 +375,4 @@ public class MakeOrderServiceImpl implements MakeOrderService {
         return responseDto;
     }
 
-    public static void main(String[] args) {
-
-        System.out.println("key:" + (1000000000019999900L / 10000000));
-    }
-
 }

+ 1 - 1
modules/make-order/src/main/resources/bootstrap.yml

@@ -4,7 +4,7 @@ spring:
   application:
     name: make-order
   profiles:
-    active: test
+    active: dev
 ---
 spring:
   config:

+ 3 - 3
modules/make-order/src/main/resources/logback-spring.xml

@@ -50,9 +50,9 @@
     </appender>
 
     <!-- SQL相关日志输出-->
-    <logger name="org.apache.ibatis" level="INFO" additivity="false"/>
-    <logger name="org.mybatis.spring" level="INFO" additivity="false"/>
-    <logger name="com.github.miemiedev.mybatis.paginator" level="INFO" additivity="false"/>
+<!--    <logger name="org.apache.ibatis" level="INFO" additivity="false"/>-->
+<!--    <logger name="org.mybatis.spring" level="INFO" additivity="false"/>-->
+<!--    <logger name="com.github.miemiedev.mybatis.paginator" level="INFO" additivity="false"/>-->
     <!-- 把>=DEBUG级别的日志都输出到控制台 -->
     <root level="INFO">
         <appender-ref ref="console"/>