From 0d7e6f42853d9dbb5f3331cff9e8bfae152e3fd4 Mon Sep 17 00:00:00 2001
From: Lictory <995372381@qq.com>
Date: Sat, 24 Aug 2024 12:34:51 +0800
Subject: [PATCH 1/7] feat: add rpc component of dubbo
---
pom.xml | 2 +
spring-cloud-alibaba-dependencies/pom.xml | 9 +
.../spring-cloud-starter-rpc/pom.xml | 22 +
spring-cloud-alibaba-tests/rpc-tests/pom.xml | 20 +
.../spring-cloud-alibaba-rpc-api/pom.xml | 19 +
.../dubbo/consumer/api/FooService.java | 21 +
.../dubbo/consumer/api/ProviderService.java | 20 +
.../alibaba/dubbo/consumer/entity/User.java | 19 +
.../spring-cloud-alibaba-rpc-consumer/pom.xml | 43 ++
.../dubbo/consumer/ConsumerApplication.java | 22 +
.../dubbo/consumer/client/FeignRpcClient.java | 94 ++++
.../dubbo/consumer/client/UrlResolver.java | 45 ++
.../config/RpcFeignConfiguration.java | 31 ++
.../interceptor/RpcFeignInterceptor.java | 15 +
.../dubbo/consumer/service/TestService.java | 33 ++
.../dubbo/consumer/util/RpcSerializeUtil.java | 25 +
.../src/main/resources/application.yml | 17 +
.../src/main/resources/dubbo.properties | 2 +
.../resources/security/serialize.allowlist | 22 +
.../spring-cloud-alibaba-rpc-core/pom.xml | 40 ++
.../rpc/annotation/DubboFeignBuilder.java | 47 ++
...lientToDubboProviderBeanPostProcessor.java | 482 ++++++++++++++++++
.../com/alibaba/rpc/common/RpcConstance.java | 9 +
...ingCloudAlibabaDubboAutoConfiguration.java | 44 ++
.../alibaba/rpc/metadata/HttpMetadata.java | 54 ++
.../alibaba/rpc/metadata/HttpRpcResponse.java | 58 +++
.../main/resources/META-INF/spring.factories | 3 +
.../src/main/resources/application.yml | 1 +
.../spring-cloud-alibaba-rpc-provider/pom.xml | 54 ++
.../dubbo/provider/ProviderApplication.java | 18 +
.../config/RpcRegistryConfiguration.java | 58 +++
.../provider/controller/TestController.java | 29 ++
.../handler/RpcNettyServerHandler.java | 24 +
.../provider/handler/ServerReplyHandler.java | 24 +
.../listener/RpcNettyServerListener.java | 160 ++++++
.../CaptureHttpServletResponseWrapper.java | 56 ++
.../provider/server/CoyoteRequestBuilder.java | 45 ++
.../MockHttpServletRequestConverter.java | 38 ++
.../dubbo/provider/server/RpcNettyServer.java | 59 +++
.../RpcToHttpServletRequestWrapper.java | 108 ++++
.../provider/service/impl/FooServiceImpl.java | 26 +
.../service/impl/ProviderServiceImpl.java | 25 +
.../dubbo/provider/util/RpcSerializeUtil.java | 31 ++
.../src/main/resources/application.yml | 17 +
.../src/main/resources/dubbo.properties | 2 +
.../resources/security/serialize.allowlist | 22 +
46 files changed, 2015 insertions(+)
create mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-rpc/pom.xml
create mode 100644 spring-cloud-alibaba-tests/rpc-tests/pom.xml
create mode 100644 spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-api/pom.xml
create mode 100644 spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-api/src/main/java/com/alibaba/dubbo/consumer/api/FooService.java
create mode 100644 spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-api/src/main/java/com/alibaba/dubbo/consumer/api/ProviderService.java
create mode 100644 spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-api/src/main/java/com/alibaba/dubbo/consumer/entity/User.java
create mode 100644 spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/pom.xml
create mode 100644 spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/java/com/alibaba/dubbo/consumer/ConsumerApplication.java
create mode 100644 spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/java/com/alibaba/dubbo/consumer/client/FeignRpcClient.java
create mode 100644 spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/java/com/alibaba/dubbo/consumer/client/UrlResolver.java
create mode 100644 spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/java/com/alibaba/dubbo/consumer/config/RpcFeignConfiguration.java
create mode 100644 spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/java/com/alibaba/dubbo/consumer/interceptor/RpcFeignInterceptor.java
create mode 100644 spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/java/com/alibaba/dubbo/consumer/service/TestService.java
create mode 100644 spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/java/com/alibaba/dubbo/consumer/util/RpcSerializeUtil.java
create mode 100644 spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/resources/application.yml
create mode 100644 spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/resources/dubbo.properties
create mode 100644 spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/resources/security/serialize.allowlist
create mode 100644 spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/pom.xml
create mode 100644 spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/main/java/com/alibaba/rpc/annotation/DubboFeignBuilder.java
create mode 100644 spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/main/java/com/alibaba/rpc/annotation/FeignClientToDubboProviderBeanPostProcessor.java
create mode 100644 spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/main/java/com/alibaba/rpc/common/RpcConstance.java
create mode 100644 spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/main/java/com/alibaba/rpc/core/SpringCloudAlibabaDubboAutoConfiguration.java
create mode 100644 spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/main/java/com/alibaba/rpc/metadata/HttpMetadata.java
create mode 100644 spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/main/java/com/alibaba/rpc/metadata/HttpRpcResponse.java
create mode 100644 spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/main/resources/META-INF/spring.factories
create mode 100644 spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/main/resources/application.yml
create mode 100644 spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/pom.xml
create mode 100644 spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/ProviderApplication.java
create mode 100644 spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/config/RpcRegistryConfiguration.java
create mode 100644 spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/controller/TestController.java
create mode 100644 spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/handler/RpcNettyServerHandler.java
create mode 100644 spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/handler/ServerReplyHandler.java
create mode 100644 spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/listener/RpcNettyServerListener.java
create mode 100644 spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/server/CaptureHttpServletResponseWrapper.java
create mode 100644 spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/server/CoyoteRequestBuilder.java
create mode 100644 spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/server/MockHttpServletRequestConverter.java
create mode 100644 spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/server/RpcNettyServer.java
create mode 100644 spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/server/RpcToHttpServletRequestWrapper.java
create mode 100644 spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/service/impl/FooServiceImpl.java
create mode 100644 spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/service/impl/ProviderServiceImpl.java
create mode 100644 spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/util/RpcSerializeUtil.java
create mode 100644 spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/resources/application.yml
create mode 100644 spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/resources/dubbo.properties
create mode 100644 spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/resources/security/serialize.allowlist
diff --git a/pom.xml b/pom.xml
index 6fc392b594..cbcec0da43 100644
--- a/pom.xml
+++ b/pom.xml
@@ -108,6 +108,8 @@
spring-cloud-alibaba-starters
spring-cloud-alibaba-coverage
spring-cloud-alibaba-tests
+ spring-cloud-alibaba-starters/spring-cloud-starter-rpc
+ spring-cloud-alibaba-tests/rpc-tests
diff --git a/spring-cloud-alibaba-dependencies/pom.xml b/spring-cloud-alibaba-dependencies/pom.xml
index c12f285e39..aac872e92b 100644
--- a/spring-cloud-alibaba-dependencies/pom.xml
+++ b/spring-cloud-alibaba-dependencies/pom.xml
@@ -39,6 +39,9 @@
3.1.1
3.0.1
1.2.7
+
+
+ 3.3.0-beta.4
@@ -299,6 +302,12 @@
test
+
+
+ org.apache.dubbo
+ dubbo-spring-boot-starter
+ ${dubbo.version}
+
diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-rpc/pom.xml b/spring-cloud-alibaba-starters/spring-cloud-starter-rpc/pom.xml
new file mode 100644
index 0000000000..d12f247fef
--- /dev/null
+++ b/spring-cloud-alibaba-starters/spring-cloud-starter-rpc/pom.xml
@@ -0,0 +1,22 @@
+
+
+ 4.0.0
+
+ com.alibaba.cloud
+ spring-cloud-alibaba
+ 2023.0.1.2
+ ../../pom.xml
+
+
+ org.example
+ spring-cloud-starter-rpc
+
+
+ 19
+ 19
+ UTF-8
+
+
+
diff --git a/spring-cloud-alibaba-tests/rpc-tests/pom.xml b/spring-cloud-alibaba-tests/rpc-tests/pom.xml
new file mode 100644
index 0000000000..e1dfd44cb5
--- /dev/null
+++ b/spring-cloud-alibaba-tests/rpc-tests/pom.xml
@@ -0,0 +1,20 @@
+
+
+ 4.0.0
+
+ com.alibaba.cloud
+ spring-cloud-alibaba-tests
+ ${revision}
+
+ rpc-tests
+ pom
+ RPC Tests
+
+ spring-cloud-alibaba-rpc-core
+ spring-cloud-alibaba-rpc-consumer
+ spring-cloud-alibaba-rpc-provider
+ spring-cloud-alibaba-rpc-api
+
+
diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-api/pom.xml b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-api/pom.xml
new file mode 100644
index 0000000000..50dd0a91e7
--- /dev/null
+++ b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-api/pom.xml
@@ -0,0 +1,19 @@
+
+
+ 4.0.0
+
+ com.alibaba.cloud
+ rpc-tests
+ ${revision}
+
+
+ spring-cloud-alibaba-rpc-api
+
+
+ org.springframework.cloud
+ spring-cloud-openfeign-core
+
+
+
diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-api/src/main/java/com/alibaba/dubbo/consumer/api/FooService.java b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-api/src/main/java/com/alibaba/dubbo/consumer/api/FooService.java
new file mode 100644
index 0000000000..edaf742ebe
--- /dev/null
+++ b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-api/src/main/java/com/alibaba/dubbo/consumer/api/FooService.java
@@ -0,0 +1,21 @@
+package com.alibaba.dubbo.consumer.api;
+
+
+
+import com.alibaba.dubbo.consumer.entity.User;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+
+/**
+ * @author :Lictory
+ * @date : 2024/08/01
+ */
+@FeignClient("provider")
+public interface FooService {
+ @GetMapping("/api/test")
+ String foo();
+ @GetMapping("/user")
+ User getUser();
+}
+
diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-api/src/main/java/com/alibaba/dubbo/consumer/api/ProviderService.java b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-api/src/main/java/com/alibaba/dubbo/consumer/api/ProviderService.java
new file mode 100644
index 0000000000..7181d2c613
--- /dev/null
+++ b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-api/src/main/java/com/alibaba/dubbo/consumer/api/ProviderService.java
@@ -0,0 +1,20 @@
+package com.alibaba.dubbo.consumer.api;
+
+import com.alibaba.dubbo.consumer.entity.User;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+
+/**
+ * @author :Lictory
+ * @date : 2024/08/01
+ */
+@FeignClient("provider")
+public interface ProviderService {
+ @GetMapping("/api/get")
+ String hi();
+
+ @PostMapping("/api/post/{userId}")
+ void post(@PathVariable("userId") Integer userId);
+}
diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-api/src/main/java/com/alibaba/dubbo/consumer/entity/User.java b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-api/src/main/java/com/alibaba/dubbo/consumer/entity/User.java
new file mode 100644
index 0000000000..9d5cdb747c
--- /dev/null
+++ b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-api/src/main/java/com/alibaba/dubbo/consumer/entity/User.java
@@ -0,0 +1,19 @@
+package com.alibaba.dubbo.consumer.entity;
+
+import java.io.Serializable;
+
+/**
+ * @author :Lictory
+ * @date : 2024/08/01
+ */
+public class User implements Serializable {
+ private int id=1;
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+}
diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/pom.xml b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/pom.xml
new file mode 100644
index 0000000000..a31f0af51b
--- /dev/null
+++ b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/pom.xml
@@ -0,0 +1,43 @@
+
+
+ 4.0.0
+
+ com.alibaba.cloud
+ rpc-tests
+ ${revision}
+
+
+ spring-cloud-alibaba-rpc-consumer
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.cloud
+ spring-cloud-openfeign-core
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+
+
+ org.springframework.cloud
+ spring-cloud-commons
+
+
+ com.alibaba.cloud
+ spring-cloud-alibaba-rpc-core
+ ${revision}
+
+
+ com.alibaba.cloud
+ spring-cloud-alibaba-rpc-api
+ 2023.0.1.2
+ compile
+
+
+
+
diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/java/com/alibaba/dubbo/consumer/ConsumerApplication.java b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/java/com/alibaba/dubbo/consumer/ConsumerApplication.java
new file mode 100644
index 0000000000..163e07f333
--- /dev/null
+++ b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/java/com/alibaba/dubbo/consumer/ConsumerApplication.java
@@ -0,0 +1,22 @@
+package com.alibaba.dubbo.consumer;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.context.annotation.ComponentScan;
+
+/**
+ * @author :Lictory
+ * @date : 2024/08/01
+ */
+
+@SpringBootApplication
+@EnableFeignClients
+@EnableDiscoveryClient
+@ComponentScan(basePackages = {"com.alibaba.dubbo.consumer.api","com.alibaba.dubbo.consumer"})
+public class ConsumerApplication {
+ public static void main(String[] args) {
+ SpringApplication.run(ConsumerApplication.class, args);
+ }
+}
diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/java/com/alibaba/dubbo/consumer/client/FeignRpcClient.java b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/java/com/alibaba/dubbo/consumer/client/FeignRpcClient.java
new file mode 100644
index 0000000000..fac5e922d6
--- /dev/null
+++ b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/java/com/alibaba/dubbo/consumer/client/FeignRpcClient.java
@@ -0,0 +1,94 @@
+package com.alibaba.dubbo.consumer.client;
+
+import com.alibaba.rpc.metadata.HttpMetadata;
+import com.alibaba.rpc.metadata.HttpRpcResponse;
+import feign.Client;
+import feign.Request;
+import feign.Response;
+import org.apache.dubbo.common.URL;
+import org.apache.dubbo.remoting.Channel;
+import org.apache.dubbo.remoting.RemotingException;
+import org.apache.dubbo.remoting.exchange.ExchangeClient;
+import org.apache.dubbo.remoting.exchange.Exchangers;
+import org.apache.dubbo.remoting.exchange.support.ExchangeHandlerDispatcher;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
+import org.springframework.web.servlet.DispatcherServlet;
+
+import java.util.Collection;
+import java.util.Map;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
+
+/**
+ * @author :Lictory
+ * @date : 2024/08/12
+ */
+
+
+public class FeignRpcClient implements Client {
+
+ private LoadBalancerClient loadBalancerClient;
+ private ExchangeClient client;
+
+ public FeignRpcClient(LoadBalancerClient loadBalancerClient) {
+ this.loadBalancerClient = loadBalancerClient;
+ }
+
+ @Override
+ public Response execute(Request request, Request.Options options) {
+
+ String url = UrlResolver.resolveOriginalUrl(loadBalancerClient, request.url());
+ initLocalClient(url);
+ HttpMetadata httpMetadata = initHttpMetadata(
+ UrlResolver.getPathFromUrl(request.url()),
+ request.httpMethod().name(),
+ request.headers(),
+ request.body()
+ );
+ HttpRpcResponse httpRpcResponse = null;
+ try {
+ CompletableFuture