|
@@ -0,0 +1,85 @@
|
|
|
|
|
+package com.kxs.stat.api.feign.config;
|
|
|
|
|
+
|
|
|
|
|
+import cn.hutool.core.text.CharSequenceUtil;
|
|
|
|
|
+import com.kxs.common.core.constant.ServiceNameConstants;
|
|
|
|
|
+import com.kxs.stat.api.feign.RemoteKxsStatService;
|
|
|
|
|
+import io.seata.core.context.RootContext;
|
|
|
|
|
+import jakarta.servlet.http.HttpServletRequest;
|
|
|
|
|
+import lombok.RequiredArgsConstructor;
|
|
|
|
|
+import org.springframework.beans.factory.annotation.Qualifier;
|
|
|
|
|
+import org.springframework.cloud.client.loadbalancer.reactive.ReactorLoadBalancerExchangeFilterFunction;
|
|
|
|
|
+import org.springframework.context.annotation.Bean;
|
|
|
|
|
+import org.springframework.context.annotation.Configuration;
|
|
|
|
|
+import org.springframework.http.HttpHeaders;
|
|
|
|
|
+import org.springframework.web.context.request.RequestContextHolder;
|
|
|
|
|
+import org.springframework.web.context.request.ServletRequestAttributes;
|
|
|
|
|
+import org.springframework.web.reactive.function.client.ClientRequest;
|
|
|
|
|
+import org.springframework.web.reactive.function.client.WebClient;
|
|
|
|
|
+import org.springframework.web.reactive.function.client.support.WebClientAdapter;
|
|
|
|
|
+import org.springframework.web.service.invoker.HttpServiceProxyFactory;
|
|
|
|
|
+
|
|
|
|
|
+/**
|
|
|
|
|
+ * <p>
|
|
|
|
|
+ * 当前服务的webClient配置
|
|
|
|
|
+ * 服务下的远程调用统一在此配置
|
|
|
|
|
+ * 使用注册中心 需配置远程调用器 以实现负载均衡
|
|
|
|
|
+ * </p>
|
|
|
|
|
+ *
|
|
|
|
|
+ * @author 没秃顶的码农
|
|
|
|
|
+ * @date 2023/11/13
|
|
|
|
|
+ */
|
|
|
|
|
+@Configuration
|
|
|
|
|
+@RequiredArgsConstructor
|
|
|
|
|
+public class KxsStoreFeignClientConfiguration {
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 负载均衡器
|
|
|
|
|
+ */
|
|
|
|
|
+ private final ReactorLoadBalancerExchangeFilterFunction reactorLoadBalancerExchangeFilterFunction;
|
|
|
|
|
+
|
|
|
|
|
+ private static final String SERVICE_NAME = ServiceNameConstants.CLIENT_NAME + ServiceNameConstants.STAT_SERVICE;
|
|
|
|
|
+
|
|
|
|
|
+ @Bean("kxsStatFeignClient")
|
|
|
|
|
+ public WebClient oauthRequestInterceptor() {
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ return WebClient.builder()
|
|
|
|
|
+ // 给请求添加过滤器,添加自定义的认证头
|
|
|
|
|
+ .filter((request, next) -> {
|
|
|
|
|
+ ClientRequest.Builder filtered = ClientRequest.from(request);
|
|
|
|
|
+
|
|
|
|
|
+ // seata XID传递
|
|
|
|
|
+ String xid = RootContext.getXID();
|
|
|
|
|
+ if (CharSequenceUtil.isNotBlank(xid)) {
|
|
|
|
|
+ filtered.header(RootContext.KEY_XID, xid);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder
|
|
|
|
|
+ .getRequestAttributes();
|
|
|
|
|
+ // 不是web请求不传递token
|
|
|
|
|
+ if (requestAttributes != null) {
|
|
|
|
|
+ HttpServletRequest httpServletRequest = requestAttributes.getRequest();
|
|
|
|
|
+ String token = httpServletRequest.getHeader(HttpHeaders.AUTHORIZATION);
|
|
|
|
|
+ if (!CharSequenceUtil.isBlank(token)) {
|
|
|
|
|
+ // 传递token
|
|
|
|
|
+ filtered.header(HttpHeaders.AUTHORIZATION, token);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ return next.exchange(filtered.build());
|
|
|
|
|
+ }).filter(reactorLoadBalancerExchangeFilterFunction)
|
|
|
|
|
+ .baseUrl(SERVICE_NAME)
|
|
|
|
|
+ .build();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 远程统计模块服务
|
|
|
|
|
+ * @param client 客户端
|
|
|
|
|
+ * @return 远程统计模块服务
|
|
|
|
|
+ */
|
|
|
|
|
+ @Bean
|
|
|
|
|
+ RemoteKxsStatService remoteKxsStoreService(@Qualifier("kxsStatFeignClient") WebClient client) {
|
|
|
|
|
+ HttpServiceProxyFactory factory = HttpServiceProxyFactory.builder(WebClientAdapter.forClient(client)).build();
|
|
|
|
|
+ return factory.createClient(RemoteKxsStatService.class);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+}
|