You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shenyu.apache.org by ke...@apache.org on 2022/06/22 10:16:56 UTC

[incubator-shenyu] branch master updated: can custom message writer in response plugin (#3600)

This is an automated email from the ASF dual-hosted git repository.

kevinclair pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-shenyu.git


The following commit(s) were added to refs/heads/master by this push:
     new d24fb98e5 can custom message writer in response plugin (#3600)
d24fb98e5 is described below

commit d24fb98e5fe23bbe56c14ebf64fb01fd7ed1c601
Author: xiaoyu <xi...@apache.org>
AuthorDate: Wed Jun 22 18:16:50 2022 +0800

    can custom message writer in response plugin (#3600)
---
 .../plugin/response/strategy/MessageWriter.java    | 11 ++++++-
 .../strategy/NettyClientMessageWriter.java         |  9 +++++-
 .../plugin/response/strategy/RPCMessageWriter.java |  9 ++++++
 .../response/strategy/WebClientMessageWriter.java  | 10 +++++-
 .../response/ResponsePluginConfiguration.java      | 36 ++++++++++++++--------
 5 files changed, 59 insertions(+), 16 deletions(-)

diff --git a/shenyu-plugin/shenyu-plugin-response/src/main/java/org/apache/shenyu/plugin/response/strategy/MessageWriter.java b/shenyu-plugin/shenyu-plugin-response/src/main/java/org/apache/shenyu/plugin/response/strategy/MessageWriter.java
index 376e457c4..4ccfdafec 100644
--- a/shenyu-plugin/shenyu-plugin-response/src/main/java/org/apache/shenyu/plugin/response/strategy/MessageWriter.java
+++ b/shenyu-plugin/shenyu-plugin-response/src/main/java/org/apache/shenyu/plugin/response/strategy/MessageWriter.java
@@ -21,11 +21,13 @@ import org.apache.shenyu.plugin.api.ShenyuPluginChain;
 import org.springframework.web.server.ServerWebExchange;
 import reactor.core.publisher.Mono;
 
+import java.util.List;
+
 /**
  * The interface Message writer.
  */
 public interface MessageWriter {
-
+    
     /**
      * Write with exchange and shenyu plugin chain.
      *
@@ -34,4 +36,11 @@ public interface MessageWriter {
      * @return {@code Mono<Void>} to indicate when request processing is complete
      */
     Mono<Void> writeWith(ServerWebExchange exchange, ShenyuPluginChain chain);
+    
+    /**
+     * Support type list.
+     *
+     * @return the list
+     */
+    List<String> supportTypes();
 }
diff --git a/shenyu-plugin/shenyu-plugin-response/src/main/java/org/apache/shenyu/plugin/response/strategy/NettyClientMessageWriter.java b/shenyu-plugin/shenyu-plugin-response/src/main/java/org/apache/shenyu/plugin/response/strategy/NettyClientMessageWriter.java
index e9e2ccc7b..486ca5e67 100644
--- a/shenyu-plugin/shenyu-plugin-response/src/main/java/org/apache/shenyu/plugin/response/strategy/NettyClientMessageWriter.java
+++ b/shenyu-plugin/shenyu-plugin-response/src/main/java/org/apache/shenyu/plugin/response/strategy/NettyClientMessageWriter.java
@@ -17,7 +17,9 @@
 
 package org.apache.shenyu.plugin.response.strategy;
 
+import com.google.common.collect.Lists;
 import org.apache.shenyu.common.constant.Constants;
+import org.apache.shenyu.common.enums.RpcTypeEnum;
 import org.apache.shenyu.plugin.api.ShenyuPluginChain;
 import org.springframework.core.io.buffer.NettyDataBuffer;
 import org.springframework.core.io.buffer.NettyDataBufferFactory;
@@ -65,7 +67,12 @@ public class NettyClientMessageWriter implements MessageWriter {
                     : response.writeWith(body);
         })).doOnCancel(() -> cleanup(exchange));
     }
