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.
*/