Browse Source

rpc调用逻辑优化

woody 1 year ago
parent
commit
62efd7c501

+ 2 - 2
framework-dubbo/src/main/java/com/chelvc/framework/dubbo/interceptor/DubboExceptionInterceptor.java → framework-dubbo/src/main/java/com/chelvc/framework/dubbo/interceptor/DubboFailureInterceptor.java

@@ -16,13 +16,13 @@ import org.apache.dubbo.rpc.RpcException;
 import org.apache.dubbo.rpc.service.GenericService;
 import org.apache.dubbo.rpc.service.GenericService;
 
 
 /**
 /**
- * Dubbo 异常处理拦截器,排除自定义异常处理
+ * Dubbo调用失败处理拦截器,排除自定义异常处理
  *
  *
  * @author Woody
  * @author Woody
  * @date 2024/1/30
  * @date 2024/1/30
  */
  */
 @Slf4j
 @Slf4j
-public class DubboExceptionInterceptor implements Filter, Filter.Listener {
+public class DubboFailureInterceptor implements Filter, Filter.Listener {
     @Override
     @Override
     public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
     public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
         return invoker.invoke(invocation);
         return invoker.invoke(invocation);

+ 1 - 1
framework-dubbo/src/main/resources/META-INF/dubbo/com.alibaba.dubbo.rpc.Filter

@@ -1,3 +1,3 @@
-customException=com.chelvc.framework.dubbo.interceptor.DubboExceptionInterceptor
+customException=com.chelvc.framework.dubbo.interceptor.DubboFailureInterceptor
 consumerContext=com.chelvc.framework.dubbo.interceptor.DubboConsumerInterceptor
 consumerContext=com.chelvc.framework.dubbo.interceptor.DubboConsumerInterceptor
 providerContext=com.chelvc.framework.dubbo.interceptor.DubboProviderInterceptor
 providerContext=com.chelvc.framework.dubbo.interceptor.DubboProviderInterceptor

+ 0 - 1
framework-feign/src/main/java/com/chelvc/framework/feign/coding/CustomEncoder.java

@@ -23,7 +23,6 @@ import feign.form.util.PojoUtil;
 import lombok.NonNull;
 import lombok.NonNull;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.HttpHeaders;
 
 
-
 /**
 /**
  * 自定义编码器
  * 自定义编码器
  *
  *

+ 14 - 5
framework-feign/src/main/java/com/chelvc/framework/feign/config/FeignConfigurer.java

@@ -1,7 +1,8 @@
 package com.chelvc.framework.feign.config;
 package com.chelvc.framework.feign.config;
 
 
 import com.chelvc.framework.feign.coding.CustomEncoder;
 import com.chelvc.framework.feign.coding.CustomEncoder;
-import com.chelvc.framework.feign.interceptor.FeignExceptionInterceptor;
+import com.chelvc.framework.feign.interceptor.FeignFailureInterceptor;
+import com.chelvc.framework.feign.interceptor.FeignInvokeInterceptor;
 import feign.codec.Decoder;
 import feign.codec.Decoder;
 import feign.codec.Encoder;
 import feign.codec.Encoder;
 import feign.codec.ErrorDecoder;
 import feign.codec.ErrorDecoder;
@@ -9,7 +10,9 @@ import feign.optionals.OptionalDecoder;
 import lombok.RequiredArgsConstructor;
 import lombok.RequiredArgsConstructor;
 import org.springframework.beans.factory.ObjectFactory;
 import org.springframework.beans.factory.ObjectFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.config.BeanDefinition;
 import org.springframework.boot.autoconfigure.AutoConfigureBefore;
 import org.springframework.boot.autoconfigure.AutoConfigureBefore;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
 import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
 import org.springframework.cloud.openfeign.FeignAutoConfiguration;
 import org.springframework.cloud.openfeign.FeignAutoConfiguration;
 import org.springframework.cloud.openfeign.support.ResponseEntityDecoder;
 import org.springframework.cloud.openfeign.support.ResponseEntityDecoder;
@@ -20,8 +23,6 @@ import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.Primary;
 import org.springframework.context.annotation.Primary;
 import org.springframework.context.annotation.Scope;
 import org.springframework.context.annotation.Scope;
 
 
-import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROTOTYPE;
-
 /**
 /**
  * Feign配置
  * Feign配置
  *
  *
@@ -36,18 +37,26 @@ public class FeignConfigurer {
 
 
     @Bean
     @Bean
     @Primary
     @Primary
-    @Scope(SCOPE_PROTOTYPE)
+    @Scope(BeanDefinition.SCOPE_PROTOTYPE)
     public Encoder encoder() {
     public Encoder encoder() {
         return new CustomEncoder(new SpringEncoder(this.messageConverters));
         return new CustomEncoder(new SpringEncoder(this.messageConverters));
     }
     }
 
 
     @Bean
     @Bean
+    @ConditionalOnMissingBean(Decoder.class)
     public Decoder decoder() {
     public Decoder decoder() {
         return new OptionalDecoder(new ResponseEntityDecoder(new SpringDecoder(this.messageConverters)));
         return new OptionalDecoder(new ResponseEntityDecoder(new SpringDecoder(this.messageConverters)));
     }
     }
 
 
     @Bean
     @Bean
+    @ConditionalOnMissingBean(ErrorDecoder.class)
     public ErrorDecoder errorDecoder() {
     public ErrorDecoder errorDecoder() {
-        return new FeignExceptionInterceptor();
+        return new FeignFailureInterceptor();
+    }
+
+    @Bean
+    @ConditionalOnMissingBean(FeignInvokeInterceptor.class)
+    public FeignInvokeInterceptor feignInvokeInterceptor() {
+        return new FeignInvokeInterceptor();
     }
     }
 }
 }

+ 18 - 4
framework-feign/src/main/java/com/chelvc/framework/feign/interceptor/FeignExceptionInterceptor.java → framework-feign/src/main/java/com/chelvc/framework/feign/interceptor/FeignFailureInterceptor.java

@@ -8,19 +8,33 @@ import com.chelvc.framework.common.exception.FrameworkException;
 import com.chelvc.framework.common.util.JacksonUtils;
 import com.chelvc.framework.common.util.JacksonUtils;
 import feign.Response;
 import feign.Response;
 import feign.codec.ErrorDecoder;
 import feign.codec.ErrorDecoder;
+import lombok.NonNull;
 
 
 /**
 /**
- * Feign调用异常处理拦截器
+ * Feign调用失败处理拦截器
  *
  *
  * @author Woody
  * @author Woody
  * @date 2024/1/30
  * @date 2024/1/30
  */
  */
-public class FeignExceptionInterceptor implements ErrorDecoder {
+public class FeignFailureInterceptor implements ErrorDecoder {
+    /**
+     * 反序列化请求结果
+     *
+     * @param response 相应结果
+     * @return 请求结果
+     * @throws IOException I/O异常
+     */
+    protected Result<?> deserialize(@NonNull Response response) throws IOException {
+        try (InputStream input = response.body().asInputStream()) {
+            return JacksonUtils.deserialize(input, Result.class);
+        }
+    }
+
     @Override
     @Override
     public Exception decode(String method, Response response) {
     public Exception decode(String method, Response response) {
         Result<?> result;
         Result<?> result;
-        try (InputStream input = response.body().asInputStream()) {
-            result = JacksonUtils.deserialize(input, Result.class);
+        try {
+            result = this.deserialize(response);
         } catch (IOException e) {
         } catch (IOException e) {
             return e;
             return e;
         }
         }

+ 21 - 8
framework-feign/src/main/java/com/chelvc/framework/feign/interceptor/FeignHeaderInterceptor.java → framework-feign/src/main/java/com/chelvc/framework/feign/interceptor/FeignInvokeInterceptor.java

@@ -9,26 +9,33 @@ import com.chelvc.framework.common.model.Terminal;
 import com.chelvc.framework.common.util.ObjectUtils;
 import com.chelvc.framework.common.util.ObjectUtils;
 import feign.RequestInterceptor;
 import feign.RequestInterceptor;
 import feign.RequestTemplate;
 import feign.RequestTemplate;
-import org.springframework.stereotype.Component;
 
 
 /**
 /**
- * Feign请求头处理拦截器
+ * Feign调用处理拦截器
  *
  *
  * @author Woody
  * @author Woody
  * @date 2024/1/30
  * @date 2024/1/30
  */
  */
-@Component
-public class FeignHeaderInterceptor implements RequestInterceptor {
-    @Override
-    public void apply(RequestTemplate template) {
-        // 打包运行环境自动添加接口地址前缀
+public class FeignInvokeInterceptor implements RequestInterceptor {
+    /**
+     * 初始化请求前缀
+     *
+     * @param template 请求模版对象实例
+     */
+    protected void initializeRequestPrefix(RequestTemplate template) {
         String path = template.path();
         String path = template.path();
         String server = template.feignTarget().name();
         String server = template.feignTarget().name();
         if (ApplicationContextHolder.isResourcePrefixed(server, path)) {
         if (ApplicationContextHolder.isResourcePrefixed(server, path)) {
             template.uri(HttpUtils.uri(server, path));
             template.uri(HttpUtils.uri(server, path));
         }
         }
+    }
 
 
-        // 拷贝当前会话请求头
+    /**
+     * 初始化请求头
+     *
+     * @param template 请求模版对象实例
+     */
+    protected void initializeRequestHeader(RequestTemplate template) {
         Session session = SessionContextHolder.getSession(false);
         Session session = SessionContextHolder.getSession(false);
         if (session != null) {
         if (session != null) {
             template.header("x-real-ip", session.getHost());
             template.header("x-real-ip", session.getHost());
@@ -48,4 +55,10 @@ public class FeignHeaderInterceptor implements RequestInterceptor {
                     (String) ObjectUtils.ifNull(session.getTimestamp(), String::valueOf));
                     (String) ObjectUtils.ifNull(session.getTimestamp(), String::valueOf));
         }
         }
     }
     }
+
+    @Override
+    public void apply(RequestTemplate template) {
+        this.initializeRequestPrefix(template);
+        this.initializeRequestHeader(template);
+    }
 }
 }