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 future = client.request(httpMetadata); + httpRpcResponse = (HttpRpcResponse) future.get(); + } catch (RemotingException | InterruptedException | ExecutionException e) { + throw new RuntimeException(e); + } + + + + return Response.builder() + .status(httpRpcResponse.getStatusCode()) + .reason(httpRpcResponse.getReasonPhrase()) + .headers(httpRpcResponse.getHeaders()) + .body(httpRpcResponse.getBody()) + .request(request) + .build(); + } + + private void initLocalClient(String url) { + URL targetUrl = URL.valueOf(url); + try { + + this.client = Exchangers.connect(targetUrl, new ExchangeHandlerDispatcher() { + @Override + public void received(Channel channel, Object message) { + System.out.println("收到来自服务端的返回值"); + super.received(channel, message); + } + }); + } catch (RemotingException e) { + throw new RuntimeException(e); + } + } + + private HttpMetadata initHttpMetadata(String url, String method, Map> headers, byte[] body) { + HttpMetadata httpMetadata = new HttpMetadata(); + httpMetadata.setBody(body); + httpMetadata.setUrl(url); + httpMetadata.setHeaders(headers); + httpMetadata.setMethod(method); + return httpMetadata; + } +} + + diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/java/com/alibaba/dubbo/consumer/client/UrlResolver.java b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/java/com/alibaba/dubbo/consumer/client/UrlResolver.java new file mode 100644 index 0000000000..56198c1d24 --- /dev/null +++ b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/java/com/alibaba/dubbo/consumer/client/UrlResolver.java @@ -0,0 +1,45 @@ +package com.alibaba.dubbo.consumer.client; + +import org.springframework.cloud.client.ServiceInstance; +import org.springframework.cloud.client.loadbalancer.LoadBalancerClient; + +import java.net.MalformedURLException; +import java.net.URL; +/** + * @author :Lictory + * @date : 2024/08/13 + */ +public class UrlResolver { + + //TODO add ExchangerClient into + + public static String resolveOriginalUrl(LoadBalancerClient loadBalancerClient, String url) { + URL result = null; + try { + result = new URL(url); + } catch (MalformedURLException e) { + throw new RuntimeException(e); + } + String serviceId = result.getHost(); + ServiceInstance choose = loadBalancerClient.choose(serviceId); + int nettyPort = Integer.parseInt(choose.getMetadata().get("rpc.netty.port")); + return "exchange://" + choose.getHost() + ":" + nettyPort; + } + + public static String getPathFromUrl(String urlString) { + try { + URL url = new URL(urlString); + StringBuilder path = new StringBuilder(); + path.append(url.getPath()); + if (url.getQuery() != null) { + path.append("?").append(url.getQuery()); + } + if (url.getRef() != null) { + path.append("#").append(url.getRef()); + } + return path.toString(); + } catch (MalformedURLException e) { + throw new IllegalArgumentException("Invalid URL: " + urlString, e); + } + } +} diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/java/com/alibaba/dubbo/consumer/config/RpcFeignConfiguration.java b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/java/com/alibaba/dubbo/consumer/config/RpcFeignConfiguration.java new file mode 100644 index 0000000000..9c597da795 --- /dev/null +++ b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/java/com/alibaba/dubbo/consumer/config/RpcFeignConfiguration.java @@ -0,0 +1,31 @@ +package com.alibaba.dubbo.consumer.config; + +import com.alibaba.dubbo.consumer.client.FeignRpcClient; + +import com.alibaba.dubbo.consumer.interceptor.RpcFeignInterceptor; +import feign.RequestInterceptor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.client.loadbalancer.LoadBalancerClient; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * @author :Lictory + * @date : 2024/08/11 + */ + +@Configuration +public class RpcFeignConfiguration { + @Autowired + private LoadBalancerClient loadBalancerClient; + +// @Bean +// public RequestInterceptor myRequestInterceptor() { +// return new RpcFeignInterceptor(); +// } + + @Bean + public feign.Client feignClient() { + return new FeignRpcClient(loadBalancerClient); + } +} diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/java/com/alibaba/dubbo/consumer/interceptor/RpcFeignInterceptor.java b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/java/com/alibaba/dubbo/consumer/interceptor/RpcFeignInterceptor.java new file mode 100644 index 0000000000..b1a15fc4cb --- /dev/null +++ b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/java/com/alibaba/dubbo/consumer/interceptor/RpcFeignInterceptor.java @@ -0,0 +1,15 @@ +package com.alibaba.dubbo.consumer.interceptor; + +import feign.RequestInterceptor; +import feign.RequestTemplate; + +/** + * @author :Lictory + * @date : 2024/08/11 + */ +public class RpcFeignInterceptor implements RequestInterceptor { + @Override + public void apply(RequestTemplate requestTemplate) { + System.out.println("rpcFeign拦截测试"); + } +} diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/java/com/alibaba/dubbo/consumer/service/TestService.java b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/java/com/alibaba/dubbo/consumer/service/TestService.java new file mode 100644 index 0000000000..2886e0ccc1 --- /dev/null +++ b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/java/com/alibaba/dubbo/consumer/service/TestService.java @@ -0,0 +1,33 @@ +package com.alibaba.dubbo.consumer.service; + + +import com.alibaba.dubbo.consumer.api.FooService; +import com.alibaba.dubbo.consumer.api.ProviderService; +import com.alibaba.dubbo.consumer.entity.User; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author :Lictory + * @date : 2024/08/01 + */ +@RestController +public class TestService { + @Autowired + private ProviderService providerService; + + @GetMapping("/test/get") + public String testGet() { + return providerService.hi(); + } + + @PostMapping("/test/post/{userId}") + public void testPost(@PathVariable("userId") Integer userId) { + providerService.post(userId); + } +} + + diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/java/com/alibaba/dubbo/consumer/util/RpcSerializeUtil.java b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/java/com/alibaba/dubbo/consumer/util/RpcSerializeUtil.java new file mode 100644 index 0000000000..3e9f5df117 --- /dev/null +++ b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/java/com/alibaba/dubbo/consumer/util/RpcSerializeUtil.java @@ -0,0 +1,25 @@ +package com.alibaba.dubbo.consumer.util; + +import org.apache.dubbo.common.serialize.ObjectOutput; +import org.apache.dubbo.common.serialize.hessian2.Hessian2Serialization; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; + +/** + * @author :Lictory + * @date : 2024/08/13 + */ +public class RpcSerializeUtil { + public byte[] serializeRequestByHessian2(Object request) throws IOException { + Hessian2Serialization serialization = new Hessian2Serialization(); + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + ObjectOutput objectOutput = serialization.serialize(null, byteArrayOutputStream); + + objectOutput.writeObject(request); + objectOutput.flushBuffer(); + + return byteArrayOutputStream.toByteArray(); + } + //TODO : add the rest of the serialization methods +} diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/resources/application.yml b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/resources/application.yml new file mode 100644 index 0000000000..21718e8171 --- /dev/null +++ b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/resources/application.yml @@ -0,0 +1,17 @@ +spring: + main: + allow-bean-definition-overriding: true + application: + name: consumer + cloud: + nacos: + discovery: + server-addr: 10.21.32.154:8848 + +server: + port: 8081 +management: + endpoints: + web: + exposure: + include: "*" diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/resources/dubbo.properties b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/resources/dubbo.properties new file mode 100644 index 0000000000..4f760cc70a --- /dev/null +++ b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/resources/dubbo.properties @@ -0,0 +1,2 @@ +dubbo.application.check-serializable=false +dubbo.application.serialize-check-status=DISABLE diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/resources/security/serialize.allowlist b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/resources/security/serialize.allowlist new file mode 100644 index 0000000000..b19c3887ef --- /dev/null +++ b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/resources/security/serialize.allowlist @@ -0,0 +1,22 @@ +# +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# + +org.apache.dubbo.common.serialize.hessian2 +com.alibaba.rpc.metadata.HttpMetadata +com.alibaba.rpc.metadata.HttpRpcResponse diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/pom.xml b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/pom.xml new file mode 100644 index 0000000000..aeab148e31 --- /dev/null +++ b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/pom.xml @@ -0,0 +1,40 @@ + + + 4.0.0 + + com.alibaba.cloud + rpc-tests + ${revision} + + + spring-cloud-alibaba-rpc-core + + + + + org.springframework.cloud + spring-cloud-starter-openfeign + provided + + + + org.apache.dubbo + dubbo-spring-boot-starter + + + + org.springframework.cloud + spring-cloud-starter-loadbalancer + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + io.github.openfeign + feign-core + + + diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/main/java/com/alibaba/rpc/annotation/DubboFeignBuilder.java b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/main/java/com/alibaba/rpc/annotation/DubboFeignBuilder.java new file mode 100644 index 0000000000..5e62c1afd5 --- /dev/null +++ b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/main/java/com/alibaba/rpc/annotation/DubboFeignBuilder.java @@ -0,0 +1,47 @@ +package com.alibaba.rpc.annotation; + + +import feign.Feign; +import feign.Target; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.dubbo.config.spring.reference.ReferenceCreator; +import org.apache.dubbo.config.spring.util.AnnotationUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; +import org.springframework.core.annotation.AnnotationAttributes; +import org.springframework.util.ReflectionUtils; + +/** + * @author Lictory + */ + +public class DubboFeignBuilder extends Feign.Builder { + @Autowired + private ApplicationContext applicationContext; + + public DubboReference defaultReference; + + final class DefaultReferenceClass { + @DubboReference(check = false) + String field; + } + + public DubboFeignBuilder() { + this.defaultReference = ReflectionUtils.findField(DefaultReferenceClass.class, "field").getAnnotation(DubboReference.class); + } + + //ReferenceBeanBuilder +// .create(defaultReference, target.getClass().getClassLoader(), applicationContext) +// .setInterfaceClass(target.type()).build(); + @Override + public T target(Target target) { + AnnotationAttributes attributes = AnnotationUtils.getAnnotationAttributes(defaultReference, true); + ReferenceCreator build = ReferenceCreator.create(attributes, applicationContext).defaultInterfaceClass(target.type()); + try { + T object = (T) build.build().get(); + return object; + } catch (Exception e) { + throw new RuntimeException(e); + } + } +} diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/main/java/com/alibaba/rpc/annotation/FeignClientToDubboProviderBeanPostProcessor.java b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/main/java/com/alibaba/rpc/annotation/FeignClientToDubboProviderBeanPostProcessor.java new file mode 100644 index 0000000000..f2452b152c --- /dev/null +++ b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/main/java/com/alibaba/rpc/annotation/FeignClientToDubboProviderBeanPostProcessor.java @@ -0,0 +1,482 @@ +package com.alibaba.rpc.annotation; + +import org.apache.dubbo.common.logger.Logger; +import org.apache.dubbo.common.logger.LoggerFactory; +import org.apache.dubbo.config.annotation.DubboService; +import org.apache.dubbo.config.spring.ServiceBean; +import org.apache.dubbo.config.spring.beans.factory.annotation.AnnotationPropertyValuesAdapter; +import org.apache.dubbo.config.spring.context.annotation.DubboClassPathBeanDefinitionScanner; +import org.springframework.beans.BeansException; +import org.springframework.beans.MutablePropertyValues; +import org.springframework.beans.factory.BeanClassLoaderAware; +import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.beans.factory.config.BeanDefinitionHolder; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.beans.factory.config.RuntimeBeanReference; +import org.springframework.beans.factory.config.SingletonBeanRegistry; +import org.springframework.beans.factory.support.AbstractBeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor; +import org.springframework.beans.factory.support.BeanNameGenerator; +import org.springframework.beans.factory.support.ManagedList; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.context.EnvironmentAware; +import org.springframework.context.ResourceLoaderAware; +import org.springframework.context.annotation.AnnotationBeanNameGenerator; +import org.springframework.context.annotation.AnnotationConfigUtils; +import org.springframework.context.annotation.ClassPathBeanDefinitionScanner; +import org.springframework.context.annotation.ConfigurationClassPostProcessor; +import org.springframework.core.env.Environment; +import org.springframework.core.io.ResourceLoader; +import org.springframework.core.type.filter.AnnotationTypeFilter; +import org.springframework.util.Assert; +import org.springframework.util.ClassUtils; +import org.springframework.util.CollectionUtils; +import org.springframework.util.ObjectUtils; +import org.springframework.util.StringUtils; + +import java.util.Arrays; +import java.util.Collection; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Set; + +import static com.alibaba.spring.util.ObjectUtils.of; +import static org.springframework.beans.factory.support.BeanDefinitionBuilder.rootBeanDefinition; +import static org.springframework.context.annotation.AnnotationConfigUtils.CONFIGURATION_BEAN_NAME_GENERATOR; +import static org.springframework.core.annotation.AnnotationUtils.findAnnotation; +import static org.springframework.util.ClassUtils.resolveClassName; + +public class FeignClientToDubboProviderBeanPostProcessor implements BeanDefinitionRegistryPostProcessor, EnvironmentAware, + ResourceLoaderAware, BeanClassLoaderAware { + + private static final String SEPARATOR = ":"; + + private final Logger logger = LoggerFactory.getLogger(getClass()); + + private final Set packagesToScan; + + private Environment environment; + + private ResourceLoader resourceLoader; + + private ClassLoader classLoader; + + private DubboService defaultService; + + public FeignClientToDubboProviderBeanPostProcessor(String... packagesToScan) { + this(Arrays.asList(packagesToScan)); + } + + public FeignClientToDubboProviderBeanPostProcessor(Collection packagesToScan) { + this(new LinkedHashSet(packagesToScan)); + } + + public FeignClientToDubboProviderBeanPostProcessor(Set packagesToScan) { + this.packagesToScan = packagesToScan; + @DubboService + final class DefaultServiceClass { + } + ; + this.defaultService = DefaultServiceClass.class.getAnnotation(DubboService.class); + } + + @Override + public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException { + + Set resolvedPackagesToScan = resolvePackagesToScan(packagesToScan); + + if (!CollectionUtils.isEmpty(resolvedPackagesToScan)) { + registerServiceBeans(resolvedPackagesToScan, registry); + } else { + if (logger.isWarnEnabled()) { + logger.warn("packagesToScan is empty , ServiceBean registry will be ignored!"); + } + } + + } + + + /** + * Registers Beans whose classes was annotated {@link FeignClient} + * + * @param packagesToScan The base packages to scan + * @param registry {@link BeanDefinitionRegistry} + */ + private void registerServiceBeans(Set packagesToScan, BeanDefinitionRegistry registry) { + + DubboClassPathBeanDefinitionScanner scanner = + new DubboClassPathBeanDefinitionScanner(registry, environment, resourceLoader); + + BeanNameGenerator beanNameGenerator = resolveBeanNameGenerator(registry); + + scanner.setBeanNameGenerator(beanNameGenerator); + + scanner.addIncludeFilter(new AnnotationTypeFilter(FeignClient.class, true, true)); + + for (String packageToScan : packagesToScan) { + + // Registers @DubboService Bean first + scanner.scan(packageToScan); + + // Finds all BeanDefinitionHolders of @DubboService whether @ComponentScan scans or not. + Set beanDefinitionHolders = + findServiceBeanDefinitionHolders(scanner, packageToScan, registry, beanNameGenerator); + + if (!CollectionUtils.isEmpty(beanDefinitionHolders)) { + + for (BeanDefinitionHolder beanDefinitionHolder : beanDefinitionHolders) { + registerServiceBean(beanDefinitionHolder, registry, scanner); + } + + if (logger.isInfoEnabled()) { + logger.info(beanDefinitionHolders.size() + " annotated Dubbo's @Service Components { " + + beanDefinitionHolders + + " } were scanned under package[" + packageToScan + "]"); + } + + } else { + + if (logger.isWarnEnabled()) { + logger.warn("No Spring Bean annotating Dubbo's @Service was found under package[" + + packageToScan + "]"); + } + + } + + } + + } + + /** + * It'd better to use BeanNameGenerator instance that should reference + * thus it maybe a potential problem on bean name generation. + * + * @param registry {@link BeanDefinitionRegistry} + * @return {@link BeanNameGenerator} instance + * @see SingletonBeanRegistry + * @see AnnotationConfigUtils#CONFIGURATION_BEAN_NAME_GENERATOR + * @see ConfigurationClassPostProcessor#processConfigBeanDefinitions + * @since 2.5.8 + */ + private BeanNameGenerator resolveBeanNameGenerator(BeanDefinitionRegistry registry) { + + BeanNameGenerator beanNameGenerator = null; + + if (registry instanceof SingletonBeanRegistry) { + SingletonBeanRegistry singletonBeanRegistry = SingletonBeanRegistry.class.cast(registry); + beanNameGenerator = (BeanNameGenerator) singletonBeanRegistry.getSingleton(CONFIGURATION_BEAN_NAME_GENERATOR); + } + + if (beanNameGenerator == null) { + + if (logger.isInfoEnabled()) { + + logger.info("BeanNameGenerator bean can't be found in BeanFactory with name [" + + CONFIGURATION_BEAN_NAME_GENERATOR + "]"); + logger.info("BeanNameGenerator will be a instance of " + + AnnotationBeanNameGenerator.class.getName() + + " , it maybe a potential problem on bean name generation."); + } + + beanNameGenerator = new AnnotationBeanNameGenerator(); + + } + + return beanNameGenerator; + + } + + /** + * Finds a {@link Set} of {@link BeanDefinitionHolder BeanDefinitionHolders} whose bean type annotated + * + * @param scanner {@link ClassPathBeanDefinitionScanner} + * @param packageToScan pachage to scan + * @param registry {@link BeanDefinitionRegistry} + * @return non-null + * @since 2.5.8 + */ + private Set findServiceBeanDefinitionHolders( + ClassPathBeanDefinitionScanner scanner, String packageToScan, BeanDefinitionRegistry registry, + BeanNameGenerator beanNameGenerator) { + + Set beanDefinitions = scanner.findCandidateComponents(packageToScan); + + Set beanDefinitionHolders = new LinkedHashSet(beanDefinitions.size()); + + for (BeanDefinition beanDefinition : beanDefinitions) { + + String beanName = beanNameGenerator.generateBeanName(beanDefinition, registry); + BeanDefinitionHolder beanDefinitionHolder = new BeanDefinitionHolder(beanDefinition, beanName); + beanDefinitionHolders.add(beanDefinitionHolder); + + } + + return beanDefinitionHolders; + + } + + /** + * + * @param beanDefinitionHolder + * @param registry + * @param scanner + * @see ServiceBean + * @see BeanDefinition + */ + private void registerServiceBean(BeanDefinitionHolder beanDefinitionHolder, BeanDefinitionRegistry registry, + DubboClassPathBeanDefinitionScanner scanner) { + + Class beanClass = resolveClass(beanDefinitionHolder); + + DubboService service = findAnnotation(beanClass, DubboService.class); + if (null == service) { + service = this.defaultService; + } + + Class interfaceClass = resolveServiceInterfaceClass(beanClass, service); + + String annotatedServiceBeanName = beanDefinitionHolder.getBeanName(); + + AbstractBeanDefinition serviceBeanDefinition = + buildServiceBeanDefinition(service, interfaceClass, annotatedServiceBeanName); + + // ServiceBean Bean name + String beanName = generateServiceBeanName(service, interfaceClass, annotatedServiceBeanName); + + if (registry.containsBeanDefinition(beanName)) { // check duplicated candidate bean + registry.registerBeanDefinition(beanName, serviceBeanDefinition); + + if (logger.isInfoEnabled()) { + logger.warn("The BeanDefinition[" + serviceBeanDefinition + + "] of ServiceBean has been registered with name : " + beanName); + } + + } else { + + if (logger.isWarnEnabled()) { + logger.warn("The Duplicated BeanDefinition[" + serviceBeanDefinition + + "] of ServiceBean[ bean name : " + beanName + + "] was be found , Did @DubboComponentScan scan to same package in many times?"); + } + + } + + } + + + private String generateServiceBeanName(DubboService service, Class interfaceClass, String annotatedServiceBeanName) { + + StringBuilder beanNameBuilder = new StringBuilder(ServiceBean.class.getSimpleName()); + + beanNameBuilder.append(SEPARATOR).append(annotatedServiceBeanName); + + String interfaceClassName = interfaceClass.getName(); + + beanNameBuilder.append(SEPARATOR).append(interfaceClassName); + + String version = service.version(); + + if (StringUtils.hasText(version)) { + beanNameBuilder.append(SEPARATOR).append(version); + } + + String group = service.group(); + + if (StringUtils.hasText(group)) { + beanNameBuilder.append(SEPARATOR).append(group); + } + + return beanNameBuilder.toString(); + + } + + private Class resolveServiceInterfaceClass(Class annotatedServiceBeanClass, DubboService service) { + + Class interfaceClass = service.interfaceClass(); + + if (void.class.equals(interfaceClass)) { + + interfaceClass = null; + + String interfaceClassName = service.interfaceName(); + + if (StringUtils.hasText(interfaceClassName)) { + if (ClassUtils.isPresent(interfaceClassName, classLoader)) { + interfaceClass = resolveClassName(interfaceClassName, classLoader); + } + } + + } + + if (interfaceClass == null) { + + Class[] allInterfaces = annotatedServiceBeanClass.getInterfaces(); + + if (allInterfaces.length > 0) { + interfaceClass = allInterfaces[0]; + } + + } + + Assert.notNull(interfaceClass, + "@Service interfaceClass() or interfaceName() or interface class must be present!"); + + Assert.isTrue(interfaceClass.isInterface(), + "The type that was annotated @Service is not an interface!"); + + return interfaceClass; + } + + private Class resolveClass(BeanDefinitionHolder beanDefinitionHolder) { + + BeanDefinition beanDefinition = beanDefinitionHolder.getBeanDefinition(); + + return resolveClass(beanDefinition); + + } + + private Class resolveClass(BeanDefinition beanDefinition) { + + String beanClassName = beanDefinition.getBeanClassName(); + + return resolveClassName(beanClassName, classLoader); + + } + + private Set resolvePackagesToScan(Set packagesToScan) { + Set resolvedPackagesToScan = new LinkedHashSet(packagesToScan.size()); + for (String packageToScan : packagesToScan) { + if (StringUtils.hasText(packageToScan)) { + String resolvedPackageToScan = environment.resolvePlaceholders(packageToScan.trim()); + resolvedPackagesToScan.add(resolvedPackageToScan); + } + } + return resolvedPackagesToScan; + } + + private AbstractBeanDefinition buildServiceBeanDefinition(DubboService service, Class interfaceClass, + String annotatedServiceBeanName) { + + BeanDefinitionBuilder builder = rootBeanDefinition(ServiceBean.class); + + AbstractBeanDefinition beanDefinition = builder.getBeanDefinition(); + + MutablePropertyValues propertyValues = beanDefinition.getPropertyValues(); + + String[] ignoreAttributeNames = of("provider", "monitor", "application", "module", "registry", "protocol", "interface"); + + propertyValues.addPropertyValues(new AnnotationPropertyValuesAdapter(service, environment, ignoreAttributeNames)); + + // References "ref" property to annotated-@Service Bean + addPropertyReference(builder, "ref", annotatedServiceBeanName); + // Set interface + builder.addPropertyValue("interface", interfaceClass.getName()); + + /** + * Add {@link com.alibaba.dubbo.config.ProviderConfig} Bean reference + */ + String providerConfigBeanName = service.provider(); + if (StringUtils.hasText(providerConfigBeanName)) { + addPropertyReference(builder, "provider", providerConfigBeanName); + } + + /** + * Add {@link com.alibaba.dubbo.config.MonitorConfig} Bean reference + */ + String monitorConfigBeanName = service.monitor(); + if (StringUtils.hasText(monitorConfigBeanName)) { + addPropertyReference(builder, "monitor", monitorConfigBeanName); + } + + /** + * Add {@link com.alibaba.dubbo.config.ApplicationConfig} Bean reference + */ + String applicationConfigBeanName = service.application(); + if (StringUtils.hasText(applicationConfigBeanName)) { + addPropertyReference(builder, "application", applicationConfigBeanName); + } + + /** + * Add {@link com.alibaba.dubbo.config.ModuleConfig} Bean reference + */ + String moduleConfigBeanName = service.module(); + if (StringUtils.hasText(moduleConfigBeanName)) { + addPropertyReference(builder, "module", moduleConfigBeanName); + } + + + /** + * Add {@link com.alibaba.dubbo.config.RegistryConfig} Bean reference + */ + String[] registryConfigBeanNames = service.registry(); + + List registryRuntimeBeanReferences = toRuntimeBeanReferences(registryConfigBeanNames); + + if (!registryRuntimeBeanReferences.isEmpty()) { + builder.addPropertyValue("registries", registryRuntimeBeanReferences); + } + + /** + * Add {@link com.alibaba.dubbo.config.ProtocolConfig} Bean reference + */ + String[] protocolConfigBeanNames = service.protocol(); + + List protocolRuntimeBeanReferences = toRuntimeBeanReferences(protocolConfigBeanNames); + + if (!protocolRuntimeBeanReferences.isEmpty()) { + builder.addPropertyValue("protocols", protocolRuntimeBeanReferences); + } + + return builder.getBeanDefinition(); + + } + + + private ManagedList toRuntimeBeanReferences(String... beanNames) { + + ManagedList runtimeBeanReferences = new ManagedList(); + + if (!ObjectUtils.isEmpty(beanNames)) { + + for (String beanName : beanNames) { + + String resolvedBeanName = environment.resolvePlaceholders(beanName); + + runtimeBeanReferences.add(new RuntimeBeanReference(resolvedBeanName)); + } + + } + + return runtimeBeanReferences; + + } + + private void addPropertyReference(BeanDefinitionBuilder builder, String propertyName, String beanName) { + String resolvedBeanName = environment.resolvePlaceholders(beanName); + builder.addPropertyReference(propertyName, resolvedBeanName); + } + + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { + + } + + @Override + public void setEnvironment(Environment environment) { + this.environment = environment; + } + + @Override + public void setResourceLoader(ResourceLoader resourceLoader) { + this.resourceLoader = resourceLoader; + } + + @Override + public void setBeanClassLoader(ClassLoader classLoader) { + this.classLoader = classLoader; + } + +} diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/main/java/com/alibaba/rpc/common/RpcConstance.java b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/main/java/com/alibaba/rpc/common/RpcConstance.java new file mode 100644 index 0000000000..d21bc8ef87 --- /dev/null +++ b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/main/java/com/alibaba/rpc/common/RpcConstance.java @@ -0,0 +1,9 @@ +package com.alibaba.rpc.common; + +/** + * @author :Lictory + * @date : 2024/08/19 + */ +public interface RpcConstance { + String LOCAL_HOST_HEADER = "http://localhost:"; +} diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/main/java/com/alibaba/rpc/core/SpringCloudAlibabaDubboAutoConfiguration.java b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/main/java/com/alibaba/rpc/core/SpringCloudAlibabaDubboAutoConfiguration.java new file mode 100644 index 0000000000..b16f1c6a93 --- /dev/null +++ b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/main/java/com/alibaba/rpc/core/SpringCloudAlibabaDubboAutoConfiguration.java @@ -0,0 +1,44 @@ +package com.alibaba.rpc.core; + + + +import com.alibaba.rpc.annotation.DubboFeignBuilder; +import com.alibaba.rpc.annotation.FeignClientToDubboProviderBeanPostProcessor; +import feign.Feign; +import org.apache.dubbo.config.AbstractConfig; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.source.ConfigurationPropertySources; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; + +import java.util.Set; + +import static java.util.Collections.emptySet; +import static org.apache.dubbo.spring.boot.util.DubboUtils.BASE_PACKAGES_PROPERTY_NAME; +import static org.apache.dubbo.spring.boot.util.DubboUtils.DUBBO_PREFIX; + +/** + * @author :Lictory + * @date : 2024/07/31 + */ + +//@Configuration +//@ConditionalOnProperty(prefix = DUBBO_PREFIX, name = "enabled", matchIfMissing = true, havingValue = "true") +//@ConditionalOnClass(AbstractConfig.class) +//public class SpringCloudAlibabaDubboAutoConfiguration { +// @ConditionalOnProperty(name = BASE_PACKAGES_PROPERTY_NAME) +// @ConditionalOnClass(ConfigurationPropertySources.class) +// @Bean +// public FeignClientToDubboProviderBeanPostProcessor feignClientToDubboProviderBeanPostProcessor(Environment environment) { +// Set packagesToScan = environment.getProperty(BASE_PACKAGES_PROPERTY_NAME, Set.class, emptySet()); +// return new FeignClientToDubboProviderBeanPostProcessor(packagesToScan); +// } +// +// @Bean +// public Feign.Builder feignDubboBuilder() { +// return new DubboFeignBuilder(); +// } +//} + diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/main/java/com/alibaba/rpc/metadata/HttpMetadata.java b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/main/java/com/alibaba/rpc/metadata/HttpMetadata.java new file mode 100644 index 0000000000..99c9020489 --- /dev/null +++ b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/main/java/com/alibaba/rpc/metadata/HttpMetadata.java @@ -0,0 +1,54 @@ +package com.alibaba.rpc.metadata; + +import feign.Request; + +import java.io.Serializable; +import java.util.Collection; +import java.util.Map; + +/** + * @author :Lictory + * @date : 2024/08/16 + */ +public class HttpMetadata implements Serializable { + + private String url; + + private String method; + + private byte[] body; + + private Map> headers; + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getMethod() { + return method; + } + + public void setMethod(String method) { + this.method = method; + } + + public byte[] getBody() { + return body; + } + + public void setBody(byte[] body) { + this.body = body; + } + + public Map> getHeaders() { + return headers; + } + + public void setHeaders(Map> headers) { + this.headers = headers; + } +} diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/main/java/com/alibaba/rpc/metadata/HttpRpcResponse.java b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/main/java/com/alibaba/rpc/metadata/HttpRpcResponse.java new file mode 100644 index 0000000000..d04bfbc90b --- /dev/null +++ b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/main/java/com/alibaba/rpc/metadata/HttpRpcResponse.java @@ -0,0 +1,58 @@ +package com.alibaba.rpc.metadata; + +import java.io.Serializable; +import java.util.Collection; +import java.util.Map; + +/** + * @author :Lictory + * @date : 2024/08/16 + */ +public class HttpRpcResponse implements Serializable { + private int statusCode; + private String reasonPhrase; + private Map> headers; + private byte[] body; + public HttpRpcResponse(int statusCode, String reasonPhrase, Map> headers, byte[] body) { + this.statusCode = statusCode; + this.reasonPhrase = reasonPhrase; + this.headers = headers; + this.body = body; + } + + public HttpRpcResponse() { + } + + public int getStatusCode() { + return statusCode; + } + + public void setStatusCode(int statusCode) { + this.statusCode = statusCode; + } + + public String getReasonPhrase() { + return reasonPhrase; + } + + public void setReasonPhrase(String reasonPhrase) { + this.reasonPhrase = reasonPhrase; + } + + public Map> getHeaders() { + return headers; + } + + public void setHeaders(Map> headers) { + this.headers = headers; + } + + public byte[] getBody() { + return body; + } + + public void setBody(byte[] body) { + this.body = body; + } +} + diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/main/resources/META-INF/spring.factories b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000000..d62d2b6774 --- /dev/null +++ b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/main/resources/META-INF/spring.factories @@ -0,0 +1,3 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ + com.alibaba.dubbo.consumer.config.RpcFeignConfiguration,\ + com.alibaba.dubbo.consumer.config.RpcRegistryConfiguration,\ diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/main/resources/application.yml b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/main/resources/application.yml new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/main/resources/application.yml @@ -0,0 +1 @@ + diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/pom.xml b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/pom.xml new file mode 100644 index 0000000000..402abdffe5 --- /dev/null +++ b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/pom.xml @@ -0,0 +1,54 @@ + + + 4.0.0 + + com.alibaba.cloud + rpc-tests + ${revision} + + + spring-cloud-alibaba-rpc-provider + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + + + + + + + + + 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-api + ${revision} + + + com.alibaba.cloud + spring-cloud-alibaba-rpc-core + ${revision} + + + diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/ProviderApplication.java b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/ProviderApplication.java new file mode 100644 index 0000000000..aa8014d7c1 --- /dev/null +++ b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/ProviderApplication.java @@ -0,0 +1,18 @@ +package com.alibaba.dubbo.provider; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.openfeign.EnableFeignClients; + +/** + * @author :Lictory + * @date : 2024/08/01 + */ + +@SpringBootApplication(scanBasePackages = "com.alibaba.dubbo.provider") +@EnableFeignClients +public class ProviderApplication { + public static void main(String[] args) { + SpringApplication.run(ProviderApplication.class, args); + } +} diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/config/RpcRegistryConfiguration.java b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/config/RpcRegistryConfiguration.java new file mode 100644 index 0000000000..7b898c8cd3 --- /dev/null +++ b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/config/RpcRegistryConfiguration.java @@ -0,0 +1,58 @@ +package com.alibaba.dubbo.provider.config; + +import com.alibaba.cloud.nacos.registry.NacosRegistration; + +import com.alibaba.rpc.metadata.HttpMetadata; +import com.alibaba.rpc.metadata.HttpRpcResponse; +import jakarta.annotation.PostConstruct; +import jakarta.servlet.ServletException; + +import org.apache.dubbo.common.URL; + +import org.apache.dubbo.common.utils.NetUtils; + +import org.apache.dubbo.remoting.RemotingException; +import org.apache.dubbo.remoting.RemotingServer; +import org.apache.dubbo.remoting.exchange.*; +import org.apache.dubbo.remoting.exchange.support.ExchangeHandlerAdapter; + +import org.apache.dubbo.rpc.model.FrameworkModel; +import org.apache.dubbo.rpc.model.ModuleModel; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.web.context.WebApplicationContext; +import org.springframework.web.servlet.DispatcherServlet; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.CompletableFuture; +import java.util.stream.Collectors; + +import static org.apache.dubbo.common.constants.CommonConstants.EXECUTOR_MANAGEMENT_MODE_DEFAULT; + +import org.springframework.mock.web.MockHttpServletResponse; + +/** + * @author :Lictory + * @date : 2024/08/12 + */ + +@Configuration +public class RpcRegistryConfiguration { + + @Autowired + private NacosRegistration nacosRegistration; + + @PostConstruct + public void init(){ + Map metadata = new HashMap<>(); + int port = NetUtils.getAvailablePort(); +// initLocalServer(nacosRegistration.getHost(), port); + System.setProperty("rpc.netty.port", String.valueOf(port)); + System.setProperty("rpc.netty.host",nacosRegistration.getHost()); + metadata.put("rpc.netty.port", String.valueOf(port)); + nacosRegistration.getMetadata().putAll(metadata); + } +} diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/controller/TestController.java b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/controller/TestController.java new file mode 100644 index 0000000000..4e23e09331 --- /dev/null +++ b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/controller/TestController.java @@ -0,0 +1,29 @@ +package com.alibaba.dubbo.provider.controller; + +import com.alibaba.dubbo.consumer.api.ProviderService; +import com.alibaba.dubbo.provider.service.impl.ProviderServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * @author :Lictory + * @date : 2024/08/09 + */ + +@RestController +@RequestMapping("/api") +public class TestController { + + @Autowired + private ProviderService providerService; + + @GetMapping("/get") + public String getTest() { + return providerService.hi(); + } + + @PostMapping("/post/{userId}") + public void postTest(@PathVariable("userId") Integer userId) { + providerService.post(userId); + } +} diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/handler/RpcNettyServerHandler.java b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/handler/RpcNettyServerHandler.java new file mode 100644 index 0000000000..b4c61b657b --- /dev/null +++ b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/handler/RpcNettyServerHandler.java @@ -0,0 +1,24 @@ +package com.alibaba.dubbo.provider.handler; + +/** + * @author :Lictory + * @date : 2024/08/15 + */ +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelInboundHandlerAdapter; + +public class RpcNettyServerHandler extends ChannelInboundHandlerAdapter { + + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) { + System.out.println("Server received: " + msg); + ctx.writeAndFlush("Message from server: " + msg); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { + cause.printStackTrace(); + ctx.close(); + } +} + diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/handler/ServerReplyHandler.java b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/handler/ServerReplyHandler.java new file mode 100644 index 0000000000..a89b6188f9 --- /dev/null +++ b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/handler/ServerReplyHandler.java @@ -0,0 +1,24 @@ +package com.alibaba.dubbo.provider.handler; + + +import com.alibaba.dubbo.consumer.entity.User; +import org.apache.dubbo.remoting.RemotingException; +import org.apache.dubbo.remoting.exchange.ExchangeChannel; +import org.apache.dubbo.remoting.exchange.support.Replier; + + +/** + * @author :Lictory + * @date : 2024/08/14 + */ + +public class ServerReplyHandler implements Replier { + + @Override + public Object reply(ExchangeChannel channel, Object request) throws RemotingException { + System.out.println("收到来自" + channel.getRemoteAddress() + "的请求" + request.toString()); + User user=new User(); + user.setId(6); + return user; + } +} diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/listener/RpcNettyServerListener.java b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/listener/RpcNettyServerListener.java new file mode 100644 index 0000000000..d534c3f047 --- /dev/null +++ b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/listener/RpcNettyServerListener.java @@ -0,0 +1,160 @@ +package com.alibaba.dubbo.provider.listener; + +import com.alibaba.dubbo.provider.server.CaptureHttpServletResponseWrapper; +import com.alibaba.dubbo.provider.server.CoyoteRequestBuilder; +import com.alibaba.dubbo.provider.server.MockHttpServletRequestConverter; +import com.alibaba.dubbo.provider.server.RpcToHttpServletRequestWrapper; +import com.alibaba.rpc.common.RpcConstance; +import com.alibaba.rpc.metadata.HttpMetadata; +import com.alibaba.rpc.metadata.HttpRpcResponse; +import jakarta.servlet.RequestDispatcher; +import jakarta.servlet.ServletContext; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequestWrapper; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletResponseWrapper; +import org.apache.catalina.connector.Connector; +import org.apache.catalina.connector.Request; +import org.apache.catalina.connector.Response; +import org.apache.dubbo.common.URL; +import org.apache.dubbo.remoting.RemotingException; +import org.apache.dubbo.remoting.exchange.ExchangeChannel; +import org.apache.dubbo.remoting.exchange.ExchangeServer; +import org.apache.dubbo.remoting.exchange.Exchangers; +import org.apache.dubbo.remoting.exchange.support.ExchangeHandlerAdapter; +import org.apache.dubbo.rpc.model.FrameworkModel; +import org.apache.http.HttpRequest; +import org.apache.http.HttpRequestFactory; +import org.apache.http.HttpResponseFactory; +import org.apache.http.MethodNotSupportedException; +import org.apache.http.impl.DefaultHttpRequestFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.context.event.ApplicationReadyEvent; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationListener; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.ResponseEntity; +import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.mock.web.MockHttpServletResponse; +import org.springframework.mock.web.MockMultipartHttpServletRequest; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.context.WebApplicationContext; +import org.springframework.web.servlet.DispatcherServlet; + +import java.io.IOException; +import java.util.*; +import java.util.concurrent.CompletableFuture; +import java.util.stream.Collectors; + +/** + * @author :Lictory + * @date : 2024/08/18 + */ +@Component +public class RpcNettyServerListener implements ApplicationListener { + private ExchangeServer server; + + @Autowired + private WebApplicationContext webApplicationContext; + + @Value("${rpc.netty.port}") + private String port; + + @Value("${rpc.netty.host}") + private String host; + + @Value("${spring.port}") + private Integer localPort; +// private RestTemplate restTemplate; + + @Autowired + private ApplicationContext applicationContext; + + private DispatcherServlet dispatcherServlet; + + @Override + public void onApplicationEvent(ApplicationReadyEvent event) { +// this.restTemplate = new RestTemplate(); +// try { +// dispatcherServlet.init(); +// } catch (ServletException e) { +// throw new RuntimeException(e); +// } + this.dispatcherServlet = webApplicationContext.getBean("dispatcherServlet", DispatcherServlet.class); + initLocalServer(host, Integer.parseInt(port)); + } + + private void initLocalServer(String host, int port) { + URL url = URL.valueOf("exchange://" + host + ":" + port); + url = url.addParameter("serialization", "hessian2"); + try { + this.server = Exchangers.bind(url, new ExchangeHandlerAdapter(FrameworkModel.defaultModel()) { + @Override + public CompletableFuture reply(ExchangeChannel channel, Object msg) { + System.out.println("接收到客户端请求"); + HttpMetadata httpMetadata = (HttpMetadata) msg; + String url = "/"+httpMetadata.getUrl(); + Connector connector = new Connector("HTTP/1.1"); + connector.setPort(port); + connector.setDomain("localhost"); + connector.setAsyncTimeout(1); + Request request = new Request(connector); + Response response = new Response(); + HttpRequestFactory factory=new DefaultHttpRequestFactory(); + org.apache.coyote.Request coyoteRequest = CoyoteRequestBuilder.initializeCoyoteRequest(httpMetadata, url); + coyoteRequest.setServerPort(port); + org.apache.coyote.Response coyoteResponse = new org.apache.coyote.Response(); + coyoteRequest.setResponse(coyoteResponse); + request.setCoyoteRequest(coyoteRequest); + response.setRequest(request); + response.setCoyoteResponse(coyoteResponse); + request.setResponse(response); +// HttpRequestFactory factory=new DefaultHttpRequestFactory(); +// try { +// HttpRequest httpRequest = factory.newHttpRequest(httpMetadata.getMethod(), url); +// } catch (MethodNotSupportedException e) { +// throw new RuntimeException(e); +// } + + try { + dispatcherServlet.service(request, response); + } catch (ServletException e) { + throw new RuntimeException(e); + } catch (IOException e) { + throw new RuntimeException(e); + } +// HttpRpcResponse httpRpcResponse = new HttpRpcResponse(); +// httpRpcResponse.setStatusCode(response.getStatus()); +// httpRpcResponse.setBody(response.getContentAsByteArray()); +// httpRpcResponse.setReasonPhrase(response.getErrorMessage()); +// httpRpcResponse.setHeaders(convertHeaders(response)); +// return CompletableFuture.completedFuture(httpRpcResponse); + return null; + } + }); + } catch (RemotingException e) { + throw new RuntimeException(e); + } + } + + public Map> convertHeaders(HttpServletResponse httpServletResponse) { + Map> feignHeaders = new HashMap<>(); + // 遍历所有头部名称 + for (String headerName : httpServletResponse.getHeaderNames()) { + // 获取对应头部名称的所有值 + Collection headerValues = httpServletResponse.getHeaders(headerName); + // 将其加入到 feignHeaders 中 + feignHeaders.put(headerName, new ArrayList<>(headerValues)); + } + return feignHeaders; + } +} + + + diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/server/CaptureHttpServletResponseWrapper.java b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/server/CaptureHttpServletResponseWrapper.java new file mode 100644 index 0000000000..08cf50651e --- /dev/null +++ b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/server/CaptureHttpServletResponseWrapper.java @@ -0,0 +1,56 @@ +package com.alibaba.dubbo.provider.server; + +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletResponseWrapper; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.PrintWriter; + +/** + * @author :Lictory + * @date : 2024/08/23 + */ + + +public class CaptureHttpServletResponseWrapper extends HttpServletResponseWrapper { + + private final ByteArrayOutputStream capture; + private final PrintWriter writer; + private int httpStatus; + + public CaptureHttpServletResponseWrapper(HttpServletResponse response) { + super(response); + this.capture = new ByteArrayOutputStream(); + this.writer = new PrintWriter(capture); + } + + @Override + public PrintWriter getWriter() { + return writer; + } + + @Override + public void setStatus(int sc) { + super.setStatus(sc); + this.httpStatus = sc; + } + + @Override + public void flushBuffer() throws IOException { + super.flushBuffer(); + writer.flush(); + } + + public byte[] getCaptureAsBytes() { + return capture.toByteArray(); + } + + public String getCaptureAsString() { + return capture.toString(); + } + + public int getHttpStatus() { + return this.httpStatus; + } +} + diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/server/CoyoteRequestBuilder.java b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/server/CoyoteRequestBuilder.java new file mode 100644 index 0000000000..052fee3378 --- /dev/null +++ b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/server/CoyoteRequestBuilder.java @@ -0,0 +1,45 @@ +package com.alibaba.dubbo.provider.server; + +import com.alibaba.rpc.metadata.HttpMetadata; +import org.apache.coyote.Request; + +import java.util.Collection; +import java.util.Map; + +/** + * @author :Lictory + * @date : 2024/08/23 + */ +public class CoyoteRequestBuilder { + public static Request initializeCoyoteRequest(HttpMetadata httpMetadata, String url) { + Request coyoteRequest = new Request(); + + // 设置 HTTP 方法 + String method = httpMetadata.getMethod(); + coyoteRequest.method().setString(method); + + // 设置请求的完整 URL 和 URI + coyoteRequest.requestURI().setString(url); + //TODO 如果 URL 中包含查询字符串,设置查询参数 +// String[] urlParts = url.split("\\?", 2); +// if (urlParts.length == 2) { +// String queryString = urlParts[1]; +// coyoteRequest.queryString().setString(queryString); +// } + + //TODO 设置请求体(如果有) +// if (httpMetadata.getBody() != null) { +// coyoteRequest. (new ByteChunk().append(httpMetadata.getBody())); +// } + + // 设置请求头 + Map> headers = httpMetadata.getHeaders(); + for (Map.Entry> entry : headers.entrySet()) { + String headerName = entry.getKey(); + for (String headerValue : entry.getValue()) { + coyoteRequest.getMimeHeaders().addValue(headerName).setString(headerValue); + } + } + return coyoteRequest; + } +} diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/server/MockHttpServletRequestConverter.java b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/server/MockHttpServletRequestConverter.java new file mode 100644 index 0000000000..4f922ec161 --- /dev/null +++ b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/server/MockHttpServletRequestConverter.java @@ -0,0 +1,38 @@ +package com.alibaba.dubbo.provider.server; + +import com.alibaba.rpc.metadata.HttpMetadata; +import org.springframework.mock.web.MockHttpServletRequest; + +import java.util.Collection; +import java.util.Map; + +/** + * @author :Lictory + * @date : 2024/08/23 + */ +public class MockHttpServletRequestConverter { + public static MockHttpServletRequest getMockHttpServletRequest(HttpMetadata httpMetadata, String url) { + // 创建 MockHttpServletRequest 实例 + MockHttpServletRequest mockRequest = new MockHttpServletRequest(); + + // 设置 HTTP 方法 + mockRequest.setMethod(httpMetadata.getMethod()); + + // 设置 URL + mockRequest.setRequestURI(url); + + // 设置请求头 + Map> headers = httpMetadata.getHeaders(); + for (Map.Entry> entry : headers.entrySet()) { + String headerName = entry.getKey(); + for (String headerValue : entry.getValue()) { + mockRequest.addHeader(headerName, headerValue); + } + } + // 设置请求体(如果有) + if (httpMetadata.getBody() != null) { + mockRequest.setContent(httpMetadata.getBody()); + } + return mockRequest; + } +} diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/server/RpcNettyServer.java b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/server/RpcNettyServer.java new file mode 100644 index 0000000000..d485e4772c --- /dev/null +++ b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/server/RpcNettyServer.java @@ -0,0 +1,59 @@ +package com.alibaba.dubbo.provider.server; + +/** + * @author :Lictory + * @date : 2024/08/15 + */ +import io.netty.bootstrap.ServerBootstrap; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelPipeline; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioServerSocketChannel; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.codec.string.StringEncoder; + +public class RpcNettyServer { + + private final String host; + private final int port; + + public RpcNettyServer(String host,int port) { + this.host=host; + this.port = port; + } + + public void start() throws InterruptedException { + EventLoopGroup bossGroup = new NioEventLoopGroup(1); + EventLoopGroup workerGroup = new NioEventLoopGroup(); + + try { + ServerBootstrap serverBootstrap = new ServerBootstrap(); + serverBootstrap.group(bossGroup, workerGroup) + .channel(NioServerSocketChannel.class) + .childHandler(new ChannelInitializer() { + @Override + protected void initChannel(SocketChannel ch) { + ChannelPipeline pipeline = ch.pipeline(); + pipeline.addLast(new StringDecoder()); // 解码器 + pipeline.addLast(new StringEncoder()); // 编码器 +// pipeline.addLast(new NettyServerHandler()); // 自定义处理器 + } + }); + + ChannelFuture channelFuture = serverBootstrap.bind(host,port).sync(); + System.out.println("Server started on port " + port); + channelFuture.channel().closeFuture().sync(); + } finally { + bossGroup.shutdownGracefully(); + workerGroup.shutdownGracefully(); + } + } + +// public static void main(String[] args) throws InterruptedException { +// new NettyServer(8080).start(); +// } +} + diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/server/RpcToHttpServletRequestWrapper.java b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/server/RpcToHttpServletRequestWrapper.java new file mode 100644 index 0000000000..9177f7a98e --- /dev/null +++ b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/server/RpcToHttpServletRequestWrapper.java @@ -0,0 +1,108 @@ +package com.alibaba.dubbo.provider.server; + +import jakarta.servlet.ReadListener; +import jakarta.servlet.ServletInputStream; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequestWrapper; + +import java.io.ByteArrayInputStream; +import java.util.Collection; +import java.util.Collections; +import java.util.Enumeration; +import java.util.Map; + +/** + * @author :Lictory + * @date : 2024/08/22 + */ +public class RpcToHttpServletRequestWrapper extends HttpServletRequestWrapper { + private final byte[] body; + private final Map> headers; + private final String method; + private final String requestURI; + private final String queryString; + + public RpcToHttpServletRequestWrapper(HttpServletRequest request, String method, String requestURI, byte[] body, Map> headers) { + super(request); + this.body = body != null ? body : new byte[0]; + this.headers = headers; + this.method = method; + this.requestURI = requestURI; + // 可能需要从url中提取query string + this.queryString = request.getQueryString(); + } + + @Override + public String getMethod() { + return this.method; + } + + @Override + public String getRequestURI() { + return this.requestURI; + } + @Override + public String getQueryString() { + return this.queryString; + } + + @Override + public Enumeration getHeaders(String name) { + Collection headerValues = headers.get(name); + if (headerValues != null) { + return Collections.enumeration(headerValues); + } + return Collections.enumeration(Collections.emptyList()); + } + + @Override + public Enumeration getHeaderNames() { + return Collections.enumeration(headers.keySet()); + } + + @Override + public String getHeader(String name) { + Collection headerValues = headers.get(name); + if (headerValues != null && !headerValues.isEmpty()) { + return headerValues.iterator().next(); // 返回第一个值 + } + return null; + } + + @Override + public ServletInputStream getInputStream() { + return new ServletInputStream() { + private final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body); + + @Override + public int read() { + return byteArrayInputStream.read(); + } + + @Override + public boolean isFinished() { + return byteArrayInputStream.available() == 0; + } + + @Override + public boolean isReady() { + return true; + } + + @Override + public void setReadListener(ReadListener readListener) { + // Not used in this implementation + } + }; + } + + @Override + public int getContentLength() { + return body.length; + } + + @Override + public String getContentType() { + return getHeader("Content-Type"); // 使用 headers 中的 Content-Type + } +} diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/service/impl/FooServiceImpl.java b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/service/impl/FooServiceImpl.java new file mode 100644 index 0000000000..947ac955b2 --- /dev/null +++ b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/service/impl/FooServiceImpl.java @@ -0,0 +1,26 @@ +package com.alibaba.dubbo.provider.service.impl; + + +import com.alibaba.dubbo.consumer.entity.User; +import com.alibaba.dubbo.consumer.api.FooService; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.stereotype.Service; + +/** + * @author :Lictory + * @date : 2024/08/01 + */ +@Service +public class FooServiceImpl implements FooService { + @Override + public String foo() { + return "Foo Spring Cloud Alibaba Dubbo"; + } + + @Override + public User getUser() { + return new User(); + } + + +} diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/service/impl/ProviderServiceImpl.java b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/service/impl/ProviderServiceImpl.java new file mode 100644 index 0000000000..0a45ffee64 --- /dev/null +++ b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/service/impl/ProviderServiceImpl.java @@ -0,0 +1,25 @@ +package com.alibaba.dubbo.provider.service.impl; + + +import com.alibaba.dubbo.consumer.api.ProviderService; +import com.alibaba.dubbo.consumer.entity.User; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.stereotype.Service; + +/** + * @author :Lictory + * @date : 2024/08/01 + */ +@Service +public class ProviderServiceImpl implements ProviderService { + @Override + public String hi() { + return "Hi Spring Cloud Alibaba 测试成功"; + } + + @Override + public void post(Integer userId) { + System.out.println("sca post Test 测试"+userId); + } + +} diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/util/RpcSerializeUtil.java b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/util/RpcSerializeUtil.java new file mode 100644 index 0000000000..6ff4f0714c --- /dev/null +++ b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/util/RpcSerializeUtil.java @@ -0,0 +1,31 @@ +package com.alibaba.dubbo.provider.util; + +import org.apache.dubbo.common.serialize.ObjectOutput; +import org.apache.dubbo.common.serialize.hessian2.Hessian2Serialization; +import org.springframework.stereotype.Component; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; + +/** + * @author :Lictory + * @date : 2024/08/13 + */ + + +public class RpcSerializeUtil { + public static byte[] serializeRequestByHessian2(Object result) { + Hessian2Serialization serialization = new Hessian2Serialization(); + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + try { + ObjectOutput objectOutput = serialization.serialize(null, byteArrayOutputStream); + + objectOutput.writeObject(result); + objectOutput.flushBuffer(); + } catch (Exception e) { + + } + return byteArrayOutputStream.toByteArray(); + } + //TODO : add the rest of the serialization methods +} diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/resources/application.yml b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/resources/application.yml new file mode 100644 index 0000000000..27a7ac14dd --- /dev/null +++ b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/resources/application.yml @@ -0,0 +1,17 @@ +spring: + main: + allow-bean-definition-overriding: true + application: + name: provider + cloud: + nacos: + discovery: + server-addr: 10.21.32.154:8848 + port: 8080 + +management: + endpoints: + web: + exposure: + include: "*" + diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/resources/dubbo.properties b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/resources/dubbo.properties new file mode 100644 index 0000000000..4f760cc70a --- /dev/null +++ b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/resources/dubbo.properties @@ -0,0 +1,2 @@ +dubbo.application.check-serializable=false +dubbo.application.serialize-check-status=DISABLE diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/resources/security/serialize.allowlist b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/resources/security/serialize.allowlist new file mode 100644 index 0000000000..b19c3887ef --- /dev/null +++ b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/resources/security/serialize.allowlist @@ -0,0 +1,22 @@ +# +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# + +org.apache.dubbo.common.serialize.hessian2 +com.alibaba.rpc.metadata.HttpMetadata +com.alibaba.rpc.metadata.HttpRpcResponse From d24114340eec4efc6189a144f4fcb3c591317bbd Mon Sep 17 00:00:00 2001 From: Lictory <995372381@qq.com> Date: Sun, 1 Sep 2024 21:49:46 +0800 Subject: [PATCH 2/7] fix : use DispatcherServlet to handler httpRequest --- .../spring-cloud-alibaba-rpc-core/pom.xml | 5 + .../rpc/annotation/DubboFeignBuilder.java | 4 - .../test/java/RpcExchangersForTriTest.java | 62 +++++++++++ .../src/test/java/RpcExchangersTest.java | 104 ++++++++++++++++++ .../provider/config/RpcDispatcherServlet.java | 16 +++ .../listener/RpcNettyServerListener.java | 65 +++-------- .../dubbo/provider/util/SpringUtil.java | 34 ++++++ 7 files changed, 234 insertions(+), 56 deletions(-) create mode 100644 spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/test/java/RpcExchangersForTriTest.java create mode 100644 spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/test/java/RpcExchangersTest.java create mode 100644 spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/config/RpcDispatcherServlet.java create mode 100644 spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/util/SpringUtil.java diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/pom.xml b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/pom.xml index aeab148e31..60bc95e24f 100644 --- a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/pom.xml +++ b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/pom.xml @@ -36,5 +36,10 @@ io.github.openfeign feign-core + + com.alibaba.cloud + spring-cloud-alibaba-test-support + test + diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/main/java/com/alibaba/rpc/annotation/DubboFeignBuilder.java b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/main/java/com/alibaba/rpc/annotation/DubboFeignBuilder.java index 5e62c1afd5..7d5de31f09 100644 --- a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/main/java/com/alibaba/rpc/annotation/DubboFeignBuilder.java +++ b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/main/java/com/alibaba/rpc/annotation/DubboFeignBuilder.java @@ -29,10 +29,6 @@ final class DefaultReferenceClass { public DubboFeignBuilder() { this.defaultReference = ReflectionUtils.findField(DefaultReferenceClass.class, "field").getAnnotation(DubboReference.class); } - - //ReferenceBeanBuilder -// .create(defaultReference, target.getClass().getClassLoader(), applicationContext) -// .setInterfaceClass(target.type()).build(); @Override public T target(Target target) { AnnotationAttributes attributes = AnnotationUtils.getAnnotationAttributes(defaultReference, true); diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/test/java/RpcExchangersForTriTest.java b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/test/java/RpcExchangersForTriTest.java new file mode 100644 index 0000000000..2e811f8996 --- /dev/null +++ b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/test/java/RpcExchangersForTriTest.java @@ -0,0 +1,62 @@ +import org.apache.dubbo.common.URL; +import org.apache.dubbo.common.constants.CommonConstants; +import org.apache.dubbo.common.utils.NetUtils; +import org.apache.dubbo.config.ApplicationConfig; +import org.apache.dubbo.config.context.ConfigManager; +import org.apache.dubbo.remoting.RemotingException; +import org.apache.dubbo.remoting.api.connection.AbstractConnectionClient; +import org.apache.dubbo.remoting.api.pu.AbstractPortUnificationServer; +import org.apache.dubbo.remoting.api.pu.DefaultPuHandler; +import org.apache.dubbo.remoting.exchange.*; +import org.apache.dubbo.remoting.exchange.support.ExchangeHandlerAdapter; +import org.apache.dubbo.remoting.exchange.support.ExchangeHandlerDispatcher; +import org.apache.dubbo.remoting.transport.netty.NettyPortUnificationServer; +import org.apache.dubbo.rpc.model.ApplicationModel; +import org.apache.dubbo.rpc.model.FrameworkModel; +import org.apache.dubbo.rpc.model.ModuleModel; +import org.junit.Test; +import org.junit.jupiter.api.BeforeAll; + +import java.util.concurrent.CompletableFuture; + +import static org.apache.dubbo.common.constants.CommonConstants.EXECUTOR_MANAGEMENT_MODE_DEFAULT; + +/** + * @author :Lictory + * @date : 2024/08/28 + */ +public class RpcExchangersForTriTest { + private static URL url; + + @BeforeAll + public static void init() throws RemotingException { + int port = NetUtils.getAvailablePort(); + url = URL.valueOf("tri://127.0.0.1:" + port); + ApplicationModel applicationModel = ApplicationModel.defaultModel(); + ApplicationConfig applicationConfig = new ApplicationConfig("provider-app"); + applicationConfig.setExecutorManagementMode(EXECUTOR_MANAGEMENT_MODE_DEFAULT); + applicationModel.getApplicationConfigManager().setApplication(applicationConfig); + ConfigManager configManager = new ConfigManager(applicationModel); + configManager.setApplication(applicationConfig); + configManager.getApplication(); + applicationModel.setConfigManager(configManager); + url = url.setScopeModel(applicationModel); + ModuleModel moduleModel = applicationModel.getDefaultModule(); + url = url.putAttribute(CommonConstants.SCOPE_MODEL, moduleModel); + } + + @Test + public void test() throws RemotingException { + AbstractPortUnificationServer server = new NettyPortUnificationServer(url, new ExchangeHandlerAdapter(FrameworkModel.defaultModel()) { + @Override + public CompletableFuture reply(ExchangeChannel channel, Object msg) throws RemotingException { + System.out.println(msg); + return CompletableFuture.completedFuture("GET"); + } + }); + AbstractConnectionClient client = PortUnificationExchanger.connect(url, new DefaultPuHandler()); + client.send("test"); + } +} + + diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/test/java/RpcExchangersTest.java b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/test/java/RpcExchangersTest.java new file mode 100644 index 0000000000..a39733197f --- /dev/null +++ b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/test/java/RpcExchangersTest.java @@ -0,0 +1,104 @@ +import org.apache.dubbo.common.URL; +import org.apache.dubbo.common.constants.CommonConstants; +import org.apache.dubbo.common.utils.Log; +import org.apache.dubbo.common.utils.NetUtils; +import org.apache.dubbo.config.ApplicationConfig; +import org.apache.dubbo.config.context.ConfigManager; +import org.apache.dubbo.remoting.Channel; +import org.apache.dubbo.remoting.RemotingException; +import org.apache.dubbo.remoting.RemotingServer; +import org.apache.dubbo.remoting.api.connection.AbstractConnectionClient; +import org.apache.dubbo.remoting.api.pu.AbstractPortUnificationServer; +import org.apache.dubbo.remoting.api.pu.DefaultPuHandler; +import org.apache.dubbo.remoting.exchange.*; +import org.apache.dubbo.remoting.exchange.support.ExchangeHandlerAdapter; +import org.apache.dubbo.remoting.exchange.support.ExchangeHandlerDispatcher; +import org.apache.dubbo.remoting.transport.ChannelHandlerAdapter; +import org.apache.dubbo.remoting.transport.netty.NettyPortUnificationServer; +import org.apache.dubbo.remoting.transport.netty4.NettyConnectionClient; +import org.apache.dubbo.rpc.model.ApplicationModel; +import org.apache.dubbo.rpc.model.FrameworkModel; +import org.apache.dubbo.rpc.model.ModuleModel; + +import org.apache.dubbo.rpc.protocol.tri.rest.support.spring.HandlerInterceptorAdapter; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; + +import static org.apache.dubbo.common.constants.CommonConstants.*; + +/** + * @author :Lictory + * @date : 2024/08/27 + */ +public class RpcExchangersTest { + private static URL url; + + private static ExchangeClient client; + private static ExchangeServer server; + +// @BeforeAll +// public static void init() throws RemotingException { +// int port = NetUtils.getAvailablePort(); +// url = URL.valueOf("empty://127.0.0.1:" + port + "?foo=bar"); +// ApplicationModel applicationModel = ApplicationModel.defaultModel(); +// ApplicationConfig applicationConfig = new ApplicationConfig("provider-app"); +// applicationConfig.setExecutorManagementMode(EXECUTOR_MANAGEMENT_MODE_DEFAULT); +// applicationModel.getApplicationConfigManager().setApplication(applicationConfig); +// ConfigManager configManager = new ConfigManager(applicationModel); +// configManager.setApplication(applicationConfig); +// configManager.getApplication(); +// applicationModel.setConfigManager(configManager); +// url = url.setScopeModel(applicationModel); +// ModuleModel moduleModel = applicationModel.getDefaultModule(); +// url = url.putAttribute(CommonConstants.SCOPE_MODEL, moduleModel); +// } + +// @Test +// void test() throws RemotingException { +// AbstractPortUnificationServer server = new NettyPortUnificationServer(url, new ExchangeHandlerAdapter(FrameworkModel.defaultModel()) { +// @Override +// public CompletableFuture reply(ExchangeChannel channel, Object msg) throws RemotingException { +// System.out.println(msg); +// return CompletableFuture.completedFuture("收到了哥们"); +// } +// }); +// +// server.send("1"); +// } +// + +// @BeforeAll + public static void init(){ + url=URL.valueOf("tri://127.0.0.1:"+ NetUtils.getAvailablePort()); + url.addParameter(PROTOCOL_KEY,TRIPLE); + } +// @Test +static void testExchangers() throws RemotingException, ExecutionException, InterruptedException { + init(); + getExchangersServer(); + getExchangersClient(); +// CompletableFuture test = client.request("test"); +// System.out.println(test.get()); +} + + static void getExchangersServer() throws RemotingException { + server= Exchangers.bind(url, new ExchangeHandlerAdapter(FrameworkModel.defaultModel()) { + @Override + public CompletableFuture reply(ExchangeChannel channel, Object msg) throws RemotingException { + System.out.println(msg); + return CompletableFuture.completedFuture("received request"+msg); + } + }); + } + static void getExchangersClient() throws RemotingException { + client= Exchangers.connect(url); + } + + public static void main(String[] args) throws RemotingException, ExecutionException, InterruptedException { + testExchangers(); + } +} diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/config/RpcDispatcherServlet.java b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/config/RpcDispatcherServlet.java new file mode 100644 index 0000000000..bf02d1fdbb --- /dev/null +++ b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/config/RpcDispatcherServlet.java @@ -0,0 +1,16 @@ +package com.alibaba.dubbo.provider.config; + +import com.alibaba.dubbo.provider.util.SpringUtil; +import org.springframework.web.servlet.DispatcherServlet; + +/** + * @author :Lictory + * @date : 2024/09/01 + */ +public class RpcDispatcherServlet extends DispatcherServlet { + public RpcDispatcherServlet() { + super(); + // 初始化mapping + onRefresh(SpringUtil.applicationContext); + } +} diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/listener/RpcNettyServerListener.java b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/listener/RpcNettyServerListener.java index d534c3f047..8ae7b37a7a 100644 --- a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/listener/RpcNettyServerListener.java +++ b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/listener/RpcNettyServerListener.java @@ -1,5 +1,6 @@ package com.alibaba.dubbo.provider.listener; +import com.alibaba.dubbo.provider.config.RpcDispatcherServlet; import com.alibaba.dubbo.provider.server.CaptureHttpServletResponseWrapper; import com.alibaba.dubbo.provider.server.CoyoteRequestBuilder; import com.alibaba.dubbo.provider.server.MockHttpServletRequestConverter; @@ -60,33 +61,16 @@ public class RpcNettyServerListener implements ApplicationListener { private ExchangeServer server; - @Autowired - private WebApplicationContext webApplicationContext; - @Value("${rpc.netty.port}") private String port; @Value("${rpc.netty.host}") private String host; - - @Value("${spring.port}") - private Integer localPort; -// private RestTemplate restTemplate; - - @Autowired - private ApplicationContext applicationContext; - - private DispatcherServlet dispatcherServlet; + private RpcDispatcherServlet dispatcherServlet; @Override public void onApplicationEvent(ApplicationReadyEvent event) { -// this.restTemplate = new RestTemplate(); -// try { -// dispatcherServlet.init(); -// } catch (ServletException e) { -// throw new RuntimeException(e); -// } - this.dispatcherServlet = webApplicationContext.getBean("dispatcherServlet", DispatcherServlet.class); + this.dispatcherServlet = new RpcDispatcherServlet(); initLocalServer(host, Integer.parseInt(port)); } @@ -99,43 +83,20 @@ private void initLocalServer(String host, int port) { public CompletableFuture reply(ExchangeChannel channel, Object msg) { System.out.println("接收到客户端请求"); HttpMetadata httpMetadata = (HttpMetadata) msg; - String url = "/"+httpMetadata.getUrl(); - Connector connector = new Connector("HTTP/1.1"); - connector.setPort(port); - connector.setDomain("localhost"); - connector.setAsyncTimeout(1); - Request request = new Request(connector); - Response response = new Response(); - HttpRequestFactory factory=new DefaultHttpRequestFactory(); - org.apache.coyote.Request coyoteRequest = CoyoteRequestBuilder.initializeCoyoteRequest(httpMetadata, url); - coyoteRequest.setServerPort(port); - org.apache.coyote.Response coyoteResponse = new org.apache.coyote.Response(); - coyoteRequest.setResponse(coyoteResponse); - request.setCoyoteRequest(coyoteRequest); - response.setRequest(request); - response.setCoyoteResponse(coyoteResponse); - request.setResponse(response); -// HttpRequestFactory factory=new DefaultHttpRequestFactory(); -// try { -// HttpRequest httpRequest = factory.newHttpRequest(httpMetadata.getMethod(), url); -// } catch (MethodNotSupportedException e) { -// throw new RuntimeException(e); -// } - + String url = httpMetadata.getUrl(); + MockHttpServletRequest request = MockHttpServletRequestConverter.getMockHttpServletRequest(httpMetadata, url); + MockHttpServletResponse response = new MockHttpServletResponse(); try { dispatcherServlet.service(request, response); - } catch (ServletException e) { - throw new RuntimeException(e); - } catch (IOException e) { + } catch (ServletException | IOException e) { throw new RuntimeException(e); } -// HttpRpcResponse httpRpcResponse = new HttpRpcResponse(); -// httpRpcResponse.setStatusCode(response.getStatus()); -// httpRpcResponse.setBody(response.getContentAsByteArray()); -// httpRpcResponse.setReasonPhrase(response.getErrorMessage()); -// httpRpcResponse.setHeaders(convertHeaders(response)); -// return CompletableFuture.completedFuture(httpRpcResponse); - return null; + HttpRpcResponse httpRpcResponse = new HttpRpcResponse(); + httpRpcResponse.setStatusCode(response.getStatus()); + httpRpcResponse.setBody(response.getContentAsByteArray()); + httpRpcResponse.setReasonPhrase(response.getErrorMessage()); + httpRpcResponse.setHeaders(convertHeaders(response)); + return CompletableFuture.completedFuture(httpRpcResponse); } }); } catch (RemotingException e) { diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/util/SpringUtil.java b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/util/SpringUtil.java new file mode 100644 index 0000000000..35378ed109 --- /dev/null +++ b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/util/SpringUtil.java @@ -0,0 +1,34 @@ +package com.alibaba.dubbo.provider.util; + +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.stereotype.Component; + +/** + * @author :Lictory + * @date : 2024/09/01 + */ + +@Component +public final class SpringUtil implements BeanFactoryPostProcessor, ApplicationContextAware { + /** + * Spring应用上下文环境 + */ + public static ConfigurableListableBeanFactory beanFactory; + + public static ApplicationContext applicationContext; + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { + SpringUtil.beanFactory = beanFactory; + } + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + SpringUtil.applicationContext = applicationContext; + } +} + From 54f15bb6c299e6a064fc1602e3120efb885259cd Mon Sep 17 00:00:00 2001 From: Lictory <995372381@qq.com> Date: Sat, 21 Sep 2024 15:08:36 +0800 Subject: [PATCH 3/7] feat: Remove redundant code and add rpc-starter(no work) --- pom.xml | 2 +- spring-cloud-alibaba-dependencies/pom.xml | 25 +- spring-cloud-alibaba-starters/pom.xml | 5 +- .../spring-cloud-starter-alibaba-rpc/pom.xml | 56 ++ .../cloud/rpc}/client/FeignRpcClient.java | 34 +- .../rpc}/config/RpcFeignConfiguration.java | 16 +- .../rpc/config/RpcRegistryConfiguration.java | 34 ++ .../cloud/rpc/constant/RpcConstant.java | 10 + .../cloud}/rpc/metadata/HttpMetadata.java | 4 +- .../cloud}/rpc/metadata/HttpRpcResponse.java | 2 +- .../rpc/server}/RpcDispatcherServlet.java | 7 +- .../rpc/server}/RpcNettyServerListener.java | 54 +- .../MockHttpServletRequestConverter.java | 4 +- .../alibaba/cloud/rpc/utils}/SpringUtil.java | 6 +- .../alibaba/cloud/rpc/utils}/UrlResolver.java | 38 +- .../main/resources/META-INF/spring.factories | 3 + .../spring-cloud-starter-rpc/pom.xml | 22 - spring-cloud-alibaba-tests/rpc-tests/pom.xml | 1 - .../spring-cloud-alibaba-rpc-consumer/pom.xml | 25 +- .../interceptor/RpcFeignInterceptor.java | 15 - .../dubbo/consumer/service/TestService.java | 2 - .../dubbo/consumer/util/RpcSerializeUtil.java | 25 - .../src/main/resources/application.yml | 5 + .../spring-cloud-alibaba-rpc-core/pom.xml | 45 -- .../rpc/annotation/DubboFeignBuilder.java | 43 -- ...lientToDubboProviderBeanPostProcessor.java | 482 ------------------ .../com/alibaba/rpc/common/RpcConstance.java | 9 - ...ingCloudAlibabaDubboAutoConfiguration.java | 44 -- .../main/resources/META-INF/spring.factories | 3 - .../src/main/resources/application.yml | 1 - .../test/java/RpcExchangersForTriTest.java | 62 --- .../src/test/java/RpcExchangersTest.java | 104 ---- .../spring-cloud-alibaba-rpc-provider/pom.xml | 35 +- .../config/RpcRegistryConfiguration.java | 58 --- .../handler/RpcNettyServerHandler.java | 24 - .../provider/handler/ServerReplyHandler.java | 24 - .../CaptureHttpServletResponseWrapper.java | 56 -- .../provider/server/CoyoteRequestBuilder.java | 45 -- .../dubbo/provider/server/RpcNettyServer.java | 59 --- .../RpcToHttpServletRequestWrapper.java | 108 ---- .../dubbo/provider/util/RpcSerializeUtil.java | 31 -- .../src/main/resources/application.yml | 11 +- 42 files changed, 215 insertions(+), 1424 deletions(-) create mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/pom.xml rename {spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/java/com/alibaba/dubbo/consumer => spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc}/client/FeignRpcClient.java (67%) rename {spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/java/com/alibaba/dubbo/consumer => spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc}/config/RpcFeignConfiguration.java (60%) create mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/config/RpcRegistryConfiguration.java create mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/constant/RpcConstant.java rename {spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/main/java/com/alibaba => spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud}/rpc/metadata/HttpMetadata.java (94%) rename {spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/main/java/com/alibaba => spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud}/rpc/metadata/HttpRpcResponse.java (97%) rename {spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/config => spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/server}/RpcDispatcherServlet.java (71%) rename {spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/listener => spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/server}/RpcNettyServerListener.java (64%) rename {spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/server => spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/utils}/MockHttpServletRequestConverter.java (92%) rename {spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/util => spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/utils}/SpringUtil.java (94%) rename {spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/java/com/alibaba/dubbo/consumer/client => spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/utils}/UrlResolver.java (52%) create mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/resources/META-INF/spring.factories delete mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-rpc/pom.xml delete mode 100644 spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/java/com/alibaba/dubbo/consumer/interceptor/RpcFeignInterceptor.java delete mode 100644 spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/java/com/alibaba/dubbo/consumer/util/RpcSerializeUtil.java delete mode 100644 spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/pom.xml delete mode 100644 spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/main/java/com/alibaba/rpc/annotation/DubboFeignBuilder.java delete mode 100644 spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/main/java/com/alibaba/rpc/annotation/FeignClientToDubboProviderBeanPostProcessor.java delete mode 100644 spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/main/java/com/alibaba/rpc/common/RpcConstance.java delete mode 100644 spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/main/java/com/alibaba/rpc/core/SpringCloudAlibabaDubboAutoConfiguration.java delete mode 100644 spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/main/resources/META-INF/spring.factories delete mode 100644 spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/main/resources/application.yml delete mode 100644 spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/test/java/RpcExchangersForTriTest.java delete mode 100644 spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/test/java/RpcExchangersTest.java delete mode 100644 spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/config/RpcRegistryConfiguration.java delete mode 100644 spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/handler/RpcNettyServerHandler.java delete mode 100644 spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/handler/ServerReplyHandler.java delete mode 100644 spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/server/CaptureHttpServletResponseWrapper.java delete mode 100644 spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/server/CoyoteRequestBuilder.java delete mode 100644 spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/server/RpcNettyServer.java delete mode 100644 spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/server/RpcToHttpServletRequestWrapper.java delete mode 100644 spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/util/RpcSerializeUtil.java diff --git a/pom.xml b/pom.xml index cbcec0da43..e737145e4b 100644 --- a/pom.xml +++ b/pom.xml @@ -108,7 +108,7 @@ spring-cloud-alibaba-starters spring-cloud-alibaba-coverage spring-cloud-alibaba-tests - spring-cloud-alibaba-starters/spring-cloud-starter-rpc + spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc spring-cloud-alibaba-tests/rpc-tests diff --git a/spring-cloud-alibaba-dependencies/pom.xml b/spring-cloud-alibaba-dependencies/pom.xml index aac872e92b..15afced70c 100644 --- a/spring-cloud-alibaba-dependencies/pom.xml +++ b/spring-cloud-alibaba-dependencies/pom.xml @@ -34,14 +34,16 @@ 4.23.0 1.11.4 + + 3.3.0-beta.4 + 3.2.1 3.1.1 3.0.1 1.2.7 - - 3.3.0-beta.4 + @@ -208,7 +210,12 @@ schedulerx2-worker ${schedulerx.worker.version} - + + + org.apache.dubbo + dubbo + ${dubbo.version} + com.alibaba.cloud @@ -287,6 +294,11 @@ spring-cloud-starter-alibaba-schedulerx ${revision} + + com.alibaba.cloud + spring-cloud-starter-alibaba-rpc + ${revision} + com.alibaba.spring @@ -301,13 +313,6 @@ ${spring.ai.version} test - - - - org.apache.dubbo - dubbo-spring-boot-starter - ${dubbo.version} - diff --git a/spring-cloud-alibaba-starters/pom.xml b/spring-cloud-alibaba-starters/pom.xml index 46366c02ff..ee970df91b 100644 --- a/spring-cloud-alibaba-starters/pom.xml +++ b/spring-cloud-alibaba-starters/pom.xml @@ -13,7 +13,7 @@ pom Spring Cloud Alibaba Starters Spring Cloud Alibaba Starters - + spring-cloud-starter-alibaba-nacos-config spring-cloud-starter-alibaba-nacos-discovery @@ -28,6 +28,7 @@ spring-cloud-alibaba-commons spring-cloud-starter-alibaba-ai spring-cloud-starter-alibaba-schedulerx + spring-cloud-starter-alibaba-rpc @@ -54,4 +55,4 @@ - \ No newline at end of file + diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/pom.xml b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/pom.xml new file mode 100644 index 0000000000..4a9e88a326 --- /dev/null +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/pom.xml @@ -0,0 +1,56 @@ + + + 4.0.0 + + com.alibaba.cloud + spring-cloud-alibaba-starters + ${revision} + ../pom.xml + + + org.example + spring-cloud-starter-alibaba-rpc + + + 19 + 19 + UTF-8 + + + + org.springframework.boot + spring-boot-starter + + + org.springframework.cloud + spring-cloud-starter-openfeign + + + org.apache.dubbo + dubbo + 3.3.0-beta.4 + + + org.springframework.boot + spring-boot-starter-test + + + org.springframework.cloud + spring-cloud-openfeign-core + + + org.springframework.boot + spring-boot-starter-web + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + org.springframework.boot + spring-boot-configuration-processor + + + 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-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/client/FeignRpcClient.java similarity index 67% rename from spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/java/com/alibaba/dubbo/consumer/client/FeignRpcClient.java rename to spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/client/FeignRpcClient.java index fac5e922d6..66cb3f46e1 100644 --- 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-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/client/FeignRpcClient.java @@ -1,19 +1,14 @@ -package com.alibaba.dubbo.consumer.client; +package com.alibaba.cloud.rpc.client; -import com.alibaba.rpc.metadata.HttpMetadata; -import com.alibaba.rpc.metadata.HttpRpcResponse; +import com.alibaba.cloud.rpc.metadata.HttpMetadata; +import com.alibaba.cloud.rpc.metadata.HttpRpcResponse; +import com.alibaba.cloud.rpc.utils.UrlResolver; 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; @@ -39,7 +34,7 @@ public FeignRpcClient(LoadBalancerClient loadBalancerClient) { public Response execute(Request request, Request.Options options) { String url = UrlResolver.resolveOriginalUrl(loadBalancerClient, request.url()); - initLocalClient(url); + this.client = UrlResolver.getClient(url); HttpMetadata httpMetadata = initHttpMetadata( UrlResolver.getPathFromUrl(request.url()), request.httpMethod().name(), @@ -53,9 +48,6 @@ public Response execute(Request request, Request.Options options) { } catch (RemotingException | InterruptedException | ExecutionException e) { throw new RuntimeException(e); } - - - return Response.builder() .status(httpRpcResponse.getStatusCode()) .reason(httpRpcResponse.getReasonPhrase()) @@ -65,22 +57,6 @@ public Response execute(Request request, Request.Options options) { .build(); } - private void initLocalClient(String url) { - URL targetUrl = URL.valueOf(url); - try { - - this.client = Exchangers.connect(targetUrl, new ExchangeHandlerDispatcher() { - @Override - public void received(Channel channel, Object message) { - System.out.println("收到来自服务端的返回值"); - super.received(channel, message); - } - }); - } catch (RemotingException e) { - throw new RuntimeException(e); - } - } - private HttpMetadata initHttpMetadata(String url, String method, Map> headers, byte[] body) { HttpMetadata httpMetadata = new HttpMetadata(); httpMetadata.setBody(body); diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/java/com/alibaba/dubbo/consumer/config/RpcFeignConfiguration.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/config/RpcFeignConfiguration.java similarity index 60% rename from spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/java/com/alibaba/dubbo/consumer/config/RpcFeignConfiguration.java rename to spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/config/RpcFeignConfiguration.java index 9c597da795..1f0dc295d3 100644 --- a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/java/com/alibaba/dubbo/consumer/config/RpcFeignConfiguration.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/config/RpcFeignConfiguration.java @@ -1,10 +1,8 @@ -package com.alibaba.dubbo.consumer.config; +package com.alibaba.cloud.rpc.config; -import com.alibaba.dubbo.consumer.client.FeignRpcClient; - -import com.alibaba.dubbo.consumer.interceptor.RpcFeignInterceptor; -import feign.RequestInterceptor; +import com.alibaba.cloud.rpc.client.FeignRpcClient; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.cloud.client.loadbalancer.LoadBalancerClient; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -14,16 +12,12 @@ * @date : 2024/08/11 */ -@Configuration +@Configuration(proxyBeanMethods = false) +@ConditionalOnProperty(prefix = "spring.rpc.enable", matchIfMissing = true) public class RpcFeignConfiguration { @Autowired private LoadBalancerClient loadBalancerClient; -// @Bean -// public RequestInterceptor myRequestInterceptor() { -// return new RpcFeignInterceptor(); -// } - @Bean public feign.Client feignClient() { return new FeignRpcClient(loadBalancerClient); diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/config/RpcRegistryConfiguration.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/config/RpcRegistryConfiguration.java new file mode 100644 index 0000000000..8fde558135 --- /dev/null +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/config/RpcRegistryConfiguration.java @@ -0,0 +1,34 @@ +package com.alibaba.cloud.rpc.config; + +import com.alibaba.cloud.nacos.registry.NacosRegistration; +import jakarta.annotation.PostConstruct; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Configuration; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author :Lictory + * @date : 2024/08/12 + */ + +@Configuration(proxyBeanMethods = false) +@ConditionalOnProperty(prefix = "spring.rpc.enable", matchIfMissing = true) +public class RpcRegistryConfiguration { + + @Autowired + private NacosRegistration nacosRegistration; + + @Value("${spring.rpc.netty.port}") + private Integer port; + + @PostConstruct + public void init() { + Map metadata = new HashMap<>(); + metadata.put("spring.rpc.netty.port", String.valueOf(port)); + nacosRegistration.getMetadata().putAll(metadata); + } +} diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/constant/RpcConstant.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/constant/RpcConstant.java new file mode 100644 index 0000000000..bdaf470188 --- /dev/null +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/constant/RpcConstant.java @@ -0,0 +1,10 @@ +package com.alibaba.cloud.rpc.constant; + +/** + * @author :Lictory + * @date : 2024/09/20 + */ +public class RpcConstant { + + public static final String SPRING_RPC_NETTY_PORT = "spring.rpc.netty.port"; +} diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/main/java/com/alibaba/rpc/metadata/HttpMetadata.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/metadata/HttpMetadata.java similarity index 94% rename from spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/main/java/com/alibaba/rpc/metadata/HttpMetadata.java rename to spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/metadata/HttpMetadata.java index 99c9020489..f8b2041be5 100644 --- a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/main/java/com/alibaba/rpc/metadata/HttpMetadata.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/metadata/HttpMetadata.java @@ -1,6 +1,4 @@ -package com.alibaba.rpc.metadata; - -import feign.Request; +package com.alibaba.cloud.rpc.metadata; import java.io.Serializable; import java.util.Collection; diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/main/java/com/alibaba/rpc/metadata/HttpRpcResponse.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/metadata/HttpRpcResponse.java similarity index 97% rename from spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/main/java/com/alibaba/rpc/metadata/HttpRpcResponse.java rename to spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/metadata/HttpRpcResponse.java index d04bfbc90b..aeedf97810 100644 --- a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/main/java/com/alibaba/rpc/metadata/HttpRpcResponse.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/metadata/HttpRpcResponse.java @@ -1,4 +1,4 @@ -package com.alibaba.rpc.metadata; +package com.alibaba.cloud.rpc.metadata; import java.io.Serializable; import java.util.Collection; diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/config/RpcDispatcherServlet.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/server/RpcDispatcherServlet.java similarity index 71% rename from spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/config/RpcDispatcherServlet.java rename to spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/server/RpcDispatcherServlet.java index bf02d1fdbb..1e77595fb9 100644 --- a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/config/RpcDispatcherServlet.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/server/RpcDispatcherServlet.java @@ -1,12 +1,13 @@ -package com.alibaba.dubbo.provider.config; +package com.alibaba.cloud.rpc.server; -import com.alibaba.dubbo.provider.util.SpringUtil; +import com.alibaba.cloud.rpc.utils.SpringUtil; import org.springframework.web.servlet.DispatcherServlet; /** * @author :Lictory - * @date : 2024/09/01 + * @date : 2024/08/31 */ + public class RpcDispatcherServlet extends DispatcherServlet { public RpcDispatcherServlet() { super(); diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/listener/RpcNettyServerListener.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/server/RpcNettyServerListener.java similarity index 64% rename from spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/listener/RpcNettyServerListener.java rename to spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/server/RpcNettyServerListener.java index 8ae7b37a7a..8cad87227d 100644 --- a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/listener/RpcNettyServerListener.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/server/RpcNettyServerListener.java @@ -1,24 +1,11 @@ -package com.alibaba.dubbo.provider.listener; +package com.alibaba.cloud.rpc.server; -import com.alibaba.dubbo.provider.config.RpcDispatcherServlet; -import com.alibaba.dubbo.provider.server.CaptureHttpServletResponseWrapper; -import com.alibaba.dubbo.provider.server.CoyoteRequestBuilder; -import com.alibaba.dubbo.provider.server.MockHttpServletRequestConverter; -import com.alibaba.dubbo.provider.server.RpcToHttpServletRequestWrapper; -import com.alibaba.rpc.common.RpcConstance; -import com.alibaba.rpc.metadata.HttpMetadata; -import com.alibaba.rpc.metadata.HttpRpcResponse; -import jakarta.servlet.RequestDispatcher; -import jakarta.servlet.ServletContext; + +import com.alibaba.cloud.rpc.metadata.HttpMetadata; +import com.alibaba.cloud.rpc.metadata.HttpRpcResponse; +import com.alibaba.cloud.rpc.utils.MockHttpServletRequestConverter; import jakarta.servlet.ServletException; -import jakarta.servlet.ServletRequest; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletRequestWrapper; import jakarta.servlet.http.HttpServletResponse; -import jakarta.servlet.http.HttpServletResponseWrapper; -import org.apache.catalina.connector.Connector; -import org.apache.catalina.connector.Request; -import org.apache.catalina.connector.Response; import org.apache.dubbo.common.URL; import org.apache.dubbo.remoting.RemotingException; import org.apache.dubbo.remoting.exchange.ExchangeChannel; @@ -26,32 +13,19 @@ import org.apache.dubbo.remoting.exchange.Exchangers; import org.apache.dubbo.remoting.exchange.support.ExchangeHandlerAdapter; import org.apache.dubbo.rpc.model.FrameworkModel; -import org.apache.http.HttpRequest; -import org.apache.http.HttpRequestFactory; -import org.apache.http.HttpResponseFactory; -import org.apache.http.MethodNotSupportedException; -import org.apache.http.impl.DefaultHttpRequestFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.context.event.ApplicationReadyEvent; -import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationListener; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpMethod; -import org.springframework.http.ResponseEntity; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockHttpServletResponse; -import org.springframework.mock.web.MockMultipartHttpServletRequest; import org.springframework.stereotype.Component; -import org.springframework.web.client.RestTemplate; -import org.springframework.web.context.WebApplicationContext; -import org.springframework.web.servlet.DispatcherServlet; import java.io.IOException; -import java.util.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; import java.util.concurrent.CompletableFuture; -import java.util.stream.Collectors; /** * @author :Lictory @@ -61,29 +35,29 @@ public class RpcNettyServerListener implements ApplicationListener { private ExchangeServer server; - @Value("${rpc.netty.port}") + @Value("${spring.rpc.netty.port}") private String port; - @Value("${rpc.netty.host}") + @Value("${spring.rpc.netty.host}") private String host; + private RpcDispatcherServlet dispatcherServlet; @Override public void onApplicationEvent(ApplicationReadyEvent event) { - this.dispatcherServlet = new RpcDispatcherServlet(); initLocalServer(host, Integer.parseInt(port)); + this.dispatcherServlet = new RpcDispatcherServlet(); } private void initLocalServer(String host, int port) { URL url = URL.valueOf("exchange://" + host + ":" + port); - url = url.addParameter("serialization", "hessian2"); try { this.server = Exchangers.bind(url, new ExchangeHandlerAdapter(FrameworkModel.defaultModel()) { @Override public CompletableFuture reply(ExchangeChannel channel, Object msg) { - System.out.println("接收到客户端请求"); HttpMetadata httpMetadata = (HttpMetadata) msg; String url = httpMetadata.getUrl(); + System.out.println(url); MockHttpServletRequest request = MockHttpServletRequestConverter.getMockHttpServletRequest(httpMetadata, url); MockHttpServletResponse response = new MockHttpServletResponse(); try { diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/server/MockHttpServletRequestConverter.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/utils/MockHttpServletRequestConverter.java similarity index 92% rename from spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/server/MockHttpServletRequestConverter.java rename to spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/utils/MockHttpServletRequestConverter.java index 4f922ec161..713eb07e07 100644 --- a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/server/MockHttpServletRequestConverter.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/utils/MockHttpServletRequestConverter.java @@ -1,6 +1,6 @@ -package com.alibaba.dubbo.provider.server; +package com.alibaba.cloud.rpc.utils; -import com.alibaba.rpc.metadata.HttpMetadata; +import com.alibaba.cloud.rpc.metadata.HttpMetadata; import org.springframework.mock.web.MockHttpServletRequest; import java.util.Collection; diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/util/SpringUtil.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/utils/SpringUtil.java similarity index 94% rename from spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/util/SpringUtil.java rename to spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/utils/SpringUtil.java index 35378ed109..4ce21892b3 100644 --- a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/util/SpringUtil.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/utils/SpringUtil.java @@ -1,4 +1,4 @@ -package com.alibaba.dubbo.provider.util; +package com.alibaba.cloud.rpc.utils; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanFactoryPostProcessor; @@ -9,9 +9,10 @@ /** * @author :Lictory - * @date : 2024/09/01 + * @date : 2024/08/31 */ + @Component public final class SpringUtil implements BeanFactoryPostProcessor, ApplicationContextAware { /** @@ -31,4 +32,3 @@ public void setApplicationContext(ApplicationContext applicationContext) throws SpringUtil.applicationContext = applicationContext; } } - diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/java/com/alibaba/dubbo/consumer/client/UrlResolver.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/utils/UrlResolver.java similarity index 52% rename from spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/java/com/alibaba/dubbo/consumer/client/UrlResolver.java rename to spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/utils/UrlResolver.java index 56198c1d24..7a3cb946aa 100644 --- a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/java/com/alibaba/dubbo/consumer/client/UrlResolver.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/utils/UrlResolver.java @@ -1,10 +1,17 @@ -package com.alibaba.dubbo.consumer.client; +package com.alibaba.cloud.rpc.utils; +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.cloud.client.ServiceInstance; import org.springframework.cloud.client.loadbalancer.LoadBalancerClient; import java.net.MalformedURLException; import java.net.URL; +import java.util.concurrent.ConcurrentHashMap; + /** * @author :Lictory * @date : 2024/08/13 @@ -13,6 +20,8 @@ public class UrlResolver { //TODO add ExchangerClient into + private static final ConcurrentHashMap clientMap = new ConcurrentHashMap<>(); + public static String resolveOriginalUrl(LoadBalancerClient loadBalancerClient, String url) { URL result = null; try { @@ -22,10 +31,25 @@ public static String resolveOriginalUrl(LoadBalancerClient loadBalancerClient, S } String serviceId = result.getHost(); ServiceInstance choose = loadBalancerClient.choose(serviceId); - int nettyPort = Integer.parseInt(choose.getMetadata().get("rpc.netty.port")); + int nettyPort = Integer.parseInt(choose.getMetadata().get("spring.rpc.netty.port")); return "exchange://" + choose.getHost() + ":" + nettyPort; } + private static void initLocalClient(String url) { + + org.apache.dubbo.common.URL targetUrl = org.apache.dubbo.common.URL.valueOf(url); + try { + clientMap.put(url, Exchangers.connect(targetUrl, new ExchangeHandlerDispatcher() { + @Override + public void received(Channel channel, Object message) { + super.received(channel, message); + } + })); + } catch (RemotingException e) { + throw new RuntimeException(e); + } + } + public static String getPathFromUrl(String urlString) { try { URL url = new URL(urlString); @@ -42,4 +66,14 @@ public static String getPathFromUrl(String urlString) { throw new IllegalArgumentException("Invalid URL: " + urlString, e); } } + + public static ExchangeClient getClient(String url) { + if (url == null || url.length() == 0) { + return null; + } + if (!clientMap.containsKey(url)) { + initLocalClient(url); + } + return clientMap.get(url); + } } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/resources/META-INF/spring.factories b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000000..96435c9292 --- /dev/null +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/resources/META-INF/spring.factories @@ -0,0 +1,3 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ + com.alibaba.cloud.rpc.config.RpcRegistryConfiguration,\ + com.alibaba.cloud.rpc.config.RpcFeignConfiguration diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-rpc/pom.xml b/spring-cloud-alibaba-starters/spring-cloud-starter-rpc/pom.xml deleted file mode 100644 index d12f247fef..0000000000 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-rpc/pom.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - 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 index e1dfd44cb5..153f44d927 100644 --- a/spring-cloud-alibaba-tests/rpc-tests/pom.xml +++ b/spring-cloud-alibaba-tests/rpc-tests/pom.xml @@ -12,7 +12,6 @@ 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-consumer/pom.xml b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/pom.xml index a31f0af51b..b8575e7af3 100644 --- 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 @@ -12,31 +12,18 @@ 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 + org.example + spring-cloud-starter-alibaba-rpc + ${revision} com.alibaba.cloud - spring-cloud-alibaba-rpc-core + spring-cloud-alibaba-rpc-api ${revision} - com.alibaba.cloud - spring-cloud-alibaba-rpc-api - 2023.0.1.2 - compile + org.springframework.cloud + spring-cloud-starter-loadbalancer diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/java/com/alibaba/dubbo/consumer/interceptor/RpcFeignInterceptor.java b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/java/com/alibaba/dubbo/consumer/interceptor/RpcFeignInterceptor.java deleted file mode 100644 index b1a15fc4cb..0000000000 --- a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/java/com/alibaba/dubbo/consumer/interceptor/RpcFeignInterceptor.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.alibaba.dubbo.consumer.interceptor; - -import feign.RequestInterceptor; -import feign.RequestTemplate; - -/** - * @author :Lictory - * @date : 2024/08/11 - */ -public class RpcFeignInterceptor implements RequestInterceptor { - @Override - public void apply(RequestTemplate requestTemplate) { - System.out.println("rpcFeign拦截测试"); - } -} diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/java/com/alibaba/dubbo/consumer/service/TestService.java b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/java/com/alibaba/dubbo/consumer/service/TestService.java index 2886e0ccc1..f21867a7cb 100644 --- a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/java/com/alibaba/dubbo/consumer/service/TestService.java +++ b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/java/com/alibaba/dubbo/consumer/service/TestService.java @@ -1,9 +1,7 @@ package com.alibaba.dubbo.consumer.service; -import com.alibaba.dubbo.consumer.api.FooService; import com.alibaba.dubbo.consumer.api.ProviderService; -import com.alibaba.dubbo.consumer.entity.User; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/java/com/alibaba/dubbo/consumer/util/RpcSerializeUtil.java b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/java/com/alibaba/dubbo/consumer/util/RpcSerializeUtil.java deleted file mode 100644 index 3e9f5df117..0000000000 --- a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/java/com/alibaba/dubbo/consumer/util/RpcSerializeUtil.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.alibaba.dubbo.consumer.util; - -import org.apache.dubbo.common.serialize.ObjectOutput; -import org.apache.dubbo.common.serialize.hessian2.Hessian2Serialization; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; - -/** - * @author :Lictory - * @date : 2024/08/13 - */ -public class RpcSerializeUtil { - public byte[] serializeRequestByHessian2(Object request) throws IOException { - Hessian2Serialization serialization = new Hessian2Serialization(); - ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); - ObjectOutput objectOutput = serialization.serialize(null, byteArrayOutputStream); - - objectOutput.writeObject(request); - objectOutput.flushBuffer(); - - return byteArrayOutputStream.toByteArray(); - } - //TODO : add the rest of the serialization methods -} diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/resources/application.yml b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/resources/application.yml index 21718e8171..d10aaf2d1a 100644 --- a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/resources/application.yml +++ b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/resources/application.yml @@ -7,6 +7,11 @@ spring: nacos: discovery: server-addr: 10.21.32.154:8848 + rpc: + enable: true + netty: + host: 127.0.0.1 + port: 20880 server: port: 8081 diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/pom.xml b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/pom.xml deleted file mode 100644 index 60bc95e24f..0000000000 --- a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/pom.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - 4.0.0 - - com.alibaba.cloud - rpc-tests - ${revision} - - - spring-cloud-alibaba-rpc-core - - - - - org.springframework.cloud - spring-cloud-starter-openfeign - provided - - - - org.apache.dubbo - dubbo-spring-boot-starter - - - - org.springframework.cloud - spring-cloud-starter-loadbalancer - - - com.alibaba.cloud - spring-cloud-starter-alibaba-nacos-discovery - - - io.github.openfeign - feign-core - - - com.alibaba.cloud - spring-cloud-alibaba-test-support - test - - - diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/main/java/com/alibaba/rpc/annotation/DubboFeignBuilder.java b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/main/java/com/alibaba/rpc/annotation/DubboFeignBuilder.java deleted file mode 100644 index 7d5de31f09..0000000000 --- a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/main/java/com/alibaba/rpc/annotation/DubboFeignBuilder.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.alibaba.rpc.annotation; - - -import feign.Feign; -import feign.Target; -import org.apache.dubbo.config.annotation.DubboReference; -import org.apache.dubbo.config.spring.reference.ReferenceCreator; -import org.apache.dubbo.config.spring.util.AnnotationUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationContext; -import org.springframework.core.annotation.AnnotationAttributes; -import org.springframework.util.ReflectionUtils; - -/** - * @author Lictory - */ - -public class DubboFeignBuilder extends Feign.Builder { - @Autowired - private ApplicationContext applicationContext; - - public DubboReference defaultReference; - - final class DefaultReferenceClass { - @DubboReference(check = false) - String field; - } - - public DubboFeignBuilder() { - this.defaultReference = ReflectionUtils.findField(DefaultReferenceClass.class, "field").getAnnotation(DubboReference.class); - } - @Override - public T target(Target target) { - AnnotationAttributes attributes = AnnotationUtils.getAnnotationAttributes(defaultReference, true); - ReferenceCreator build = ReferenceCreator.create(attributes, applicationContext).defaultInterfaceClass(target.type()); - try { - T object = (T) build.build().get(); - return object; - } catch (Exception e) { - throw new RuntimeException(e); - } - } -} diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/main/java/com/alibaba/rpc/annotation/FeignClientToDubboProviderBeanPostProcessor.java b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/main/java/com/alibaba/rpc/annotation/FeignClientToDubboProviderBeanPostProcessor.java deleted file mode 100644 index f2452b152c..0000000000 --- a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/main/java/com/alibaba/rpc/annotation/FeignClientToDubboProviderBeanPostProcessor.java +++ /dev/null @@ -1,482 +0,0 @@ -package com.alibaba.rpc.annotation; - -import org.apache.dubbo.common.logger.Logger; -import org.apache.dubbo.common.logger.LoggerFactory; -import org.apache.dubbo.config.annotation.DubboService; -import org.apache.dubbo.config.spring.ServiceBean; -import org.apache.dubbo.config.spring.beans.factory.annotation.AnnotationPropertyValuesAdapter; -import org.apache.dubbo.config.spring.context.annotation.DubboClassPathBeanDefinitionScanner; -import org.springframework.beans.BeansException; -import org.springframework.beans.MutablePropertyValues; -import org.springframework.beans.factory.BeanClassLoaderAware; -import org.springframework.beans.factory.config.BeanDefinition; -import org.springframework.beans.factory.config.BeanDefinitionHolder; -import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; -import org.springframework.beans.factory.config.RuntimeBeanReference; -import org.springframework.beans.factory.config.SingletonBeanRegistry; -import org.springframework.beans.factory.support.AbstractBeanDefinition; -import org.springframework.beans.factory.support.BeanDefinitionBuilder; -import org.springframework.beans.factory.support.BeanDefinitionRegistry; -import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor; -import org.springframework.beans.factory.support.BeanNameGenerator; -import org.springframework.beans.factory.support.ManagedList; -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.context.EnvironmentAware; -import org.springframework.context.ResourceLoaderAware; -import org.springframework.context.annotation.AnnotationBeanNameGenerator; -import org.springframework.context.annotation.AnnotationConfigUtils; -import org.springframework.context.annotation.ClassPathBeanDefinitionScanner; -import org.springframework.context.annotation.ConfigurationClassPostProcessor; -import org.springframework.core.env.Environment; -import org.springframework.core.io.ResourceLoader; -import org.springframework.core.type.filter.AnnotationTypeFilter; -import org.springframework.util.Assert; -import org.springframework.util.ClassUtils; -import org.springframework.util.CollectionUtils; -import org.springframework.util.ObjectUtils; -import org.springframework.util.StringUtils; - -import java.util.Arrays; -import java.util.Collection; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Set; - -import static com.alibaba.spring.util.ObjectUtils.of; -import static org.springframework.beans.factory.support.BeanDefinitionBuilder.rootBeanDefinition; -import static org.springframework.context.annotation.AnnotationConfigUtils.CONFIGURATION_BEAN_NAME_GENERATOR; -import static org.springframework.core.annotation.AnnotationUtils.findAnnotation; -import static org.springframework.util.ClassUtils.resolveClassName; - -public class FeignClientToDubboProviderBeanPostProcessor implements BeanDefinitionRegistryPostProcessor, EnvironmentAware, - ResourceLoaderAware, BeanClassLoaderAware { - - private static final String SEPARATOR = ":"; - - private final Logger logger = LoggerFactory.getLogger(getClass()); - - private final Set packagesToScan; - - private Environment environment; - - private ResourceLoader resourceLoader; - - private ClassLoader classLoader; - - private DubboService defaultService; - - public FeignClientToDubboProviderBeanPostProcessor(String... packagesToScan) { - this(Arrays.asList(packagesToScan)); - } - - public FeignClientToDubboProviderBeanPostProcessor(Collection packagesToScan) { - this(new LinkedHashSet(packagesToScan)); - } - - public FeignClientToDubboProviderBeanPostProcessor(Set packagesToScan) { - this.packagesToScan = packagesToScan; - @DubboService - final class DefaultServiceClass { - } - ; - this.defaultService = DefaultServiceClass.class.getAnnotation(DubboService.class); - } - - @Override - public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException { - - Set resolvedPackagesToScan = resolvePackagesToScan(packagesToScan); - - if (!CollectionUtils.isEmpty(resolvedPackagesToScan)) { - registerServiceBeans(resolvedPackagesToScan, registry); - } else { - if (logger.isWarnEnabled()) { - logger.warn("packagesToScan is empty , ServiceBean registry will be ignored!"); - } - } - - } - - - /** - * Registers Beans whose classes was annotated {@link FeignClient} - * - * @param packagesToScan The base packages to scan - * @param registry {@link BeanDefinitionRegistry} - */ - private void registerServiceBeans(Set packagesToScan, BeanDefinitionRegistry registry) { - - DubboClassPathBeanDefinitionScanner scanner = - new DubboClassPathBeanDefinitionScanner(registry, environment, resourceLoader); - - BeanNameGenerator beanNameGenerator = resolveBeanNameGenerator(registry); - - scanner.setBeanNameGenerator(beanNameGenerator); - - scanner.addIncludeFilter(new AnnotationTypeFilter(FeignClient.class, true, true)); - - for (String packageToScan : packagesToScan) { - - // Registers @DubboService Bean first - scanner.scan(packageToScan); - - // Finds all BeanDefinitionHolders of @DubboService whether @ComponentScan scans or not. - Set beanDefinitionHolders = - findServiceBeanDefinitionHolders(scanner, packageToScan, registry, beanNameGenerator); - - if (!CollectionUtils.isEmpty(beanDefinitionHolders)) { - - for (BeanDefinitionHolder beanDefinitionHolder : beanDefinitionHolders) { - registerServiceBean(beanDefinitionHolder, registry, scanner); - } - - if (logger.isInfoEnabled()) { - logger.info(beanDefinitionHolders.size() + " annotated Dubbo's @Service Components { " + - beanDefinitionHolders + - " } were scanned under package[" + packageToScan + "]"); - } - - } else { - - if (logger.isWarnEnabled()) { - logger.warn("No Spring Bean annotating Dubbo's @Service was found under package[" - + packageToScan + "]"); - } - - } - - } - - } - - /** - * It'd better to use BeanNameGenerator instance that should reference - * thus it maybe a potential problem on bean name generation. - * - * @param registry {@link BeanDefinitionRegistry} - * @return {@link BeanNameGenerator} instance - * @see SingletonBeanRegistry - * @see AnnotationConfigUtils#CONFIGURATION_BEAN_NAME_GENERATOR - * @see ConfigurationClassPostProcessor#processConfigBeanDefinitions - * @since 2.5.8 - */ - private BeanNameGenerator resolveBeanNameGenerator(BeanDefinitionRegistry registry) { - - BeanNameGenerator beanNameGenerator = null; - - if (registry instanceof SingletonBeanRegistry) { - SingletonBeanRegistry singletonBeanRegistry = SingletonBeanRegistry.class.cast(registry); - beanNameGenerator = (BeanNameGenerator) singletonBeanRegistry.getSingleton(CONFIGURATION_BEAN_NAME_GENERATOR); - } - - if (beanNameGenerator == null) { - - if (logger.isInfoEnabled()) { - - logger.info("BeanNameGenerator bean can't be found in BeanFactory with name [" - + CONFIGURATION_BEAN_NAME_GENERATOR + "]"); - logger.info("BeanNameGenerator will be a instance of " + - AnnotationBeanNameGenerator.class.getName() + - " , it maybe a potential problem on bean name generation."); - } - - beanNameGenerator = new AnnotationBeanNameGenerator(); - - } - - return beanNameGenerator; - - } - - /** - * Finds a {@link Set} of {@link BeanDefinitionHolder BeanDefinitionHolders} whose bean type annotated - * - * @param scanner {@link ClassPathBeanDefinitionScanner} - * @param packageToScan pachage to scan - * @param registry {@link BeanDefinitionRegistry} - * @return non-null - * @since 2.5.8 - */ - private Set findServiceBeanDefinitionHolders( - ClassPathBeanDefinitionScanner scanner, String packageToScan, BeanDefinitionRegistry registry, - BeanNameGenerator beanNameGenerator) { - - Set beanDefinitions = scanner.findCandidateComponents(packageToScan); - - Set beanDefinitionHolders = new LinkedHashSet(beanDefinitions.size()); - - for (BeanDefinition beanDefinition : beanDefinitions) { - - String beanName = beanNameGenerator.generateBeanName(beanDefinition, registry); - BeanDefinitionHolder beanDefinitionHolder = new BeanDefinitionHolder(beanDefinition, beanName); - beanDefinitionHolders.add(beanDefinitionHolder); - - } - - return beanDefinitionHolders; - - } - - /** - * - * @param beanDefinitionHolder - * @param registry - * @param scanner - * @see ServiceBean - * @see BeanDefinition - */ - private void registerServiceBean(BeanDefinitionHolder beanDefinitionHolder, BeanDefinitionRegistry registry, - DubboClassPathBeanDefinitionScanner scanner) { - - Class beanClass = resolveClass(beanDefinitionHolder); - - DubboService service = findAnnotation(beanClass, DubboService.class); - if (null == service) { - service = this.defaultService; - } - - Class interfaceClass = resolveServiceInterfaceClass(beanClass, service); - - String annotatedServiceBeanName = beanDefinitionHolder.getBeanName(); - - AbstractBeanDefinition serviceBeanDefinition = - buildServiceBeanDefinition(service, interfaceClass, annotatedServiceBeanName); - - // ServiceBean Bean name - String beanName = generateServiceBeanName(service, interfaceClass, annotatedServiceBeanName); - - if (registry.containsBeanDefinition(beanName)) { // check duplicated candidate bean - registry.registerBeanDefinition(beanName, serviceBeanDefinition); - - if (logger.isInfoEnabled()) { - logger.warn("The BeanDefinition[" + serviceBeanDefinition + - "] of ServiceBean has been registered with name : " + beanName); - } - - } else { - - if (logger.isWarnEnabled()) { - logger.warn("The Duplicated BeanDefinition[" + serviceBeanDefinition + - "] of ServiceBean[ bean name : " + beanName + - "] was be found , Did @DubboComponentScan scan to same package in many times?"); - } - - } - - } - - - private String generateServiceBeanName(DubboService service, Class interfaceClass, String annotatedServiceBeanName) { - - StringBuilder beanNameBuilder = new StringBuilder(ServiceBean.class.getSimpleName()); - - beanNameBuilder.append(SEPARATOR).append(annotatedServiceBeanName); - - String interfaceClassName = interfaceClass.getName(); - - beanNameBuilder.append(SEPARATOR).append(interfaceClassName); - - String version = service.version(); - - if (StringUtils.hasText(version)) { - beanNameBuilder.append(SEPARATOR).append(version); - } - - String group = service.group(); - - if (StringUtils.hasText(group)) { - beanNameBuilder.append(SEPARATOR).append(group); - } - - return beanNameBuilder.toString(); - - } - - private Class resolveServiceInterfaceClass(Class annotatedServiceBeanClass, DubboService service) { - - Class interfaceClass = service.interfaceClass(); - - if (void.class.equals(interfaceClass)) { - - interfaceClass = null; - - String interfaceClassName = service.interfaceName(); - - if (StringUtils.hasText(interfaceClassName)) { - if (ClassUtils.isPresent(interfaceClassName, classLoader)) { - interfaceClass = resolveClassName(interfaceClassName, classLoader); - } - } - - } - - if (interfaceClass == null) { - - Class[] allInterfaces = annotatedServiceBeanClass.getInterfaces(); - - if (allInterfaces.length > 0) { - interfaceClass = allInterfaces[0]; - } - - } - - Assert.notNull(interfaceClass, - "@Service interfaceClass() or interfaceName() or interface class must be present!"); - - Assert.isTrue(interfaceClass.isInterface(), - "The type that was annotated @Service is not an interface!"); - - return interfaceClass; - } - - private Class resolveClass(BeanDefinitionHolder beanDefinitionHolder) { - - BeanDefinition beanDefinition = beanDefinitionHolder.getBeanDefinition(); - - return resolveClass(beanDefinition); - - } - - private Class resolveClass(BeanDefinition beanDefinition) { - - String beanClassName = beanDefinition.getBeanClassName(); - - return resolveClassName(beanClassName, classLoader); - - } - - private Set resolvePackagesToScan(Set packagesToScan) { - Set resolvedPackagesToScan = new LinkedHashSet(packagesToScan.size()); - for (String packageToScan : packagesToScan) { - if (StringUtils.hasText(packageToScan)) { - String resolvedPackageToScan = environment.resolvePlaceholders(packageToScan.trim()); - resolvedPackagesToScan.add(resolvedPackageToScan); - } - } - return resolvedPackagesToScan; - } - - private AbstractBeanDefinition buildServiceBeanDefinition(DubboService service, Class interfaceClass, - String annotatedServiceBeanName) { - - BeanDefinitionBuilder builder = rootBeanDefinition(ServiceBean.class); - - AbstractBeanDefinition beanDefinition = builder.getBeanDefinition(); - - MutablePropertyValues propertyValues = beanDefinition.getPropertyValues(); - - String[] ignoreAttributeNames = of("provider", "monitor", "application", "module", "registry", "protocol", "interface"); - - propertyValues.addPropertyValues(new AnnotationPropertyValuesAdapter(service, environment, ignoreAttributeNames)); - - // References "ref" property to annotated-@Service Bean - addPropertyReference(builder, "ref", annotatedServiceBeanName); - // Set interface - builder.addPropertyValue("interface", interfaceClass.getName()); - - /** - * Add {@link com.alibaba.dubbo.config.ProviderConfig} Bean reference - */ - String providerConfigBeanName = service.provider(); - if (StringUtils.hasText(providerConfigBeanName)) { - addPropertyReference(builder, "provider", providerConfigBeanName); - } - - /** - * Add {@link com.alibaba.dubbo.config.MonitorConfig} Bean reference - */ - String monitorConfigBeanName = service.monitor(); - if (StringUtils.hasText(monitorConfigBeanName)) { - addPropertyReference(builder, "monitor", monitorConfigBeanName); - } - - /** - * Add {@link com.alibaba.dubbo.config.ApplicationConfig} Bean reference - */ - String applicationConfigBeanName = service.application(); - if (StringUtils.hasText(applicationConfigBeanName)) { - addPropertyReference(builder, "application", applicationConfigBeanName); - } - - /** - * Add {@link com.alibaba.dubbo.config.ModuleConfig} Bean reference - */ - String moduleConfigBeanName = service.module(); - if (StringUtils.hasText(moduleConfigBeanName)) { - addPropertyReference(builder, "module", moduleConfigBeanName); - } - - - /** - * Add {@link com.alibaba.dubbo.config.RegistryConfig} Bean reference - */ - String[] registryConfigBeanNames = service.registry(); - - List registryRuntimeBeanReferences = toRuntimeBeanReferences(registryConfigBeanNames); - - if (!registryRuntimeBeanReferences.isEmpty()) { - builder.addPropertyValue("registries", registryRuntimeBeanReferences); - } - - /** - * Add {@link com.alibaba.dubbo.config.ProtocolConfig} Bean reference - */ - String[] protocolConfigBeanNames = service.protocol(); - - List protocolRuntimeBeanReferences = toRuntimeBeanReferences(protocolConfigBeanNames); - - if (!protocolRuntimeBeanReferences.isEmpty()) { - builder.addPropertyValue("protocols", protocolRuntimeBeanReferences); - } - - return builder.getBeanDefinition(); - - } - - - private ManagedList toRuntimeBeanReferences(String... beanNames) { - - ManagedList runtimeBeanReferences = new ManagedList(); - - if (!ObjectUtils.isEmpty(beanNames)) { - - for (String beanName : beanNames) { - - String resolvedBeanName = environment.resolvePlaceholders(beanName); - - runtimeBeanReferences.add(new RuntimeBeanReference(resolvedBeanName)); - } - - } - - return runtimeBeanReferences; - - } - - private void addPropertyReference(BeanDefinitionBuilder builder, String propertyName, String beanName) { - String resolvedBeanName = environment.resolvePlaceholders(beanName); - builder.addPropertyReference(propertyName, resolvedBeanName); - } - - - @Override - public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { - - } - - @Override - public void setEnvironment(Environment environment) { - this.environment = environment; - } - - @Override - public void setResourceLoader(ResourceLoader resourceLoader) { - this.resourceLoader = resourceLoader; - } - - @Override - public void setBeanClassLoader(ClassLoader classLoader) { - this.classLoader = classLoader; - } - -} diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/main/java/com/alibaba/rpc/common/RpcConstance.java b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/main/java/com/alibaba/rpc/common/RpcConstance.java deleted file mode 100644 index d21bc8ef87..0000000000 --- a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/main/java/com/alibaba/rpc/common/RpcConstance.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.alibaba.rpc.common; - -/** - * @author :Lictory - * @date : 2024/08/19 - */ -public interface RpcConstance { - String LOCAL_HOST_HEADER = "http://localhost:"; -} diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/main/java/com/alibaba/rpc/core/SpringCloudAlibabaDubboAutoConfiguration.java b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/main/java/com/alibaba/rpc/core/SpringCloudAlibabaDubboAutoConfiguration.java deleted file mode 100644 index b16f1c6a93..0000000000 --- a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/main/java/com/alibaba/rpc/core/SpringCloudAlibabaDubboAutoConfiguration.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.alibaba.rpc.core; - - - -import com.alibaba.rpc.annotation.DubboFeignBuilder; -import com.alibaba.rpc.annotation.FeignClientToDubboProviderBeanPostProcessor; -import feign.Feign; -import org.apache.dubbo.config.AbstractConfig; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.source.ConfigurationPropertySources; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.Environment; - -import java.util.Set; - -import static java.util.Collections.emptySet; -import static org.apache.dubbo.spring.boot.util.DubboUtils.BASE_PACKAGES_PROPERTY_NAME; -import static org.apache.dubbo.spring.boot.util.DubboUtils.DUBBO_PREFIX; - -/** - * @author :Lictory - * @date : 2024/07/31 - */ - -//@Configuration -//@ConditionalOnProperty(prefix = DUBBO_PREFIX, name = "enabled", matchIfMissing = true, havingValue = "true") -//@ConditionalOnClass(AbstractConfig.class) -//public class SpringCloudAlibabaDubboAutoConfiguration { -// @ConditionalOnProperty(name = BASE_PACKAGES_PROPERTY_NAME) -// @ConditionalOnClass(ConfigurationPropertySources.class) -// @Bean -// public FeignClientToDubboProviderBeanPostProcessor feignClientToDubboProviderBeanPostProcessor(Environment environment) { -// Set packagesToScan = environment.getProperty(BASE_PACKAGES_PROPERTY_NAME, Set.class, emptySet()); -// return new FeignClientToDubboProviderBeanPostProcessor(packagesToScan); -// } -// -// @Bean -// public Feign.Builder feignDubboBuilder() { -// return new DubboFeignBuilder(); -// } -//} - diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/main/resources/META-INF/spring.factories b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/main/resources/META-INF/spring.factories deleted file mode 100644 index d62d2b6774..0000000000 --- a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/main/resources/META-INF/spring.factories +++ /dev/null @@ -1,3 +0,0 @@ -org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ - com.alibaba.dubbo.consumer.config.RpcFeignConfiguration,\ - com.alibaba.dubbo.consumer.config.RpcRegistryConfiguration,\ diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/main/resources/application.yml b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/main/resources/application.yml deleted file mode 100644 index 8b13789179..0000000000 --- a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/main/resources/application.yml +++ /dev/null @@ -1 +0,0 @@ - diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/test/java/RpcExchangersForTriTest.java b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/test/java/RpcExchangersForTriTest.java deleted file mode 100644 index 2e811f8996..0000000000 --- a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/test/java/RpcExchangersForTriTest.java +++ /dev/null @@ -1,62 +0,0 @@ -import org.apache.dubbo.common.URL; -import org.apache.dubbo.common.constants.CommonConstants; -import org.apache.dubbo.common.utils.NetUtils; -import org.apache.dubbo.config.ApplicationConfig; -import org.apache.dubbo.config.context.ConfigManager; -import org.apache.dubbo.remoting.RemotingException; -import org.apache.dubbo.remoting.api.connection.AbstractConnectionClient; -import org.apache.dubbo.remoting.api.pu.AbstractPortUnificationServer; -import org.apache.dubbo.remoting.api.pu.DefaultPuHandler; -import org.apache.dubbo.remoting.exchange.*; -import org.apache.dubbo.remoting.exchange.support.ExchangeHandlerAdapter; -import org.apache.dubbo.remoting.exchange.support.ExchangeHandlerDispatcher; -import org.apache.dubbo.remoting.transport.netty.NettyPortUnificationServer; -import org.apache.dubbo.rpc.model.ApplicationModel; -import org.apache.dubbo.rpc.model.FrameworkModel; -import org.apache.dubbo.rpc.model.ModuleModel; -import org.junit.Test; -import org.junit.jupiter.api.BeforeAll; - -import java.util.concurrent.CompletableFuture; - -import static org.apache.dubbo.common.constants.CommonConstants.EXECUTOR_MANAGEMENT_MODE_DEFAULT; - -/** - * @author :Lictory - * @date : 2024/08/28 - */ -public class RpcExchangersForTriTest { - private static URL url; - - @BeforeAll - public static void init() throws RemotingException { - int port = NetUtils.getAvailablePort(); - url = URL.valueOf("tri://127.0.0.1:" + port); - ApplicationModel applicationModel = ApplicationModel.defaultModel(); - ApplicationConfig applicationConfig = new ApplicationConfig("provider-app"); - applicationConfig.setExecutorManagementMode(EXECUTOR_MANAGEMENT_MODE_DEFAULT); - applicationModel.getApplicationConfigManager().setApplication(applicationConfig); - ConfigManager configManager = new ConfigManager(applicationModel); - configManager.setApplication(applicationConfig); - configManager.getApplication(); - applicationModel.setConfigManager(configManager); - url = url.setScopeModel(applicationModel); - ModuleModel moduleModel = applicationModel.getDefaultModule(); - url = url.putAttribute(CommonConstants.SCOPE_MODEL, moduleModel); - } - - @Test - public void test() throws RemotingException { - AbstractPortUnificationServer server = new NettyPortUnificationServer(url, new ExchangeHandlerAdapter(FrameworkModel.defaultModel()) { - @Override - public CompletableFuture reply(ExchangeChannel channel, Object msg) throws RemotingException { - System.out.println(msg); - return CompletableFuture.completedFuture("GET"); - } - }); - AbstractConnectionClient client = PortUnificationExchanger.connect(url, new DefaultPuHandler()); - client.send("test"); - } -} - - diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/test/java/RpcExchangersTest.java b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/test/java/RpcExchangersTest.java deleted file mode 100644 index a39733197f..0000000000 --- a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-core/src/test/java/RpcExchangersTest.java +++ /dev/null @@ -1,104 +0,0 @@ -import org.apache.dubbo.common.URL; -import org.apache.dubbo.common.constants.CommonConstants; -import org.apache.dubbo.common.utils.Log; -import org.apache.dubbo.common.utils.NetUtils; -import org.apache.dubbo.config.ApplicationConfig; -import org.apache.dubbo.config.context.ConfigManager; -import org.apache.dubbo.remoting.Channel; -import org.apache.dubbo.remoting.RemotingException; -import org.apache.dubbo.remoting.RemotingServer; -import org.apache.dubbo.remoting.api.connection.AbstractConnectionClient; -import org.apache.dubbo.remoting.api.pu.AbstractPortUnificationServer; -import org.apache.dubbo.remoting.api.pu.DefaultPuHandler; -import org.apache.dubbo.remoting.exchange.*; -import org.apache.dubbo.remoting.exchange.support.ExchangeHandlerAdapter; -import org.apache.dubbo.remoting.exchange.support.ExchangeHandlerDispatcher; -import org.apache.dubbo.remoting.transport.ChannelHandlerAdapter; -import org.apache.dubbo.remoting.transport.netty.NettyPortUnificationServer; -import org.apache.dubbo.remoting.transport.netty4.NettyConnectionClient; -import org.apache.dubbo.rpc.model.ApplicationModel; -import org.apache.dubbo.rpc.model.FrameworkModel; -import org.apache.dubbo.rpc.model.ModuleModel; - -import org.apache.dubbo.rpc.protocol.tri.rest.support.spring.HandlerInterceptorAdapter; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; - -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutionException; - -import static org.apache.dubbo.common.constants.CommonConstants.*; - -/** - * @author :Lictory - * @date : 2024/08/27 - */ -public class RpcExchangersTest { - private static URL url; - - private static ExchangeClient client; - private static ExchangeServer server; - -// @BeforeAll -// public static void init() throws RemotingException { -// int port = NetUtils.getAvailablePort(); -// url = URL.valueOf("empty://127.0.0.1:" + port + "?foo=bar"); -// ApplicationModel applicationModel = ApplicationModel.defaultModel(); -// ApplicationConfig applicationConfig = new ApplicationConfig("provider-app"); -// applicationConfig.setExecutorManagementMode(EXECUTOR_MANAGEMENT_MODE_DEFAULT); -// applicationModel.getApplicationConfigManager().setApplication(applicationConfig); -// ConfigManager configManager = new ConfigManager(applicationModel); -// configManager.setApplication(applicationConfig); -// configManager.getApplication(); -// applicationModel.setConfigManager(configManager); -// url = url.setScopeModel(applicationModel); -// ModuleModel moduleModel = applicationModel.getDefaultModule(); -// url = url.putAttribute(CommonConstants.SCOPE_MODEL, moduleModel); -// } - -// @Test -// void test() throws RemotingException { -// AbstractPortUnificationServer server = new NettyPortUnificationServer(url, new ExchangeHandlerAdapter(FrameworkModel.defaultModel()) { -// @Override -// public CompletableFuture reply(ExchangeChannel channel, Object msg) throws RemotingException { -// System.out.println(msg); -// return CompletableFuture.completedFuture("收到了哥们"); -// } -// }); -// -// server.send("1"); -// } -// - -// @BeforeAll - public static void init(){ - url=URL.valueOf("tri://127.0.0.1:"+ NetUtils.getAvailablePort()); - url.addParameter(PROTOCOL_KEY,TRIPLE); - } -// @Test -static void testExchangers() throws RemotingException, ExecutionException, InterruptedException { - init(); - getExchangersServer(); - getExchangersClient(); -// CompletableFuture test = client.request("test"); -// System.out.println(test.get()); -} - - static void getExchangersServer() throws RemotingException { - server= Exchangers.bind(url, new ExchangeHandlerAdapter(FrameworkModel.defaultModel()) { - @Override - public CompletableFuture reply(ExchangeChannel channel, Object msg) throws RemotingException { - System.out.println(msg); - return CompletableFuture.completedFuture("received request"+msg); - } - }); - } - static void getExchangersClient() throws RemotingException { - client= Exchangers.connect(url); - } - - public static void main(String[] args) throws RemotingException, ExecutionException, InterruptedException { - testExchangers(); - } -} diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/pom.xml b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/pom.xml index 402abdffe5..27c1154164 100644 --- a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/pom.xml +++ b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/pom.xml @@ -12,42 +12,13 @@ spring-cloud-alibaba-rpc-provider - com.alibaba.cloud - spring-cloud-starter-alibaba-nacos-discovery - - - - - - - - - - - - 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-api + org.example + spring-cloud-starter-alibaba-rpc ${revision} com.alibaba.cloud - spring-cloud-alibaba-rpc-core + spring-cloud-alibaba-rpc-api ${revision} diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/config/RpcRegistryConfiguration.java b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/config/RpcRegistryConfiguration.java deleted file mode 100644 index 7b898c8cd3..0000000000 --- a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/config/RpcRegistryConfiguration.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.alibaba.dubbo.provider.config; - -import com.alibaba.cloud.nacos.registry.NacosRegistration; - -import com.alibaba.rpc.metadata.HttpMetadata; -import com.alibaba.rpc.metadata.HttpRpcResponse; -import jakarta.annotation.PostConstruct; -import jakarta.servlet.ServletException; - -import org.apache.dubbo.common.URL; - -import org.apache.dubbo.common.utils.NetUtils; - -import org.apache.dubbo.remoting.RemotingException; -import org.apache.dubbo.remoting.RemotingServer; -import org.apache.dubbo.remoting.exchange.*; -import org.apache.dubbo.remoting.exchange.support.ExchangeHandlerAdapter; - -import org.apache.dubbo.rpc.model.FrameworkModel; -import org.apache.dubbo.rpc.model.ModuleModel; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Configuration; -import org.springframework.mock.web.MockHttpServletRequest; -import org.springframework.web.context.WebApplicationContext; -import org.springframework.web.servlet.DispatcherServlet; - -import java.io.IOException; -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.CompletableFuture; -import java.util.stream.Collectors; - -import static org.apache.dubbo.common.constants.CommonConstants.EXECUTOR_MANAGEMENT_MODE_DEFAULT; - -import org.springframework.mock.web.MockHttpServletResponse; - -/** - * @author :Lictory - * @date : 2024/08/12 - */ - -@Configuration -public class RpcRegistryConfiguration { - - @Autowired - private NacosRegistration nacosRegistration; - - @PostConstruct - public void init(){ - Map metadata = new HashMap<>(); - int port = NetUtils.getAvailablePort(); -// initLocalServer(nacosRegistration.getHost(), port); - System.setProperty("rpc.netty.port", String.valueOf(port)); - System.setProperty("rpc.netty.host",nacosRegistration.getHost()); - metadata.put("rpc.netty.port", String.valueOf(port)); - nacosRegistration.getMetadata().putAll(metadata); - } -} diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/handler/RpcNettyServerHandler.java b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/handler/RpcNettyServerHandler.java deleted file mode 100644 index b4c61b657b..0000000000 --- a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/handler/RpcNettyServerHandler.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.alibaba.dubbo.provider.handler; - -/** - * @author :Lictory - * @date : 2024/08/15 - */ -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelInboundHandlerAdapter; - -public class RpcNettyServerHandler extends ChannelInboundHandlerAdapter { - - @Override - public void channelRead(ChannelHandlerContext ctx, Object msg) { - System.out.println("Server received: " + msg); - ctx.writeAndFlush("Message from server: " + msg); - } - - @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { - cause.printStackTrace(); - ctx.close(); - } -} - diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/handler/ServerReplyHandler.java b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/handler/ServerReplyHandler.java deleted file mode 100644 index a89b6188f9..0000000000 --- a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/handler/ServerReplyHandler.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.alibaba.dubbo.provider.handler; - - -import com.alibaba.dubbo.consumer.entity.User; -import org.apache.dubbo.remoting.RemotingException; -import org.apache.dubbo.remoting.exchange.ExchangeChannel; -import org.apache.dubbo.remoting.exchange.support.Replier; - - -/** - * @author :Lictory - * @date : 2024/08/14 - */ - -public class ServerReplyHandler implements Replier { - - @Override - public Object reply(ExchangeChannel channel, Object request) throws RemotingException { - System.out.println("收到来自" + channel.getRemoteAddress() + "的请求" + request.toString()); - User user=new User(); - user.setId(6); - return user; - } -} diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/server/CaptureHttpServletResponseWrapper.java b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/server/CaptureHttpServletResponseWrapper.java deleted file mode 100644 index 08cf50651e..0000000000 --- a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/server/CaptureHttpServletResponseWrapper.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.alibaba.dubbo.provider.server; - -import jakarta.servlet.http.HttpServletResponse; -import jakarta.servlet.http.HttpServletResponseWrapper; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.PrintWriter; - -/** - * @author :Lictory - * @date : 2024/08/23 - */ - - -public class CaptureHttpServletResponseWrapper extends HttpServletResponseWrapper { - - private final ByteArrayOutputStream capture; - private final PrintWriter writer; - private int httpStatus; - - public CaptureHttpServletResponseWrapper(HttpServletResponse response) { - super(response); - this.capture = new ByteArrayOutputStream(); - this.writer = new PrintWriter(capture); - } - - @Override - public PrintWriter getWriter() { - return writer; - } - - @Override - public void setStatus(int sc) { - super.setStatus(sc); - this.httpStatus = sc; - } - - @Override - public void flushBuffer() throws IOException { - super.flushBuffer(); - writer.flush(); - } - - public byte[] getCaptureAsBytes() { - return capture.toByteArray(); - } - - public String getCaptureAsString() { - return capture.toString(); - } - - public int getHttpStatus() { - return this.httpStatus; - } -} - diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/server/CoyoteRequestBuilder.java b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/server/CoyoteRequestBuilder.java deleted file mode 100644 index 052fee3378..0000000000 --- a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/server/CoyoteRequestBuilder.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.alibaba.dubbo.provider.server; - -import com.alibaba.rpc.metadata.HttpMetadata; -import org.apache.coyote.Request; - -import java.util.Collection; -import java.util.Map; - -/** - * @author :Lictory - * @date : 2024/08/23 - */ -public class CoyoteRequestBuilder { - public static Request initializeCoyoteRequest(HttpMetadata httpMetadata, String url) { - Request coyoteRequest = new Request(); - - // 设置 HTTP 方法 - String method = httpMetadata.getMethod(); - coyoteRequest.method().setString(method); - - // 设置请求的完整 URL 和 URI - coyoteRequest.requestURI().setString(url); - //TODO 如果 URL 中包含查询字符串,设置查询参数 -// String[] urlParts = url.split("\\?", 2); -// if (urlParts.length == 2) { -// String queryString = urlParts[1]; -// coyoteRequest.queryString().setString(queryString); -// } - - //TODO 设置请求体(如果有) -// if (httpMetadata.getBody() != null) { -// coyoteRequest. (new ByteChunk().append(httpMetadata.getBody())); -// } - - // 设置请求头 - Map> headers = httpMetadata.getHeaders(); - for (Map.Entry> entry : headers.entrySet()) { - String headerName = entry.getKey(); - for (String headerValue : entry.getValue()) { - coyoteRequest.getMimeHeaders().addValue(headerName).setString(headerValue); - } - } - return coyoteRequest; - } -} diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/server/RpcNettyServer.java b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/server/RpcNettyServer.java deleted file mode 100644 index d485e4772c..0000000000 --- a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/server/RpcNettyServer.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.alibaba.dubbo.provider.server; - -/** - * @author :Lictory - * @date : 2024/08/15 - */ -import io.netty.bootstrap.ServerBootstrap; -import io.netty.channel.ChannelFuture; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.ChannelPipeline; -import io.netty.channel.EventLoopGroup; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.SocketChannel; -import io.netty.channel.socket.nio.NioServerSocketChannel; -import io.netty.handler.codec.string.StringDecoder; -import io.netty.handler.codec.string.StringEncoder; - -public class RpcNettyServer { - - private final String host; - private final int port; - - public RpcNettyServer(String host,int port) { - this.host=host; - this.port = port; - } - - public void start() throws InterruptedException { - EventLoopGroup bossGroup = new NioEventLoopGroup(1); - EventLoopGroup workerGroup = new NioEventLoopGroup(); - - try { - ServerBootstrap serverBootstrap = new ServerBootstrap(); - serverBootstrap.group(bossGroup, workerGroup) - .channel(NioServerSocketChannel.class) - .childHandler(new ChannelInitializer() { - @Override - protected void initChannel(SocketChannel ch) { - ChannelPipeline pipeline = ch.pipeline(); - pipeline.addLast(new StringDecoder()); // 解码器 - pipeline.addLast(new StringEncoder()); // 编码器 -// pipeline.addLast(new NettyServerHandler()); // 自定义处理器 - } - }); - - ChannelFuture channelFuture = serverBootstrap.bind(host,port).sync(); - System.out.println("Server started on port " + port); - channelFuture.channel().closeFuture().sync(); - } finally { - bossGroup.shutdownGracefully(); - workerGroup.shutdownGracefully(); - } - } - -// public static void main(String[] args) throws InterruptedException { -// new NettyServer(8080).start(); -// } -} - diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/server/RpcToHttpServletRequestWrapper.java b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/server/RpcToHttpServletRequestWrapper.java deleted file mode 100644 index 9177f7a98e..0000000000 --- a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/server/RpcToHttpServletRequestWrapper.java +++ /dev/null @@ -1,108 +0,0 @@ -package com.alibaba.dubbo.provider.server; - -import jakarta.servlet.ReadListener; -import jakarta.servlet.ServletInputStream; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletRequestWrapper; - -import java.io.ByteArrayInputStream; -import java.util.Collection; -import java.util.Collections; -import java.util.Enumeration; -import java.util.Map; - -/** - * @author :Lictory - * @date : 2024/08/22 - */ -public class RpcToHttpServletRequestWrapper extends HttpServletRequestWrapper { - private final byte[] body; - private final Map> headers; - private final String method; - private final String requestURI; - private final String queryString; - - public RpcToHttpServletRequestWrapper(HttpServletRequest request, String method, String requestURI, byte[] body, Map> headers) { - super(request); - this.body = body != null ? body : new byte[0]; - this.headers = headers; - this.method = method; - this.requestURI = requestURI; - // 可能需要从url中提取query string - this.queryString = request.getQueryString(); - } - - @Override - public String getMethod() { - return this.method; - } - - @Override - public String getRequestURI() { - return this.requestURI; - } - @Override - public String getQueryString() { - return this.queryString; - } - - @Override - public Enumeration getHeaders(String name) { - Collection headerValues = headers.get(name); - if (headerValues != null) { - return Collections.enumeration(headerValues); - } - return Collections.enumeration(Collections.emptyList()); - } - - @Override - public Enumeration getHeaderNames() { - return Collections.enumeration(headers.keySet()); - } - - @Override - public String getHeader(String name) { - Collection headerValues = headers.get(name); - if (headerValues != null && !headerValues.isEmpty()) { - return headerValues.iterator().next(); // 返回第一个值 - } - return null; - } - - @Override - public ServletInputStream getInputStream() { - return new ServletInputStream() { - private final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body); - - @Override - public int read() { - return byteArrayInputStream.read(); - } - - @Override - public boolean isFinished() { - return byteArrayInputStream.available() == 0; - } - - @Override - public boolean isReady() { - return true; - } - - @Override - public void setReadListener(ReadListener readListener) { - // Not used in this implementation - } - }; - } - - @Override - public int getContentLength() { - return body.length; - } - - @Override - public String getContentType() { - return getHeader("Content-Type"); // 使用 headers 中的 Content-Type - } -} diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/util/RpcSerializeUtil.java b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/util/RpcSerializeUtil.java deleted file mode 100644 index 6ff4f0714c..0000000000 --- a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/util/RpcSerializeUtil.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.alibaba.dubbo.provider.util; - -import org.apache.dubbo.common.serialize.ObjectOutput; -import org.apache.dubbo.common.serialize.hessian2.Hessian2Serialization; -import org.springframework.stereotype.Component; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; - -/** - * @author :Lictory - * @date : 2024/08/13 - */ - - -public class RpcSerializeUtil { - public static byte[] serializeRequestByHessian2(Object result) { - Hessian2Serialization serialization = new Hessian2Serialization(); - ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); - try { - ObjectOutput objectOutput = serialization.serialize(null, byteArrayOutputStream); - - objectOutput.writeObject(result); - objectOutput.flushBuffer(); - } catch (Exception e) { - - } - return byteArrayOutputStream.toByteArray(); - } - //TODO : add the rest of the serialization methods -} diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/resources/application.yml b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/resources/application.yml index 27a7ac14dd..6b72a0eacf 100644 --- a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/resources/application.yml +++ b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/resources/application.yml @@ -1,3 +1,4 @@ + spring: main: allow-bean-definition-overriding: true @@ -7,11 +8,15 @@ spring: nacos: discovery: server-addr: 10.21.32.154:8848 - port: 8080 - + rpc: + enable: true + netty: + host: 127.0.0.1 + port: 20880 management: endpoints: web: exposure: include: "*" - +server: + port: 8080 From b3600f4debd7fde83b23fe3c75285479569fe8a9 Mon Sep 17 00:00:00 2001 From: Lictory <995372381@qq.com> Date: Sun, 22 Sep 2024 14:26:06 +0800 Subject: [PATCH 4/7] fix: Remove duplicate dependence --- pom.xml | 2 - spring-cloud-alibaba-coverage/pom.xml | 6 +++ .../spring-cloud-starter-alibaba-rpc/pom.xml | 5 ++- .../cloud/rpc/client/FeignRpcClient.java | 36 ++++++++++------ .../rpc/config/RpcFeignConfiguration.java | 17 ++++++++ .../rpc/config/RpcRegistryConfiguration.java | 23 +++++++++- .../cloud/rpc/constant/RpcConstant.java | 10 ----- .../cloud/rpc/metadata/HttpMetadata.java | 16 +++++++ .../cloud/rpc/metadata/HttpRpcResponse.java | 16 +++++++ .../rpc/server/RpcDispatcherServlet.java | 17 ++++++++ .../rpc/server/RpcNettyServerListener.java | 36 ++++++++++++---- .../MockHttpServletRequestConverter.java | 27 ++++++++++-- .../alibaba/cloud/rpc/utils/SpringUtil.java | 21 ++++++++-- .../alibaba/cloud/rpc/utils/UrlResolver.java | 42 ++++++++++++++----- spring-cloud-alibaba-tests/pom.xml | 3 +- 15 files changed, 222 insertions(+), 55 deletions(-) delete mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/constant/RpcConstant.java diff --git a/pom.xml b/pom.xml index e737145e4b..6fc392b594 100644 --- a/pom.xml +++ b/pom.xml @@ -108,8 +108,6 @@ spring-cloud-alibaba-starters spring-cloud-alibaba-coverage spring-cloud-alibaba-tests - spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc - spring-cloud-alibaba-tests/rpc-tests diff --git a/spring-cloud-alibaba-coverage/pom.xml b/spring-cloud-alibaba-coverage/pom.xml index 6a0b650b6a..8279e00417 100644 --- a/spring-cloud-alibaba-coverage/pom.xml +++ b/spring-cloud-alibaba-coverage/pom.xml @@ -70,6 +70,12 @@ ${revision} + + com.alibaba.cloud + spring-cloud-starter-alibaba-rpc + ${revision} + + diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/pom.xml b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/pom.xml index 4a9e88a326..15f2f54c81 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/pom.xml +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/pom.xml @@ -10,9 +10,8 @@ ../pom.xml - org.example spring-cloud-starter-alibaba-rpc - + Spring Cloud Starter Alibaba Rpc 19 19 @@ -22,6 +21,7 @@ org.springframework.boot spring-boot-starter + true org.springframework.cloud @@ -43,6 +43,7 @@ org.springframework.boot spring-boot-starter-web + true com.alibaba.cloud diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/client/FeignRpcClient.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/client/FeignRpcClient.java index 66cb3f46e1..a2deec7e1f 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/client/FeignRpcClient.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/client/FeignRpcClient.java @@ -1,5 +1,26 @@ +/* + * Copyright 2013-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.alibaba.cloud.rpc.client; +import java.util.Collection; +import java.util.Map; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; + import com.alibaba.cloud.rpc.metadata.HttpMetadata; import com.alibaba.cloud.rpc.metadata.HttpRpcResponse; import com.alibaba.cloud.rpc.utils.UrlResolver; @@ -8,21 +29,14 @@ import feign.Response; import org.apache.dubbo.remoting.RemotingException; import org.apache.dubbo.remoting.exchange.ExchangeClient; -import org.springframework.cloud.client.loadbalancer.LoadBalancerClient; -import java.util.Collection; -import java.util.Map; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutionException; +import org.springframework.cloud.client.loadbalancer.LoadBalancerClient; /** * @author :Lictory * @date : 2024/08/12 */ - - public class FeignRpcClient implements Client { - private LoadBalancerClient loadBalancerClient; private ExchangeClient client; @@ -32,7 +46,6 @@ public FeignRpcClient(LoadBalancerClient loadBalancerClient) { @Override public Response execute(Request request, Request.Options options) { - String url = UrlResolver.resolveOriginalUrl(loadBalancerClient, request.url()); this.client = UrlResolver.getClient(url); HttpMetadata httpMetadata = initHttpMetadata( @@ -45,7 +58,8 @@ public Response execute(Request request, Request.Options options) { try { CompletableFuture future = client.request(httpMetadata); httpRpcResponse = (HttpRpcResponse) future.get(); - } catch (RemotingException | InterruptedException | ExecutionException e) { + } + catch (RemotingException | InterruptedException | ExecutionException e) { throw new RuntimeException(e); } return Response.builder() @@ -66,5 +80,3 @@ private HttpMetadata initHttpMetadata(String url, String method, Map reply(ExchangeChannel channel, Object msg) { MockHttpServletResponse response = new MockHttpServletResponse(); try { dispatcherServlet.service(request, response); - } catch (ServletException | IOException e) { + } + catch (ServletException | IOException e) { throw new RuntimeException(e); } HttpRpcResponse httpRpcResponse = new HttpRpcResponse(); @@ -72,7 +89,8 @@ public CompletableFuture reply(ExchangeChannel channel, Object msg) { httpRpcResponse.setHeaders(convertHeaders(response)); return CompletableFuture.completedFuture(httpRpcResponse); } - }); + } + ); } catch (RemotingException e) { throw new RuntimeException(e); } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/utils/MockHttpServletRequestConverter.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/utils/MockHttpServletRequestConverter.java index 713eb07e07..3e08dd6bd1 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/utils/MockHttpServletRequestConverter.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/utils/MockHttpServletRequestConverter.java @@ -1,16 +1,37 @@ +/* + * Copyright 2013-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.alibaba.cloud.rpc.utils; +import java.util.Collection; +import java.util.Map; + import com.alibaba.cloud.rpc.metadata.HttpMetadata; + import org.springframework.mock.web.MockHttpServletRequest; -import java.util.Collection; -import java.util.Map; /** * @author :Lictory * @date : 2024/08/23 */ -public class MockHttpServletRequestConverter { +public final class MockHttpServletRequestConverter { + private MockHttpServletRequestConverter() { + + } public static MockHttpServletRequest getMockHttpServletRequest(HttpMetadata httpMetadata, String url) { // 创建 MockHttpServletRequest 实例 MockHttpServletRequest mockRequest = new MockHttpServletRequest(); diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/utils/SpringUtil.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/utils/SpringUtil.java index 4ce21892b3..a1c5e465a9 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/utils/SpringUtil.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/utils/SpringUtil.java @@ -1,3 +1,19 @@ +/* + * Copyright 2013-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.alibaba.cloud.rpc.utils; import org.springframework.beans.BeansException; @@ -15,11 +31,8 @@ @Component public final class SpringUtil implements BeanFactoryPostProcessor, ApplicationContextAware { - /** - * Spring应用上下文环境 - */ - public static ConfigurableListableBeanFactory beanFactory; + public static ConfigurableListableBeanFactory beanFactory; public static ApplicationContext applicationContext; @Override diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/utils/UrlResolver.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/utils/UrlResolver.java index 7a3cb946aa..96acde0068 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/utils/UrlResolver.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/utils/UrlResolver.java @@ -1,24 +1,42 @@ +/* + * Copyright 2013-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.alibaba.cloud.rpc.utils; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.concurrent.ConcurrentHashMap; + 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.cloud.client.ServiceInstance; import org.springframework.cloud.client.loadbalancer.LoadBalancerClient; -import java.net.MalformedURLException; -import java.net.URL; -import java.util.concurrent.ConcurrentHashMap; - /** * @author :Lictory * @date : 2024/08/13 */ -public class UrlResolver { +public final class UrlResolver { - //TODO add ExchangerClient into + private UrlResolver() { + } private static final ConcurrentHashMap clientMap = new ConcurrentHashMap<>(); @@ -26,7 +44,8 @@ public static String resolveOriginalUrl(LoadBalancerClient loadBalancerClient, S URL result = null; try { result = new URL(url); - } catch (MalformedURLException e) { + } + catch (MalformedURLException e) { throw new RuntimeException(e); } String serviceId = result.getHost(); @@ -44,8 +63,10 @@ private static void initLocalClient(String url) { public void received(Channel channel, Object message) { super.received(channel, message); } - })); - } catch (RemotingException e) { + } + )); + } + catch (RemotingException e) { throw new RuntimeException(e); } } @@ -62,7 +83,8 @@ public static String getPathFromUrl(String urlString) { path.append("#").append(url.getRef()); } return path.toString(); - } catch (MalformedURLException e) { + } + catch (MalformedURLException e) { throw new IllegalArgumentException("Invalid URL: " + urlString, e); } } diff --git a/spring-cloud-alibaba-tests/pom.xml b/spring-cloud-alibaba-tests/pom.xml index cb11432df8..2c2de31388 100644 --- a/spring-cloud-alibaba-tests/pom.xml +++ b/spring-cloud-alibaba-tests/pom.xml @@ -18,6 +18,7 @@ sentinel-tests + rpc-tests @@ -54,4 +55,4 @@ - \ No newline at end of file + From 49bb6ff09dda80833470c24625feb57b1857e388 Mon Sep 17 00:00:00 2001 From: Lictory <995372381@qq.com> Date: Fri, 27 Sep 2024 17:28:43 +0800 Subject: [PATCH 5/7] fix: Remove duplicate dependence --- spring-cloud-alibaba-dependencies/pom.xml | 8 +- .../spring-cloud-starter-alibaba-rpc/pom.xml | 29 +++-- .../alibaba/cloud/rpc/RpcConfiguration.java | 50 ++++++++ .../com/alibaba/cloud/rpc/RpcProperties.java | 61 ++++++++++ .../cloud/rpc/client/FeignRpcClient.java | 82 +++++++------ .../rpc/config/RpcFeignConfiguration.java | 16 +-- .../rpc/config/RpcRegistryConfiguration.java | 36 +++--- .../cloud/rpc/metadata/HttpMetadata.java | 56 ++++----- .../cloud/rpc/metadata/HttpRpcResponse.java | 73 +++++------ .../rpc/server/RpcDispatcherServlet.java | 12 +- .../rpc/server/RpcNettyServerListener.java | 110 ++++++++--------- .../MockHttpServletRequestConverter.java | 55 +++++---- .../alibaba/cloud/rpc/utils/SpringUtil.java | 47 ------- .../alibaba/cloud/rpc/utils/UrlResolver.java | 115 +++++++++--------- .../main/resources/META-INF/spring.factories | 3 - ...ot.autoconfigure.AutoConfiguration.imports | 3 + .../dubbo/consumer/api/FooService.java | 20 ++- .../dubbo/consumer/api/ProviderService.java | 17 ++- .../alibaba/dubbo/consumer/entity/User.java | 16 +++ .../spring-cloud-alibaba-rpc-consumer/pom.xml | 2 +- .../dubbo/consumer/ConsumerApplication.java | 16 +++ .../dubbo/consumer/service/TestService.java | 17 ++- .../src/main/resources/application.yml | 10 +- .../resources/security/serialize.allowlist | 4 +- .../spring-cloud-alibaba-rpc-provider/pom.xml | 2 +- .../dubbo/provider/ProviderApplication.java | 18 ++- .../provider/controller/TestController.java | 17 ++- .../provider/service/impl/FooServiceImpl.java | 17 ++- .../service/impl/ProviderServiceImpl.java | 16 +++ .../src/main/resources/application.yml | 11 +- .../resources/security/serialize.allowlist | 4 +- 31 files changed, 581 insertions(+), 362 deletions(-) create mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/RpcConfiguration.java create mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/RpcProperties.java delete mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/utils/SpringUtil.java delete mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/resources/META-INF/spring.factories create mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports diff --git a/spring-cloud-alibaba-dependencies/pom.xml b/spring-cloud-alibaba-dependencies/pom.xml index 95477c237c..94dce88613 100644 --- a/spring-cloud-alibaba-dependencies/pom.xml +++ b/spring-cloud-alibaba-dependencies/pom.xml @@ -211,9 +211,15 @@ org.apache.dubbo - dubbo + dubbo-remoting-netty4 ${dubbo.version} + + org.apache.dubbo + dubbo-serialization-hessian2 + ${dubbo.version} + + com.alibaba.cloud diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/pom.xml b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/pom.xml index 15f2f54c81..8791e9a518 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/pom.xml +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/pom.xml @@ -12,11 +12,7 @@ spring-cloud-starter-alibaba-rpc Spring Cloud Starter Alibaba Rpc - - 19 - 19 - UTF-8 - + org.springframework.boot @@ -27,31 +23,38 @@ org.springframework.cloud spring-cloud-starter-openfeign + + + org.springframework.boot + spring-boot-starter-actuator + org.apache.dubbo - dubbo + dubbo-remoting-netty4 3.3.0-beta.4 - org.springframework.boot - spring-boot-starter-test + org.apache.dubbo + dubbo-serialization-hessian2 + 3.3.0-beta.4 + - org.springframework.cloud - spring-cloud-openfeign-core + org.springframework.boot + spring-boot-starter-test + org.springframework.boot spring-boot-starter-web - true com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery - org.springframework.boot - spring-boot-configuration-processor + org.springframework.cloud + spring-cloud-starter-loadbalancer diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/RpcConfiguration.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/RpcConfiguration.java new file mode 100644 index 0000000000..bf4926ad93 --- /dev/null +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/RpcConfiguration.java @@ -0,0 +1,50 @@ +/* + * Copyright 2013-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.rpc; + +import com.alibaba.cloud.rpc.utils.UrlResolver; + +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; + + +/** + * @author :Lictory + * @date : 2024/09/27 + */ + +@AutoConfiguration +@ConditionalOnProperty(prefix = RpcProperties.PREFIX, name = "enabled", havingValue = "true", matchIfMissing = true) +@EnableConfigurationProperties(RpcProperties.class) +public class RpcConfiguration { + @Bean + @ConditionalOnMissingBean + public RpcProperties rpcProperties() { + return new RpcProperties(); + } + + + @Bean + @ConditionalOnMissingBean + public UrlResolver initUrlResolver() { + return new UrlResolver(); + } + +} diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/RpcProperties.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/RpcProperties.java new file mode 100644 index 0000000000..9d16dcfc03 --- /dev/null +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/RpcProperties.java @@ -0,0 +1,61 @@ +/* + * Copyright 2013-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.rpc; + +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * @author :Lictory + * @date : 2024/09/27 + */ +@ConfigurationProperties("spring.cloud.rpc.netty") +public class RpcProperties { + + /** + * config prefix. + */ + public static final String PREFIX = "spring.cloud.rpc"; + + /** + * prefix of netty port. + */ + public static final String NETTY_PORT_PREFIX = "spring.cloud.rpc.netty.port"; + + /** + * prefix of netty host. + */ + public static final String HOST_PREFIX = "spring.cloud.rpc.netty.host"; + + private Integer port; + private String host; + + public Integer getPort() { + return port; + } + + public String getHost() { + return host; + } + + public void setPort(Integer port) { + this.port = port; + } + + public void setHost(String host) { + this.host = host; + } +} diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/client/FeignRpcClient.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/client/FeignRpcClient.java index a2deec7e1f..50f7c3d148 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/client/FeignRpcClient.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/client/FeignRpcClient.java @@ -30,53 +30,57 @@ import org.apache.dubbo.remoting.RemotingException; import org.apache.dubbo.remoting.exchange.ExchangeClient; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.client.loadbalancer.LoadBalancerClient; +import org.springframework.stereotype.Component; /** * @author :Lictory * @date : 2024/08/12 */ + +@Component public class FeignRpcClient implements Client { - private LoadBalancerClient loadBalancerClient; - private ExchangeClient client; + @Autowired + private LoadBalancerClient loadBalancerClient; + private ExchangeClient client; - public FeignRpcClient(LoadBalancerClient loadBalancerClient) { - this.loadBalancerClient = loadBalancerClient; - } + @Autowired + private UrlResolver urlResolver; - @Override - public Response execute(Request request, Request.Options options) { - String url = UrlResolver.resolveOriginalUrl(loadBalancerClient, request.url()); - this.client = UrlResolver.getClient(url); - HttpMetadata httpMetadata = initHttpMetadata( - UrlResolver.getPathFromUrl(request.url()), - request.httpMethod().name(), - request.headers(), - request.body() - ); - HttpRpcResponse httpRpcResponse = null; - try { - CompletableFuture future = client.request(httpMetadata); - httpRpcResponse = (HttpRpcResponse) future.get(); - } - catch (RemotingException | InterruptedException | ExecutionException e) { - throw new RuntimeException(e); - } - return Response.builder() - .status(httpRpcResponse.getStatusCode()) - .reason(httpRpcResponse.getReasonPhrase()) - .headers(httpRpcResponse.getHeaders()) - .body(httpRpcResponse.getBody()) - .request(request) - .build(); - } + @Override + public Response execute(Request request, Request.Options options) { + String url = urlResolver.resolveOriginalUrl(loadBalancerClient, request.url()); + this.client = urlResolver.getClient(url); + HttpMetadata httpMetadata = initHttpMetadata( + urlResolver.getPathFromUrl(request.url()), + request.httpMethod().name(), + request.headers(), + request.body() + ); + HttpRpcResponse httpRpcResponse = null; + try { + CompletableFuture future = client.request(httpMetadata); + httpRpcResponse = (HttpRpcResponse) future.get(); + } + catch (RemotingException | InterruptedException | ExecutionException e) { + throw new RuntimeException(e); + } + return Response.builder() + .status(httpRpcResponse.getStatusCode()) + .reason(httpRpcResponse.getReasonPhrase()) + .headers(httpRpcResponse.getHeaders()) + .body(httpRpcResponse.getBody()) + .request(request) + .build(); + } - private HttpMetadata initHttpMetadata(String url, String method, Map> headers, byte[] body) { - HttpMetadata httpMetadata = new HttpMetadata(); - httpMetadata.setBody(body); - httpMetadata.setUrl(url); - httpMetadata.setHeaders(headers); - httpMetadata.setMethod(method); - return httpMetadata; - } + private HttpMetadata initHttpMetadata(String url, String method, Map> headers, byte[] body) { + HttpMetadata httpMetadata = new HttpMetadata(); + httpMetadata.setBody(body); + httpMetadata.setUrl(url); + httpMetadata.setHeaders(headers); + httpMetadata.setMethod(method); + return httpMetadata; + } } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/config/RpcFeignConfiguration.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/config/RpcFeignConfiguration.java index 4a03e52559..51716b8bd6 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/config/RpcFeignConfiguration.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/config/RpcFeignConfiguration.java @@ -16,11 +16,10 @@ package com.alibaba.cloud.rpc.config; +import com.alibaba.cloud.rpc.RpcProperties; import com.alibaba.cloud.rpc.client.FeignRpcClient; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.cloud.client.loadbalancer.LoadBalancerClient; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -30,13 +29,10 @@ */ @Configuration(proxyBeanMethods = false) -@ConditionalOnProperty(prefix = "spring.rpc.enable", matchIfMissing = true) +@ConditionalOnProperty(prefix = RpcProperties.PREFIX, name = "enabled", havingValue = "true", matchIfMissing = true) public class RpcFeignConfiguration { - @Autowired - private LoadBalancerClient loadBalancerClient; - - @Bean - public feign.Client feignClient() { - return new FeignRpcClient(loadBalancerClient); - } + @Bean + public feign.Client feignClient() { + return new FeignRpcClient(); + } } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/config/RpcRegistryConfiguration.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/config/RpcRegistryConfiguration.java index 6d808dc02e..f616fbe440 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/config/RpcRegistryConfiguration.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/config/RpcRegistryConfiguration.java @@ -21,11 +21,14 @@ import java.util.Map; import com.alibaba.cloud.nacos.registry.NacosRegistration; +import com.alibaba.cloud.rpc.RpcProperties; +import com.alibaba.cloud.rpc.server.RpcNettyServerListener; import jakarta.annotation.PostConstruct; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -35,19 +38,24 @@ */ @Configuration(proxyBeanMethods = false) -@ConditionalOnProperty(prefix = "spring.rpc.enable", matchIfMissing = true) +@ConditionalOnProperty(prefix = RpcProperties.PREFIX, name = "enabled", havingValue = "true", matchIfMissing = true) public class RpcRegistryConfiguration { - @Autowired - private NacosRegistration nacosRegistration; - - @Value("${spring.rpc.netty.port}") - private Integer port; - - @PostConstruct - public void init() { - Map metadata = new HashMap<>(); - metadata.put("spring.rpc.netty.port", String.valueOf(port)); - nacosRegistration.getMetadata().putAll(metadata); - } + @Autowired + private NacosRegistration nacosRegistration; + @Autowired + private RpcProperties rpcProperties; + + @PostConstruct + public void init() { + Map metadata = new HashMap<>(); + metadata.put(RpcProperties.NETTY_PORT_PREFIX, String.valueOf(rpcProperties.getPort())); + nacosRegistration.getMetadata().putAll(metadata); + } + + @Bean + @ConditionalOnMissingBean + public RpcNettyServerListener initRpcNettyServerListener() { + return new RpcNettyServerListener(); + } } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/metadata/HttpMetadata.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/metadata/HttpMetadata.java index c034a23b7e..024f7d688b 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/metadata/HttpMetadata.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/metadata/HttpMetadata.java @@ -26,43 +26,43 @@ */ public class HttpMetadata implements Serializable { - private String url; + private String url; - private String method; + private String method; - private byte[] body; + private byte[] body; - private Map> headers; + private Map> headers; - public String getUrl() { - return url; - } + public String getUrl() { + return url; + } - public void setUrl(String url) { - this.url = url; - } + public void setUrl(String url) { + this.url = url; + } - public String getMethod() { - return method; - } + public String getMethod() { + return method; + } - public void setMethod(String method) { - this.method = method; - } + public void setMethod(String method) { + this.method = method; + } - public byte[] getBody() { - return body; - } + public byte[] getBody() { + return body; + } - public void setBody(byte[] body) { - this.body = body; - } + public void setBody(byte[] body) { + this.body = body; + } - public Map> getHeaders() { - return headers; - } + public Map> getHeaders() { + return headers; + } - public void setHeaders(Map> headers) { - this.headers = headers; - } + public void setHeaders(Map> headers) { + this.headers = headers; + } } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/metadata/HttpRpcResponse.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/metadata/HttpRpcResponse.java index 37fc3e0852..c2d2dcdb32 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/metadata/HttpRpcResponse.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/metadata/HttpRpcResponse.java @@ -25,50 +25,51 @@ * @date : 2024/08/16 */ public class HttpRpcResponse implements Serializable { - private int statusCode; - private String reasonPhrase; - private Map> headers; - private byte[] body; - public HttpRpcResponse(int statusCode, String reasonPhrase, Map> headers, byte[] body) { - this.statusCode = statusCode; - this.reasonPhrase = reasonPhrase; - this.headers = headers; - this.body = body; - } + private int statusCode; + private String reasonPhrase; + private Map> headers; + private byte[] body; - public HttpRpcResponse() { - } + public HttpRpcResponse(int statusCode, String reasonPhrase, Map> headers, byte[] body) { + this.statusCode = statusCode; + this.reasonPhrase = reasonPhrase; + this.headers = headers; + this.body = body; + } - public int getStatusCode() { - return statusCode; - } + public HttpRpcResponse() { + } - public void setStatusCode(int statusCode) { - this.statusCode = statusCode; - } + public int getStatusCode() { + return statusCode; + } - public String getReasonPhrase() { - return reasonPhrase; - } + public void setStatusCode(int statusCode) { + this.statusCode = statusCode; + } - public void setReasonPhrase(String reasonPhrase) { - this.reasonPhrase = reasonPhrase; - } + public String getReasonPhrase() { + return reasonPhrase; + } - public Map> getHeaders() { - return headers; - } + public void setReasonPhrase(String reasonPhrase) { + this.reasonPhrase = reasonPhrase; + } - public void setHeaders(Map> headers) { - this.headers = headers; - } + public Map> getHeaders() { + return headers; + } - public byte[] getBody() { - return body; - } + public void setHeaders(Map> headers) { + this.headers = headers; + } - public void setBody(byte[] body) { - this.body = body; - } + public byte[] getBody() { + return body; + } + + public void setBody(byte[] body) { + this.body = body; + } } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/server/RpcDispatcherServlet.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/server/RpcDispatcherServlet.java index 1257ed9b0e..3f3ea5d7ca 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/server/RpcDispatcherServlet.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/server/RpcDispatcherServlet.java @@ -16,8 +16,8 @@ package com.alibaba.cloud.rpc.server; -import com.alibaba.cloud.rpc.utils.SpringUtil; +import org.springframework.context.ApplicationContext; import org.springframework.web.servlet.DispatcherServlet; /** @@ -26,9 +26,9 @@ */ public class RpcDispatcherServlet extends DispatcherServlet { - public RpcDispatcherServlet() { - super(); - // 初始化mapping - onRefresh(SpringUtil.applicationContext); - } + public RpcDispatcherServlet(ApplicationContext applicationContext) { + super(); + // initial mapping + onRefresh(applicationContext); + } } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/server/RpcNettyServerListener.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/server/RpcNettyServerListener.java index 4e97299cf5..d203b5744d 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/server/RpcNettyServerListener.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/server/RpcNettyServerListener.java @@ -23,6 +23,7 @@ import java.util.Map; import java.util.concurrent.CompletableFuture; +import com.alibaba.cloud.rpc.RpcProperties; import com.alibaba.cloud.rpc.metadata.HttpMetadata; import com.alibaba.cloud.rpc.metadata.HttpRpcResponse; import com.alibaba.cloud.rpc.utils.MockHttpServletRequestConverter; @@ -36,77 +37,76 @@ import org.apache.dubbo.remoting.exchange.support.ExchangeHandlerAdapter; import org.apache.dubbo.rpc.model.FrameworkModel; -import org.springframework.beans.factory.annotation.Value; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.context.event.ApplicationReadyEvent; +import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationListener; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockHttpServletResponse; -import org.springframework.stereotype.Component; /** * @author :Lictory * @date : 2024/08/18 */ -@Component + public class RpcNettyServerListener implements ApplicationListener { - private ExchangeServer server; + private ExchangeServer server; - @Value("${spring.rpc.netty.port}") - private String port; + @Autowired + private RpcProperties rpcProperties; - @Value("${spring.rpc.netty.host}") - private String host; + private RpcDispatcherServlet dispatcherServlet; - private RpcDispatcherServlet dispatcherServlet; + @Autowired + private ApplicationContext applicationContext; - @Override - public void onApplicationEvent(ApplicationReadyEvent event) { - initLocalServer(host, Integer.parseInt(port)); - this.dispatcherServlet = new RpcDispatcherServlet(); - } + @Override + public void onApplicationEvent(ApplicationReadyEvent event) { + initLocalServer(rpcProperties.getHost(), rpcProperties.getPort()); + this.dispatcherServlet = new RpcDispatcherServlet(applicationContext); + } - private void initLocalServer(String host, int port) { - URL url = URL.valueOf("exchange://" + host + ":" + port); - try { - this.server = Exchangers.bind(url, new ExchangeHandlerAdapter(FrameworkModel.defaultModel()) { - @Override - public CompletableFuture reply(ExchangeChannel channel, Object msg) { - HttpMetadata httpMetadata = (HttpMetadata) msg; - String url = httpMetadata.getUrl(); - System.out.println(url); - MockHttpServletRequest request = MockHttpServletRequestConverter.getMockHttpServletRequest(httpMetadata, url); - MockHttpServletResponse response = new MockHttpServletResponse(); - try { - dispatcherServlet.service(request, response); - } - catch (ServletException | IOException e) { - throw new RuntimeException(e); - } - HttpRpcResponse httpRpcResponse = new HttpRpcResponse(); - httpRpcResponse.setStatusCode(response.getStatus()); - httpRpcResponse.setBody(response.getContentAsByteArray()); - httpRpcResponse.setReasonPhrase(response.getErrorMessage()); - httpRpcResponse.setHeaders(convertHeaders(response)); - return CompletableFuture.completedFuture(httpRpcResponse); - } - } - ); - } catch (RemotingException e) { - throw new RuntimeException(e); - } - } + private void initLocalServer(String host, int port) { + URL url = URL.valueOf("exchange://" + host + ":" + port); + try { + this.server = Exchangers.bind(url, new ExchangeHandlerAdapter(FrameworkModel.defaultModel()) { + @Override + public CompletableFuture reply(ExchangeChannel channel, Object msg) { + HttpMetadata httpMetadata = (HttpMetadata) msg; + String url = httpMetadata.getUrl(); + System.out.println(url); + MockHttpServletRequest request = MockHttpServletRequestConverter.getMockHttpServletRequest(httpMetadata, url); + MockHttpServletResponse response = new MockHttpServletResponse(); + try { + dispatcherServlet.service(request, response); + } + catch (ServletException | IOException e) { + throw new RuntimeException(e); + } + HttpRpcResponse httpRpcResponse = new HttpRpcResponse(); + httpRpcResponse.setStatusCode(response.getStatus()); + httpRpcResponse.setBody(response.getContentAsByteArray()); + httpRpcResponse.setReasonPhrase(response.getErrorMessage()); + httpRpcResponse.setHeaders(convertHeaders(response)); + return CompletableFuture.completedFuture(httpRpcResponse); + } + } + ); + } + catch (RemotingException e) { + throw new RuntimeException(e); + } + } - public Map> convertHeaders(HttpServletResponse httpServletResponse) { - Map> feignHeaders = new HashMap<>(); - // 遍历所有头部名称 - for (String headerName : httpServletResponse.getHeaderNames()) { - // 获取对应头部名称的所有值 - Collection headerValues = httpServletResponse.getHeaders(headerName); - // 将其加入到 feignHeaders 中 - feignHeaders.put(headerName, new ArrayList<>(headerValues)); - } - return feignHeaders; - } + public Map> convertHeaders(HttpServletResponse httpServletResponse) { + Map> feignHeaders = new HashMap<>(); + // get all headers + for (String headerName : httpServletResponse.getHeaderNames()) { + Collection headerValues = httpServletResponse.getHeaders(headerName); + feignHeaders.put(headerName, new ArrayList<>(headerValues)); + } + return feignHeaders; + } } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/utils/MockHttpServletRequestConverter.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/utils/MockHttpServletRequestConverter.java index 3e08dd6bd1..1c5b5f82ae 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/utils/MockHttpServletRequestConverter.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/utils/MockHttpServletRequestConverter.java @@ -29,31 +29,32 @@ * @date : 2024/08/23 */ public final class MockHttpServletRequestConverter { - private MockHttpServletRequestConverter() { - - } - public static MockHttpServletRequest getMockHttpServletRequest(HttpMetadata httpMetadata, String url) { - // 创建 MockHttpServletRequest 实例 - MockHttpServletRequest mockRequest = new MockHttpServletRequest(); - - // 设置 HTTP 方法 - mockRequest.setMethod(httpMetadata.getMethod()); - - // 设置 URL - mockRequest.setRequestURI(url); - - // 设置请求头 - Map> headers = httpMetadata.getHeaders(); - for (Map.Entry> entry : headers.entrySet()) { - String headerName = entry.getKey(); - for (String headerValue : entry.getValue()) { - mockRequest.addHeader(headerName, headerValue); - } - } - // 设置请求体(如果有) - if (httpMetadata.getBody() != null) { - mockRequest.setContent(httpMetadata.getBody()); - } - return mockRequest; - } + private MockHttpServletRequestConverter() { + + } + + public static MockHttpServletRequest getMockHttpServletRequest(HttpMetadata httpMetadata, String url) { + // create MockHttpServletRequest instance + MockHttpServletRequest mockRequest = new MockHttpServletRequest(); + + // set HTTP method + mockRequest.setMethod(httpMetadata.getMethod()); + + // set URL + mockRequest.setRequestURI(url); + + // set request headers + Map> headers = httpMetadata.getHeaders(); + for (Map.Entry> entry : headers.entrySet()) { + String headerName = entry.getKey(); + for (String headerValue : entry.getValue()) { + mockRequest.addHeader(headerName, headerValue); + } + } + // set request body(if exist) + if (httpMetadata.getBody() != null) { + mockRequest.setContent(httpMetadata.getBody()); + } + return mockRequest; + } } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/utils/SpringUtil.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/utils/SpringUtil.java deleted file mode 100644 index a1c5e465a9..0000000000 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/utils/SpringUtil.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2013-2023 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.alibaba.cloud.rpc.utils; - -import org.springframework.beans.BeansException; -import org.springframework.beans.factory.config.BeanFactoryPostProcessor; -import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationContextAware; -import org.springframework.stereotype.Component; - -/** - * @author :Lictory - * @date : 2024/08/31 - */ - - -@Component -public final class SpringUtil implements BeanFactoryPostProcessor, ApplicationContextAware { - - public static ConfigurableListableBeanFactory beanFactory; - public static ApplicationContext applicationContext; - - @Override - public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { - SpringUtil.beanFactory = beanFactory; - } - - @Override - public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { - SpringUtil.applicationContext = applicationContext; - } -} diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/utils/UrlResolver.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/utils/UrlResolver.java index 96acde0068..2679a49a90 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/utils/UrlResolver.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/java/com/alibaba/cloud/rpc/utils/UrlResolver.java @@ -20,6 +20,7 @@ import java.net.URL; import java.util.concurrent.ConcurrentHashMap; +import com.alibaba.cloud.rpc.RpcProperties; import org.apache.dubbo.remoting.Channel; import org.apache.dubbo.remoting.RemotingException; import org.apache.dubbo.remoting.exchange.ExchangeClient; @@ -33,69 +34,67 @@ * @author :Lictory * @date : 2024/08/13 */ -public final class UrlResolver { - private UrlResolver() { - } +public class UrlResolver { - private static final ConcurrentHashMap clientMap = new ConcurrentHashMap<>(); + private static final ConcurrentHashMap clientMap = new ConcurrentHashMap<>(); - public static String resolveOriginalUrl(LoadBalancerClient loadBalancerClient, String url) { - URL result = null; - try { - result = new URL(url); - } - catch (MalformedURLException e) { - throw new RuntimeException(e); - } - String serviceId = result.getHost(); - ServiceInstance choose = loadBalancerClient.choose(serviceId); - int nettyPort = Integer.parseInt(choose.getMetadata().get("spring.rpc.netty.port")); - return "exchange://" + choose.getHost() + ":" + nettyPort; - } + public String resolveOriginalUrl(LoadBalancerClient loadBalancerClient, String url) { + URL result = null; + try { + result = new URL(url); + } + catch (MalformedURLException e) { + throw new RuntimeException(e); + } + String serviceId = result.getHost(); + ServiceInstance choose = loadBalancerClient.choose(serviceId); + int nettyPort = Integer.parseInt(choose.getMetadata().get(RpcProperties.NETTY_PORT_PREFIX)); + return "exchange://" + choose.getHost() + ":" + nettyPort; + } - private static void initLocalClient(String url) { + private void initLocalClient(String url) { - org.apache.dubbo.common.URL targetUrl = org.apache.dubbo.common.URL.valueOf(url); - try { - clientMap.put(url, Exchangers.connect(targetUrl, new ExchangeHandlerDispatcher() { - @Override - public void received(Channel channel, Object message) { - super.received(channel, message); - } - } - )); - } - catch (RemotingException e) { - throw new RuntimeException(e); - } - } + org.apache.dubbo.common.URL targetUrl = org.apache.dubbo.common.URL.valueOf(url); + try { + clientMap.put(url, Exchangers.connect(targetUrl, new ExchangeHandlerDispatcher() { + @Override + public void received(Channel channel, Object message) { + super.received(channel, message); + } + } + )); + } + catch (RemotingException e) { + throw new RuntimeException(e); + } + } - public static String getPathFromUrl(String urlString) { - try { - URL url = new URL(urlString); - StringBuilder path = new StringBuilder(); - path.append(url.getPath()); - if (url.getQuery() != null) { - path.append("?").append(url.getQuery()); - } - if (url.getRef() != null) { - path.append("#").append(url.getRef()); - } - return path.toString(); - } - catch (MalformedURLException e) { - throw new IllegalArgumentException("Invalid URL: " + urlString, e); - } - } + public String getPathFromUrl(String urlString) { + try { + URL url = new URL(urlString); + StringBuilder path = new StringBuilder(); + path.append(url.getPath()); + if (url.getQuery() != null) { + path.append("?").append(url.getQuery()); + } + if (url.getRef() != null) { + path.append("#").append(url.getRef()); + } + return path.toString(); + } + catch (MalformedURLException e) { + throw new IllegalArgumentException("Invalid URL: " + urlString, e); + } + } - public static ExchangeClient getClient(String url) { - if (url == null || url.length() == 0) { - return null; - } - if (!clientMap.containsKey(url)) { - initLocalClient(url); - } - return clientMap.get(url); - } + public ExchangeClient getClient(String url) { + if (url == null || url.length() == 0) { + return null; + } + if (!clientMap.containsKey(url)) { + initLocalClient(url); + } + return clientMap.get(url); + } } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/resources/META-INF/spring.factories b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/resources/META-INF/spring.factories deleted file mode 100644 index 96435c9292..0000000000 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/resources/META-INF/spring.factories +++ /dev/null @@ -1,3 +0,0 @@ -org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ - com.alibaba.cloud.rpc.config.RpcRegistryConfiguration,\ - com.alibaba.cloud.rpc.config.RpcFeignConfiguration diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000000..77bdbb3e14 --- /dev/null +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1,3 @@ +com.alibaba.cloud.rpc.RpcConfiguration +com.alibaba.cloud.rpc.config.RpcFeignConfiguration +com.alibaba.cloud.rpc.config.RpcRegistryConfiguration 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 index edaf742ebe..1081c1beab 100644 --- 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 @@ -1,11 +1,24 @@ -package com.alibaba.dubbo.consumer.api; - +/* + * Copyright 2013-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +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 @@ -15,6 +28,7 @@ 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 index 7181d2c613..9b167c9572 100644 --- 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 @@ -1,6 +1,21 @@ +/* + * Copyright 2013-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + 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; 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 index 9d5cdb747c..fb2992b6ad 100644 --- 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 @@ -1,3 +1,19 @@ +/* + * Copyright 2013-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.alibaba.dubbo.consumer.entity; import java.io.Serializable; 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 index b8575e7af3..1cc2f0c001 100644 --- 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 @@ -12,7 +12,7 @@ spring-cloud-alibaba-rpc-consumer - org.example + com.alibaba.cloud spring-cloud-starter-alibaba-rpc ${revision} 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 index 163e07f333..a392ec0428 100644 --- 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 @@ -1,3 +1,19 @@ +/* + * Copyright 2013-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.alibaba.dubbo.consumer; import org.springframework.boot.SpringApplication; diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/java/com/alibaba/dubbo/consumer/service/TestService.java b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/java/com/alibaba/dubbo/consumer/service/TestService.java index f21867a7cb..3a0f99f5ae 100644 --- a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/java/com/alibaba/dubbo/consumer/service/TestService.java +++ b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/java/com/alibaba/dubbo/consumer/service/TestService.java @@ -1,5 +1,20 @@ -package com.alibaba.dubbo.consumer.service; +/* + * Copyright 2013-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.dubbo.consumer.service; import com.alibaba.dubbo.consumer.api.ProviderService; import org.springframework.beans.factory.annotation.Autowired; diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/resources/application.yml b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/resources/application.yml index d10aaf2d1a..0c5d78dc0a 100644 --- a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/resources/application.yml +++ b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/resources/application.yml @@ -7,11 +7,11 @@ spring: nacos: discovery: server-addr: 10.21.32.154:8848 - rpc: - enable: true - netty: - host: 127.0.0.1 - port: 20880 + rpc: + enabled: true + netty: + host: 127.0.0.1 + port: 20880 server: port: 8081 diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/resources/security/serialize.allowlist b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/resources/security/serialize.allowlist index b19c3887ef..5421d68abe 100644 --- a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/resources/security/serialize.allowlist +++ b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/resources/security/serialize.allowlist @@ -18,5 +18,5 @@ # org.apache.dubbo.common.serialize.hessian2 -com.alibaba.rpc.metadata.HttpMetadata -com.alibaba.rpc.metadata.HttpRpcResponse +com.alibaba.cloud.rpc.metadata.HttpMetadata +com.alibaba.cloud.rpc.metadata.HttpRpcResponse diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/pom.xml b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/pom.xml index 27c1154164..a6e0a20dc2 100644 --- a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/pom.xml +++ b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/pom.xml @@ -12,7 +12,7 @@ spring-cloud-alibaba-rpc-provider - org.example + com.alibaba.cloud spring-cloud-starter-alibaba-rpc ${revision} diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/ProviderApplication.java b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/ProviderApplication.java index aa8014d7c1..d4ec3c9975 100644 --- a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/ProviderApplication.java +++ b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/ProviderApplication.java @@ -1,3 +1,19 @@ +/* + * Copyright 2013-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.alibaba.dubbo.provider; import org.springframework.boot.SpringApplication; @@ -9,7 +25,7 @@ * @date : 2024/08/01 */ -@SpringBootApplication(scanBasePackages = "com.alibaba.dubbo.provider") +@SpringBootApplication @EnableFeignClients public class ProviderApplication { public static void main(String[] args) { diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/controller/TestController.java b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/controller/TestController.java index 4e23e09331..8286533a33 100644 --- a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/controller/TestController.java +++ b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/controller/TestController.java @@ -1,7 +1,22 @@ +/* + * Copyright 2013-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.alibaba.dubbo.provider.controller; import com.alibaba.dubbo.consumer.api.ProviderService; -import com.alibaba.dubbo.provider.service.impl.ProviderServiceImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/service/impl/FooServiceImpl.java b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/service/impl/FooServiceImpl.java index 947ac955b2..538de1c5df 100644 --- a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/service/impl/FooServiceImpl.java +++ b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/service/impl/FooServiceImpl.java @@ -1,9 +1,24 @@ +/* + * Copyright 2013-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.alibaba.dubbo.provider.service.impl; import com.alibaba.dubbo.consumer.entity.User; import com.alibaba.dubbo.consumer.api.FooService; -import org.apache.dubbo.config.annotation.DubboService; import org.springframework.stereotype.Service; /** diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/service/impl/ProviderServiceImpl.java b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/service/impl/ProviderServiceImpl.java index 0a45ffee64..08fb5adf9f 100644 --- a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/service/impl/ProviderServiceImpl.java +++ b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/service/impl/ProviderServiceImpl.java @@ -1,3 +1,19 @@ +/* + * Copyright 2013-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.alibaba.dubbo.provider.service.impl; diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/resources/application.yml b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/resources/application.yml index 6b72a0eacf..195382710b 100644 --- a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/resources/application.yml +++ b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/resources/application.yml @@ -1,4 +1,3 @@ - spring: main: allow-bean-definition-overriding: true @@ -8,11 +7,11 @@ spring: nacos: discovery: server-addr: 10.21.32.154:8848 - rpc: - enable: true - netty: - host: 127.0.0.1 - port: 20880 + rpc: + enabled: true + netty: + host: 127.0.0.1 + port: 20881 management: endpoints: web: diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/resources/security/serialize.allowlist b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/resources/security/serialize.allowlist index b19c3887ef..5421d68abe 100644 --- a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/resources/security/serialize.allowlist +++ b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/resources/security/serialize.allowlist @@ -18,5 +18,5 @@ # org.apache.dubbo.common.serialize.hessian2 -com.alibaba.rpc.metadata.HttpMetadata -com.alibaba.rpc.metadata.HttpRpcResponse +com.alibaba.cloud.rpc.metadata.HttpMetadata +com.alibaba.cloud.rpc.metadata.HttpRpcResponse From 76b67629adef18d72c55b196b9620a5abe9a7ab3 Mon Sep 17 00:00:00 2001 From: Lictory <995372381@qq.com> Date: Sun, 27 Oct 2024 21:04:04 +0800 Subject: [PATCH 6/7] fix: update code style --- spring-cloud-alibaba-dependencies/pom.xml | 5 --- .../spring-cloud-starter-alibaba-rpc/pom.xml | 12 +----- .../consumer => }/api/ProviderService.java | 21 +++++++--- .../dubbo/consumer/api/FooService.java | 35 ---------------- .../alibaba/dubbo/consumer/entity/User.java | 35 ---------------- .../spring-cloud-alibaba-rpc-consumer/pom.xml | 4 -- .../dubbo/consumer/ConsumerApplication.java | 8 ++-- .../dubbo/consumer/service/TestService.java | 28 +++++++------ .../dubbo/provider/ProviderApplication.java | 6 +-- .../provider/controller/TestController.java | 30 ++++++++------ .../provider/service/impl/FooServiceImpl.java | 41 ------------------- .../service/impl/ProviderServiceImpl.java | 21 +++++----- 12 files changed, 67 insertions(+), 179 deletions(-) rename spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-api/src/main/java/com/alibaba/{dubbo/consumer => }/api/ProviderService.java (79%) delete mode 100644 spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-api/src/main/java/com/alibaba/dubbo/consumer/api/FooService.java delete mode 100644 spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-api/src/main/java/com/alibaba/dubbo/consumer/entity/User.java delete mode 100644 spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/service/impl/FooServiceImpl.java diff --git a/spring-cloud-alibaba-dependencies/pom.xml b/spring-cloud-alibaba-dependencies/pom.xml index 94dce88613..ceb2abed44 100644 --- a/spring-cloud-alibaba-dependencies/pom.xml +++ b/spring-cloud-alibaba-dependencies/pom.xml @@ -214,11 +214,6 @@ dubbo-remoting-netty4 ${dubbo.version} - - org.apache.dubbo - dubbo-serialization-hessian2 - ${dubbo.version} - diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/pom.xml b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/pom.xml index 8791e9a518..1b3c26123a 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/pom.xml +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-rpc/pom.xml @@ -1,7 +1,5 @@ - - + 4.0.0 com.alibaba.cloud @@ -31,12 +29,6 @@ org.apache.dubbo dubbo-remoting-netty4 - 3.3.0-beta.4 - - - org.apache.dubbo - dubbo-serialization-hessian2 - 3.3.0-beta.4 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/api/ProviderService.java similarity index 79% rename from spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-api/src/main/java/com/alibaba/dubbo/consumer/api/ProviderService.java rename to spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-api/src/main/java/com/alibaba/api/ProviderService.java index 9b167c9572..4dc5e897c2 100644 --- 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/api/ProviderService.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.alibaba.dubbo.consumer.api; +package com.alibaba.api; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; @@ -23,13 +23,22 @@ /** * @author :Lictory - * @date : 2024/08/01 */ @FeignClient("provider") public interface ProviderService { - @GetMapping("/api/get") - String hi(); + /** + * string test. + * + * @return string + */ + @GetMapping("/api/get") + String hi(); - @PostMapping("/api/post/{userId}") - void post(@PathVariable("userId") Integer userId); + /** + * post test. + * + * @param userId id + */ + @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/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 deleted file mode 100644 index 1081c1beab..0000000000 --- a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-api/src/main/java/com/alibaba/dubbo/consumer/api/FooService.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2013-2023 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -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; - -/** - * @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/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 deleted file mode 100644 index fb2992b6ad..0000000000 --- a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-api/src/main/java/com/alibaba/dubbo/consumer/entity/User.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2013-2023 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -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 index 1cc2f0c001..35bc36ae0f 100644 --- 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 @@ -21,10 +21,6 @@ spring-cloud-alibaba-rpc-api ${revision} - - org.springframework.cloud - spring-cloud-starter-loadbalancer - 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 index a392ec0428..78e3ab3e4d 100644 --- 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 @@ -30,9 +30,9 @@ @SpringBootApplication @EnableFeignClients @EnableDiscoveryClient -@ComponentScan(basePackages = {"com.alibaba.dubbo.consumer.api","com.alibaba.dubbo.consumer"}) +@ComponentScan(basePackages = {"com.alibaba.api"}) public class ConsumerApplication { - public static void main(String[] args) { - SpringApplication.run(ConsumerApplication.class, args); - } + 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/service/TestService.java b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/java/com/alibaba/dubbo/consumer/service/TestService.java index 3a0f99f5ae..f9dbe14f92 100644 --- a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/java/com/alibaba/dubbo/consumer/service/TestService.java +++ b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-consumer/src/main/java/com/alibaba/dubbo/consumer/service/TestService.java @@ -16,7 +16,9 @@ package com.alibaba.dubbo.consumer.service; -import com.alibaba.dubbo.consumer.api.ProviderService; + +import com.alibaba.api.ProviderService; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -29,18 +31,18 @@ */ @RestController public class TestService { - @Autowired - private ProviderService providerService; - - @GetMapping("/test/get") - public String testGet() { - return providerService.hi(); - } - - @PostMapping("/test/post/{userId}") - public void testPost(@PathVariable("userId") Integer userId) { - providerService.post(userId); - } + @Autowired + private ProviderService providerService; + + @GetMapping("/test/get") + public String testGet() { + return providerService.hi(); + } + + @PostMapping("/test/post/{userId}") + public void testPost(@PathVariable("userId") Integer userId) { + providerService.post(userId); + } } diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/ProviderApplication.java b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/ProviderApplication.java index d4ec3c9975..0ef1160eda 100644 --- a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/ProviderApplication.java +++ b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/ProviderApplication.java @@ -28,7 +28,7 @@ @SpringBootApplication @EnableFeignClients public class ProviderApplication { - public static void main(String[] args) { - SpringApplication.run(ProviderApplication.class, args); - } + public static void main(String[] args) { + SpringApplication.run(ProviderApplication.class, args); + } } diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/controller/TestController.java b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/controller/TestController.java index 8286533a33..85f6ab8873 100644 --- a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/controller/TestController.java +++ b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/controller/TestController.java @@ -16,9 +16,15 @@ package com.alibaba.dubbo.provider.controller; -import com.alibaba.dubbo.consumer.api.ProviderService; +import com.alibaba.api.ProviderService; + import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + /** * @author :Lictory @@ -29,16 +35,16 @@ @RequestMapping("/api") public class TestController { - @Autowired - private ProviderService providerService; + @Autowired + private ProviderService providerService; - @GetMapping("/get") - public String getTest() { - return providerService.hi(); - } + @GetMapping("/get") + public String getTest() { + return providerService.hi(); + } - @PostMapping("/post/{userId}") - public void postTest(@PathVariable("userId") Integer userId) { - providerService.post(userId); - } + @PostMapping("/post/{userId}") + public void postTest(@PathVariable("userId") Integer userId) { + providerService.post(userId); + } } diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/service/impl/FooServiceImpl.java b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/service/impl/FooServiceImpl.java deleted file mode 100644 index 538de1c5df..0000000000 --- a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/service/impl/FooServiceImpl.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright 2013-2023 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.alibaba.dubbo.provider.service.impl; - - -import com.alibaba.dubbo.consumer.entity.User; -import com.alibaba.dubbo.consumer.api.FooService; -import org.springframework.stereotype.Service; - -/** - * @author :Lictory - * @date : 2024/08/01 - */ -@Service -public class FooServiceImpl implements FooService { - @Override - public String foo() { - return "Foo Spring Cloud Alibaba Dubbo"; - } - - @Override - public User getUser() { - return new User(); - } - - -} diff --git a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/service/impl/ProviderServiceImpl.java b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/service/impl/ProviderServiceImpl.java index 08fb5adf9f..b44a60d667 100644 --- a/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/service/impl/ProviderServiceImpl.java +++ b/spring-cloud-alibaba-tests/rpc-tests/spring-cloud-alibaba-rpc-provider/src/main/java/com/alibaba/dubbo/provider/service/impl/ProviderServiceImpl.java @@ -17,9 +17,8 @@ package com.alibaba.dubbo.provider.service.impl; -import com.alibaba.dubbo.consumer.api.ProviderService; -import com.alibaba.dubbo.consumer.entity.User; -import org.apache.dubbo.config.annotation.DubboService; +import com.alibaba.api.ProviderService; + import org.springframework.stereotype.Service; /** @@ -28,14 +27,14 @@ */ @Service public class ProviderServiceImpl implements ProviderService { - @Override - public String hi() { - return "Hi Spring Cloud Alibaba 测试成功"; - } + @Override + public String hi() { + return "Hi Spring Cloud Alibaba 测试成功"; + } - @Override - public void post(Integer userId) { - System.out.println("sca post Test 测试"+userId); - } + @Override + public void post(Integer userId) { + System.out.println("sca post Test 测试" + userId); + } } From 9cbf464586081d021d4ccc3fc2071af553bc3421 Mon Sep 17 00:00:00 2001 From: Lictory <132423128+CheerWinLi@users.noreply.github.com> Date: Thu, 20 Feb 2025 00:11:45 +0800 Subject: [PATCH 7/7] Update pom.xml --- spring-cloud-alibaba-dependencies/pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-cloud-alibaba-dependencies/pom.xml b/spring-cloud-alibaba-dependencies/pom.xml index 3d7371975b..780e36597a 100644 --- a/spring-cloud-alibaba-dependencies/pom.xml +++ b/spring-cloud-alibaba-dependencies/pom.xml @@ -281,6 +281,7 @@ spring-cloud-starter-alibaba-rpc ${revision} + org.springframework.ai