-
+    
+    @Override
+    public List<String> supportTypes() {
+        return Lists.newArrayList(RpcTypeEnum.HTTP.getName(), RpcTypeEnum.SPRING_CLOUD.getName());
+    }
+    
     private void cleanup(final ServerWebExchange exchange) {
         Connection connection = exchange.getAttribute(Constants.CLIENT_RESPONSE_CONN_ATTR);
         if (Objects.nonNull(connection)) {
diff --git a/shenyu-plugin/shenyu-plugin-response/src/main/java/org/apache/shenyu/plugin/response/strategy/RPCMessageWriter.java b/shenyu-plugin/shenyu-plugin-response/src/main/java/org/apache/shenyu/plugin/response/strategy/RPCMessageWriter.java
index 3c69cb7e7..3c2908482 100644
--- a/shenyu-plugin/shenyu-plugin-response/src/main/java/org/apache/shenyu/plugin/response/strategy/RPCMessageWriter.java
+++ b/shenyu-plugin/shenyu-plugin-response/src/main/java/org/apache/shenyu/plugin/response/strategy/RPCMessageWriter.java
@@ -17,7 +17,9 @@
 
 package org.apache.shenyu.plugin.response.strategy;
 
+import com.google.common.collect.Lists;
 import org.apache.shenyu.common.constant.Constants;
+import org.apache.shenyu.common.enums.RpcTypeEnum;
 import org.apache.shenyu.plugin.api.ShenyuPluginChain;
 import org.apache.shenyu.plugin.api.result.ShenyuResultEnum;
 import org.apache.shenyu.plugin.api.result.ShenyuResultWrap;
@@ -25,6 +27,7 @@ import org.apache.shenyu.plugin.api.utils.WebFluxResultUtils;
 import org.springframework.web.server.ServerWebExchange;
 import reactor.core.publisher.Mono;
 
+import java.util.List;
 import java.util.Objects;
 
 /**
@@ -43,4 +46,10 @@ public class RPCMessageWriter implements MessageWriter {
             return WebFluxResultUtils.result(exchange, result);
         }));
     }
+    
+    @Override
+    public List<String> supportTypes() {
+        return Lists.newArrayList(RpcTypeEnum.DUBBO.getName(), RpcTypeEnum.SOFA.getName(), 
+                RpcTypeEnum.GRPC.getName(), RpcTypeEnum.MOTAN.getName(), RpcTypeEnum.TARS.getName());
+    }
 }
diff --git a/shenyu-plugin/shenyu-plugin-response/src/main/java/org/apache/shenyu/plugin/response/strategy/WebClientMessageWriter.java b/shenyu-plugin/shenyu-plugin-response/src/main/java/org/apache/shenyu/plugin/response/strategy/WebClientMessageWriter.java
index 8c07de2f7..393d0c3a3 100644
--- a/shenyu-plugin/shenyu-plugin-response/src/main/java/org/apache/shenyu/plugin/response/strategy/WebClientMessageWriter.java
+++ b/shenyu-plugin/shenyu-plugin-response/src/main/java/org/apache/shenyu/plugin/response/strategy/WebClientMessageWriter.java
@@ -17,7 +17,9 @@
 
 package org.apache.shenyu.plugin.response.strategy;
 
+import com.google.common.collect.Lists;
 import org.apache.shenyu.common.constant.Constants;
+import org.apache.shenyu.common.enums.RpcTypeEnum;
 import org.apache.shenyu.plugin.api.ShenyuPluginChain;
 import org.apache.shenyu.plugin.api.result.ShenyuResultEnum;
 import org.apache.shenyu.plugin.api.result.ShenyuResultWrap;
@@ -31,6 +33,7 @@ import org.springframework.web.server.ServerWebExchange;
 import reactor.core.publisher.Mono;
 
 import java.util.HashSet;
+import java.util.List;
 import java.util.Objects;
 import java.util.Set;
 import java.util.StringJoiner;
@@ -81,7 +84,12 @@ public class WebClientMessageWriter implements MessageWriter {
                     .doOnCancel(() -> clean(exchange));
         }));
     }
-
+    
+    @Override
+    public List<String> supportTypes() {
+        return Lists.newArrayList(RpcTypeEnum.HTTP.getName(), RpcTypeEnum.SPRING_CLOUD.getName());
+    }
+    
     private void redrawResponseHeaders(final ServerHttpResponse response,
                                        final ClientResponse clientResponse) {
         response.getCookies().putAll(clientResponse.cookies());
diff --git a/shenyu-spring-boot-starter/shenyu-spring-boot-starter-plugin/shenyu-spring-boot-starter-plugin-response/src/main/java/org/apache/shenyu/springboot/starter/plugin/response/ResponsePluginConfiguration.java b/shenyu-spring-boot-starter/shenyu-spring-boot-starter-plugin/shenyu-spring-boot-starter-plugin-response/src/main/java/org/apache/shenyu/springboot/starter/plugin/response/ResponsePluginConfiguration.java
index 886f3d5bd..b92095c7b 100644
--- a/shenyu-spring-boot-starter/shenyu-spring-boot-starter-plugin/shenyu-spring-boot-starter-plugin-response/src/main/java/org/apache/shenyu/springboot/starter/plugin/response/ResponsePluginConfiguration.java
+++ b/shenyu-spring-boot-starter/shenyu-spring-boot-starter-plugin/shenyu-spring-boot-starter-plugin-response/src/main/java/org/apache/shenyu/springboot/starter/plugin/response/ResponsePluginConfiguration.java
@@ -18,7 +18,6 @@
 
 package org.apache.shenyu.springboot.starter.plugin.response;
 
-import org.apache.shenyu.common.enums.RpcTypeEnum;
 import org.apache.shenyu.plugin.api.ShenyuPlugin;
 import org.apache.shenyu.plugin.response.ResponsePlugin;
 import org.apache.shenyu.plugin.response.strategy.MessageWriter;
@@ -30,7 +29,9 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 
-import java.util.HashMap;
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -47,20 +48,29 @@ public class ResponsePluginConfiguration {
      * @return the shenyu plugin
      */
     @Bean
-    public ShenyuPlugin responsePlugin(final ObjectProvider<MessageWriter> httpWriter) {
-        Map<String, MessageWriter> writerMap = new HashMap<>();
-        MessageWriter httpWrite = httpWriter.getIfAvailable();
-        MessageWriter rpcWrite = new RPCMessageWriter();
-        writerMap.put(RpcTypeEnum.HTTP.getName(), httpWrite);
-        writerMap.put(RpcTypeEnum.SPRING_CLOUD.getName(), httpWrite);
-        writerMap.put(RpcTypeEnum.DUBBO.getName(), rpcWrite);
-        writerMap.put(RpcTypeEnum.SOFA.getName(), rpcWrite);
-        writerMap.put(RpcTypeEnum.GRPC.getName(), rpcWrite);
-        writerMap.put(RpcTypeEnum.MOTAN.getName(), rpcWrite);
-        writerMap.put(RpcTypeEnum.TARS.getName(), rpcWrite);
+    public ShenyuPlugin responsePlugin(final ObjectProvider<List<MessageWriter>> httpWriter) {
+        Map<String, MessageWriter> writerMap = new LinkedHashMap<>();
+        List<MessageWriter> writerList = httpWriter.getIfAvailable(ArrayList::new);
+        for (MessageWriter writer : writerList) {
+            List<String> supportTypes = writer.supportTypes();
+            for (String type : supportTypes) {
+                writerMap.put(type, writer);
+            }
+        }
         return new ResponsePlugin(writerMap);
     }
     
+    /**
+     * Rpc message writer message writer.
+     *
+     * @return the message writer
+     */
+    @Bean
+    @ConditionalOnProperty(name = "shenyu.plugins.response.rpc-message-writer", havingValue = "true", matchIfMissing = true)
+    public MessageWriter rpcMessageWriter() {
+        return new RPCMessageWriter();
+    }
+    
     /**
      * The type Web client message writer configuration.
      */