feat(可回溯): 重构

增加feign
This commit is contained in:
BrandWang
2023-05-08 19:24:38 +08:00
parent d1a4b55f5d
commit dbaab0484b
22 changed files with 549 additions and 4 deletions
+38
View File
@@ -0,0 +1,38 @@
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### IntelliJ IDEA ###
.idea/modules.xml
.idea/jarRepositories.xml
.idea/compiler.xml
.idea/libraries/
*.iws
*.iml
*.ipr
### Eclipse ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/
### Mac OS ###
.DS_Store
+100
View File
@@ -0,0 +1,100 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.wabestway.recall</groupId>
<artifactId>afis-recall-api</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.wabestway.common</groupId>
<artifactId>afis-web-common</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.2.3.RELEASE</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.6</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>3.0.0</version>
<exclusions>
<exclusion>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
</exclusion>
</exclusions>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
<version>1.5.22</version>
<scope>provided</scope>
</dependency>
<!--lombok插件 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.6</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-openfeign-core</artifactId>
<version>2.2.3.RELEASE</version>
<scope>compile</scope>
</dependency>
</dependencies>
<distributionManagement>
<repository>
<id>release</id>
<name>Nexus Release Repository</name>
<url>http://dev.wabestway.com/nexus/repository/maven-releases/</url>
</repository>
<snapshotRepository>
<!-- 需与server id一致 -->
<id>snapshot</id>
<name>Nexus Snapshot Repository</name>
<url>http://dev.wabestway.com/nexus/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<phase>none</phase>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
@@ -0,0 +1,7 @@
package com.wabestway.recall;
public class Main {
public static void main(String[] args) {
System.out.println("Hello world!");
}
}
@@ -0,0 +1,34 @@
package com.wabestway.recall.api.dto;
import lombok.Data;
import java.util.List;
@Data
public class TraceUpDTO {
private String batchId;
private long batchTime;
List<TraceRecord> records;
}
@Data
class TraceRecord {
/** 业务订单ID */
private String orderId;
/** 产品编码 */
private String supplierProductCode;
/** 产品名称 */
private String supplierProductName;
/** 保单号 */
private String policyNo;
/** 投保人名称 */
private String holderName;
/** 投保人手机号 */
private String holderPhone;
/** 保险公司名称 */
private String supplierName;
/** 保单起始日期 */
private String startDate;
/** 保单结束日期 */
private String endDate;
}
@@ -0,0 +1,19 @@
package com.wabestway.recall.api.fallback;
import com.alibaba.fastjson.JSON;
import com.wabestway.commons.http.ResObj;
import com.wabestway.recall.api.dto.TraceUpDTO;
import com.wabestway.recall.api.feign.TraceFeignClient;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@Component
@Slf4j
public class TraceFeignClientFallback implements TraceFeignClient {
@Override
public ResObj batchTraceUp(TraceUpDTO traceUpDTO) {
log.error("回溯业务数据更新:{}", JSON.toJSONString(traceUpDTO));
return ResObj.fail("服务不可用");
}
}
@@ -0,0 +1,14 @@
package com.wabestway.recall.api.feign;
import com.wabestway.commons.http.ResObj;
import com.wabestway.recall.api.dto.TraceUpDTO;
import com.wabestway.recall.api.fallback.TraceFeignClientFallback;
import io.swagger.v3.oas.annotations.parameters.RequestBody;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
@FeignClient(value = "afis-recall", fallback = TraceFeignClientFallback.class)
public interface TraceFeignClient {
@PostMapping("/api/traceUp")
ResObj batchTraceUp(@RequestBody TraceUpDTO traceUpDTO);
}
@@ -1,8 +1,10 @@
package com.wabestway.recall.trace.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.TableId;
import com.wabestway.recall.trace.handler.ListTypeHandler;
import lombok.Data;
import java.util.List;
@@ -29,6 +31,7 @@ public class RecallRecordEntity {
/** 页面说明 */
private String content;
/** 记录事件 */
@TableField(typeHandler = ListTypeHandler.class)
private List<String> events;
/** 回溯记录跟踪ID */
private String traceId;
@@ -0,0 +1,42 @@
package com.wabestway.recall.trace.handler;
import com.wabestway.recall.trace.vo.RecallRecordVO;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;
import org.apache.ibatis.type.TypeHandler;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.List;
@MappedTypes(value = {RecallRecordVO.class})
@MappedJdbcTypes(value = {JdbcType.LONGNVARCHAR})
public class ListTypeHandler implements TypeHandler<List<String>> {
@Override
public void setParameter(PreparedStatement ps, int i, List<String> strings, JdbcType jdbcType) throws SQLException {
ps.setString(i, String.join(",", strings));
}
@Override
public List<String> getResult(ResultSet rs, String s) throws SQLException {
String str = rs.getString(s);
return Arrays.asList(str.split(","));
}
@Override
public List<String> getResult(ResultSet rs, int i) throws SQLException {
String str = rs.getString(i);
return Arrays.asList(str.split(","));
}
@Override
public List<String> getResult(CallableStatement cs, int i) throws SQLException {
String str = cs.getString(i);
return Arrays.asList(str.split(","));
}
}
@@ -1,6 +1,10 @@
package com.wabestway.recall.trace.vo;
import java.io.Serializable;
import java.util.List;
import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@@ -76,6 +80,7 @@ public class RecallOrderVO implements Serializable {
private String createBy;
/** 创建时间 */
@ApiModelProperty(value = "创建时间")
@JsonProperty(value = "createAt")
private Long createTime;
/** 更新人 */
@ApiModelProperty(value = "更新人")
@@ -84,4 +89,6 @@ public class RecallOrderVO implements Serializable {
@ApiModelProperty(value = "更新时间")
private Long updateTime;
private List<String> events;
}
+13 -3
View File
@@ -20,7 +20,8 @@
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<mybatisplus.version>3.3.2</mybatisplus.version>
<alibaba.boot.druid>1.1.22</alibaba.boot.druid> </properties>
<alibaba.boot.druid>1.1.22</alibaba.boot.druid>
</properties>
<dependencies>
<dependency>
@@ -40,7 +41,16 @@
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>${alibaba.boot.druid}</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
@@ -74,7 +84,7 @@
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
@@ -56,6 +56,17 @@ public class RecallOrderApiServiceImpl implements RecallOrderApiService {
@Override
public ResObj<RecallOrderVO> getRecallOrderByOrderId(String orderId) {
RecallOrderVO recallOrderVO = recallOrderService.queryRecallOrderById(orderId);
if (recallOrderVO != null) {
LambdaQueryWrapper<RecallRecordEntity> recordQuery = Wrappers.lambdaQuery();
recordQuery.eq(RecallRecordEntity::getTraceId, recallOrderVO.getTraceId());
recordQuery.orderByAsc(RecallRecordEntity::getCreateTime);
List<RecallRecordEntity> recordList = recallRecordService.getBaseMapper().selectList(recordQuery);
List<String> events = recordList.stream()
.flatMap(entity -> entity.getEvents().stream())
.collect(Collectors.toList());
recallOrderVO.setEvents(events);
}
return ResObj.ok(recallOrderVO);
}
@@ -38,7 +38,8 @@ public class RecallRecordApiServiceImpl implements RecallRecordApiService {
.map(recallOrderService::queryRecallOrderByOrderId)
.map(RecallOrderEntity::getTraceId)
.orElse(UUID.randomUUID().toString().replace("-", ""));
log.info(traceId);
record.setTraceId(traceId);
boolean isLastEvent = record.isLast();
RecallOrderEntity order = Optional.ofNullable(orderId)
@@ -0,0 +1 @@
# nacos
@@ -0,0 +1,2 @@
server:
port: 9235
@@ -0,0 +1,16 @@
#spring:
# jackson:
# date-format: yyyy-MM-dd HH:mm:ss
# time-zone: GMT+8
mybatis-plus:
#MyBaits 别名包扫描路径,通过该属性可以给包中的类注册别名
configuration:
# 打印控制台
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
spring:
freemarker:
settings:
classic_compatible: true
@@ -0,0 +1,17 @@
spring:
profiles: dev
application:
name: afis-recall
cloud:
nacos:
config:
file-extension: yaml
server-addr: 192.168.0.141:8848
namespace: ns-car-dev
discovery:
#Nacos服务注册中心地址
server-addr: 192.168.0.141:8848
namespace: ns-car-dev
main:
allow-bean-definition-overriding: true
@@ -0,0 +1,51 @@
spring:
profiles: native
application:
name: afis-recall
cloud:
nacos:
config:
file-extension: yaml
server-addr: 49.7.225.107:8848
namespace: native-test
discovery:
#Nacos服务注册中心地址
server-addr: 49.7.225.107:8848
namespace: native-test
main:
allow-bean-definition-overriding: true
datasource:
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://123.56.82.16:3306/afis-agency?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
username: rocar
password: rocar
driver-class-name: com.mysql.cj.jdbc.Driver
platform: mysql
druid:
initial-size: 2
max-active: 100
time-between-eviction-runs-millis: 60000
min-evictable-idle-time-millis: 300000
validation-query: SELECT 1 FROM DUAL
test-while-idle: true
test-on-borrow: false
test-on-return: false
pool-prepared-statements: true
max-pool-prepared-statement-per-connection-size: 5
filter:
stat:
log-slow-sql: true
slow-sql-millis: 2000
enabled: true
config:
enabled: true
wall:
enabled: true
encoding:
enabled: true
stat-view-servlet:
enabled: true
url-pattern: /druid/*
login-username: admin
login-password: admin
@@ -0,0 +1,17 @@
spring:
profiles: prod
application:
name: afis-recall
cloud:
nacos:
config:
file-extension: yaml
server-addr: 192.168.208.47:18848,192.168.208.48:18848
namespace: cs-prd
discovery:
#Nacos服务注册中心地址
server-addr: 192.168.208.47:18848,192.168.208.48:18848
namespace: cs-prd
main:
allow-bean-definition-overriding: true
@@ -0,0 +1,16 @@
spring:
profiles: uat
application:
name: afis-recall
cloud:
nacos:
config:
file-extension: yaml
server-addr: 192.168.220.31:8848
namespace: tfs-cs-uat
discovery:
#Nacos服务注册中心地址
server-addr: 192.168.220.31:8848
namespace: tfs-cs-uat
main:
allow-bean-definition-overriding: true
@@ -0,0 +1,3 @@
spring:
profiles:
active: native
@@ -0,0 +1,135 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<springProperty scope="context" name="LOG_HOME" source="application.log.home" defaultValue="/home/log"/>
<springProperty scope="context" name="SERVICE_NAME" source="spring.application.name"/>
<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{trace_id}] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- 按照每天生成日志文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}/${SERVICE_NAME}/${SERVICE_NAME}.log.%d{yyyy-MM-dd}.log</FileNamePattern>
<!--日志文件保留天数-->
<MaxHistory>181</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ${PID} %X{trace_id} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
<!--日志文件最大的大小-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>10MB</MaxFileSize>
</triggeringPolicy>
</appender>
<!-- 2.2 level为 INFO 日志,时间滚动输出 -->
<appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文档的路径及文档名 -->
<file>${LOG_HOME}/${SERVICE_NAME}/${SERVICE_NAME}.log</file>
<!--日志文档输出格式-->
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ${PID} %X{trace_id} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 每天日志归档路径以及格式 -->
<fileNamePattern>${LOG_HOME}/${SERVICE_NAME}/${SERVICE_NAME}-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志文档保留天数-->
<maxHistory>181</maxHistory>
</rollingPolicy>
<!-- 此日志文档只记录info级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>info</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 2.3 level为 WARN 日志,时间滚动输出 -->
<appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文档的路径及文档名 -->
<file>${LOG_HOME}/${SERVICE_NAME}/${SERVICE_NAME}-warn.log</file>
<!--日志文档输出格式-->
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ${PID} %X{trace_id} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>UTF-8</charset> <!-- 此处设置字符集 -->
</encoder>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/${SERVICE_NAME}/${SERVICE_NAME}-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志文档保留天数-->
<maxHistory>181</maxHistory>
</rollingPolicy>
<!-- 此日志文档只记录warn级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>warn</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 2.4 level为 ERROR 日志,时间滚动输出 -->
<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文档的路径及文档名 -->
<file>${LOG_HOME}/${SERVICE_NAME}/${SERVICE_NAME}-error.log</file>
<!--日志文档输出格式-->
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ${PID} %X{trace_id} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>UTF-8</charset> <!-- 此处设置字符集 -->
</encoder>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/${SERVICE_NAME}/${SERVICE_NAME}-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志文档保留天数-->
<maxHistory>181</maxHistory>
</rollingPolicy>
<!-- 此日志文档只记录ERROR级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<property name="email_subject" value="【Error】: %logger - %msg"/>
<logger name="com.wabestway" additivity="false">
<level value="debug"/>
<appender-ref ref="FILE"/>
<appender-ref ref="STDOUT"/>
</logger>
<logger name="com.alibaba" additivity="false">
<level value="ERROR"/>
<appender-ref ref="FILE"/>
<appender-ref ref="STDOUT"/>
</logger>
<!-- 在程序的开发测试阶段,可以调整level的级别,常用级别优先级为: -->
<!-- TRACE < DEBUG < INFO < WARN < ERROR -->
<!-- 日志输出级别 -->
<root level="INFO">
<appender-ref ref="STDOUT"/>
<appender-ref ref="INFO_FILE"/>
<appender-ref ref="FILE"/>
<appender-ref ref="WARN_FILE"/>
<appender-ref ref="ERROR_FILE"/>
</root>
</configuration>
+1
View File
@@ -11,6 +11,7 @@
<modules>
<module>afis-recall-web</module>
<module>afis-recall-service</module>
<module>afis-recall-api</module>
</modules>