From 3b91e9d947fb51fda6a76a01aa0d188307c3f7b4 Mon Sep 17 00:00:00 2001 From: zlt Date: Sun, 15 Sep 2019 23:43:46 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=A7=9F=E6=88=B7=E3=80=81tr?= =?UTF-8?q?ace=E7=AD=89=E6=95=B0=E6=8D=AE=E4=BC=A0=E9=80=92=E6=96=B9?= =?UTF-8?q?=E5=BC=8F=EF=BC=8C=E7=94=B1=E6=8B=A6=E6=88=AA=E5=99=A8=E6=94=B9?= =?UTF-8?q?=E4=B8=BA=E8=BF=87=E6=BB=A4=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/config/DefaultWebMvcConfig.java | 34 -------------- .../central/common/filter/TenantFilter.java | 41 +++++++++++++++++ .../central/common/filter/TraceFilter.java | 45 +++++++++++++++++++ .../interceptor/LbIsolationInterceptor.java | 26 ----------- .../common/interceptor/TenantInterceptor.java | 34 -------------- .../common/interceptor/TraceInterceptor.java | 26 ----------- .../main/resources/META-INF/spring.factories | 6 ++- .../ribbon/config/FeignInterceptorConfig.java | 3 +- .../ribbon/filter/LbIsolationFilter.java | 45 +++++++++++++++++++ .../main/resources/META-INF/spring.factories | 3 +- zlt-demo/seata-demo/README.md | 7 ++- 11 files changed, 144 insertions(+), 126 deletions(-) create mode 100644 zlt-commons/zlt-common-spring-boot-starter/src/main/java/com/central/common/filter/TenantFilter.java create mode 100644 zlt-commons/zlt-common-spring-boot-starter/src/main/java/com/central/common/filter/TraceFilter.java delete mode 100644 zlt-commons/zlt-common-spring-boot-starter/src/main/java/com/central/common/interceptor/LbIsolationInterceptor.java delete mode 100644 zlt-commons/zlt-common-spring-boot-starter/src/main/java/com/central/common/interceptor/TenantInterceptor.java delete mode 100644 zlt-commons/zlt-common-spring-boot-starter/src/main/java/com/central/common/interceptor/TraceInterceptor.java create mode 100644 zlt-commons/zlt-ribbon-spring-boot-starter/src/main/java/com/central/common/ribbon/filter/LbIsolationFilter.java diff --git a/zlt-commons/zlt-common-spring-boot-starter/src/main/java/com/central/common/config/DefaultWebMvcConfig.java b/zlt-commons/zlt-common-spring-boot-starter/src/main/java/com/central/common/config/DefaultWebMvcConfig.java index 5df572c..297dee5 100644 --- a/zlt-commons/zlt-common-spring-boot-starter/src/main/java/com/central/common/config/DefaultWebMvcConfig.java +++ b/zlt-commons/zlt-common-spring-boot-starter/src/main/java/com/central/common/config/DefaultWebMvcConfig.java @@ -1,18 +1,11 @@ package com.central.common.config; -import com.central.common.constant.ConfigConstants; import com.central.common.feign.UserService; -import com.central.common.interceptor.LbIsolationInterceptor; -import com.central.common.interceptor.TenantInterceptor; -import com.central.common.interceptor.TraceInterceptor; import com.central.common.resolver.ClientArgumentResolver; import com.central.common.resolver.TokenArgumentResolver; -import com.central.log.properties.TraceProperties; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Lazy; import org.springframework.web.method.support.HandlerMethodArgumentResolver; -import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; @@ -29,33 +22,6 @@ public class DefaultWebMvcConfig extends WebMvcConfigurationSupport { @Autowired private UserService userService; - @Autowired - private TraceProperties traceProperties; - - @Value("${" + ConfigConstants.CONFIG_RIBBON_ISOLATION_ENABLED + ":false}") - private boolean enableIsolation; - - /** - * 配置SpringMVC拦截器,添加租户拦截器 - */ - @Override - protected void addInterceptors(InterceptorRegistry registry) { - //租户拦截器 - registry.addInterceptor(new TenantInterceptor()).addPathPatterns("/**"); - - if (traceProperties.getEnable()) { - //日志链路追踪拦截器 - registry.addInterceptor(new TraceInterceptor()).addPathPatterns("/**"); - } - - if (enableIsolation) { - //负债均衡隔离规则拦截器 - registry.addInterceptor(new LbIsolationInterceptor()).addPathPatterns("/**"); - } - - super.addInterceptors(registry); - } - /** * Token参数解析 * diff --git a/zlt-commons/zlt-common-spring-boot-starter/src/main/java/com/central/common/filter/TenantFilter.java b/zlt-commons/zlt-common-spring-boot-starter/src/main/java/com/central/common/filter/TenantFilter.java new file mode 100644 index 0000000..61d82d3 --- /dev/null +++ b/zlt-commons/zlt-common-spring-boot-starter/src/main/java/com/central/common/filter/TenantFilter.java @@ -0,0 +1,41 @@ +package com.central.common.filter; + +import cn.hutool.core.util.StrUtil; +import com.central.common.constant.CommonConstant; +import com.central.common.constant.SecurityConstants; +import com.central.common.context.TenantContextHolder; +import org.springframework.web.filter.OncePerRequestFilter; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * 租户过滤器 + * + * @author zlt + * @date 2019/9/15 + */ +public class TenantFilter extends OncePerRequestFilter { + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, + FilterChain filterChain) throws IOException, ServletException { + try { + //优先获取请求参数中的tenantId值 + String tenantId = request.getParameter(CommonConstant.TENANT_ID_PARAM); + if (StrUtil.isEmpty(tenantId)) { + tenantId = request.getHeader(SecurityConstants.TENANT_HEADER); + } + //保存租户id + if (StrUtil.isEmpty(tenantId)) { + TenantContextHolder.setTenant(tenantId); + } + + filterChain.doFilter(request, response); + } finally { + TenantContextHolder.clear(); + } + } +} diff --git a/zlt-commons/zlt-common-spring-boot-starter/src/main/java/com/central/common/filter/TraceFilter.java b/zlt-commons/zlt-common-spring-boot-starter/src/main/java/com/central/common/filter/TraceFilter.java new file mode 100644 index 0000000..7b2781b --- /dev/null +++ b/zlt-commons/zlt-common-spring-boot-starter/src/main/java/com/central/common/filter/TraceFilter.java @@ -0,0 +1,45 @@ +package com.central.common.filter; + +import cn.hutool.core.util.StrUtil; +import com.central.common.constant.CommonConstant; +import com.central.log.properties.TraceProperties; +import org.slf4j.MDC; +import org.springframework.web.filter.OncePerRequestFilter; + +import javax.annotation.Resource; +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * 日志链路追踪过滤器 + * + * @author zlt + * @date 2019/9/15 + */ +public class TraceFilter extends OncePerRequestFilter { + @Resource + private TraceProperties traceProperties; + + @Override + protected boolean shouldNotFilter(HttpServletRequest request) { + return !traceProperties.getEnable(); + } + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, + FilterChain filterChain) throws IOException, ServletException { + try { + String traceId = request.getHeader(CommonConstant.TRACE_ID_HEADER); + if (StrUtil.isNotEmpty(traceId)) { + MDC.put(CommonConstant.LOG_TRACE_ID, traceId); + } + + filterChain.doFilter(request, response); + } finally { + MDC.clear(); + } + } +} diff --git a/zlt-commons/zlt-common-spring-boot-starter/src/main/java/com/central/common/interceptor/LbIsolationInterceptor.java b/zlt-commons/zlt-common-spring-boot-starter/src/main/java/com/central/common/interceptor/LbIsolationInterceptor.java deleted file mode 100644 index 00db34a..0000000 --- a/zlt-commons/zlt-common-spring-boot-starter/src/main/java/com/central/common/interceptor/LbIsolationInterceptor.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.central.common.interceptor; - -import cn.hutool.core.util.StrUtil; -import com.central.common.constant.CommonConstant; -import com.central.common.context.LbIsolationContextHolder; -import org.springframework.web.servlet.HandlerInterceptor; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -/** - * 负载均衡隔离规则截器 - * - * @author zlt - * @date 2019/8/5 - */ -public class LbIsolationInterceptor implements HandlerInterceptor { - @Override - public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { - String version = request.getHeader(CommonConstant.Z_L_T_VERSION); - if(StrUtil.isNotEmpty(version)){ - LbIsolationContextHolder.setVersion(version); - } - return true; - } -} diff --git a/zlt-commons/zlt-common-spring-boot-starter/src/main/java/com/central/common/interceptor/TenantInterceptor.java b/zlt-commons/zlt-common-spring-boot-starter/src/main/java/com/central/common/interceptor/TenantInterceptor.java deleted file mode 100644 index 4f7aeb5..0000000 --- a/zlt-commons/zlt-common-spring-boot-starter/src/main/java/com/central/common/interceptor/TenantInterceptor.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.central.common.interceptor; - -import cn.hutool.core.util.StrUtil; -import com.central.common.constant.CommonConstant; -import com.central.common.constant.SecurityConstants; -import com.central.common.context.TenantContextHolder; -import org.springframework.web.servlet.HandlerInterceptor; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -/** - * 租户拦截器 - * - * @author zlt - * @date 2019/8/5 - */ -public class TenantInterceptor implements HandlerInterceptor { - @Override - public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { - //优先获取请求参数中的tenantId值 - String tenantId = request.getParameter(CommonConstant.TENANT_ID_PARAM); - if (StrUtil.isEmpty(tenantId)) { - tenantId = request.getHeader(SecurityConstants.TENANT_HEADER); - } - //保存租户id - if(StrUtil.isNotEmpty(tenantId)){ - TenantContextHolder.setTenant(tenantId); - } else { - TenantContextHolder.clear(); - } - return true; - } -} diff --git a/zlt-commons/zlt-common-spring-boot-starter/src/main/java/com/central/common/interceptor/TraceInterceptor.java b/zlt-commons/zlt-common-spring-boot-starter/src/main/java/com/central/common/interceptor/TraceInterceptor.java deleted file mode 100644 index b68e069..0000000 --- a/zlt-commons/zlt-common-spring-boot-starter/src/main/java/com/central/common/interceptor/TraceInterceptor.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.central.common.interceptor; - -import cn.hutool.core.util.StrUtil; -import com.central.common.constant.CommonConstant; -import org.slf4j.MDC; -import org.springframework.web.servlet.HandlerInterceptor; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -/** - * 日志链路追踪拦截器 - * - * @author zlt - * @date 2019/8/13 - */ -public class TraceInterceptor implements HandlerInterceptor { - @Override - public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { - String traceId = request.getHeader(CommonConstant.TRACE_ID_HEADER); - if (StrUtil.isNotEmpty(traceId)) { - MDC.put(CommonConstant.LOG_TRACE_ID, traceId); - } - return true; - } -} diff --git a/zlt-commons/zlt-common-spring-boot-starter/src/main/resources/META-INF/spring.factories b/zlt-commons/zlt-common-spring-boot-starter/src/main/resources/META-INF/spring.factories index 7c72414..70270f2 100644 --- a/zlt-commons/zlt-common-spring-boot-starter/src/main/resources/META-INF/spring.factories +++ b/zlt-commons/zlt-common-spring-boot-starter/src/main/resources/META-INF/spring.factories @@ -1,2 +1,6 @@ org.springframework.context.ApplicationContextInitializer=\ -com.central.common.config.BannerInitializer \ No newline at end of file +com.central.common.config.BannerInitializer + +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ +com.central.common.filter.TenantFilter,\ +com.central.common.filter.TraceFilter \ No newline at end of file diff --git a/zlt-commons/zlt-ribbon-spring-boot-starter/src/main/java/com/central/common/ribbon/config/FeignInterceptorConfig.java b/zlt-commons/zlt-ribbon-spring-boot-starter/src/main/java/com/central/common/ribbon/config/FeignInterceptorConfig.java index 49041d7..02d839a 100644 --- a/zlt-commons/zlt-ribbon-spring-boot-starter/src/main/java/com/central/common/ribbon/config/FeignInterceptorConfig.java +++ b/zlt-commons/zlt-ribbon-spring-boot-starter/src/main/java/com/central/common/ribbon/config/FeignInterceptorConfig.java @@ -37,7 +37,7 @@ public class FeignInterceptorConfig { */ @Bean public RequestInterceptor requestInterceptor() { - RequestInterceptor requestInterceptor = template -> { + return template -> { ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder .getRequestAttributes(); if (attributes != null) { @@ -77,7 +77,6 @@ public class FeignInterceptorConfig { template.header(CommonConstant.TRACE_ID_HEADER, traceId); } }; - return requestInterceptor; } /** diff --git a/zlt-commons/zlt-ribbon-spring-boot-starter/src/main/java/com/central/common/ribbon/filter/LbIsolationFilter.java b/zlt-commons/zlt-ribbon-spring-boot-starter/src/main/java/com/central/common/ribbon/filter/LbIsolationFilter.java new file mode 100644 index 0000000..fdd33fd --- /dev/null +++ b/zlt-commons/zlt-ribbon-spring-boot-starter/src/main/java/com/central/common/ribbon/filter/LbIsolationFilter.java @@ -0,0 +1,45 @@ +package com.central.common.ribbon.filter; + +import cn.hutool.core.util.StrUtil; +import com.central.common.constant.CommonConstant; +import com.central.common.constant.ConfigConstants; +import com.central.common.context.LbIsolationContextHolder; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.filter.OncePerRequestFilter; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * 负载均衡隔离规则过滤器 + * + * @author zlt + * @date 2019/9/15 + */ +public class LbIsolationFilter extends OncePerRequestFilter { + @Value("${" + ConfigConstants.CONFIG_RIBBON_ISOLATION_ENABLED + ":false}") + private boolean enableIsolation; + + @Override + protected boolean shouldNotFilter(HttpServletRequest request) { + return !enableIsolation; + } + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, + FilterChain filterChain) throws IOException, ServletException { + try { + String version = request.getHeader(CommonConstant.Z_L_T_VERSION); + if(StrUtil.isNotEmpty(version)){ + LbIsolationContextHolder.setVersion(version); + } + + filterChain.doFilter(request, response); + } finally { + LbIsolationContextHolder.clear(); + } + } +} diff --git a/zlt-commons/zlt-ribbon-spring-boot-starter/src/main/resources/META-INF/spring.factories b/zlt-commons/zlt-ribbon-spring-boot-starter/src/main/resources/META-INF/spring.factories index fe9830b..d198a8d 100644 --- a/zlt-commons/zlt-ribbon-spring-boot-starter/src/main/resources/META-INF/spring.factories +++ b/zlt-commons/zlt-ribbon-spring-boot-starter/src/main/resources/META-INF/spring.factories @@ -1,4 +1,5 @@ org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.central.common.ribbon.RibbonAutoConfigure,\ com.central.common.ribbon.FeignAutoConfigure,\ -com.central.common.ribbon.RestTemplateAutoConfigure +com.central.common.ribbon.RestTemplateAutoConfigure,\ +com.central.common.ribbon.filter.LbIsolationFilter diff --git a/zlt-demo/seata-demo/README.md b/zlt-demo/seata-demo/README.md index d4e17c9..43ae36c 100644 --- a/zlt-demo/seata-demo/README.md +++ b/zlt-demo/seata-demo/README.md @@ -13,8 +13,11 @@   **提供以下两个测试接口** -1. `http://localhost:9090/placeOrder`:成功下单 -2. `http://localhost:9090/placeOrder`:测试异常回滚,`storage-service`和`order-service`的事务已提交,`account-service`出异常后全局回滚 + +1. 事务成功:扣除库存成功 > 创建订单成功 > 扣减账户余额成功 +http://localhost:9090/placeOrder +1. 事务失败:扣除库存成功 > 创建订单成功 > 扣减账户余额失败,事务回滚 +http://localhost:9090/placeOrderFallBack   ## 二、运行步骤 -- GitLab