From 17286832e977627b4a737de3c64e653716162535 Mon Sep 17 00:00:00 2001 From: warren <2410818122@qq.com> Date: Thu, 26 May 2022 22:23:49 +0800 Subject: [PATCH 01/22] =?UTF-8?q?update:=20COK6=20smart-socket=E9=80=82?= =?UTF-8?q?=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/needcoke/b/BApplication.java | 10 +----- .../needcoke/b/controller/TestController.java | 7 ++-- business-b/src/main/resources/application.yml | 4 +-- business-c/pom.xml | 8 +++-- .../needcoke/c/controller/TestController.java | 32 +++++++++++++++++++ business-c/src/main/resources/application.yml | 19 +++++++++++ .../src/main/resources/application.yml | 8 ++--- 7 files changed, 67 insertions(+), 21 deletions(-) create mode 100644 business-c/src/main/java/org/needcoke/c/controller/TestController.java create mode 100644 business-c/src/main/resources/application.yml diff --git a/business-b/src/main/java/org/needcoke/b/BApplication.java b/business-b/src/main/java/org/needcoke/b/BApplication.java index 6da8433..a1a0e71 100644 --- a/business-b/src/main/java/org/needcoke/b/BApplication.java +++ b/business-b/src/main/java/org/needcoke/b/BApplication.java @@ -1,10 +1,8 @@ package org.needcoke.b; -import org.needcoke.rpc.utils.SpringContextUtils; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; -import org.springframework.context.ConfigurableApplicationContext; /** * @author Gilgamesh @@ -15,12 +13,6 @@ import org.springframework.context.ConfigurableApplicationContext; public class BApplication { public static void main(String[] args) { - ConfigurableApplicationContext run = SpringApplication.run(BApplication.class, args); - SpringContextUtils bean = run.getBean(SpringContextUtils.class); - - Object beanNameMethodMap = run.getBean("beanNameMethodMap"); - - System.out.println(123); - + SpringApplication.run(BApplication.class, args); } } diff --git a/business-b/src/main/java/org/needcoke/b/controller/TestController.java b/business-b/src/main/java/org/needcoke/b/controller/TestController.java index 61d63db..e8b90b7 100644 --- a/business-b/src/main/java/org/needcoke/b/controller/TestController.java +++ b/business-b/src/main/java/org/needcoke/b/controller/TestController.java @@ -26,9 +26,9 @@ import java.util.Map; public class TestController { @GetMapping("test") - public InvokeResult test(){ - Map map = new HashMap<>(); - map.put("word","刘勇是死废物"); + public InvokeResult test() { + Map map = new HashMap<>(); + map.put("word", "刘勇是死废物"); InvokeResult execute = ConnectUtil.execute("bussiness-a", "config", "hahha2", map); return execute; } @@ -38,6 +38,7 @@ public class TestController { @Resource private LoadBalance loadBalance; + @GetMapping("testPort") public Integer testPort(){ List instances = discoveryClient.getInstances("bussiness-a"); diff --git a/business-b/src/main/resources/application.yml b/business-b/src/main/resources/application.yml index a06f02a..73b258d 100644 --- a/business-b/src/main/resources/application.yml +++ b/business-b/src/main/resources/application.yml @@ -1,14 +1,14 @@ spring: application: - name: bussiness-b + name: bussiness-c # nacos默认可以不写 但是 如果不是默认的必须要写 cloud: nacos: #注册中心 discovery: #server-addr: http://192.168.*:8848 - server-addr: http://127.0.0.1:8848 + server-addr: http://192.168.0.109:8848 cluster-name: 严鸣是吕诗文爸爸 group: 相亲相爱一家人 server: diff --git a/business-c/pom.xml b/business-c/pom.xml index 4cb9139..09b23b9 100644 --- a/business-c/pom.xml +++ b/business-c/pom.xml @@ -18,10 +18,12 @@ - cn.hutool - hutool-all - 5.7.16 + org.needcoke + connect-core + abandon + + \ No newline at end of file diff --git a/business-c/src/main/java/org/needcoke/c/controller/TestController.java b/business-c/src/main/java/org/needcoke/c/controller/TestController.java new file mode 100644 index 0000000..9e98bf3 --- /dev/null +++ b/business-c/src/main/java/org/needcoke/c/controller/TestController.java @@ -0,0 +1,32 @@ +package org.needcoke.c.controller; + +import lombok.RequiredArgsConstructor; +import org.needcoke.rpc.utils.ConnectUtil; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author Gilgamesh + * @date 2022/4/2 + */ +@RestController +@RequestMapping("api/c") +@RequiredArgsConstructor +public class TestController { + + + @GetMapping("exec") + public void exec() { + for (int i = 0; i < 1000000; i++) { + ConnectUtil.execute("bussiness-b", "testController", "test", null); + if (i % 10000 == 0) { + try { + Thread.sleep(500); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + } + } +} diff --git a/business-c/src/main/resources/application.yml b/business-c/src/main/resources/application.yml new file mode 100644 index 0000000..73b258d --- /dev/null +++ b/business-c/src/main/resources/application.yml @@ -0,0 +1,19 @@ + +spring: + application: + name: bussiness-c + # nacos默认可以不写 但是 如果不是默认的必须要写 + cloud: + nacos: + #注册中心 + discovery: + #server-addr: http://192.168.*:8848 + server-addr: http://192.168.0.109:8848 + cluster-name: 严鸣是吕诗文爸爸 + group: 相亲相爱一家人 +server: + port: 8081 + +coke: + server: + port: 13001 \ No newline at end of file diff --git a/bussiness-a/src/main/resources/application.yml b/bussiness-a/src/main/resources/application.yml index 43c6995..e0fcb67 100644 --- a/bussiness-a/src/main/resources/application.yml +++ b/bussiness-a/src/main/resources/application.yml @@ -8,13 +8,13 @@ spring: #注册中心 discovery: #server-addr: http://192.168.*:8848 - server-addr: http://127.0.0.1:8848 + server-addr: http://192.168.0.109:8848 cluster-name: 严鸣是吕诗文爸爸 group: 相亲相爱一家人 access-key: server: - port: 8000 + port: 8002 coke: - server: - port: 13005 \ No newline at end of file + server: + port: 13291 \ No newline at end of file -- Gitee From c0b76954a878ee44f0c42b7d34ff988a5be5f369 Mon Sep 17 00:00:00 2001 From: warren Date: Thu, 16 Jun 2022 15:24:35 +0800 Subject: [PATCH 02/22] =?UTF-8?q?update:=20COK-6=20=E6=96=B0=E5=A2=9Esmart?= =?UTF-8?q?-socket=20invoker=E9=80=82=E9=85=8D80%,=E5=B7=B2=E7=BB=8F?= =?UTF-8?q?=E5=8F=AF=E7=94=A8,=E4=BD=86=E6=9C=89=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 16 +++++----- business-b/pom.xml | 4 +-- .../needcoke/b/controller/TestController.java | 2 +- business-c/pom.xml | 7 ++++ .../java/org/needcoke/c/CApplication.java | 16 ++++------ .../needcoke/c/controller/CController.java | 30 ++++++++++++++++++ .../src/main/resources}/application.yml | 9 ++++-- bussiness-a/pom.xml | 4 +-- .../classes/org/needcoke/a/AApplication.class | Bin 763 -> 0 bytes .../needcoke/a/controller/AController.class | Bin 2031 -> 0 bytes connect-core/pom.xml | 15 +++++++-- .../common/enums/ConnectionExceptionEnum.java | 2 ++ .../exception/CokeConnectException.java | 3 ++ .../exception/CokeSmartSocketException.java | 3 ++ .../config/CokeConnectContextInitializer.java | 16 ---------- .../rpc/invoker/SmartSocketInvoker.java | 5 +-- .../SmartSocketServerProcessor.java | 4 +-- .../org/needcoke/rpc/utils/ConnectUtil.java | 8 ----- .../main/resources/META-INF/spring.factories | 2 -- 19 files changed, 88 insertions(+), 58 deletions(-) create mode 100644 business-c/src/main/java/org/needcoke/c/controller/CController.java rename {bussiness-a/target/classes => business-c/src/main/resources}/application.yml (83%) delete mode 100644 bussiness-a/target/classes/org/needcoke/a/AApplication.class delete mode 100644 bussiness-a/target/classes/org/needcoke/a/controller/AController.class delete mode 100644 connect-core/src/main/java/org/needcoke/rpc/config/CokeConnectContextInitializer.java delete mode 100644 connect-core/src/main/resources/META-INF/spring.factories diff --git a/README.md b/README.md index f16f8e8..15b3aa5 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,17 @@ # coke-connect #### 介绍 -基于spring boot/spring cloud生态的跨服务rpc调用组件。支持eureka和nacos两种注册中心,支持负载均衡配置(默认轮询)。灵活的函数名称调用方式。 +基于spring cloud生态的跨服务rpc调用组件。支持eureka和nacos两种注册中心,支持负载均衡配置(默认轮询)。 + +灵活的函数名称调用方式。 #### 特点 -1、对linux平台的epoll优化 -2、灵活的消息拦截机制 +支持选配基于okHttps,smartSocket,netty作为跨服务调用的消息组件 +支持多种负载均衡策略 +调用远程方法就像调用本地方法一样 +#### 展望 -#### 参与贡献 +接口快速失败 ,失败重试 ,失败更改节点健康状态 -1. Fork 本仓库 -2. 新建 Feat_xxx 分支 -3. 提交代码 -4. 新建 Pull Request diff --git a/business-b/pom.xml b/business-b/pom.xml index 4339e24..50495d1 100644 --- a/business-b/pom.xml +++ b/business-b/pom.xml @@ -12,8 +12,8 @@ business-b - 8 - 8 + 11 + 11 diff --git a/business-b/src/main/java/org/needcoke/b/controller/TestController.java b/business-b/src/main/java/org/needcoke/b/controller/TestController.java index 7bde14b..41bb75b 100644 --- a/business-b/src/main/java/org/needcoke/b/controller/TestController.java +++ b/business-b/src/main/java/org/needcoke/b/controller/TestController.java @@ -34,7 +34,7 @@ public class TestController { public InvokeResult test(){ Map map = new HashMap<>(); map.put("word","刘勇是死废物"); - InvokeResult execute = ConnectUtil.execute("bussiness-a", "config", "hahha2", map); + InvokeResult execute = ConnectUtil.execute("bussiness-c", "cCon", "cTest", map); return execute; } diff --git a/business-c/pom.xml b/business-c/pom.xml index 4cb9139..08532e2 100644 --- a/business-c/pom.xml +++ b/business-c/pom.xml @@ -22,6 +22,13 @@ hutool-all 5.7.16 + + + org.needcoke + connect-core + abandon + + \ No newline at end of file diff --git a/business-c/src/main/java/org/needcoke/c/CApplication.java b/business-c/src/main/java/org/needcoke/c/CApplication.java index 632f06f..f3cab60 100644 --- a/business-c/src/main/java/org/needcoke/c/CApplication.java +++ b/business-c/src/main/java/org/needcoke/c/CApplication.java @@ -1,22 +1,18 @@ package org.needcoke.c; -import cn.hutool.core.util.ReUtil; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.client.discovery.EnableDiscoveryClient; /** * @author Gilgamesh * @date 2022/4/2 */ +@EnableDiscoveryClient +@SpringBootApplication public class CApplication { public static void main(String[] args) { - - /* by warren: 横向模糊匹配 */ - // String regex = "ab{2,3}c"; String content = "abbbbc";‘ - - /* by warren: 纵向匹配 */ - String regex = "a[123]b";String content = "a1b"; - //String regex = ""; String content = ""; - boolean match = ReUtil.isMatch(regex, content); - System.out.println(match); + SpringApplication.run(CApplication.class, args); } } diff --git a/business-c/src/main/java/org/needcoke/c/controller/CController.java b/business-c/src/main/java/org/needcoke/c/controller/CController.java new file mode 100644 index 0000000..bf3d012 --- /dev/null +++ b/business-c/src/main/java/org/needcoke/c/controller/CController.java @@ -0,0 +1,30 @@ +package org.needcoke.c.controller; + +import org.needcoke.rpc.annotation.Call; +import org.needcoke.rpc.annotation.Rpc; +import org.needcoke.rpc.invoker.InvokeResult; +import org.needcoke.rpc.invoker.SmartSocketInvoker; +import org.needcoke.rpc.utils.ConnectUtil; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; + +@Component("cCon") +@Rpc +public class CController { + +// @Bean +// public SmartSocketInvoker smartSocketInvoker(){ +// return new SmartSocketInvoker(); +// } + + @Call("cTest") + public String cTest(String word){ + Map map = new HashMap<>(); + map.put("word",word); + InvokeResult execute = ConnectUtil.execute("bussiness-a", "config", "hahha2", map); + return execute.getBody().toString(); + } +} diff --git a/bussiness-a/target/classes/application.yml b/business-c/src/main/resources/application.yml similarity index 83% rename from bussiness-a/target/classes/application.yml rename to business-c/src/main/resources/application.yml index 5fe70a0..53e1a0c 100644 --- a/bussiness-a/target/classes/application.yml +++ b/business-c/src/main/resources/application.yml @@ -1,7 +1,7 @@ spring: application: - name: bussiness-a + name: bussiness-c # nacos默认可以不写 但是 如果不是默认的必须要写 cloud: nacos: @@ -11,6 +11,9 @@ spring: server-addr: http://127.0.0.1:8848 cluster-name: 严鸣是吕诗文爸爸 group: 相亲相爱一家人 - access-key: server: - port: 8000 \ No newline at end of file + port: 8089 + +coke: + server: + port: 13007 \ No newline at end of file diff --git a/bussiness-a/pom.xml b/bussiness-a/pom.xml index 3f32b91..51fe960 100644 --- a/bussiness-a/pom.xml +++ b/bussiness-a/pom.xml @@ -12,8 +12,8 @@ bussiness-a - 8 - 8 + 11 + 11 diff --git a/bussiness-a/target/classes/org/needcoke/a/AApplication.class b/bussiness-a/target/classes/org/needcoke/a/AApplication.class deleted file mode 100644 index 5c149a68adf51c185c444e7d91044bc679d8857c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 763 zcmaJv>P|8O+^cHf!7sMq9DWq_UTB$+dz{$HYi(z9&UT=V(#R=3y ze?Wg!#dra+LQ(fHqnT&FH*dUu|NZ_0U>`dHD)?N*dVnw3sA7|0{!nS9!6V;mQmGm+7kD$cCrgIwpBfTI68<}lB&{hu9Gu~o-5zA~)5FX(4@EhER!_7^`| z$kku;3R?7vHlt04t-_*viAdAVjNR_e^hI`@ymP$wYRm7WAVF;pckm4*`kDM!0`nFr zR;l8Y8Rfb5BiKU@*C=`zSi%Cu`pW?XSfpx!>Lu#<%Lh3bP-~XjPbis04Df_dll-Gb~04>Uw diff --git a/bussiness-a/target/classes/org/needcoke/a/controller/AController.class b/bussiness-a/target/classes/org/needcoke/a/controller/AController.class deleted file mode 100644 index bea2e23cd2949ca7e595357e743e10143687ddc5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2031 zcmcIlTXWk)7(Ht{QDQ4M69R6_r6p+{C#kp;8WNKdQql&Tl&P68z|-2^I@>ssk>r&A z6n+7(Fay&G%rHFj&J4eWhr(G|c4XpC;DHB8-?!iSu6tJd+tZ(Z0dNDKjKjuTIZAI^ zcqfZAZst(LY7Qm5YhG&>){VKG!y?|xVgffUY*@G@FxAjO-8)wPDHA%zPMOS_WP5>aw*jeQor3F%ur>K;T+bldDvt?j0&eI(5$teXrG0 zzO%X2ml=M%s++D1J3b>`J(IuOt*0g3rc(_~hwB@3D%|h5p*~XkI?&9$>AGGhL+!at zePif29;upB({96&eXMgwg}budHbDhOj%BOE8tmRUcH9S^z|25NgcE87%0Jf8z|NM( zfyQRmGJSTOXArV@s3(7C~BK5q9WI-h`=EqTUBnh6*q4nZXV-8kpcrrPauCng9- zZ-zfn4Q2h1IifAM@Vd*wk2z6ft;Q+b+i|bb%dUL8hKFYRsq>V{TS=h318#83%>FK;Hg9D;% zEaO8P+qh%nE_Q5ugpb)pgiD+n8x`!@*uy=61+(wx9?gLu_i7JSowS`i&2K0~E}Sl~ z82%GZ^_@`pGW2|bwR4H~%>R=>uBpP9hdfZ}qS>)A-H$ytz`0&db4U+lu&2Iejr93~ zzcDvbW_$Q(INiR8wwa|zbEcUub`MKpg6l(mjp=rW@mG`JIAX#*UWwh4X>pm?zyxmu z&duyIr8MPf%D8Qut32Q_!VPondL&p z;0u`(jHhsdY#N_^`_~`Krm{>_*#*`HyoxOQ%i{`G@ESHTPX;eU)s~1`q4Y9dp~U=g z-C30Bb(uBhdG%ePSBhR>PbtPSwuQd!D%Y;jHiOht6f6`iELtf2$-A@L{?d^4FVTIO zsZ9c4gCSDconnect-core - 8 - 8 + 11 + 11 @@ -74,6 +74,17 @@ aio-core 1.5.17 + + org.projectlombok + lombok + + + + net.dreamlu + mica-auto + 2.3.1 + provided + diff --git a/connect-core/src/main/java/org/needcoke/rpc/common/enums/ConnectionExceptionEnum.java b/connect-core/src/main/java/org/needcoke/rpc/common/enums/ConnectionExceptionEnum.java index ab7ad25..3664aa4 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/common/enums/ConnectionExceptionEnum.java +++ b/connect-core/src/main/java/org/needcoke/rpc/common/enums/ConnectionExceptionEnum.java @@ -18,6 +18,8 @@ public enum ConnectionExceptionEnum { CAN_NOT_FIND_SUCH_INSTANCE("0004","can't find this instance.","找不到对应的实例"), + REMOTE_SERVICE_DOES_NOT_OPEN_THE_COKE_SERVICE_PORT("0005","remote service does not open the coke service port.","远程服务未开启coke服务端口") + ; private final String code; diff --git a/connect-core/src/main/java/org/needcoke/rpc/common/exception/CokeConnectException.java b/connect-core/src/main/java/org/needcoke/rpc/common/exception/CokeConnectException.java index 7a4e66a..b3245e3 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/common/exception/CokeConnectException.java +++ b/connect-core/src/main/java/org/needcoke/rpc/common/exception/CokeConnectException.java @@ -2,6 +2,8 @@ package org.needcoke.rpc.common.exception; import lombok.Data; import org.needcoke.rpc.common.enums.ConnectionExceptionEnum; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ResponseStatus; /** * coke通用异常 @@ -10,6 +12,7 @@ import org.needcoke.rpc.common.enums.ConnectionExceptionEnum; * @date 2022/5/12 */ @Data +@ResponseStatus(code = HttpStatus.BAD_GATEWAY) public class CokeConnectException extends RuntimeException { private String errorCode; diff --git a/connect-core/src/main/java/org/needcoke/rpc/common/exception/CokeSmartSocketException.java b/connect-core/src/main/java/org/needcoke/rpc/common/exception/CokeSmartSocketException.java index 613e13b..b68c7ba 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/common/exception/CokeSmartSocketException.java +++ b/connect-core/src/main/java/org/needcoke/rpc/common/exception/CokeSmartSocketException.java @@ -2,8 +2,11 @@ package org.needcoke.rpc.common.exception; import lombok.Data; import org.needcoke.rpc.common.enums.ConnectionExceptionEnum; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ResponseStatus; @Data +@ResponseStatus(code = HttpStatus.BAD_GATEWAY) public class CokeSmartSocketException extends RuntimeException { private String errorCode; diff --git a/connect-core/src/main/java/org/needcoke/rpc/config/CokeConnectContextInitializer.java b/connect-core/src/main/java/org/needcoke/rpc/config/CokeConnectContextInitializer.java deleted file mode 100644 index da2bac6..0000000 --- a/connect-core/src/main/java/org/needcoke/rpc/config/CokeConnectContextInitializer.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.needcoke.rpc.config; - -import org.springframework.context.annotation.ComponentScan; - -/** - * Spring Boot 配置文件的扫描类 EnableAutoConfiguration - * - * @author Gilgamesh - * @date 2022/4/2 - */ - -@ComponentScan("org.needcoke.rpc") -public class CokeConnectContextInitializer { - - -} diff --git a/connect-core/src/main/java/org/needcoke/rpc/invoker/SmartSocketInvoker.java b/connect-core/src/main/java/org/needcoke/rpc/invoker/SmartSocketInvoker.java index f4a4adf..5758d72 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/invoker/SmartSocketInvoker.java +++ b/connect-core/src/main/java/org/needcoke/rpc/invoker/SmartSocketInvoker.java @@ -5,6 +5,8 @@ import lombok.extern.slf4j.Slf4j; import org.needcoke.rpc.codec.CokeRequest; import org.needcoke.rpc.codec.CokeRequestProtocol; import org.needcoke.rpc.common.constant.ConnectConstant; +import org.needcoke.rpc.common.enums.ConnectionExceptionEnum; +import org.needcoke.rpc.common.exception.CokeConnectException; import org.needcoke.rpc.processor.smart_socket.SmartSocketClientProcessor; import org.needcoke.rpc.utils.ConnectUtil; import org.smartboot.socket.transport.AioQuickClient; @@ -32,8 +34,7 @@ public class SmartSocketInvoker extends ConnectInvoker { String uri = instance.getHost() + ConnectConstant.COLON + instance.getPort(); Integer serverPort = ConnectUtil.getCokeServerPort(instance); if (0 == serverPort) { - throw new RuntimeException("对方服务未开起server!"); - //TODO 异常统一 + throw new CokeConnectException(ConnectionExceptionEnum.REMOTE_SERVICE_DOES_NOT_OPEN_THE_COKE_SERVICE_PORT); } if (!sessionMap.containsKey(uri)) { AioQuickClient aioQuickClient = new AioQuickClient(instance.getHost(), serverPort, new CokeRequestProtocol(), new SmartSocketClientProcessor()); diff --git a/connect-core/src/main/java/org/needcoke/rpc/processor/smart_socket/SmartSocketServerProcessor.java b/connect-core/src/main/java/org/needcoke/rpc/processor/smart_socket/SmartSocketServerProcessor.java index 3b0c902..c683de7 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/processor/smart_socket/SmartSocketServerProcessor.java +++ b/connect-core/src/main/java/org/needcoke/rpc/processor/smart_socket/SmartSocketServerProcessor.java @@ -1,5 +1,6 @@ package org.needcoke.rpc.processor.smart_socket; +import cn.hutool.core.collection.CollUtil; import com.alibaba.fastjson.JSONObject; import lombok.extern.slf4j.Slf4j; import org.needcoke.rpc.codec.CokeRequest; @@ -13,7 +14,6 @@ import org.smartboot.socket.StateMachineEnum; import org.smartboot.socket.transport.AioSession; import java.lang.reflect.Method; -import java.util.Collection; import java.util.Map; @Slf4j @@ -44,7 +44,7 @@ public class SmartSocketServerProcessor extends SmartSocketMessageProcessor headerNames = request.getHeaderNames(); - while (headerNames.hasMoreElements()) { - String nextElement = headerNames.nextElement(); - String header = request.getHeader(nextElement); - sHttpTask.addHeader(nextElement,header); - } HttpResult result = sHttpTask .get(); return result.getBody().toBean(Integer.class); diff --git a/connect-core/src/main/resources/META-INF/spring.factories b/connect-core/src/main/resources/META-INF/spring.factories deleted file mode 100644 index 18bbc5f..0000000 --- a/connect-core/src/main/resources/META-INF/spring.factories +++ /dev/null @@ -1,2 +0,0 @@ -org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ - org.needcoke.rpc.config.CokeConnectContextInitializer \ No newline at end of file -- Gitee From 25d823dad668b5b884cf805aac10756e3897b9e3 Mon Sep 17 00:00:00 2001 From: warren Date: Thu, 16 Jun 2022 18:30:45 +0800 Subject: [PATCH 03/22] =?UTF-8?q?update:=20COK-6=20=E6=96=B0=E5=A2=9Esmart?= =?UTF-8?q?-socket=20invoker=E9=80=82=E9=85=8D80%,=E5=B7=B2=E7=BB=8F?= =?UTF-8?q?=E5=8F=AF=E7=94=A8,=E4=BD=86=E6=9C=89=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 13 +- business-b/pom.xml | 16 + .../nacos/client/naming/net/NamingProxy.java | 721 ++++++++++++++++++ .../common/constant/RequestUrlConstants.java | 29 + business-b/src/main/resources/application.yml | 2 + business-c/pom.xml | 2 + .../needcoke/c/controller/CController.java | 8 +- connect-core/pom.xml | 31 +- .../java/org/needcoke/rpc/annotation/Rpc.java | 9 +- .../needcoke/rpc/annotation/RpcClient.java | 12 + .../common/enums/ConnectionExceptionEnum.java | 5 +- .../rpc/controller/RpcController.java | 1 - .../needcoke/rpc/invoker/ConnectInvoker.java | 1 + .../rpc/invoker/SmartSocketInvoker.java | 14 +- 14 files changed, 824 insertions(+), 40 deletions(-) create mode 100644 business-b/src/main/java/com/alibaba/nacos/client/naming/net/NamingProxy.java create mode 100644 business-b/src/main/java/com/alibaba/nacos/common/constant/RequestUrlConstants.java create mode 100644 connect-core/src/main/java/org/needcoke/rpc/annotation/RpcClient.java diff --git a/README.md b/README.md index 15b3aa5..923d9d3 100644 --- a/README.md +++ b/README.md @@ -7,11 +7,22 @@ #### 特点 支持选配基于okHttps,smartSocket,netty作为跨服务调用的消息组件 + 支持多种负载均衡策略 调用远程方法就像调用本地方法一样 #### 展望 -接口快速失败 ,失败重试 ,失败更改节点健康状态 +@RpcClient注解的支持 + +接口快速失败 ,失败重试 + +接口调用失败日志采集 ,链路追踪 ,实时分析修改注册中心中该节点的健康状态 + +通过注册中心直接获取Rpc端口号(现在是从注册中心获取){ + step 1: 将rpc注解以metadata的方式存入注册中心,后续调用不需要调接口 + step 2: 适配spring-boot-protocol,采用代理的方式统一端口 + step 3: 覆盖主流tomcat 、undertow 、 jetty,增设拦截器,共享一个服务器 +} diff --git a/business-b/pom.xml b/business-b/pom.xml index 50495d1..ddf542c 100644 --- a/business-b/pom.xml +++ b/business-b/pom.xml @@ -21,6 +21,22 @@ connect-core abandon + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + 2.2.5.RELEASE + + + com.alibaba.nacos + nacos-client + 1.4.1 + + + com.alibaba.nacos + nacos-common + 1.4.1 + \ No newline at end of file diff --git a/business-b/src/main/java/com/alibaba/nacos/client/naming/net/NamingProxy.java b/business-b/src/main/java/com/alibaba/nacos/client/naming/net/NamingProxy.java new file mode 100644 index 0000000..d43ebef --- /dev/null +++ b/business-b/src/main/java/com/alibaba/nacos/client/naming/net/NamingProxy.java @@ -0,0 +1,721 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * + * 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 + * + * 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. + */ + +package com.alibaba.nacos.client.naming.net; + +import com.alibaba.nacos.api.PropertyKeyConst; +import com.alibaba.nacos.api.SystemPropertyKeyConst; +import com.alibaba.nacos.api.common.Constants; +import com.alibaba.nacos.api.exception.NacosException; +import com.alibaba.nacos.api.naming.CommonParams; +import com.alibaba.nacos.api.naming.pojo.Instance; +import com.alibaba.nacos.api.naming.pojo.ListView; +import com.alibaba.nacos.api.naming.pojo.Service; +import com.alibaba.nacos.api.selector.AbstractSelector; +import com.alibaba.nacos.api.selector.ExpressionSelector; +import com.alibaba.nacos.api.selector.SelectorType; +import com.alibaba.nacos.client.config.impl.SpasAdapter; +import com.alibaba.nacos.client.monitor.MetricsMonitor; +import com.alibaba.nacos.client.naming.beat.BeatInfo; +import com.alibaba.nacos.client.naming.utils.CollectionUtils; +import com.alibaba.nacos.client.naming.utils.NetUtils; +import com.alibaba.nacos.client.naming.utils.SignUtil; +import com.alibaba.nacos.client.naming.utils.UtilAndComs; +import com.alibaba.nacos.client.security.SecurityProxy; +import com.alibaba.nacos.client.utils.AppNameUtils; +import com.alibaba.nacos.client.utils.TemplateUtils; +import com.alibaba.nacos.common.constant.HttpHeaderConsts; +import com.alibaba.nacos.common.http.HttpRestResult; +import com.alibaba.nacos.common.http.client.NacosRestTemplate; +import com.alibaba.nacos.common.http.param.Header; +import com.alibaba.nacos.common.http.param.Query; +import com.alibaba.nacos.common.lifecycle.Closeable; +import com.alibaba.nacos.common.utils.*; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.JsonNode; +import lombok.extern.slf4j.Slf4j; +import org.apache.http.HttpStatus; + +import java.io.IOException; +import java.io.StringReader; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Properties; +import java.util.Random; +import java.util.concurrent.Callable; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.TimeUnit; + +import static com.alibaba.nacos.client.utils.LogUtils.NAMING_LOGGER; + +/** + * Naming proxy. + * + * @author nkorange + */ +@Slf4j +public class NamingProxy implements Closeable { + + private final NacosRestTemplate nacosRestTemplate = NamingHttpClientManager.getInstance().getNacosRestTemplate(); + + private static final int DEFAULT_SERVER_PORT = 8848; + + private int serverPort = DEFAULT_SERVER_PORT; + + private final String namespaceId; + + private final String endpoint; + + private String nacosDomain; + + private List serverList; + + private List serversFromEndpoint = new ArrayList(); + + private final SecurityProxy securityProxy; + + private long lastSrvRefTime = 0L; + + private final long vipSrvRefInterMillis = TimeUnit.SECONDS.toMillis(30); + + private final long securityInfoRefreshIntervalMills = TimeUnit.SECONDS.toMillis(5); + + private Properties properties; + + private ScheduledExecutorService executorService; + + private int maxRetry; + + public NamingProxy(String namespaceId, String endpoint, String serverList, Properties properties) { + + this.securityProxy = new SecurityProxy(properties, nacosRestTemplate); + this.properties = properties; + this.setServerPort(DEFAULT_SERVER_PORT); + this.namespaceId = namespaceId; + this.endpoint = endpoint; + this.maxRetry = ConvertUtils.toInt(properties.getProperty(PropertyKeyConst.NAMING_REQUEST_DOMAIN_RETRY_COUNT, + String.valueOf(UtilAndComs.REQUEST_DOMAIN_RETRY_COUNT))); + + if (StringUtils.isNotEmpty(serverList)) { + this.serverList = Arrays.asList(serverList.split(",")); + if (this.serverList.size() == 1) { + this.nacosDomain = serverList; + } + } + this.initRefreshTask(); + } + + private void initRefreshTask() { + + this.executorService = new ScheduledThreadPoolExecutor(2, new ThreadFactory() { + @Override + public Thread newThread(Runnable r) { + Thread t = new Thread(r); + t.setName("com.alibaba.nacos.client.naming.updater"); + t.setDaemon(true); + return t; + } + }); + + refreshSrvIfNeed(); + this.securityProxy.login(getServerList()); + + this.executorService.scheduleWithFixedDelay(new Runnable() { + @Override + public void run() { + refreshSrvIfNeed(); + } + }, 0, vipSrvRefInterMillis, TimeUnit.MILLISECONDS); + + this.executorService.scheduleWithFixedDelay(new Runnable() { + @Override + public void run() { + securityProxy.login(getServerList()); + } + }, 0, securityInfoRefreshIntervalMills, TimeUnit.MILLISECONDS); + } + + public List getServerListFromEndpoint() { + + try { + String urlString = "http://" + endpoint + "/nacos/serverlist"; + Header header = builderHeader(); + HttpRestResult restResult = nacosRestTemplate.get(urlString, header, Query.EMPTY, String.class); + if (!restResult.ok()) { + throw new IOException( + "Error while requesting: " + urlString + "'. Server returned: " + restResult.getCode()); + } + + String content = restResult.getData(); + List list = new ArrayList(); + for (String line : IoUtils.readLines(new StringReader(content))) { + if (!line.trim().isEmpty()) { + list.add(line.trim()); + } + } + + return list; + + } catch (Exception e) { + e.printStackTrace(); + } + + return null; + } + + private void refreshSrvIfNeed() { + try { + + if (!CollectionUtils.isEmpty(serverList)) { + NAMING_LOGGER.debug("server list provided by user: " + serverList); + return; + } + + if (System.currentTimeMillis() - lastSrvRefTime < vipSrvRefInterMillis) { + return; + } + + List list = getServerListFromEndpoint(); + + if (CollectionUtils.isEmpty(list)) { + throw new Exception("Can not acquire Nacos list"); + } + + if (!CollectionUtils.isEqualCollection(list, serversFromEndpoint)) { + NAMING_LOGGER.info("[SERVER-LIST] server list is updated: " + list); + } + + serversFromEndpoint = list; + lastSrvRefTime = System.currentTimeMillis(); + } catch (Throwable e) { + NAMING_LOGGER.warn("failed to update server list", e); + } + } + + /** + * register a instance to service with specified instance properties. + * + * @param serviceName name of service + * @param groupName group of service + * @param instance instance to register + * @throws NacosException nacos exception + */ + public void registerService(String serviceName, String groupName, Instance instance) throws NacosException { + + NAMING_LOGGER.info("[REGISTER-SERVICE] {} registering service {} with instance: {}", namespaceId, serviceName, + instance); + + final Map params = new HashMap(16); + params.put(CommonParams.NAMESPACE_ID, namespaceId); + params.put(CommonParams.SERVICE_NAME, serviceName); + params.put(CommonParams.GROUP_NAME, groupName); + params.put(CommonParams.CLUSTER_NAME, instance.getClusterName()); + params.put("ip", instance.getIp()); + params.put("port", String.valueOf(instance.getPort())); + params.put("weight", String.valueOf(instance.getWeight())); + params.put("enable", String.valueOf(instance.isEnabled())); + params.put("healthy", String.valueOf(instance.isHealthy())); + params.put("ephemeral", String.valueOf(instance.isEphemeral())); + params.put("metadata", JacksonUtils.toJson(instance.getMetadata())); + + reqApi(UtilAndComs.nacosUrlInstance, params, HttpMethod.POST); + + } + + /** + * deregister instance from a service. + * + * @param serviceName name of service + * @param instance instance + * @throws NacosException nacos exception + */ + public void deregisterService(String serviceName, Instance instance) throws NacosException { + + NAMING_LOGGER + .info("[DEREGISTER-SERVICE] {} deregistering service {} with instance: {}", namespaceId, serviceName, + instance); + + final Map params = new HashMap(8); + params.put(CommonParams.NAMESPACE_ID, namespaceId); + params.put(CommonParams.SERVICE_NAME, serviceName); + params.put(CommonParams.CLUSTER_NAME, instance.getClusterName()); + params.put("ip", instance.getIp()); + params.put("port", String.valueOf(instance.getPort())); + params.put("ephemeral", String.valueOf(instance.isEphemeral())); + + reqApi(UtilAndComs.nacosUrlInstance, params, HttpMethod.DELETE); + } + + /** + * Update instance to service. + * + * @param serviceName service name + * @param groupName group name + * @param instance instance + * @throws NacosException nacos exception + */ + public void updateInstance(String serviceName, String groupName, Instance instance) throws NacosException { + NAMING_LOGGER + .info("[UPDATE-SERVICE] {} update service {} with instance: {}", namespaceId, serviceName, instance); + + final Map params = new HashMap(8); + params.put(CommonParams.NAMESPACE_ID, namespaceId); + params.put(CommonParams.SERVICE_NAME, serviceName); + params.put(CommonParams.GROUP_NAME, groupName); + params.put(CommonParams.CLUSTER_NAME, instance.getClusterName()); + params.put("ip", instance.getIp()); + params.put("port", String.valueOf(instance.getPort())); + params.put("weight", String.valueOf(instance.getWeight())); + params.put("enabled", String.valueOf(instance.isEnabled())); + params.put("ephemeral", String.valueOf(instance.isEphemeral())); + params.put("metadata", JacksonUtils.toJson(instance.getMetadata())); + + reqApi(UtilAndComs.nacosUrlInstance, params, HttpMethod.PUT); + } + + /** + * Query Service. + * + * @param serviceName service name + * @param groupName group name + * @return service + * @throws NacosException nacos exception + */ + public Service queryService(String serviceName, String groupName) throws NacosException { + NAMING_LOGGER.info("[QUERY-SERVICE] {} query service : {}, {}", namespaceId, serviceName, groupName); + + final Map params = new HashMap(3); + params.put(CommonParams.NAMESPACE_ID, namespaceId); + params.put(CommonParams.SERVICE_NAME, serviceName); + params.put(CommonParams.GROUP_NAME, groupName); + + String result = reqApi(UtilAndComs.nacosUrlService, params, HttpMethod.GET); + return JacksonUtils.toObj(result, Service.class); + } + + /** + * Create service. + * + * @param service service + * @param selector selector + * @throws NacosException nacos exception + */ + public void createService(Service service, AbstractSelector selector) throws NacosException { + + NAMING_LOGGER.info("[CREATE-SERVICE] {} creating service : {}", namespaceId, service); + + final Map params = new HashMap(6); + params.put(CommonParams.NAMESPACE_ID, namespaceId); + params.put(CommonParams.SERVICE_NAME, service.getName()); + params.put(CommonParams.GROUP_NAME, service.getGroupName()); + params.put("protectThreshold", String.valueOf(service.getProtectThreshold())); + params.put("metadata", JacksonUtils.toJson(service.getMetadata())); + params.put("selector", JacksonUtils.toJson(selector)); + + reqApi(UtilAndComs.nacosUrlService, params, HttpMethod.POST); + + } + + /** + * Delete service. + * + * @param serviceName service name + * @param groupName group name + * @return true if delete ok + * @throws NacosException nacos exception + */ + public boolean deleteService(String serviceName, String groupName) throws NacosException { + NAMING_LOGGER.info("[DELETE-SERVICE] {} deleting service : {} with groupName : {}", namespaceId, serviceName, + groupName); + + final Map params = new HashMap(6); + params.put(CommonParams.NAMESPACE_ID, namespaceId); + params.put(CommonParams.SERVICE_NAME, serviceName); + params.put(CommonParams.GROUP_NAME, groupName); + + String result = reqApi(UtilAndComs.nacosUrlService, params, HttpMethod.DELETE); + return "ok".equals(result); + } + + /** + * Update service. + * + * @param service service + * @param selector selector + * @throws NacosException nacos exception + */ + public void updateService(Service service, AbstractSelector selector) throws NacosException { + NAMING_LOGGER.info("[UPDATE-SERVICE] {} updating service : {}", namespaceId, service); + + final Map params = new HashMap(6); + params.put(CommonParams.NAMESPACE_ID, namespaceId); + params.put(CommonParams.SERVICE_NAME, service.getName()); + params.put(CommonParams.GROUP_NAME, service.getGroupName()); + params.put("protectThreshold", String.valueOf(service.getProtectThreshold())); + params.put("metadata", JacksonUtils.toJson(service.getMetadata())); + params.put("selector", JacksonUtils.toJson(selector)); + + reqApi(UtilAndComs.nacosUrlService, params, HttpMethod.PUT); + } + + /** + * Query instance list. + * + * @param serviceName service name + * @param clusters clusters + * @param udpPort udp port + * @param healthyOnly healthy only + * @return instance list + * @throws NacosException nacos exception + */ + public String queryList(String serviceName, String clusters, int udpPort, boolean healthyOnly) + throws NacosException { + + final Map params = new HashMap(8); + params.put(CommonParams.NAMESPACE_ID, namespaceId); + params.put(CommonParams.SERVICE_NAME, serviceName); + params.put("clusters", clusters); + params.put("udpPort", String.valueOf(udpPort)); + params.put("clientIP", NetUtils.localIP()); + params.put("healthyOnly", String.valueOf(healthyOnly)); + + return reqApi(UtilAndComs.nacosUrlBase + "/instance/list", params, HttpMethod.GET); + } + + /** + * Send beat. + * + * @param beatInfo beat info + * @param lightBeatEnabled light beat + * @return beat result + * @throws NacosException nacos exception + */ + public JsonNode sendBeat(BeatInfo beatInfo, boolean lightBeatEnabled) throws NacosException { + + if (NAMING_LOGGER.isDebugEnabled()) { + NAMING_LOGGER.debug("[BEAT] {} sending beat to server: {}", namespaceId, beatInfo.toString()); + } + Map params = new HashMap(8); + Map bodyMap = new HashMap(2); + if (!lightBeatEnabled) { + bodyMap.put("beat", JacksonUtils.toJson(beatInfo)); + } + params.put(CommonParams.NAMESPACE_ID, namespaceId); + params.put(CommonParams.SERVICE_NAME, beatInfo.getServiceName()); + params.put(CommonParams.CLUSTER_NAME, beatInfo.getCluster()); + params.put("ip", beatInfo.getIp()); + params.put("port", String.valueOf(beatInfo.getPort())); + String result = reqApi(UtilAndComs.nacosUrlBase + "/instance/beat", params, bodyMap, HttpMethod.PUT); + LoggerUtils.printIfErrorEnabled(log,"心跳维持 --- result = {}",result); + return JacksonUtils.toObj(result); + } + + /** + * Check Server healthy. + * + * @return true if server is healthy + */ + public boolean serverHealthy() { + + try { + String result = reqApi(UtilAndComs.nacosUrlBase + "/operator/metrics", new HashMap(2), + HttpMethod.GET); + JsonNode json = JacksonUtils.toObj(result); + String serverStatus = json.get("status").asText(); + return "UP".equals(serverStatus); + } catch (Exception e) { + return false; + } + } + + public ListView getServiceList(int pageNo, int pageSize, String groupName) throws NacosException { + return getServiceList(pageNo, pageSize, groupName, null); + } + + public ListView getServiceList(int pageNo, int pageSize, String groupName, AbstractSelector selector) + throws NacosException { + + Map params = new HashMap(4); + params.put("pageNo", String.valueOf(pageNo)); + params.put("pageSize", String.valueOf(pageSize)); + params.put(CommonParams.NAMESPACE_ID, namespaceId); + params.put(CommonParams.GROUP_NAME, groupName); + + if (selector != null) { + switch (SelectorType.valueOf(selector.getType())) { + case none: + break; + case label: + ExpressionSelector expressionSelector = (ExpressionSelector) selector; + params.put("selector", JacksonUtils.toJson(expressionSelector)); + break; + default: + break; + } + } + + String result = reqApi(UtilAndComs.nacosUrlBase + "/service/list", params, HttpMethod.GET); + + JsonNode json = JacksonUtils.toObj(result); + ListView listView = new ListView(); + listView.setCount(json.get("count").asInt()); + listView.setData(JacksonUtils.toObj(json.get("doms").toString(), new TypeReference>() { + })); + + return listView; + } + + public String reqApi(String api, Map params, String method) throws NacosException { + return reqApi(api, params, Collections.EMPTY_MAP, method); + } + + public String reqApi(String api, Map params, Map body, String method) + throws NacosException { + return reqApi(api, params, body, getServerList(), method); + } + + /** + * Request api. + * + * @param api api + * @param params parameters + * @param body body + * @param servers servers + * @param method http method + * @return result + * @throws NacosException nacos exception + */ + public String reqApi(String api, Map params, Map body, List servers, + String method) throws NacosException { + + params.put(CommonParams.NAMESPACE_ID, getNamespaceId()); + + if (CollectionUtils.isEmpty(servers) && StringUtils.isBlank(nacosDomain)) { + throw new NacosException(NacosException.INVALID_PARAM, "no server available"); + } + + NacosException exception = new NacosException(); + + if (StringUtils.isNotBlank(nacosDomain)) { + for (int i = 0; i < maxRetry; i++) { + try { + return callServer(api, params, body, nacosDomain, method); + } catch (NacosException e) { + exception = e; + if (NAMING_LOGGER.isDebugEnabled()) { + NAMING_LOGGER.debug("request {} failed.", nacosDomain, e); + } + } + } + } else { + Random random = new Random(System.currentTimeMillis()); + int index = random.nextInt(servers.size()); + + for (int i = 0; i < servers.size(); i++) { + String server = servers.get(index); + try { + return callServer(api, params, body, server, method); + } catch (NacosException e) { + exception = e; + if (NAMING_LOGGER.isDebugEnabled()) { + NAMING_LOGGER.debug("request {} failed.", server, e); + } + } + index = (index + 1) % servers.size(); + } + } + + NAMING_LOGGER.error("request: {} failed, servers: {}, code: {}, msg: {}", api, servers, exception.getErrCode(), + exception.getErrMsg()); + + throw new NacosException(exception.getErrCode(), + "failed to req API:" + api + " after all servers(" + servers + ") tried: " + exception.getMessage()); + + } + + private List getServerList() { + List snapshot = serversFromEndpoint; + if (!CollectionUtils.isEmpty(serverList)) { + snapshot = serverList; + } + return snapshot; + } + + public String callServer(String api, Map params, Map body, String curServer) + throws NacosException { + return callServer(api, params, body, curServer, HttpMethod.GET); + } + + /** + * Call server. + * + * @param api api + * @param params parameters + * @param body body + * @param curServer ? + * @param method http method + * @return result + * @throws NacosException nacos exception + */ + public String callServer(String api, Map params, Map body, String curServer, + String method) throws NacosException { + long start = System.currentTimeMillis(); + long end = 0; + injectSecurityInfo(params); + Header header = builderHeader(); + + String url; + if (curServer.startsWith(UtilAndComs.HTTPS) || curServer.startsWith(UtilAndComs.HTTP)) { + url = curServer + api; + } else { + if (!IPUtil.containsPort(curServer)) { + curServer = curServer + IPUtil.IP_PORT_SPLITER + serverPort; + } + url = NamingHttpClientManager.getInstance().getPrefix() + curServer + api; + } + + try { + HttpRestResult restResult = nacosRestTemplate + .exchangeForm(url, header, Query.newInstance().initParams(params), body, method, String.class); + end = System.currentTimeMillis(); + + MetricsMonitor.getNamingRequestMonitor(method, url, String.valueOf(restResult.getCode())) + .observe(end - start); + + if (restResult.ok()) { + return restResult.getData(); + } + if (HttpStatus.SC_NOT_MODIFIED == restResult.getCode()) { + return StringUtils.EMPTY; + } + throw new NacosException(restResult.getCode(), restResult.getMessage()); + } catch (Exception e) { + NAMING_LOGGER.error("[NA] failed to request", e); + throw new NacosException(NacosException.SERVER_ERROR, e); + } + } + + private void injectSecurityInfo(Map params) { + + // Inject token if exist: + if (StringUtils.isNotBlank(securityProxy.getAccessToken())) { + params.put(Constants.ACCESS_TOKEN, securityProxy.getAccessToken()); + } + + // Inject ak/sk if exist: + String ak = getAccessKey(); + String sk = getSecretKey(); + params.put("app", AppNameUtils.getAppName()); + if (StringUtils.isNotBlank(ak) && StringUtils.isNotBlank(sk)) { + try { + String signData = getSignData(params.get("serviceName")); + String signature = SignUtil.sign(signData, sk); + params.put("signature", signature); + params.put("data", signData); + params.put("ak", ak); + } catch (Exception e) { + NAMING_LOGGER.error("inject ak/sk failed.", e); + } + } + } + + /** + * Build header. + * + * @return header + */ + public Header builderHeader() { + Header header = Header.newInstance(); + header.addParam(HttpHeaderConsts.CLIENT_VERSION_HEADER, VersionUtils.version); + header.addParam(HttpHeaderConsts.USER_AGENT_HEADER, UtilAndComs.VERSION); + header.addParam(HttpHeaderConsts.ACCEPT_ENCODING, "gzip,deflate,sdch"); + header.addParam(HttpHeaderConsts.CONNECTION, "Keep-Alive"); + header.addParam(HttpHeaderConsts.REQUEST_ID, UuidUtils.generateUuid()); + header.addParam(HttpHeaderConsts.REQUEST_MODULE, "Naming"); + return header; + } + + private static String getSignData(String serviceName) { + return StringUtils.isNotEmpty(serviceName) ? System.currentTimeMillis() + "@@" + serviceName + : String.valueOf(System.currentTimeMillis()); + } + + public String getAccessKey() { + if (properties == null) { + + return SpasAdapter.getAk(); + } + + return TemplateUtils + .stringEmptyAndThenExecute(properties.getProperty(PropertyKeyConst.ACCESS_KEY), new Callable() { + + @Override + public String call() { + return SpasAdapter.getAk(); + } + }); + } + + public String getSecretKey() { + if (properties == null) { + + return SpasAdapter.getSk(); + } + + return TemplateUtils + .stringEmptyAndThenExecute(properties.getProperty(PropertyKeyConst.SECRET_KEY), new Callable() { + @Override + public String call() throws Exception { + return SpasAdapter.getSk(); + } + }); + } + + public void setProperties(Properties properties) { + this.properties = properties; + setServerPort(DEFAULT_SERVER_PORT); + } + + public String getNamespaceId() { + return namespaceId; + } + + public void setServerPort(int serverPort) { + this.serverPort = serverPort; + + String sp = System.getProperty(SystemPropertyKeyConst.NAMING_SERVER_PORT); + if (StringUtils.isNotBlank(sp)) { + this.serverPort = Integer.parseInt(sp); + } + } + + @Override + public void shutdown() throws NacosException { + String className = this.getClass().getName(); + NAMING_LOGGER.info("{} do shutdown begin", className); + ThreadUtils.shutdownThreadPool(executorService, NAMING_LOGGER); + NamingHttpClientManager.getInstance().shutdown(); + SpasAdapter.freeCredentialInstance(); + NAMING_LOGGER.info("{} do shutdown stop", className); + } +} + diff --git a/business-b/src/main/java/com/alibaba/nacos/common/constant/RequestUrlConstants.java b/business-b/src/main/java/com/alibaba/nacos/common/constant/RequestUrlConstants.java new file mode 100644 index 0000000..9e4e17a --- /dev/null +++ b/business-b/src/main/java/com/alibaba/nacos/common/constant/RequestUrlConstants.java @@ -0,0 +1,29 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * + * 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 + * + * 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. + */ + +package com.alibaba.nacos.common.constant; + +/** + * Nacos request url constants. + * + * @author chenhao26 + */ +public interface RequestUrlConstants { + + String HTTP_PREFIX = "http://"; + String HTTPS_PREFIX = "https://"; + +} diff --git a/business-b/src/main/resources/application.yml b/business-b/src/main/resources/application.yml index a06f02a..b16e9b6 100644 --- a/business-b/src/main/resources/application.yml +++ b/business-b/src/main/resources/application.yml @@ -7,6 +7,8 @@ spring: nacos: #注册中心 discovery: + metadata: + coke-server-port: 13001 #server-addr: http://192.168.*:8848 server-addr: http://127.0.0.1:8848 cluster-name: 严鸣是吕诗文爸爸 diff --git a/business-c/pom.xml b/business-c/pom.xml index 08532e2..09fc0a0 100644 --- a/business-c/pom.xml +++ b/business-c/pom.xml @@ -28,6 +28,8 @@ connect-core abandon + + diff --git a/business-c/src/main/java/org/needcoke/c/controller/CController.java b/business-c/src/main/java/org/needcoke/c/controller/CController.java index bf3d012..432f685 100644 --- a/business-c/src/main/java/org/needcoke/c/controller/CController.java +++ b/business-c/src/main/java/org/needcoke/c/controller/CController.java @@ -15,10 +15,10 @@ import java.util.Map; @Rpc public class CController { -// @Bean -// public SmartSocketInvoker smartSocketInvoker(){ -// return new SmartSocketInvoker(); -// } + @Bean + public SmartSocketInvoker smartSocketInvoker(){ + return new SmartSocketInvoker(); + } @Call("cTest") public String cTest(String word){ diff --git a/connect-core/pom.xml b/connect-core/pom.xml index f25d711..57724fa 100644 --- a/connect-core/pom.xml +++ b/connect-core/pom.xml @@ -22,11 +22,7 @@ spring-boot-starter-web 2.3.2.RELEASE - - com.alibaba.cloud - spring-cloud-starter-alibaba-nacos-discovery - 2.2.5.RELEASE - + org.projectlombok lombok @@ -53,12 +49,6 @@ okhttps-jackson 3.5.1 - - - org.springframework.cloud - spring-cloud-starter-netflix-ribbon - 2.2.5.RELEASE - com.alibaba fastjson @@ -85,6 +75,14 @@ 2.3.1 provided + + org.springframework.cloud + spring-cloud-commons + 2.2.5.RELEASE + compile + + + @@ -98,17 +96,6 @@ pom import - - org.springframework.cloud - spring-cloud-dependencies - 2.2.5.RELEASE - - - - com.alibaba.cloud - spring-cloud-alibaba-dependencies - 2.2.5.RELEASE - diff --git a/connect-core/src/main/java/org/needcoke/rpc/annotation/Rpc.java b/connect-core/src/main/java/org/needcoke/rpc/annotation/Rpc.java index 90173cd..4dc6aa3 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/annotation/Rpc.java +++ b/connect-core/src/main/java/org/needcoke/rpc/annotation/Rpc.java @@ -11,17 +11,10 @@ import java.lang.annotation.*; * @author Gilgamesh * @date 2022/4/2 */ -@Target({ElementType.TYPE, ElementType.METHOD}) +@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented -@Import(Component.class) public @interface Rpc { - String value() default ""; - - String serviceId() default ""; - String beanName() default ""; - - String callName() default ""; } diff --git a/connect-core/src/main/java/org/needcoke/rpc/annotation/RpcClient.java b/connect-core/src/main/java/org/needcoke/rpc/annotation/RpcClient.java new file mode 100644 index 0000000..14b0bf8 --- /dev/null +++ b/connect-core/src/main/java/org/needcoke/rpc/annotation/RpcClient.java @@ -0,0 +1,12 @@ +package org.needcoke.rpc.annotation; + +import java.lang.annotation.*; + +@Target({ElementType.TYPE}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface RpcClient { + + String serviceId(); + +} diff --git a/connect-core/src/main/java/org/needcoke/rpc/common/enums/ConnectionExceptionEnum.java b/connect-core/src/main/java/org/needcoke/rpc/common/enums/ConnectionExceptionEnum.java index 3664aa4..d9c546c 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/common/enums/ConnectionExceptionEnum.java +++ b/connect-core/src/main/java/org/needcoke/rpc/common/enums/ConnectionExceptionEnum.java @@ -18,8 +18,11 @@ public enum ConnectionExceptionEnum { CAN_NOT_FIND_SUCH_INSTANCE("0004","can't find this instance.","找不到对应的实例"), - REMOTE_SERVICE_DOES_NOT_OPEN_THE_COKE_SERVICE_PORT("0005","remote service does not open the coke service port.","远程服务未开启coke服务端口") + REMOTE_SERVICE_DOES_NOT_OPEN_THE_COKE_SERVICE_PORT("0005","remote service does not open the coke service port.","远程服务未开启coke服务端口"), + RECONNECTION_WITH_REMOTE_SERVICE_FAILED("0006","reconnection with remote service failed","与远程服务重建连接失败"), + + CONNECTION_WITH_REMOTE_SERVICE_FAILED("0007","reconnection with remote service failed","与远程服务重建连接失败"), ; private final String code; diff --git a/connect-core/src/main/java/org/needcoke/rpc/controller/RpcController.java b/connect-core/src/main/java/org/needcoke/rpc/controller/RpcController.java index 65fda9d..833b5a2 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/controller/RpcController.java +++ b/connect-core/src/main/java/org/needcoke/rpc/controller/RpcController.java @@ -28,7 +28,6 @@ import java.util.Map; @RequiredArgsConstructor public class RpcController { - private ServerConfig serverConfig; @Resource diff --git a/connect-core/src/main/java/org/needcoke/rpc/invoker/ConnectInvoker.java b/connect-core/src/main/java/org/needcoke/rpc/invoker/ConnectInvoker.java index 568b7ae..8c26c43 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/invoker/ConnectInvoker.java +++ b/connect-core/src/main/java/org/needcoke/rpc/invoker/ConnectInvoker.java @@ -5,6 +5,7 @@ import com.ejlchina.okhttps.HttpResult; import lombok.extern.slf4j.Slf4j; import org.springframework.cloud.client.ServiceInstance; +import java.io.IOException; import java.util.Map; @Slf4j diff --git a/connect-core/src/main/java/org/needcoke/rpc/invoker/SmartSocketInvoker.java b/connect-core/src/main/java/org/needcoke/rpc/invoker/SmartSocketInvoker.java index 5758d72..7e34485 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/invoker/SmartSocketInvoker.java +++ b/connect-core/src/main/java/org/needcoke/rpc/invoker/SmartSocketInvoker.java @@ -23,7 +23,6 @@ public class SmartSocketInvoker extends ConnectInvoker { /** * 给AioQuickClient加个引用,防止垃圾回收。 - * //TODO AioSession失效时重建连接 */ private final Map clientMap = new ConcurrentHashMap<>(); @@ -43,7 +42,7 @@ public class SmartSocketInvoker extends ConnectInvoker { AioSession session = aioQuickClient.start(); sessionMap.put(uri, session); } catch (IOException e) { - throw new RuntimeException(e); + throw new CokeConnectException(ConnectionExceptionEnum.CONNECTION_WITH_REMOTE_SERVICE_FAILED); } } AioSession session = sessionMap.get(uri); @@ -58,7 +57,16 @@ public class SmartSocketInvoker extends ConnectInvoker { session.writeBuffer().write(bytes); session.writeBuffer().flush(); } catch (IOException e) { - throw new RuntimeException(e.getMessage()); + //一般是session失效了 + log.error(e.getMessage()); + try { + session = clientMap.get(uri).start(); + } catch (IOException ex) { + //与远程服务重建连接失败 + throw new CokeConnectException(ConnectionExceptionEnum.RECONNECTION_WITH_REMOTE_SERVICE_FAILED); + } + sessionMap.put(uri,session); + return execute(instance,beanName,methodName,params); } InvokeResult tmp = new InvokeResult(); long start = DateUtil.current(); -- Gitee From 9f8205e4d39c1af5a5539fc372fa065437cb5a4f Mon Sep 17 00:00:00 2001 From: warren Date: Fri, 17 Jun 2022 18:28:23 +0800 Subject: [PATCH 04/22] =?UTF-8?q?=E6=96=B0=E5=A2=9Econtainer=E8=B0=83?= =?UTF-8?q?=E7=94=A8=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../needcoke/b/component/TestComponent.java | 8 ++- .../needcoke/b/controller/TestController.java | 5 +- business-c/pom.xml | 6 +- .../needcoke/c/controller/CController.java | 12 +++- bussiness-a/pom.xml | 5 ++ .../org/needcoke/a/configuration/Config.java | 5 +- connect-core/pom.xml | 6 +- .../org/needcoke/rpc/codec/CokeRequest.java | 6 -- .../rpc/common/constant/ConnectConstant.java | 2 + .../rpc/common/enums/RpcTypeEnum.java | 6 ++ .../exception/CokeConnectException.java | 11 +++ .../config/CokeHandlerInterceptorAdapter.java | 23 ++++++ .../rpc/config/RequestIdContextHolder.java | 49 +++++++++++++ .../org/needcoke/rpc/config/ServerConfig.java | 13 +++- .../rpc/controller/RpcController.java | 15 +++- .../needcoke/rpc/invoker/ConnectInvoker.java | 28 +++++++- .../needcoke/rpc/invoker/OkHttpsInvoker.java | 16 +++-- .../rpc/invoker/SmartSocketInvoker.java | 34 +++++++-- .../java/org/needcoke/rpc/net/Connector.java | 70 +++++++++++++++++++ .../needcoke/rpc/net/ConnectorFactory.java | 48 +++++++++++++ .../SmartSocketClientProcessor.java | 8 +-- .../SmartSocketServerProcessor.java | 22 +++--- .../rpc/server/SmartSocketServer.java | 3 - .../org/needcoke/rpc/utils/ConnectUtil.java | 9 +-- 24 files changed, 357 insertions(+), 53 deletions(-) create mode 100644 connect-core/src/main/java/org/needcoke/rpc/common/enums/RpcTypeEnum.java create mode 100644 connect-core/src/main/java/org/needcoke/rpc/config/CokeHandlerInterceptorAdapter.java create mode 100644 connect-core/src/main/java/org/needcoke/rpc/config/RequestIdContextHolder.java create mode 100644 connect-core/src/main/java/org/needcoke/rpc/net/Connector.java create mode 100644 connect-core/src/main/java/org/needcoke/rpc/net/ConnectorFactory.java diff --git a/business-b/src/main/java/org/needcoke/b/component/TestComponent.java b/business-b/src/main/java/org/needcoke/b/component/TestComponent.java index 8ed46cf..48bf9c1 100644 --- a/business-b/src/main/java/org/needcoke/b/component/TestComponent.java +++ b/business-b/src/main/java/org/needcoke/b/component/TestComponent.java @@ -1,5 +1,6 @@ package org.needcoke.b.component; +import org.needcoke.rpc.common.enums.RpcTypeEnum; import org.needcoke.rpc.invoker.SmartSocketInvoker; import org.needcoke.rpc.loadBalance.RoundRobinLoadBalance; import org.needcoke.rpc.loadBalance.WeightedResponseTimeBalance; @@ -7,6 +8,8 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Primary; import org.springframework.stereotype.Component; +import javax.annotation.Resource; + /** * @author Gilgamesh * @date 2022/4/2 @@ -14,7 +17,6 @@ import org.springframework.stereotype.Component; @Component public class TestComponent { - // @Bean // @Primary // public WeightedResponseTimeBalance weightedResponseTimeBalance(){ @@ -22,8 +24,8 @@ public class TestComponent { // } @Bean - public SmartSocketInvoker smartSocketInvoker(){ - return new SmartSocketInvoker(); + public SmartSocketInvoker smartSocketInvoker(RpcTypeEnum rpcTypeEnum){ + return new SmartSocketInvoker(rpcTypeEnum); } } diff --git a/business-b/src/main/java/org/needcoke/b/controller/TestController.java b/business-b/src/main/java/org/needcoke/b/controller/TestController.java index 41bb75b..47d8854 100644 --- a/business-b/src/main/java/org/needcoke/b/controller/TestController.java +++ b/business-b/src/main/java/org/needcoke/b/controller/TestController.java @@ -6,6 +6,7 @@ import lombok.extern.slf4j.Slf4j; import org.needcoke.rpc.annotation.Rpc; import org.needcoke.rpc.invoker.InvokeResult; import org.needcoke.rpc.loadBalance.LoadBalance; +import org.needcoke.rpc.net.ConnectorFactory; import org.needcoke.rpc.utils.ConnectUtil; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.discovery.DiscoveryClient; @@ -30,11 +31,13 @@ import java.util.Map; @RequiredArgsConstructor public class TestController { + private final ConnectorFactory connectorFactory; + @GetMapping("test") public InvokeResult test(){ Map map = new HashMap<>(); map.put("word","刘勇是死废物"); - InvokeResult execute = ConnectUtil.execute("bussiness-c", "cCon", "cTest", map); + InvokeResult execute = connectorFactory.connector("bussiness-c").execute( "cCon", "cTest", map); return execute; } diff --git a/business-c/pom.xml b/business-c/pom.xml index 09fc0a0..9f1ed51 100644 --- a/business-c/pom.xml +++ b/business-c/pom.xml @@ -29,7 +29,11 @@ abandon - + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + 2.2.5.RELEASE + diff --git a/business-c/src/main/java/org/needcoke/c/controller/CController.java b/business-c/src/main/java/org/needcoke/c/controller/CController.java index 432f685..338a765 100644 --- a/business-c/src/main/java/org/needcoke/c/controller/CController.java +++ b/business-c/src/main/java/org/needcoke/c/controller/CController.java @@ -2,12 +2,15 @@ package org.needcoke.c.controller; import org.needcoke.rpc.annotation.Call; import org.needcoke.rpc.annotation.Rpc; +import org.needcoke.rpc.common.enums.RpcTypeEnum; import org.needcoke.rpc.invoker.InvokeResult; import org.needcoke.rpc.invoker.SmartSocketInvoker; +import org.needcoke.rpc.net.ConnectorFactory; import org.needcoke.rpc.utils.ConnectUtil; import org.springframework.context.annotation.Bean; import org.springframework.stereotype.Component; +import javax.annotation.Resource; import java.util.HashMap; import java.util.Map; @@ -16,15 +19,18 @@ import java.util.Map; public class CController { @Bean - public SmartSocketInvoker smartSocketInvoker(){ - return new SmartSocketInvoker(); + public SmartSocketInvoker smartSocketInvoker(RpcTypeEnum rpcTypeEnum){ + return new SmartSocketInvoker(rpcTypeEnum); } + @Resource + private ConnectorFactory connectorFactory; + @Call("cTest") public String cTest(String word){ Map map = new HashMap<>(); map.put("word",word); - InvokeResult execute = ConnectUtil.execute("bussiness-a", "config", "hahha2", map); + InvokeResult execute = connectorFactory.connector("bussiness-a").execute("config", "hahha2", map); return execute.getBody().toString(); } } diff --git a/bussiness-a/pom.xml b/bussiness-a/pom.xml index 51fe960..1febe49 100644 --- a/bussiness-a/pom.xml +++ b/bussiness-a/pom.xml @@ -22,6 +22,11 @@ connect-core abandon + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + 2.2.5.RELEASE + \ No newline at end of file diff --git a/bussiness-a/src/main/java/org/needcoke/a/configuration/Config.java b/bussiness-a/src/main/java/org/needcoke/a/configuration/Config.java index 567cce6..a0a2c9f 100644 --- a/bussiness-a/src/main/java/org/needcoke/a/configuration/Config.java +++ b/bussiness-a/src/main/java/org/needcoke/a/configuration/Config.java @@ -3,6 +3,7 @@ package org.needcoke.a.configuration; import lombok.extern.slf4j.Slf4j; import org.needcoke.rpc.annotation.Call; import org.needcoke.rpc.annotation.Rpc; +import org.needcoke.rpc.common.enums.RpcTypeEnum; import org.needcoke.rpc.invoker.SmartSocketInvoker; import org.springframework.context.annotation.Bean; import org.springframework.stereotype.Component; @@ -31,7 +32,7 @@ public class Config { } @Bean - public SmartSocketInvoker smartSocketInvoker(){ - return new SmartSocketInvoker(); + public SmartSocketInvoker smartSocketInvoker(RpcTypeEnum rpcTypeEnum){ + return new SmartSocketInvoker(rpcTypeEnum); } } diff --git a/connect-core/pom.xml b/connect-core/pom.xml index 57724fa..f932e6a 100644 --- a/connect-core/pom.xml +++ b/connect-core/pom.xml @@ -81,7 +81,11 @@ 2.2.5.RELEASE compile - + + com.alibaba + transmittable-thread-local + 2.12.1 + diff --git a/connect-core/src/main/java/org/needcoke/rpc/codec/CokeRequest.java b/connect-core/src/main/java/org/needcoke/rpc/codec/CokeRequest.java index 0232e07..cd5fd9f 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/codec/CokeRequest.java +++ b/connect-core/src/main/java/org/needcoke/rpc/codec/CokeRequest.java @@ -28,8 +28,6 @@ public class CokeRequest { @Getter private InvokeResult result; - private Integer requestId; - public CokeRequest setRequestType(ConnectRequestEnum requestType) { this.requestType = requestType; @@ -83,8 +81,4 @@ public class CokeRequest { return jsonString.getBytes(); } - public CokeRequest setRequestId(Integer requestId){ - this.requestId = requestId; - return this; - } } diff --git a/connect-core/src/main/java/org/needcoke/rpc/common/constant/ConnectConstant.java b/connect-core/src/main/java/org/needcoke/rpc/common/constant/ConnectConstant.java index 2af99f4..f4c8e08 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/common/constant/ConnectConstant.java +++ b/connect-core/src/main/java/org/needcoke/rpc/common/constant/ConnectConstant.java @@ -15,6 +15,8 @@ public interface ConnectConstant { String COKE_PORT_RELATIVE_PATH = "/coke/connect/port"; + String COKE_RPC_TYPE_RELATIVE_PATH = "/coke/connect/rpcType"; + /** * 实例名称 */ diff --git a/connect-core/src/main/java/org/needcoke/rpc/common/enums/RpcTypeEnum.java b/connect-core/src/main/java/org/needcoke/rpc/common/enums/RpcTypeEnum.java new file mode 100644 index 0000000..09a21ca --- /dev/null +++ b/connect-core/src/main/java/org/needcoke/rpc/common/enums/RpcTypeEnum.java @@ -0,0 +1,6 @@ +package org.needcoke.rpc.common.enums; + +public enum RpcTypeEnum { + + okHttp3,smartSocket,netty +} diff --git a/connect-core/src/main/java/org/needcoke/rpc/common/exception/CokeConnectException.java b/connect-core/src/main/java/org/needcoke/rpc/common/exception/CokeConnectException.java index b3245e3..29bf086 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/common/exception/CokeConnectException.java +++ b/connect-core/src/main/java/org/needcoke/rpc/common/exception/CokeConnectException.java @@ -2,6 +2,7 @@ package org.needcoke.rpc.common.exception; import lombok.Data; import org.needcoke.rpc.common.enums.ConnectionExceptionEnum; +import org.needcoke.rpc.config.RequestIdContextHolder; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ResponseStatus; @@ -19,6 +20,8 @@ public class CokeConnectException extends RuntimeException { private String note; + private String requestId; + public CokeConnectException(String message, Throwable cause, String errorCode) { super(message, cause); this.errorCode = errorCode; @@ -39,5 +42,13 @@ public class CokeConnectException extends RuntimeException { super(connectionExceptionEnum.getValue(),e); this.errorCode = connectionExceptionEnum.getErrorCode(); this.note = connectionExceptionEnum.getNote(); + this.requestId = RequestIdContextHolder.getRequestId(); + } + + public CokeConnectException(String requestId ,ConnectionExceptionEnum connectionExceptionEnum,Throwable e) { + super(connectionExceptionEnum.getValue(),e); + this.errorCode = connectionExceptionEnum.getErrorCode(); + this.note = connectionExceptionEnum.getNote(); + this.requestId = requestId; } } diff --git a/connect-core/src/main/java/org/needcoke/rpc/config/CokeHandlerInterceptorAdapter.java b/connect-core/src/main/java/org/needcoke/rpc/config/CokeHandlerInterceptorAdapter.java new file mode 100644 index 0000000..26e487c --- /dev/null +++ b/connect-core/src/main/java/org/needcoke/rpc/config/CokeHandlerInterceptorAdapter.java @@ -0,0 +1,23 @@ +package org.needcoke.rpc.config; + +import cn.hutool.core.util.StrUtil; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +@Component +public class CokeHandlerInterceptorAdapter extends HandlerInterceptorAdapter { + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + String COKE_REQUEST_ID_HEADER_ID_NAME = "COKE_REQUEST_ID"; + String cokeRequestId = request.getHeader(COKE_REQUEST_ID_HEADER_ID_NAME); + if(StrUtil.isEmpty(cokeRequestId)){ + RequestIdContextHolder.setRequestId(RequestIdContextHolder.newRequestId()); + }else{ + RequestIdContextHolder.setRequestId(cokeRequestId); + } + return super.preHandle(request, response, handler); + } +} diff --git a/connect-core/src/main/java/org/needcoke/rpc/config/RequestIdContextHolder.java b/connect-core/src/main/java/org/needcoke/rpc/config/RequestIdContextHolder.java new file mode 100644 index 0000000..dc626e0 --- /dev/null +++ b/connect-core/src/main/java/org/needcoke/rpc/config/RequestIdContextHolder.java @@ -0,0 +1,49 @@ +package org.needcoke.rpc.config; + +import com.alibaba.ttl.TransmittableThreadLocal; +import lombok.experimental.UtilityClass; +import org.needcoke.rpc.utils.SpringContextUtils; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.concurrent.atomic.AtomicLong; + +@UtilityClass +public class RequestIdContextHolder { + + private final ThreadLocal THREAD_LOCAL_REQUEST_ID = new TransmittableThreadLocal<>(); + + public void setRequestId(String requestId){ + THREAD_LOCAL_REQUEST_ID.set(requestId); + } + + public String getRequestId(){ + return THREAD_LOCAL_REQUEST_ID.get(); + } + + public void clear() { + THREAD_LOCAL_REQUEST_ID.remove(); + } + + private final AtomicLong requestIdMaker = new AtomicLong(1); + + public long getAndAdd(){ + return requestIdMaker.getAndAdd(1); + } + + + + public static String newRequestId(){ + try { + InetAddress localHost = InetAddress.getLocalHost(); + String ip = localHost.getHostAddress(); + int port = SpringContextUtils.getBean(ServerConfig.class).getMvcPort(); + return ip+":"+port+"#"+getAndAdd(); + } catch (UnknownHostException e) { + e.printStackTrace(); + } + + return "error-request-id"; + } + +} diff --git a/connect-core/src/main/java/org/needcoke/rpc/config/ServerConfig.java b/connect-core/src/main/java/org/needcoke/rpc/config/ServerConfig.java index 4e59bb9..624c5e2 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/config/ServerConfig.java +++ b/connect-core/src/main/java/org/needcoke/rpc/config/ServerConfig.java @@ -1,6 +1,7 @@ package org.needcoke.rpc.config; import lombok.Getter; +import org.needcoke.rpc.common.enums.RpcTypeEnum; import org.needcoke.rpc.invoker.ConnectInvoker; import org.needcoke.rpc.invoker.OkHttpsInvoker; import org.needcoke.rpc.invoker.SmartSocketInvoker; @@ -26,13 +27,16 @@ public class ServerConfig { @Value("${coke.server.type:http}") private String serverType; + @Value("${server.port}") + private int mvcPort; + /** * coke-connect的默认远程调用组件为okHttps */ @ConditionalOnMissingBean(ConnectInvoker.class) @Bean - public OkHttpsInvoker okHttpsInvoker(){ - return new OkHttpsInvoker(); + public OkHttpsInvoker okHttpsInvoker(RpcTypeEnum rpcTypeEnum){ + return new OkHttpsInvoker(rpcTypeEnum); } /** @@ -61,4 +65,9 @@ public class ServerConfig { public Map cokeServerPortMap(){ return new ConcurrentHashMap<>(); } + + @Bean + public RpcTypeEnum rpcType(){ + return RpcTypeEnum.okHttp3; + } } diff --git a/connect-core/src/main/java/org/needcoke/rpc/controller/RpcController.java b/connect-core/src/main/java/org/needcoke/rpc/controller/RpcController.java index 833b5a2..8c3b884 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/controller/RpcController.java +++ b/connect-core/src/main/java/org/needcoke/rpc/controller/RpcController.java @@ -5,9 +5,12 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.needcoke.rpc.common.constant.ConnectConstant; import org.needcoke.rpc.common.enums.ConnectionExceptionEnum; +import org.needcoke.rpc.common.enums.RpcTypeEnum; import org.needcoke.rpc.common.exception.CokeConnectException; +import org.needcoke.rpc.config.RequestIdContextHolder; import org.needcoke.rpc.config.ServerConfig; import org.needcoke.rpc.invoker.OkHttpsInvoker; +import org.needcoke.rpc.invoker.SmartSocketInvoker; import org.needcoke.rpc.utils.SpringContextUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; @@ -42,7 +45,7 @@ public class RpcController { public Object execute(@RequestParam String beanName, @RequestParam String methodName, @RequestBody Map params) { - log.info("execute http -- beanName : {} , methodName : {} , param : {}", beanName, methodName, JSONObject.toJSONString(params)); + log.info("execute http -- beanName : {} , methodName : {} , param : {} ,requestId = {}", beanName, methodName, JSONObject.toJSONString(params), RequestIdContextHolder.getRequestId()); Method method = SpringContextUtils.getMethod(beanName, methodName); if (null == method) { log.error(ConnectionExceptionEnum.BEAN_WITHOUT_METHOD.logStatement(ConnectConstant.EXECUTE_RELATIVE_PATH)); @@ -71,4 +74,14 @@ public class RpcController { } return 0; } + + @GetMapping("rpcType") + public RpcTypeEnum getRpcType(){ + try { + SmartSocketInvoker bean = applicationContext.getBean(SmartSocketInvoker.class); + }catch (Exception e){ + return RpcTypeEnum.smartSocket; + } + return RpcTypeEnum.okHttp3; + } } diff --git a/connect-core/src/main/java/org/needcoke/rpc/invoker/ConnectInvoker.java b/connect-core/src/main/java/org/needcoke/rpc/invoker/ConnectInvoker.java index 8c26c43..d33b5da 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/invoker/ConnectInvoker.java +++ b/connect-core/src/main/java/org/needcoke/rpc/invoker/ConnectInvoker.java @@ -1,17 +1,23 @@ package org.needcoke.rpc.invoker; import com.alibaba.fastjson.JSONObject; +import com.ejlchina.okhttps.HTTP; import com.ejlchina.okhttps.HttpResult; +import com.ejlchina.okhttps.SHttpTask; +import com.ejlchina.okhttps.jackson.JacksonMsgConvertor; import lombok.extern.slf4j.Slf4j; +import org.needcoke.rpc.common.constant.ConnectConstant; +import org.needcoke.rpc.common.enums.HttpContentTypeEnum; +import org.needcoke.rpc.common.enums.RpcTypeEnum; +import org.needcoke.rpc.net.Connector; import org.springframework.cloud.client.ServiceInstance; - -import java.io.IOException; +import java.util.HashMap; import java.util.Map; @Slf4j public abstract class ConnectInvoker { - public abstract InvokeResult execute(ServiceInstance instance, String beanName, String methodName, Map params); + public abstract InvokeResult execute(Connector connector, ServiceInstance instance, String beanName, String methodName, Map params); /** @@ -27,4 +33,20 @@ public abstract class ConnectInvoker { " , params = " + JSONObject.toJSONString(params); log.debug(builder); } + + private final Map remoteRpcTypeMap = new HashMap<>(); + + public RpcTypeEnum getRemoteRpcType(ServiceInstance instance) { + if (remoteRpcTypeMap.containsKey(instance)) { + return remoteRpcTypeMap.get(instance); + } + SHttpTask sHttpTask = HTTP.builder().addMsgConvertor(new JacksonMsgConvertor()).build() + .sync(instance.getUri() + ConnectConstant.COKE_RPC_TYPE_RELATIVE_PATH) + .bodyType(HttpContentTypeEnum.JSON.getValue()); + HttpResult result = sHttpTask + .get(); + RpcTypeEnum rpcTypeEnum = result.getBody().toBean(RpcTypeEnum.class); + remoteRpcTypeMap.put(instance, rpcTypeEnum); + return rpcTypeEnum; + } } diff --git a/connect-core/src/main/java/org/needcoke/rpc/invoker/OkHttpsInvoker.java b/connect-core/src/main/java/org/needcoke/rpc/invoker/OkHttpsInvoker.java index ac0753f..7fe2006 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/invoker/OkHttpsInvoker.java +++ b/connect-core/src/main/java/org/needcoke/rpc/invoker/OkHttpsInvoker.java @@ -6,6 +6,10 @@ import com.ejlchina.okhttps.SHttpTask; import com.ejlchina.okhttps.jackson.JacksonMsgConvertor; import org.needcoke.rpc.common.constant.ConnectConstant; import org.needcoke.rpc.common.enums.HttpContentTypeEnum; +import org.needcoke.rpc.common.enums.RpcTypeEnum; +import org.needcoke.rpc.config.RequestIdContextHolder; +import org.needcoke.rpc.net.Connector; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.client.ServiceInstance; import org.springframework.web.context.request.RequestAttributes; import org.springframework.web.context.request.RequestContextHolder; @@ -20,26 +24,28 @@ import java.util.Map; */ public class OkHttpsInvoker extends ConnectInvoker { - public OkHttpsInvoker() { - System.out.println("哈哈哈"); + + public OkHttpsInvoker(RpcTypeEnum rpcTypeEnum) { + rpcTypeEnum = RpcTypeEnum.okHttp3; } @Override - public InvokeResult execute(ServiceInstance instance, String beanName, String methodName, Map params) { - + public InvokeResult execute(Connector connector, ServiceInstance instance, String beanName, String methodName, Map params) { RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes(); HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest(); + String COKE_REQUEST_ID_HEADER_ID_NAME = "COKE_REQUEST_ID"; SHttpTask sHttpTask = HTTP.builder().addMsgConvertor(new JacksonMsgConvertor()).build() .sync(instance.getUri() + ConnectConstant.EXECUTE_RELATIVE_PATH) .bodyType(HttpContentTypeEnum.JSON.getValue()) .addBodyPara(params) + .addHeader(COKE_REQUEST_ID_HEADER_ID_NAME, RequestIdContextHolder.getRequestId()) .addUrlPara(ConnectConstant.BEAN_NAME, beanName) .addUrlPara(ConnectConstant.METHOD_NAME, methodName); Enumeration headerNames = request.getHeaderNames(); while (headerNames.hasMoreElements()) { String nextElement = headerNames.nextElement(); String header = request.getHeader(nextElement); - sHttpTask.addHeader(nextElement,header); + sHttpTask.addHeader(nextElement, header); } HttpResult result = sHttpTask .post(); diff --git a/connect-core/src/main/java/org/needcoke/rpc/invoker/SmartSocketInvoker.java b/connect-core/src/main/java/org/needcoke/rpc/invoker/SmartSocketInvoker.java index 7e34485..89a0943 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/invoker/SmartSocketInvoker.java +++ b/connect-core/src/main/java/org/needcoke/rpc/invoker/SmartSocketInvoker.java @@ -6,9 +6,14 @@ import org.needcoke.rpc.codec.CokeRequest; import org.needcoke.rpc.codec.CokeRequestProtocol; import org.needcoke.rpc.common.constant.ConnectConstant; import org.needcoke.rpc.common.enums.ConnectionExceptionEnum; +import org.needcoke.rpc.common.enums.RpcTypeEnum; import org.needcoke.rpc.common.exception.CokeConnectException; +import org.needcoke.rpc.config.RequestIdContextHolder; +import org.needcoke.rpc.net.Connector; +import org.needcoke.rpc.net.ConnectorFactory; import org.needcoke.rpc.processor.smart_socket.SmartSocketClientProcessor; import org.needcoke.rpc.utils.ConnectUtil; +import org.needcoke.rpc.utils.SpringContextUtils; import org.smartboot.socket.transport.AioQuickClient; import org.smartboot.socket.transport.AioSession; import org.springframework.cloud.client.ServiceInstance; @@ -21,6 +26,12 @@ import java.util.concurrent.locks.LockSupport; @Slf4j public class SmartSocketInvoker extends ConnectInvoker { + private RpcTypeEnum rpcTypeEnum; + + public SmartSocketInvoker(RpcTypeEnum rpcTypeEnum) { + this.rpcTypeEnum = rpcTypeEnum; + } + /** * 给AioQuickClient加个引用,防止垃圾回收。 */ @@ -29,7 +40,15 @@ public class SmartSocketInvoker extends ConnectInvoker { private final Map sessionMap = new ConcurrentHashMap<>(); @Override - public InvokeResult execute(ServiceInstance instance, String beanName, String methodName, Map params) { + public InvokeResult execute(Connector connector, ServiceInstance instance, String beanName, String methodName, Map params) { + RpcTypeEnum remoteRpcType = getRemoteRpcType(instance); + if(remoteRpcType == RpcTypeEnum.okHttp3){ + if (null == connector.getHttpInvoker()) { + connector.setHttpInvoker(new OkHttpsInvoker(RpcTypeEnum.okHttp3)); + } + return connector.compensationExecute(instance,beanName,methodName,params); + } + String uri = instance.getHost() + ConnectConstant.COLON + instance.getPort(); Integer serverPort = ConnectUtil.getCokeServerPort(instance); if (0 == serverPort) { @@ -47,10 +66,11 @@ public class SmartSocketInvoker extends ConnectInvoker { } AioSession session = sessionMap.get(uri); int requestId = ConnectUtil.requestIdMaker.addAndGet(1); + String COKE_REQUEST_ID_HEADER_ID_NAME = "COKE_REQUEST_ID"; CokeRequest request = new CokeRequest().setBeanName(beanName) .setMethodName(methodName) .setParams(params) - .setRequestId(requestId); + .addHeader(COKE_REQUEST_ID_HEADER_ID_NAME, RequestIdContextHolder.getRequestId()); byte[] bytes = request.toBytes(); try { session.writeBuffer().writeInt(bytes.length); @@ -62,15 +82,17 @@ public class SmartSocketInvoker extends ConnectInvoker { try { session = clientMap.get(uri).start(); } catch (IOException ex) { - //与远程服务重建连接失败 - throw new CokeConnectException(ConnectionExceptionEnum.RECONNECTION_WITH_REMOTE_SERVICE_FAILED); + if (null == connector.getHttpInvoker()) { + connector.setHttpInvoker(new OkHttpsInvoker(RpcTypeEnum.okHttp3)); + } + return connector.compensationExecute(instance,beanName,methodName,params); } sessionMap.put(uri,session); - return execute(instance,beanName,methodName,params); + return execute(connector,instance,beanName,methodName,params); } InvokeResult tmp = new InvokeResult(); long start = DateUtil.current(); - ConnectUtil.putRequestMap(requestId, tmp); + ConnectUtil.putRequestMap(tmp); ConnectUtil.threadMap.put(requestId, Thread.currentThread()); LockSupport.park(); InvokeResult result = ConnectUtil.getFromRequestMap(requestId); diff --git a/connect-core/src/main/java/org/needcoke/rpc/net/Connector.java b/connect-core/src/main/java/org/needcoke/rpc/net/Connector.java new file mode 100644 index 0000000..77aa1ca --- /dev/null +++ b/connect-core/src/main/java/org/needcoke/rpc/net/Connector.java @@ -0,0 +1,70 @@ +package org.needcoke.rpc.net; + +import org.needcoke.rpc.common.enums.RpcTypeEnum; +import org.needcoke.rpc.invoker.ConnectInvoker; +import org.needcoke.rpc.invoker.InvokeResult; +import org.needcoke.rpc.loadBalance.LoadBalance; +import org.springframework.cloud.client.ServiceInstance; +import org.springframework.cloud.client.discovery.DiscoveryClient; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public class Connector { + + private final String serviceId; + + private final DiscoveryClient discoveryClient; + + private final ConnectInvoker invoker; + + private final LoadBalance loadBalance; + + private ConnectInvoker httpInvoker; + + private final ConcurrentHashMap requestTypeMap; + + public Connector(String serviceId, DiscoveryClient discoveryClient, ConnectInvoker invoker, LoadBalance loadBalance) { + this.serviceId = serviceId; + this.discoveryClient = discoveryClient; + this.invoker = invoker; + this.loadBalance = loadBalance; + this.requestTypeMap = new ConcurrentHashMap<>(); + } + + public ConcurrentHashMap getRequestTypeMap() { + return requestTypeMap; + } + + /** + * 执行远程方法 + * + * @param beanName 远程服务上的 bean的名称 + * @param methodName 方法名称 或 @Call value + * @return 返回远程方法执行结果的json + */ + public InvokeResult execute(String beanName, + String methodName, + Map params) { + List instances = discoveryClient.getInstances(serviceId); + ServiceInstance instance = loadBalance.choose(serviceId, instances); + InvokeResult result = invoker.execute(this, instance, beanName, methodName, params); + return result; + } + + public ConnectInvoker getHttpInvoker() { + return httpInvoker; + } + + public void setHttpInvoker(ConnectInvoker httpInvoker) { + this.httpInvoker = httpInvoker; + } + + public InvokeResult compensationExecute(ServiceInstance instance, + String beanName, + String methodName, + Map params) { + return this.httpInvoker.execute(this, instance, beanName, methodName, params); + } +} diff --git a/connect-core/src/main/java/org/needcoke/rpc/net/ConnectorFactory.java b/connect-core/src/main/java/org/needcoke/rpc/net/ConnectorFactory.java new file mode 100644 index 0000000..0cc0d55 --- /dev/null +++ b/connect-core/src/main/java/org/needcoke/rpc/net/ConnectorFactory.java @@ -0,0 +1,48 @@ +package org.needcoke.rpc.net; + +import org.needcoke.rpc.invoker.ConnectInvoker; +import org.needcoke.rpc.loadBalance.LoadBalance; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.client.discovery.DiscoveryClient; +import org.springframework.stereotype.Component; + +import java.util.concurrent.ConcurrentHashMap; + +@Component +public class ConnectorFactory { + + private DiscoveryClient dc; + + private ConnectInvoker ci; + + private LoadBalance lb; + + @Autowired + public void setLb(LoadBalance lb) { + this.lb = lb; + } + @Autowired + public void setCi(ConnectInvoker ci) { + this.ci = ci; + } + + @Autowired + public void setDc(DiscoveryClient dc) { + this.dc = dc; + } + + private final ConcurrentHashMap connectorMap = new ConcurrentHashMap<>(); + + /** + * 创建或者获取连接器 + */ + public Connector connector(String serviceId){ + if (connectorMap.containsKey(serviceId)) { + return connectorMap.get(serviceId); + } + Connector connector = new Connector(serviceId, dc, ci, lb); + connectorMap.put(serviceId,connector); + return connector; + } + +} diff --git a/connect-core/src/main/java/org/needcoke/rpc/processor/smart_socket/SmartSocketClientProcessor.java b/connect-core/src/main/java/org/needcoke/rpc/processor/smart_socket/SmartSocketClientProcessor.java index e166d20..092a87b 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/processor/smart_socket/SmartSocketClientProcessor.java +++ b/connect-core/src/main/java/org/needcoke/rpc/processor/smart_socket/SmartSocketClientProcessor.java @@ -3,6 +3,7 @@ package org.needcoke.rpc.processor.smart_socket; import lombok.extern.slf4j.Slf4j; import org.needcoke.rpc.codec.CokeRequest; import org.needcoke.rpc.common.enums.ConnectRequestEnum; +import org.needcoke.rpc.config.RequestIdContextHolder; import org.needcoke.rpc.utils.ConnectUtil; import org.smartboot.socket.transport.AioSession; @@ -14,11 +15,10 @@ public class SmartSocketClientProcessor extends SmartSocketMessageProcessor { @Override public void process(AioSession session, CokeRequest request) { - + String COKE_REQUEST_ID_HEADER_ID_NAME = "COKE_REQUEST_ID"; + if (request.getHeaders().containsKey(COKE_REQUEST_ID_HEADER_ID_NAME)) { + RequestIdContextHolder.setRequestId(request.getHeaders().get(COKE_REQUEST_ID_HEADER_ID_NAME)); + } else { + RequestIdContextHolder.setRequestId(RequestIdContextHolder.newRequestId()); + } //TODO 将该段代码抽出成公共的 if (ConnectRequestEnum.INTERNAL_REQUEST == request.getRequestType()) { String beanName = request.getBeanName(); String methodName = request.getMethodName(); Map params = request.getParams(); - log.info("execute smart socket requestId = {} , -- beanName : {} , methodName : {} , param : {}", request.getRequestId(), beanName, methodName, JSONObject.toJSONString(params)); + log.info("execute smart socket requestId = {} , -- beanName : {} , methodName : {} , param : {}", RequestIdContextHolder.getRequestId(), beanName, methodName, JSONObject.toJSONString(params)); Method method = SpringContextUtils.getMethod(beanName, methodName); if (null == method) { - log.error(ConnectionExceptionEnum.BEAN_WITHOUT_METHOD.logStatement("beanName {} , methodName {}"), beanName, methodName); + log.error(ConnectionExceptionEnum.BEAN_WITHOUT_METHOD.logStatement("beanName {} , methodName {} , requestId = {}"), beanName, methodName, RequestIdContextHolder.getRequestId()); throw new CokeConnectException(ConnectionExceptionEnum.BEAN_WITHOUT_METHOD); } Object bean = SpringContextUtils.getBean(beanName); try { Object invoke = null; - if(CollUtil.isEmpty(params)){ - invoke= method.invoke(bean); - }else { - invoke = method.invoke(bean,params.values().toArray()); + if (CollUtil.isEmpty(params)) { + invoke = method.invoke(bean); + } else { + invoke = method.invoke(bean, params.values().toArray()); } InvokeResult invokeResult = new InvokeResult().setBody(invoke).setStatus(200).setTime(30L); this.response(session, request.setRequestType(ConnectRequestEnum.INTERNAL_RESPONSE).setResult(invokeResult)); } catch (Exception e) { log.error(ConnectionExceptionEnum.INVOKE_METHOD_ERROR.logStatement(ConnectConstant.EXECUTE_RELATIVE_PATH)); - throw new CokeConnectException(ConnectionExceptionEnum.INVOKE_METHOD_ERROR,e); + throw new CokeConnectException(ConnectionExceptionEnum.INVOKE_METHOD_ERROR, e); } } diff --git a/connect-core/src/main/java/org/needcoke/rpc/server/SmartSocketServer.java b/connect-core/src/main/java/org/needcoke/rpc/server/SmartSocketServer.java index 319b4ca..c698371 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/server/SmartSocketServer.java +++ b/connect-core/src/main/java/org/needcoke/rpc/server/SmartSocketServer.java @@ -5,14 +5,11 @@ import org.needcoke.rpc.codec.CokeRequestProtocol; import org.needcoke.rpc.config.ServerConfig; import org.needcoke.rpc.processor.smart_socket.SmartSocketServerProcessor; import org.smartboot.socket.transport.AioQuickServer; -import org.springframework.cloud.client.ServiceInstance; -import org.springframework.cloud.client.discovery.DiscoveryClient; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import javax.annotation.Resource; import java.io.IOException; -import java.util.List; @Slf4j public class SmartSocketServer implements ConnectionServer{ diff --git a/connect-core/src/main/java/org/needcoke/rpc/utils/ConnectUtil.java b/connect-core/src/main/java/org/needcoke/rpc/utils/ConnectUtil.java index b59512c..2066d4a 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/utils/ConnectUtil.java +++ b/connect-core/src/main/java/org/needcoke/rpc/utils/ConnectUtil.java @@ -7,6 +7,7 @@ import com.ejlchina.okhttps.jackson.JacksonMsgConvertor; import lombok.extern.slf4j.Slf4j; import org.needcoke.rpc.common.constant.ConnectConstant; import org.needcoke.rpc.common.enums.HttpContentTypeEnum; +import org.needcoke.rpc.config.RequestIdContextHolder; import org.needcoke.rpc.invoker.ConnectInvoker; import org.needcoke.rpc.invoker.InvokeResult; import org.needcoke.rpc.loadBalance.LoadBalance; @@ -72,15 +73,15 @@ public class ConnectUtil { public static final AtomicInteger requestIdMaker = new AtomicInteger(); - public static final Map requestMap = new ConcurrentHashMap(); + public static final Map requestMap = new ConcurrentHashMap(); public static void putRequestMap(InvokeResult result){ - requestMap.put(requestIdMaker.addAndGet(1),result); + requestMap.put(RequestIdContextHolder.getRequestId(),result); } public static ConcurrentHashMap threadMap = new ConcurrentHashMap<>(); - public static void putRequestMap(Integer requestId,InvokeResult result){ + public static void putRequestMap(String requestId,InvokeResult result){ requestMap.put(requestId,result); } @@ -101,7 +102,7 @@ public class ConnectUtil { Map params) { List instances = discoveryClient.getInstances(serviceId); ServiceInstance instance = loadBalance.choose(serviceId,instances); - InvokeResult result = connectInvoker.execute(instance, beanName, methodName, params); + InvokeResult result = connectInvoker.execute(null,instance, beanName, methodName, params); return result; } -- Gitee From 82bac05c8ae695f31da5c31eb55c04ac48ad7843 Mon Sep 17 00:00:00 2001 From: warren Date: Mon, 20 Jun 2022 09:48:54 +0800 Subject: [PATCH 05/22] =?UTF-8?q?=E7=A7=BB=E5=8A=A8requestId=E7=9A=84key?= =?UTF-8?q?=E5=88=B0constant=E5=8C=85=E7=9B=AE=E5=BD=95=E4=B8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/needcoke/rpc/common/constant/ConnectConstant.java | 2 ++ .../needcoke/rpc/config/CokeHandlerInterceptorAdapter.java | 4 ++-- .../main/java/org/needcoke/rpc/invoker/OkHttpsInvoker.java | 4 +--- .../java/org/needcoke/rpc/invoker/SmartSocketInvoker.java | 6 +----- .../processor/smart_socket/SmartSocketServerProcessor.java | 5 ++--- 5 files changed, 8 insertions(+), 13 deletions(-) diff --git a/connect-core/src/main/java/org/needcoke/rpc/common/constant/ConnectConstant.java b/connect-core/src/main/java/org/needcoke/rpc/common/constant/ConnectConstant.java index f4c8e08..817903e 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/common/constant/ConnectConstant.java +++ b/connect-core/src/main/java/org/needcoke/rpc/common/constant/ConnectConstant.java @@ -36,4 +36,6 @@ public interface ConnectConstant { * 冒号 : */ String COLON = ":"; + + String COKE_REQUEST_ID_HEADER_ID_NAME = "COKE_REQUEST_ID"; } diff --git a/connect-core/src/main/java/org/needcoke/rpc/config/CokeHandlerInterceptorAdapter.java b/connect-core/src/main/java/org/needcoke/rpc/config/CokeHandlerInterceptorAdapter.java index 26e487c..b4845b0 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/config/CokeHandlerInterceptorAdapter.java +++ b/connect-core/src/main/java/org/needcoke/rpc/config/CokeHandlerInterceptorAdapter.java @@ -1,6 +1,7 @@ package org.needcoke.rpc.config; import cn.hutool.core.util.StrUtil; +import org.needcoke.rpc.common.constant.ConnectConstant; import org.springframework.stereotype.Component; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; import javax.servlet.http.HttpServletRequest; @@ -11,8 +12,7 @@ public class CokeHandlerInterceptorAdapter extends HandlerInterceptorAdapter { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { - String COKE_REQUEST_ID_HEADER_ID_NAME = "COKE_REQUEST_ID"; - String cokeRequestId = request.getHeader(COKE_REQUEST_ID_HEADER_ID_NAME); + String cokeRequestId = request.getHeader(ConnectConstant.COKE_REQUEST_ID_HEADER_ID_NAME); if(StrUtil.isEmpty(cokeRequestId)){ RequestIdContextHolder.setRequestId(RequestIdContextHolder.newRequestId()); }else{ diff --git a/connect-core/src/main/java/org/needcoke/rpc/invoker/OkHttpsInvoker.java b/connect-core/src/main/java/org/needcoke/rpc/invoker/OkHttpsInvoker.java index 7fe2006..fb800eb 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/invoker/OkHttpsInvoker.java +++ b/connect-core/src/main/java/org/needcoke/rpc/invoker/OkHttpsInvoker.java @@ -9,7 +9,6 @@ import org.needcoke.rpc.common.enums.HttpContentTypeEnum; import org.needcoke.rpc.common.enums.RpcTypeEnum; import org.needcoke.rpc.config.RequestIdContextHolder; import org.needcoke.rpc.net.Connector; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.client.ServiceInstance; import org.springframework.web.context.request.RequestAttributes; import org.springframework.web.context.request.RequestContextHolder; @@ -33,12 +32,11 @@ public class OkHttpsInvoker extends ConnectInvoker { public InvokeResult execute(Connector connector, ServiceInstance instance, String beanName, String methodName, Map params) { RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes(); HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest(); - String COKE_REQUEST_ID_HEADER_ID_NAME = "COKE_REQUEST_ID"; SHttpTask sHttpTask = HTTP.builder().addMsgConvertor(new JacksonMsgConvertor()).build() .sync(instance.getUri() + ConnectConstant.EXECUTE_RELATIVE_PATH) .bodyType(HttpContentTypeEnum.JSON.getValue()) .addBodyPara(params) - .addHeader(COKE_REQUEST_ID_HEADER_ID_NAME, RequestIdContextHolder.getRequestId()) + .addHeader(ConnectConstant.COKE_REQUEST_ID_HEADER_ID_NAME, RequestIdContextHolder.getRequestId()) .addUrlPara(ConnectConstant.BEAN_NAME, beanName) .addUrlPara(ConnectConstant.METHOD_NAME, methodName); Enumeration headerNames = request.getHeaderNames(); diff --git a/connect-core/src/main/java/org/needcoke/rpc/invoker/SmartSocketInvoker.java b/connect-core/src/main/java/org/needcoke/rpc/invoker/SmartSocketInvoker.java index 89a0943..71e2d0c 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/invoker/SmartSocketInvoker.java +++ b/connect-core/src/main/java/org/needcoke/rpc/invoker/SmartSocketInvoker.java @@ -10,10 +10,8 @@ import org.needcoke.rpc.common.enums.RpcTypeEnum; import org.needcoke.rpc.common.exception.CokeConnectException; import org.needcoke.rpc.config.RequestIdContextHolder; import org.needcoke.rpc.net.Connector; -import org.needcoke.rpc.net.ConnectorFactory; import org.needcoke.rpc.processor.smart_socket.SmartSocketClientProcessor; import org.needcoke.rpc.utils.ConnectUtil; -import org.needcoke.rpc.utils.SpringContextUtils; import org.smartboot.socket.transport.AioQuickClient; import org.smartboot.socket.transport.AioSession; import org.springframework.cloud.client.ServiceInstance; @@ -48,7 +46,6 @@ public class SmartSocketInvoker extends ConnectInvoker { } return connector.compensationExecute(instance,beanName,methodName,params); } - String uri = instance.getHost() + ConnectConstant.COLON + instance.getPort(); Integer serverPort = ConnectUtil.getCokeServerPort(instance); if (0 == serverPort) { @@ -66,11 +63,10 @@ public class SmartSocketInvoker extends ConnectInvoker { } AioSession session = sessionMap.get(uri); int requestId = ConnectUtil.requestIdMaker.addAndGet(1); - String COKE_REQUEST_ID_HEADER_ID_NAME = "COKE_REQUEST_ID"; CokeRequest request = new CokeRequest().setBeanName(beanName) .setMethodName(methodName) .setParams(params) - .addHeader(COKE_REQUEST_ID_HEADER_ID_NAME, RequestIdContextHolder.getRequestId()); + .addHeader(ConnectConstant.COKE_REQUEST_ID_HEADER_ID_NAME, RequestIdContextHolder.getRequestId()); byte[] bytes = request.toBytes(); try { session.writeBuffer().writeInt(bytes.length); diff --git a/connect-core/src/main/java/org/needcoke/rpc/processor/smart_socket/SmartSocketServerProcessor.java b/connect-core/src/main/java/org/needcoke/rpc/processor/smart_socket/SmartSocketServerProcessor.java index 53e9cf3..09d834e 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/processor/smart_socket/SmartSocketServerProcessor.java +++ b/connect-core/src/main/java/org/needcoke/rpc/processor/smart_socket/SmartSocketServerProcessor.java @@ -21,9 +21,8 @@ import java.util.Map; public class SmartSocketServerProcessor extends SmartSocketMessageProcessor { @Override public void process(AioSession session, CokeRequest request) { - String COKE_REQUEST_ID_HEADER_ID_NAME = "COKE_REQUEST_ID"; - if (request.getHeaders().containsKey(COKE_REQUEST_ID_HEADER_ID_NAME)) { - RequestIdContextHolder.setRequestId(request.getHeaders().get(COKE_REQUEST_ID_HEADER_ID_NAME)); + if (request.getHeaders().containsKey(ConnectConstant.COKE_REQUEST_ID_HEADER_ID_NAME)) { + RequestIdContextHolder.setRequestId(request.getHeaders().get(ConnectConstant.COKE_REQUEST_ID_HEADER_ID_NAME)); } else { RequestIdContextHolder.setRequestId(RequestIdContextHolder.newRequestId()); } -- Gitee From 084f837dd130489d3ff34ed2ab4de1e114ecf09b Mon Sep 17 00:00:00 2001 From: warren Date: Mon, 20 Jun 2022 16:42:00 +0800 Subject: [PATCH 06/22] =?UTF-8?q?=E9=93=BE=E8=B7=AF=E8=BF=BD=E8=B8=AA?= =?UTF-8?q?=E5=9F=8B=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/needcoke/b/BApplication.java | 10 +--- connect-core/pom.xml | 8 +-- .../org/needcoke/rpc/codec/CokeRequest.java | 6 ++- .../rpc/common/constant/ConnectConstant.java | 2 +- .../exception/CokeConnectException.java | 4 +- .../config/CokeHandlerInterceptorAdapter.java | 33 +++++++----- .../rpc/config/CokeWebMvcConfigurer.java | 14 +++++ .../rpc/config/RequestIdContextHolder.java | 49 ----------------- .../rpc/controller/RpcController.java | 8 +-- .../needcoke/rpc/invoker/OkHttpsInvoker.java | 4 +- .../rpc/invoker/SmartSocketInvoker.java | 11 ++-- .../SmartSocketClientProcessor.java | 10 ++-- .../SmartSocketServerProcessor.java | 26 ++++++--- .../org/needcoke/rpc/utils/ConnectUtil.java | 14 ++--- connect-link-tracking/pom.xml | 52 ++++++++++++++++++ .../link/tracking/common/CommonConstant.java | 6 +++ .../config/LinkTrackingContextHolder.java | 32 +++++++++++ .../rpc/link/tracking/net/LinkTracking.java | 53 +++++++++++++++++++ .../rpc/link/tracking/util/TrackingUtil.java | 49 +++++++++++++++++ pom.xml | 1 + 20 files changed, 279 insertions(+), 113 deletions(-) create mode 100644 connect-core/src/main/java/org/needcoke/rpc/config/CokeWebMvcConfigurer.java delete mode 100644 connect-core/src/main/java/org/needcoke/rpc/config/RequestIdContextHolder.java create mode 100644 connect-link-tracking/pom.xml create mode 100644 connect-link-tracking/src/main/java/org/connect/rpc/link/tracking/common/CommonConstant.java create mode 100644 connect-link-tracking/src/main/java/org/connect/rpc/link/tracking/config/LinkTrackingContextHolder.java create mode 100644 connect-link-tracking/src/main/java/org/connect/rpc/link/tracking/net/LinkTracking.java create mode 100644 connect-link-tracking/src/main/java/org/connect/rpc/link/tracking/util/TrackingUtil.java diff --git a/business-b/src/main/java/org/needcoke/b/BApplication.java b/business-b/src/main/java/org/needcoke/b/BApplication.java index 6da8433..a1a0e71 100644 --- a/business-b/src/main/java/org/needcoke/b/BApplication.java +++ b/business-b/src/main/java/org/needcoke/b/BApplication.java @@ -1,10 +1,8 @@ package org.needcoke.b; -import org.needcoke.rpc.utils.SpringContextUtils; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; -import org.springframework.context.ConfigurableApplicationContext; /** * @author Gilgamesh @@ -15,12 +13,6 @@ import org.springframework.context.ConfigurableApplicationContext; public class BApplication { public static void main(String[] args) { - ConfigurableApplicationContext run = SpringApplication.run(BApplication.class, args); - SpringContextUtils bean = run.getBean(SpringContextUtils.class); - - Object beanNameMethodMap = run.getBean("beanNameMethodMap"); - - System.out.println(123); - + SpringApplication.run(BApplication.class, args); } } diff --git a/connect-core/pom.xml b/connect-core/pom.xml index f932e6a..3148587 100644 --- a/connect-core/pom.xml +++ b/connect-core/pom.xml @@ -81,12 +81,12 @@ 2.2.5.RELEASE compile + - com.alibaba - transmittable-thread-local - 2.12.1 + org.needcoke + connect-link-tracking + abandon - diff --git a/connect-core/src/main/java/org/needcoke/rpc/codec/CokeRequest.java b/connect-core/src/main/java/org/needcoke/rpc/codec/CokeRequest.java index cd5fd9f..6b037c2 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/codec/CokeRequest.java +++ b/connect-core/src/main/java/org/needcoke/rpc/codec/CokeRequest.java @@ -4,8 +4,6 @@ import com.alibaba.fastjson.JSONObject; import lombok.Getter; import org.needcoke.rpc.common.enums.ConnectRequestEnum; import org.needcoke.rpc.invoker.InvokeResult; - -import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.Map; @@ -63,6 +61,10 @@ public class CokeRequest { return this; } + public String getHeader(String name){ + return this.headers.get(name); + } + public CokeRequest addHeader(String name,String header) { if (null == headers) { headers = new HashMap<>(); diff --git a/connect-core/src/main/java/org/needcoke/rpc/common/constant/ConnectConstant.java b/connect-core/src/main/java/org/needcoke/rpc/common/constant/ConnectConstant.java index 817903e..95591ce 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/common/constant/ConnectConstant.java +++ b/connect-core/src/main/java/org/needcoke/rpc/common/constant/ConnectConstant.java @@ -37,5 +37,5 @@ public interface ConnectConstant { */ String COLON = ":"; - String COKE_REQUEST_ID_HEADER_ID_NAME = "COKE_REQUEST_ID"; + String COKE_REQUEST_ID_HEADER_ID_NAME = "COKE-LINK-TRACKING-INFO"; } diff --git a/connect-core/src/main/java/org/needcoke/rpc/common/exception/CokeConnectException.java b/connect-core/src/main/java/org/needcoke/rpc/common/exception/CokeConnectException.java index 29bf086..f8f9783 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/common/exception/CokeConnectException.java +++ b/connect-core/src/main/java/org/needcoke/rpc/common/exception/CokeConnectException.java @@ -1,8 +1,8 @@ package org.needcoke.rpc.common.exception; import lombok.Data; +import org.connect.rpc.link.tracking.util.TrackingUtil; import org.needcoke.rpc.common.enums.ConnectionExceptionEnum; -import org.needcoke.rpc.config.RequestIdContextHolder; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ResponseStatus; @@ -42,7 +42,7 @@ public class CokeConnectException extends RuntimeException { super(connectionExceptionEnum.getValue(),e); this.errorCode = connectionExceptionEnum.getErrorCode(); this.note = connectionExceptionEnum.getNote(); - this.requestId = RequestIdContextHolder.getRequestId(); + this.requestId = TrackingUtil.getRequestId(); } public CokeConnectException(String requestId ,ConnectionExceptionEnum connectionExceptionEnum,Throwable e) { diff --git a/connect-core/src/main/java/org/needcoke/rpc/config/CokeHandlerInterceptorAdapter.java b/connect-core/src/main/java/org/needcoke/rpc/config/CokeHandlerInterceptorAdapter.java index b4845b0..167b208 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/config/CokeHandlerInterceptorAdapter.java +++ b/connect-core/src/main/java/org/needcoke/rpc/config/CokeHandlerInterceptorAdapter.java @@ -1,23 +1,30 @@ package org.needcoke.rpc.config; -import cn.hutool.core.util.StrUtil; -import org.needcoke.rpc.common.constant.ConnectConstant; -import org.springframework.stereotype.Component; -import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; +import lombok.extern.slf4j.Slf4j; +import org.apache.catalina.connector.RequestFacade; +import org.connect.rpc.link.tracking.config.LinkTrackingContextHolder; +import org.connect.rpc.link.tracking.net.LinkTracking; +import org.connect.rpc.link.tracking.util.TrackingUtil; +import org.needcoke.rpc.utils.SpringContextUtils; +import org.springframework.web.servlet.HandlerInterceptor; + import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import java.util.Map; -@Component -public class CokeHandlerInterceptorAdapter extends HandlerInterceptorAdapter { +@Slf4j +public class CokeHandlerInterceptorAdapter implements HandlerInterceptor { @Override - public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { - String cokeRequestId = request.getHeader(ConnectConstant.COKE_REQUEST_ID_HEADER_ID_NAME); - if(StrUtil.isEmpty(cokeRequestId)){ - RequestIdContextHolder.setRequestId(RequestIdContextHolder.newRequestId()); - }else{ - RequestIdContextHolder.setRequestId(cokeRequestId); + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { + ServerConfig bean = SpringContextUtils.getBean(ServerConfig.class); + int port = bean.getMvcPort(); + TrackingUtil.preHttp(request,response,handler,port); + LinkTracking linkTracking = LinkTrackingContextHolder.getLinkTracking(); + if(request instanceof RequestFacade){ + String requestURI = ((RequestFacade) request).getRequestURI(); + linkTracking.addMataData("http path",requestURI); } - return super.preHandle(request, response, handler); + return true; } } diff --git a/connect-core/src/main/java/org/needcoke/rpc/config/CokeWebMvcConfigurer.java b/connect-core/src/main/java/org/needcoke/rpc/config/CokeWebMvcConfigurer.java new file mode 100644 index 0000000..ed792e7 --- /dev/null +++ b/connect-core/src/main/java/org/needcoke/rpc/config/CokeWebMvcConfigurer.java @@ -0,0 +1,14 @@ +package org.needcoke.rpc.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class CokeWebMvcConfigurer implements WebMvcConfigurer { + + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(new CokeHandlerInterceptorAdapter()).addPathPatterns("/**"); + } +} diff --git a/connect-core/src/main/java/org/needcoke/rpc/config/RequestIdContextHolder.java b/connect-core/src/main/java/org/needcoke/rpc/config/RequestIdContextHolder.java deleted file mode 100644 index dc626e0..0000000 --- a/connect-core/src/main/java/org/needcoke/rpc/config/RequestIdContextHolder.java +++ /dev/null @@ -1,49 +0,0 @@ -package org.needcoke.rpc.config; - -import com.alibaba.ttl.TransmittableThreadLocal; -import lombok.experimental.UtilityClass; -import org.needcoke.rpc.utils.SpringContextUtils; - -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.util.concurrent.atomic.AtomicLong; - -@UtilityClass -public class RequestIdContextHolder { - - private final ThreadLocal THREAD_LOCAL_REQUEST_ID = new TransmittableThreadLocal<>(); - - public void setRequestId(String requestId){ - THREAD_LOCAL_REQUEST_ID.set(requestId); - } - - public String getRequestId(){ - return THREAD_LOCAL_REQUEST_ID.get(); - } - - public void clear() { - THREAD_LOCAL_REQUEST_ID.remove(); - } - - private final AtomicLong requestIdMaker = new AtomicLong(1); - - public long getAndAdd(){ - return requestIdMaker.getAndAdd(1); - } - - - - public static String newRequestId(){ - try { - InetAddress localHost = InetAddress.getLocalHost(); - String ip = localHost.getHostAddress(); - int port = SpringContextUtils.getBean(ServerConfig.class).getMvcPort(); - return ip+":"+port+"#"+getAndAdd(); - } catch (UnknownHostException e) { - e.printStackTrace(); - } - - return "error-request-id"; - } - -} diff --git a/connect-core/src/main/java/org/needcoke/rpc/controller/RpcController.java b/connect-core/src/main/java/org/needcoke/rpc/controller/RpcController.java index 8c3b884..a3a4bae 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/controller/RpcController.java +++ b/connect-core/src/main/java/org/needcoke/rpc/controller/RpcController.java @@ -3,11 +3,11 @@ package org.needcoke.rpc.controller; import com.alibaba.fastjson.JSONObject; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.connect.rpc.link.tracking.util.TrackingUtil; import org.needcoke.rpc.common.constant.ConnectConstant; import org.needcoke.rpc.common.enums.ConnectionExceptionEnum; import org.needcoke.rpc.common.enums.RpcTypeEnum; import org.needcoke.rpc.common.exception.CokeConnectException; -import org.needcoke.rpc.config.RequestIdContextHolder; import org.needcoke.rpc.config.ServerConfig; import org.needcoke.rpc.invoker.OkHttpsInvoker; import org.needcoke.rpc.invoker.SmartSocketInvoker; @@ -45,7 +45,7 @@ public class RpcController { public Object execute(@RequestParam String beanName, @RequestParam String methodName, @RequestBody Map params) { - log.info("execute http -- beanName : {} , methodName : {} , param : {} ,requestId = {}", beanName, methodName, JSONObject.toJSONString(params), RequestIdContextHolder.getRequestId()); + log.info("execute http -- beanName : {} , methodName : {} , param : {} ,linkTracking = {}", beanName, methodName, JSONObject.toJSONString(params), TrackingUtil.linkTrackingJsonStr()); Method method = SpringContextUtils.getMethod(beanName, methodName); if (null == method) { log.error(ConnectionExceptionEnum.BEAN_WITHOUT_METHOD.logStatement(ConnectConstant.EXECUTE_RELATIVE_PATH)); @@ -80,8 +80,8 @@ public class RpcController { try { SmartSocketInvoker bean = applicationContext.getBean(SmartSocketInvoker.class); }catch (Exception e){ - return RpcTypeEnum.smartSocket; + return RpcTypeEnum.okHttp3; } - return RpcTypeEnum.okHttp3; + return RpcTypeEnum.smartSocket; } } diff --git a/connect-core/src/main/java/org/needcoke/rpc/invoker/OkHttpsInvoker.java b/connect-core/src/main/java/org/needcoke/rpc/invoker/OkHttpsInvoker.java index fb800eb..92a6391 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/invoker/OkHttpsInvoker.java +++ b/connect-core/src/main/java/org/needcoke/rpc/invoker/OkHttpsInvoker.java @@ -4,10 +4,10 @@ import com.ejlchina.okhttps.HTTP; import com.ejlchina.okhttps.HttpResult; import com.ejlchina.okhttps.SHttpTask; import com.ejlchina.okhttps.jackson.JacksonMsgConvertor; +import org.connect.rpc.link.tracking.util.TrackingUtil; import org.needcoke.rpc.common.constant.ConnectConstant; import org.needcoke.rpc.common.enums.HttpContentTypeEnum; import org.needcoke.rpc.common.enums.RpcTypeEnum; -import org.needcoke.rpc.config.RequestIdContextHolder; import org.needcoke.rpc.net.Connector; import org.springframework.cloud.client.ServiceInstance; import org.springframework.web.context.request.RequestAttributes; @@ -36,7 +36,7 @@ public class OkHttpsInvoker extends ConnectInvoker { .sync(instance.getUri() + ConnectConstant.EXECUTE_RELATIVE_PATH) .bodyType(HttpContentTypeEnum.JSON.getValue()) .addBodyPara(params) - .addHeader(ConnectConstant.COKE_REQUEST_ID_HEADER_ID_NAME, RequestIdContextHolder.getRequestId()) + .addHeader(TrackingUtil.headerKey(), TrackingUtil.headerValue()) .addUrlPara(ConnectConstant.BEAN_NAME, beanName) .addUrlPara(ConnectConstant.METHOD_NAME, methodName); Enumeration headerNames = request.getHeaderNames(); diff --git a/connect-core/src/main/java/org/needcoke/rpc/invoker/SmartSocketInvoker.java b/connect-core/src/main/java/org/needcoke/rpc/invoker/SmartSocketInvoker.java index 71e2d0c..268e6e2 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/invoker/SmartSocketInvoker.java +++ b/connect-core/src/main/java/org/needcoke/rpc/invoker/SmartSocketInvoker.java @@ -2,13 +2,13 @@ package org.needcoke.rpc.invoker; import cn.hutool.core.date.DateUtil; import lombok.extern.slf4j.Slf4j; +import org.connect.rpc.link.tracking.util.TrackingUtil; import org.needcoke.rpc.codec.CokeRequest; import org.needcoke.rpc.codec.CokeRequestProtocol; import org.needcoke.rpc.common.constant.ConnectConstant; import org.needcoke.rpc.common.enums.ConnectionExceptionEnum; import org.needcoke.rpc.common.enums.RpcTypeEnum; import org.needcoke.rpc.common.exception.CokeConnectException; -import org.needcoke.rpc.config.RequestIdContextHolder; import org.needcoke.rpc.net.Connector; import org.needcoke.rpc.processor.smart_socket.SmartSocketClientProcessor; import org.needcoke.rpc.utils.ConnectUtil; @@ -62,11 +62,10 @@ public class SmartSocketInvoker extends ConnectInvoker { } } AioSession session = sessionMap.get(uri); - int requestId = ConnectUtil.requestIdMaker.addAndGet(1); CokeRequest request = new CokeRequest().setBeanName(beanName) .setMethodName(methodName) .setParams(params) - .addHeader(ConnectConstant.COKE_REQUEST_ID_HEADER_ID_NAME, RequestIdContextHolder.getRequestId()); + .addHeader(TrackingUtil.headerKey(), TrackingUtil.headerValue()); byte[] bytes = request.toBytes(); try { session.writeBuffer().writeInt(bytes.length); @@ -89,11 +88,11 @@ public class SmartSocketInvoker extends ConnectInvoker { InvokeResult tmp = new InvokeResult(); long start = DateUtil.current(); ConnectUtil.putRequestMap(tmp); - ConnectUtil.threadMap.put(requestId, Thread.currentThread()); + ConnectUtil.threadMap.put(TrackingUtil.getRequestId(), Thread.currentThread()); LockSupport.park(); - InvokeResult result = ConnectUtil.getFromRequestMap(requestId); + InvokeResult result = ConnectUtil.getFromRequestMap(TrackingUtil.getRequestId()); long end = DateUtil.current(); - log.info("requestId = {} , start = {} , end = {} ,cost = {}", requestId, start, end, end - start); + log.info("requestId = {} , start = {} , end = {} ,cost = {}", TrackingUtil.getRequestId(), start, end, end - start); result.setTime(end - start); return result; } diff --git a/connect-core/src/main/java/org/needcoke/rpc/processor/smart_socket/SmartSocketClientProcessor.java b/connect-core/src/main/java/org/needcoke/rpc/processor/smart_socket/SmartSocketClientProcessor.java index 092a87b..bde2214 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/processor/smart_socket/SmartSocketClientProcessor.java +++ b/connect-core/src/main/java/org/needcoke/rpc/processor/smart_socket/SmartSocketClientProcessor.java @@ -1,9 +1,9 @@ package org.needcoke.rpc.processor.smart_socket; import lombok.extern.slf4j.Slf4j; +import org.connect.rpc.link.tracking.util.TrackingUtil; import org.needcoke.rpc.codec.CokeRequest; import org.needcoke.rpc.common.enums.ConnectRequestEnum; -import org.needcoke.rpc.config.RequestIdContextHolder; import org.needcoke.rpc.utils.ConnectUtil; import org.smartboot.socket.transport.AioSession; @@ -15,10 +15,10 @@ public class SmartSocketClientProcessor extends SmartSocketMessageProcessor { @Override public void process(AioSession session, CokeRequest request) { - if (request.getHeaders().containsKey(ConnectConstant.COKE_REQUEST_ID_HEADER_ID_NAME)) { - RequestIdContextHolder.setRequestId(request.getHeaders().get(ConnectConstant.COKE_REQUEST_ID_HEADER_ID_NAME)); + String json = request.getHeader(CommonConstant.COKE_REQUEST_ID_HEADER_ID_NAME); + int mvcPort = SpringContextUtils.getBean(ServerConfig.class).getMvcPort(); + if (StrUtil.isEmpty(json)) { + LinkTracking linkTracking = new LinkTracking(mvcPort); + linkTracking.setIndex(1); + LinkTrackingContextHolder.setLinkTracking(linkTracking); } else { - RequestIdContextHolder.setRequestId(RequestIdContextHolder.newRequestId()); + LinkTracking linkTracking = JSONUtil.toBean(json, LinkTracking.class); + linkTracking.setIndex(linkTracking.getIndex() + 1); + linkTracking.changeIp(); + linkTracking.setPort(mvcPort); + LinkTrackingContextHolder.setLinkTracking(linkTracking); } //TODO 将该段代码抽出成公共的 if (ConnectRequestEnum.INTERNAL_REQUEST == request.getRequestType()) { String beanName = request.getBeanName(); String methodName = request.getMethodName(); Map params = request.getParams(); - log.info("execute smart socket requestId = {} , -- beanName : {} , methodName : {} , param : {}", RequestIdContextHolder.getRequestId(), beanName, methodName, JSONObject.toJSONString(params)); + log.info("execute smart socket linkTracking = {} , -- beanName : {} , methodName : {} , param : {}", TrackingUtil.linkTrackingJsonStr(), beanName, methodName, JSONObject.toJSONString(params)); Method method = SpringContextUtils.getMethod(beanName, methodName); if (null == method) { - log.error(ConnectionExceptionEnum.BEAN_WITHOUT_METHOD.logStatement("beanName {} , methodName {} , requestId = {}"), beanName, methodName, RequestIdContextHolder.getRequestId()); + log.error(ConnectionExceptionEnum.BEAN_WITHOUT_METHOD.logStatement("beanName {} , methodName {} , linkTracking = {}"), beanName, methodName, TrackingUtil.linkTrackingJsonStr()); throw new CokeConnectException(ConnectionExceptionEnum.BEAN_WITHOUT_METHOD); } Object bean = SpringContextUtils.getBean(beanName); diff --git a/connect-core/src/main/java/org/needcoke/rpc/utils/ConnectUtil.java b/connect-core/src/main/java/org/needcoke/rpc/utils/ConnectUtil.java index 2066d4a..841e813 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/utils/ConnectUtil.java +++ b/connect-core/src/main/java/org/needcoke/rpc/utils/ConnectUtil.java @@ -5,9 +5,9 @@ import com.ejlchina.okhttps.HttpResult; import com.ejlchina.okhttps.SHttpTask; import com.ejlchina.okhttps.jackson.JacksonMsgConvertor; import lombok.extern.slf4j.Slf4j; +import org.connect.rpc.link.tracking.util.TrackingUtil; import org.needcoke.rpc.common.constant.ConnectConstant; import org.needcoke.rpc.common.enums.HttpContentTypeEnum; -import org.needcoke.rpc.config.RequestIdContextHolder; import org.needcoke.rpc.invoker.ConnectInvoker; import org.needcoke.rpc.invoker.InvokeResult; import org.needcoke.rpc.loadBalance.LoadBalance; @@ -16,14 +16,8 @@ import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.stereotype.Component; -import org.springframework.web.context.request.RequestAttributes; -import org.springframework.web.context.request.RequestContextHolder; -import org.springframework.web.context.request.ServletRequestAttributes; -import org.springframework.web.context.request.async.DeferredResult; import javax.annotation.PostConstruct; -import javax.servlet.http.HttpServletRequest; -import java.util.Enumeration; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -76,16 +70,16 @@ public class ConnectUtil { public static final Map requestMap = new ConcurrentHashMap(); public static void putRequestMap(InvokeResult result){ - requestMap.put(RequestIdContextHolder.getRequestId(),result); + requestMap.put(TrackingUtil.getRequestId(),result); } - public static ConcurrentHashMap threadMap = new ConcurrentHashMap<>(); + public static ConcurrentHashMap threadMap = new ConcurrentHashMap<>(); public static void putRequestMap(String requestId,InvokeResult result){ requestMap.put(requestId,result); } - public static InvokeResult getFromRequestMap(Integer key){ + public static InvokeResult getFromRequestMap(String key){ return requestMap.get(key); } diff --git a/connect-link-tracking/pom.xml b/connect-link-tracking/pom.xml new file mode 100644 index 0000000..cf6eb83 --- /dev/null +++ b/connect-link-tracking/pom.xml @@ -0,0 +1,52 @@ + + + + coke-connect + org.needcoke + abandon + + 4.0.0 + + connect-link-tracking + + + 11 + 11 + + + + + org.projectlombok + lombok + 1.18.24 + + + + com.alibaba + transmittable-thread-local + 2.12.1 + + + org.apache.tomcat.embed + tomcat-embed-core + 9.0.63 + compile + + + + cn.hutool + hutool-all + 5.8.0 + compile + + + com.google.code.gson + gson + 2.9.0 + compile + + + + \ No newline at end of file diff --git a/connect-link-tracking/src/main/java/org/connect/rpc/link/tracking/common/CommonConstant.java b/connect-link-tracking/src/main/java/org/connect/rpc/link/tracking/common/CommonConstant.java new file mode 100644 index 0000000..dd40f85 --- /dev/null +++ b/connect-link-tracking/src/main/java/org/connect/rpc/link/tracking/common/CommonConstant.java @@ -0,0 +1,6 @@ +package org.connect.rpc.link.tracking.common; + +public interface CommonConstant { + + String COKE_REQUEST_ID_HEADER_ID_NAME = "COKE-LINK-TRACKING-INFO"; +} diff --git a/connect-link-tracking/src/main/java/org/connect/rpc/link/tracking/config/LinkTrackingContextHolder.java b/connect-link-tracking/src/main/java/org/connect/rpc/link/tracking/config/LinkTrackingContextHolder.java new file mode 100644 index 0000000..cc04086 --- /dev/null +++ b/connect-link-tracking/src/main/java/org/connect/rpc/link/tracking/config/LinkTrackingContextHolder.java @@ -0,0 +1,32 @@ +package org.connect.rpc.link.tracking.config; + +import com.alibaba.ttl.TransmittableThreadLocal; +import lombok.experimental.UtilityClass; +import org.connect.rpc.link.tracking.net.LinkTracking; + +@UtilityClass +public class LinkTrackingContextHolder { + + private final ThreadLocal THREAD_LOCAL_LINK_TRACKING = new TransmittableThreadLocal<>(); + + public void setLinkTracking(LinkTracking tracking) { + THREAD_LOCAL_LINK_TRACKING.set(tracking); + } + + public LinkTracking getLinkTracking() { + return THREAD_LOCAL_LINK_TRACKING.get(); + } + + public void clear() { + THREAD_LOCAL_LINK_TRACKING.remove(); + } + + + public boolean isEmpty() { + return THREAD_LOCAL_LINK_TRACKING.get() == null; + } + + public boolean isNotEmpty() { + return THREAD_LOCAL_LINK_TRACKING.get() != null; + } +} diff --git a/connect-link-tracking/src/main/java/org/connect/rpc/link/tracking/net/LinkTracking.java b/connect-link-tracking/src/main/java/org/connect/rpc/link/tracking/net/LinkTracking.java new file mode 100644 index 0000000..1a881a5 --- /dev/null +++ b/connect-link-tracking/src/main/java/org/connect/rpc/link/tracking/net/LinkTracking.java @@ -0,0 +1,53 @@ +package org.connect.rpc.link.tracking.net; + +import cn.hutool.core.collection.CollUtil; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.atomic.AtomicLong; + +@Data +@Accessors(chain = true) +public class LinkTracking { + private String ip; + + private int port; + + private Map metaData; + + private Long requestId; + + private Integer index; + + private String serviceId; + + private static final AtomicLong requestIdMaker = new AtomicLong(1); + + public LinkTracking(int port) { + this.port = port; + changeIp(); + requestId = requestIdMaker.getAndAdd(1); + this.index = 1; + } + + public void changeIp(){ + try { + InetAddress localHost = InetAddress.getLocalHost(); + String ip = localHost.getHostAddress(); + this.ip = ip; + } catch (UnknownHostException e) { + e.printStackTrace(); + } + } + + public void addMataData(String key,String value){ + if(CollUtil.isEmpty(metaData)){ + this.metaData = new HashMap<>(); + } + metaData.put(key,value); + } +} diff --git a/connect-link-tracking/src/main/java/org/connect/rpc/link/tracking/util/TrackingUtil.java b/connect-link-tracking/src/main/java/org/connect/rpc/link/tracking/util/TrackingUtil.java new file mode 100644 index 0000000..d37ece6 --- /dev/null +++ b/connect-link-tracking/src/main/java/org/connect/rpc/link/tracking/util/TrackingUtil.java @@ -0,0 +1,49 @@ +package org.connect.rpc.link.tracking.util; + +import cn.hutool.core.util.StrUtil; +import com.google.gson.Gson; +import lombok.experimental.UtilityClass; +import org.connect.rpc.link.tracking.common.CommonConstant; +import org.connect.rpc.link.tracking.config.LinkTrackingContextHolder; +import org.connect.rpc.link.tracking.net.LinkTracking; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +@UtilityClass +public class TrackingUtil { + + private Gson gson = new Gson(); + public void preHttp(HttpServletRequest request, HttpServletResponse response, Object handler, int port) { + String cokeRequestIdJson = request.getHeader(CommonConstant.COKE_REQUEST_ID_HEADER_ID_NAME); + if (StrUtil.isEmpty(cokeRequestIdJson)) { + LinkTracking linkTracking = new LinkTracking(port); + linkTracking.setIndex(1); + LinkTrackingContextHolder.setLinkTracking(linkTracking); + } else { + LinkTracking linkTracking = gson.fromJson(cokeRequestIdJson, LinkTracking.class); + linkTracking.setIndex(linkTracking.getIndex() + 1); + linkTracking.changeIp(); + linkTracking.setPort(port); + LinkTrackingContextHolder.setLinkTracking(linkTracking); + } + } + + public String headerKey() { + return CommonConstant.COKE_REQUEST_ID_HEADER_ID_NAME; + } + + public String headerValue() { + LinkTracking linkTracking = LinkTrackingContextHolder.getLinkTracking(); + linkTracking.setIndex(linkTracking.getIndex()); + return gson.toJson(linkTracking); + } + + public String getRequestId() { + return LinkTrackingContextHolder.getLinkTracking().getRequestId().toString(); + } + + public String linkTrackingJsonStr() { + return gson.toJson(LinkTrackingContextHolder.getLinkTracking()); + } +} diff --git a/pom.xml b/pom.xml index 4747cef..002ce59 100644 --- a/pom.xml +++ b/pom.xml @@ -17,6 +17,7 @@ bussiness-a business-b business-c + connect-link-tracking -- Gitee From 41184713fab5e8b7a956508216bdab2854edb8f1 Mon Sep 17 00:00:00 2001 From: warren Date: Tue, 21 Jun 2022 18:32:24 +0800 Subject: [PATCH 07/22] =?UTF-8?q?=E9=93=BE=E8=B7=AF=E8=BF=BD=E8=B8=AA?= =?UTF-8?q?=E5=9F=8B=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../needcoke/b/controller/TestController.java | 2 +- .../needcoke/c/controller/CController.java | 3 +-- .../rpc/invoker/SmartSocketInvoker.java | 2 +- .../SmartSocketClientProcessor.java | 2 +- .../SmartSocketServerProcessor.java | 4 ++++ .../org/needcoke/rpc/utils/ConnectUtil.java | 14 +++++++++--- .../config/LinkTrackingContextHolder.java | 3 ++- .../config/LinkTrackingThreadPool.java | 22 +++++++++++++++++++ .../rpc/link/tracking/net/LinkTracking.java | 6 +++-- .../rpc/link/tracking/util/TrackingUtil.java | 2 +- 10 files changed, 48 insertions(+), 12 deletions(-) create mode 100644 connect-link-tracking/src/main/java/org/connect/rpc/link/tracking/config/LinkTrackingThreadPool.java diff --git a/business-b/src/main/java/org/needcoke/b/controller/TestController.java b/business-b/src/main/java/org/needcoke/b/controller/TestController.java index 47d8854..8a57cd2 100644 --- a/business-b/src/main/java/org/needcoke/b/controller/TestController.java +++ b/business-b/src/main/java/org/needcoke/b/controller/TestController.java @@ -37,7 +37,7 @@ public class TestController { public InvokeResult test(){ Map map = new HashMap<>(); map.put("word","刘勇是死废物"); - InvokeResult execute = connectorFactory.connector("bussiness-c").execute( "cCon", "cTest", map); + InvokeResult execute = connectorFactory.connector("bussiness-c").execute( "cCon", "cTest2", map); return execute; } diff --git a/business-c/src/main/java/org/needcoke/c/controller/CController.java b/business-c/src/main/java/org/needcoke/c/controller/CController.java index 338a765..83fc842 100644 --- a/business-c/src/main/java/org/needcoke/c/controller/CController.java +++ b/business-c/src/main/java/org/needcoke/c/controller/CController.java @@ -6,7 +6,6 @@ import org.needcoke.rpc.common.enums.RpcTypeEnum; import org.needcoke.rpc.invoker.InvokeResult; import org.needcoke.rpc.invoker.SmartSocketInvoker; import org.needcoke.rpc.net.ConnectorFactory; -import org.needcoke.rpc.utils.ConnectUtil; import org.springframework.context.annotation.Bean; import org.springframework.stereotype.Component; @@ -26,7 +25,7 @@ public class CController { @Resource private ConnectorFactory connectorFactory; - @Call("cTest") + @Call("cTest2") public String cTest(String word){ Map map = new HashMap<>(); map.put("word",word); diff --git a/connect-core/src/main/java/org/needcoke/rpc/invoker/SmartSocketInvoker.java b/connect-core/src/main/java/org/needcoke/rpc/invoker/SmartSocketInvoker.java index 268e6e2..f618881 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/invoker/SmartSocketInvoker.java +++ b/connect-core/src/main/java/org/needcoke/rpc/invoker/SmartSocketInvoker.java @@ -88,7 +88,7 @@ public class SmartSocketInvoker extends ConnectInvoker { InvokeResult tmp = new InvokeResult(); long start = DateUtil.current(); ConnectUtil.putRequestMap(tmp); - ConnectUtil.threadMap.put(TrackingUtil.getRequestId(), Thread.currentThread()); + ConnectUtil.putThreadMap(TrackingUtil.getRequestId(), Thread.currentThread()); LockSupport.park(); InvokeResult result = ConnectUtil.getFromRequestMap(TrackingUtil.getRequestId()); long end = DateUtil.current(); diff --git a/connect-core/src/main/java/org/needcoke/rpc/processor/smart_socket/SmartSocketClientProcessor.java b/connect-core/src/main/java/org/needcoke/rpc/processor/smart_socket/SmartSocketClientProcessor.java index bde2214..62a6870 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/processor/smart_socket/SmartSocketClientProcessor.java +++ b/connect-core/src/main/java/org/needcoke/rpc/processor/smart_socket/SmartSocketClientProcessor.java @@ -18,7 +18,7 @@ public class SmartSocketClientProcessor extends SmartSocketMessageProcessor requestMap = new ConcurrentHashMap(); + private static final Map requestMap = new ConcurrentHashMap(); public static void putRequestMap(InvokeResult result){ requestMap.put(TrackingUtil.getRequestId(),result); } - public static ConcurrentHashMap threadMap = new ConcurrentHashMap<>(); + private static Map threadMap = new ConcurrentHashMap<>(); public static void putRequestMap(String requestId,InvokeResult result){ requestMap.put(requestId,result); } public static InvokeResult getFromRequestMap(String key){ - return requestMap.get(key); + return requestMap.remove(key); + } + + public static void putThreadMap(String requestId,Thread thread){ + threadMap.put(requestId,thread); + } + + public static Thread getFromThreadMap(String requestId){ + return threadMap.remove(requestId); } /** diff --git a/connect-link-tracking/src/main/java/org/connect/rpc/link/tracking/config/LinkTrackingContextHolder.java b/connect-link-tracking/src/main/java/org/connect/rpc/link/tracking/config/LinkTrackingContextHolder.java index cc04086..f5f5d0c 100644 --- a/connect-link-tracking/src/main/java/org/connect/rpc/link/tracking/config/LinkTrackingContextHolder.java +++ b/connect-link-tracking/src/main/java/org/connect/rpc/link/tracking/config/LinkTrackingContextHolder.java @@ -1,13 +1,14 @@ package org.connect.rpc.link.tracking.config; import com.alibaba.ttl.TransmittableThreadLocal; +import com.alibaba.ttl.TtlRunnable; import lombok.experimental.UtilityClass; import org.connect.rpc.link.tracking.net.LinkTracking; @UtilityClass public class LinkTrackingContextHolder { - private final ThreadLocal THREAD_LOCAL_LINK_TRACKING = new TransmittableThreadLocal<>(); + private final TransmittableThreadLocal THREAD_LOCAL_LINK_TRACKING = new TransmittableThreadLocal<>(); public void setLinkTracking(LinkTracking tracking) { THREAD_LOCAL_LINK_TRACKING.set(tracking); diff --git a/connect-link-tracking/src/main/java/org/connect/rpc/link/tracking/config/LinkTrackingThreadPool.java b/connect-link-tracking/src/main/java/org/connect/rpc/link/tracking/config/LinkTrackingThreadPool.java new file mode 100644 index 0000000..2f4a90c --- /dev/null +++ b/connect-link-tracking/src/main/java/org/connect/rpc/link/tracking/config/LinkTrackingThreadPool.java @@ -0,0 +1,22 @@ +package org.connect.rpc.link.tracking.config; + +import lombok.experimental.UtilityClass; + +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; + +@UtilityClass +public class LinkTrackingThreadPool { + + ExecutorService executorService = Executors.newFixedThreadPool(3); + + public void submit(Runnable task){ + executorService.submit(task); + } + + public Future submit(Callable task){ + return executorService.submit(task); + } +} diff --git a/connect-link-tracking/src/main/java/org/connect/rpc/link/tracking/net/LinkTracking.java b/connect-link-tracking/src/main/java/org/connect/rpc/link/tracking/net/LinkTracking.java index 1a881a5..1542956 100644 --- a/connect-link-tracking/src/main/java/org/connect/rpc/link/tracking/net/LinkTracking.java +++ b/connect-link-tracking/src/main/java/org/connect/rpc/link/tracking/net/LinkTracking.java @@ -2,6 +2,7 @@ package org.connect.rpc.link.tracking.net; import cn.hutool.core.collection.CollUtil; import lombok.Data; +import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; import java.net.InetAddress; @@ -11,6 +12,7 @@ import java.util.Map; import java.util.concurrent.atomic.AtomicLong; @Data +@EqualsAndHashCode @Accessors(chain = true) public class LinkTracking { private String ip; @@ -19,7 +21,7 @@ public class LinkTracking { private Map metaData; - private Long requestId; + private String requestId; private Integer index; @@ -30,7 +32,7 @@ public class LinkTracking { public LinkTracking(int port) { this.port = port; changeIp(); - requestId = requestIdMaker.getAndAdd(1); + requestId = ""+requestIdMaker.getAndAdd(1); this.index = 1; } diff --git a/connect-link-tracking/src/main/java/org/connect/rpc/link/tracking/util/TrackingUtil.java b/connect-link-tracking/src/main/java/org/connect/rpc/link/tracking/util/TrackingUtil.java index d37ece6..cd8c091 100644 --- a/connect-link-tracking/src/main/java/org/connect/rpc/link/tracking/util/TrackingUtil.java +++ b/connect-link-tracking/src/main/java/org/connect/rpc/link/tracking/util/TrackingUtil.java @@ -40,7 +40,7 @@ public class TrackingUtil { } public String getRequestId() { - return LinkTrackingContextHolder.getLinkTracking().getRequestId().toString(); + return LinkTrackingContextHolder.getLinkTracking().getRequestId(); } public String linkTrackingJsonStr() { -- Gitee From 2763ba982f59014a7bf37c0726d26590d292121d Mon Sep 17 00:00:00 2001 From: warren Date: Wed, 22 Jun 2022 14:56:21 +0800 Subject: [PATCH 08/22] =?UTF-8?q?=E6=96=B0=E5=A2=9Enetty=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E7=BB=84=E4=BB=B6=E8=B0=83=E7=94=A8=E6=96=B9=E5=BC=8F=E4=BB=A5?= =?UTF-8?q?=E5=8F=8Asmartsocket=E8=B0=83=E7=94=A8=E6=96=B9=E5=BC=8F?= =?UTF-8?q?=E4=BD=9C=E4=B8=BA=E7=8B=AC=E7=AB=8B=E7=9A=84module=E6=8A=BD?= =?UTF-8?q?=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../needcoke/b/component/TestComponent.java | 15 +-- .../needcoke/c/controller/CController.java | 10 +- .../org/needcoke/a/configuration/Config.java | 10 +- connect-core/pom.xml | 6 -- .../org/needcoke/rpc/codec/CokeRequest.java | 22 +++-- .../org/needcoke/rpc/config/ServerConfig.java | 13 --- .../rpc/controller/RpcController.java | 7 +- .../needcoke/rpc/invoker/ConnectInvoker.java | 19 ++++ .../needcoke/rpc/invoker/OkHttpsInvoker.java | 2 + .../java/org/needcoke/rpc/utils/GsonUtil.java | 6 ++ .../config/LinkTrackingContextHolder.java | 1 - .../config/LinkTrackingThreadPool.java | 22 ----- .../rpc/link/tracking/util/TrackingUtil.java | 2 +- connect-server-netty/pom.xml | 34 +++++++ .../rpc/netty/client/NettyClient.java | 47 ++++++++++ .../rpc/netty/client/NettySession.java | 4 + .../netty/client/SenderHandlerAdapter.java | 35 +++++++ .../needcoke/rpc/netty/codec/RpcDecoder.java | 37 ++++++++ .../needcoke/rpc/netty/codec/RpcEncoder.java | 25 +++++ .../rpc/netty/invoker/NettyInvoker.java | 91 +++++++++++++++++++ .../processor/ReadMessageClientProcessor.java | 24 +++++ .../netty/processor/ReadMessageProcessor.java | 9 ++ .../processor/ReadMessageServerProcessor.java | 57 ++++++++++++ .../rpc/netty/server/NettyServer.java | 62 +++++++++++++ .../server/NettyServerHandlerAdapter.java | 41 +++++++++ connect-server-smart-socket/pom.xml | 35 +++++++ .../Invoker}/SmartSocketInvoker.java | 32 ++++--- .../codec/CokeRequestProtocol.java | 3 +- .../SmartSocketClientProcessor.java | 11 +-- .../SmartSocketMessageProcessor.java | 2 +- .../SmartSocketServerProcessor.java | 11 ++- .../server/SmartSocketServer.java | 9 +- pom.xml | 2 + 33 files changed, 597 insertions(+), 109 deletions(-) create mode 100644 connect-core/src/main/java/org/needcoke/rpc/utils/GsonUtil.java delete mode 100644 connect-link-tracking/src/main/java/org/connect/rpc/link/tracking/config/LinkTrackingThreadPool.java create mode 100644 connect-server-netty/pom.xml create mode 100644 connect-server-netty/src/main/java/org/needcoke/rpc/netty/client/NettyClient.java create mode 100644 connect-server-netty/src/main/java/org/needcoke/rpc/netty/client/NettySession.java create mode 100644 connect-server-netty/src/main/java/org/needcoke/rpc/netty/client/SenderHandlerAdapter.java create mode 100644 connect-server-netty/src/main/java/org/needcoke/rpc/netty/codec/RpcDecoder.java create mode 100644 connect-server-netty/src/main/java/org/needcoke/rpc/netty/codec/RpcEncoder.java create mode 100644 connect-server-netty/src/main/java/org/needcoke/rpc/netty/invoker/NettyInvoker.java create mode 100644 connect-server-netty/src/main/java/org/needcoke/rpc/netty/processor/ReadMessageClientProcessor.java create mode 100644 connect-server-netty/src/main/java/org/needcoke/rpc/netty/processor/ReadMessageProcessor.java create mode 100644 connect-server-netty/src/main/java/org/needcoke/rpc/netty/processor/ReadMessageServerProcessor.java create mode 100644 connect-server-netty/src/main/java/org/needcoke/rpc/netty/server/NettyServer.java create mode 100644 connect-server-netty/src/main/java/org/needcoke/rpc/netty/server/NettyServerHandlerAdapter.java create mode 100644 connect-server-smart-socket/pom.xml rename {connect-core/src/main/java/org/needcoke/rpc/invoker => connect-server-smart-socket/src/main/java/org/needcoke/rpc/smartsocket/Invoker}/SmartSocketInvoker.java (86%) rename {connect-core/src/main/java/org/needcoke/rpc => connect-server-smart-socket/src/main/java/org/needcoke/rpc/smartsocket}/codec/CokeRequestProtocol.java (92%) rename {connect-core/src/main/java/org/needcoke/rpc/processor/smart_socket => connect-server-smart-socket/src/main/java/org/needcoke/rpc/smartsocket/processor}/SmartSocketClientProcessor.java (62%) rename {connect-core/src/main/java/org/needcoke/rpc/processor/smart_socket => connect-server-smart-socket/src/main/java/org/needcoke/rpc/smartsocket/processor}/SmartSocketMessageProcessor.java (96%) rename {connect-core/src/main/java/org/needcoke/rpc/processor/smart_socket => connect-server-smart-socket/src/main/java/org/needcoke/rpc/smartsocket/processor}/SmartSocketServerProcessor.java (91%) rename {connect-core/src/main/java/org/needcoke/rpc => connect-server-smart-socket/src/main/java/org/needcoke/rpc/smartsocket}/server/SmartSocketServer.java (73%) diff --git a/business-b/src/main/java/org/needcoke/b/component/TestComponent.java b/business-b/src/main/java/org/needcoke/b/component/TestComponent.java index 48bf9c1..77dcc51 100644 --- a/business-b/src/main/java/org/needcoke/b/component/TestComponent.java +++ b/business-b/src/main/java/org/needcoke/b/component/TestComponent.java @@ -1,15 +1,8 @@ package org.needcoke.b.component; -import org.needcoke.rpc.common.enums.RpcTypeEnum; import org.needcoke.rpc.invoker.SmartSocketInvoker; -import org.needcoke.rpc.loadBalance.RoundRobinLoadBalance; -import org.needcoke.rpc.loadBalance.WeightedResponseTimeBalance; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Primary; import org.springframework.stereotype.Component; -import javax.annotation.Resource; - /** * @author Gilgamesh * @date 2022/4/2 @@ -23,9 +16,9 @@ public class TestComponent { // return new WeightedResponseTimeBalance(); // } - @Bean - public SmartSocketInvoker smartSocketInvoker(RpcTypeEnum rpcTypeEnum){ - return new SmartSocketInvoker(rpcTypeEnum); - } +// @Bean +// public SmartSocketInvoker smartSocketInvoker(RpcTypeEnum rpcTypeEnum){ +// return new SmartSocketInvoker(rpcTypeEnum); +// } } diff --git a/business-c/src/main/java/org/needcoke/c/controller/CController.java b/business-c/src/main/java/org/needcoke/c/controller/CController.java index 83fc842..d75cfa0 100644 --- a/business-c/src/main/java/org/needcoke/c/controller/CController.java +++ b/business-c/src/main/java/org/needcoke/c/controller/CController.java @@ -2,11 +2,9 @@ package org.needcoke.c.controller; import org.needcoke.rpc.annotation.Call; import org.needcoke.rpc.annotation.Rpc; -import org.needcoke.rpc.common.enums.RpcTypeEnum; import org.needcoke.rpc.invoker.InvokeResult; import org.needcoke.rpc.invoker.SmartSocketInvoker; import org.needcoke.rpc.net.ConnectorFactory; -import org.springframework.context.annotation.Bean; import org.springframework.stereotype.Component; import javax.annotation.Resource; @@ -17,10 +15,10 @@ import java.util.Map; @Rpc public class CController { - @Bean - public SmartSocketInvoker smartSocketInvoker(RpcTypeEnum rpcTypeEnum){ - return new SmartSocketInvoker(rpcTypeEnum); - } +// @Bean +// public SmartSocketInvoker smartSocketInvoker(RpcTypeEnum rpcTypeEnum){ +// return new SmartSocketInvoker(rpcTypeEnum); +// } @Resource private ConnectorFactory connectorFactory; diff --git a/bussiness-a/src/main/java/org/needcoke/a/configuration/Config.java b/bussiness-a/src/main/java/org/needcoke/a/configuration/Config.java index a0a2c9f..8975e7b 100644 --- a/bussiness-a/src/main/java/org/needcoke/a/configuration/Config.java +++ b/bussiness-a/src/main/java/org/needcoke/a/configuration/Config.java @@ -3,9 +3,7 @@ package org.needcoke.a.configuration; import lombok.extern.slf4j.Slf4j; import org.needcoke.rpc.annotation.Call; import org.needcoke.rpc.annotation.Rpc; -import org.needcoke.rpc.common.enums.RpcTypeEnum; import org.needcoke.rpc.invoker.SmartSocketInvoker; -import org.springframework.context.annotation.Bean; import org.springframework.stereotype.Component; /** @@ -31,8 +29,8 @@ public class Config { return "say : "+word; } - @Bean - public SmartSocketInvoker smartSocketInvoker(RpcTypeEnum rpcTypeEnum){ - return new SmartSocketInvoker(rpcTypeEnum); - } +// @Bean +// public SmartSocketInvoker smartSocketInvoker(RpcTypeEnum rpcTypeEnum){ +// return new SmartSocketInvoker(rpcTypeEnum); +// } } diff --git a/connect-core/pom.xml b/connect-core/pom.xml index 3148587..0f024d2 100644 --- a/connect-core/pom.xml +++ b/connect-core/pom.xml @@ -38,12 +38,6 @@ slf4j-api 1.7.16 - - - org.smartboot.http - smart-http-client - 1.1.12 - com.ejlchina okhttps-jackson diff --git a/connect-core/src/main/java/org/needcoke/rpc/codec/CokeRequest.java b/connect-core/src/main/java/org/needcoke/rpc/codec/CokeRequest.java index 6b037c2..3780848 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/codec/CokeRequest.java +++ b/connect-core/src/main/java/org/needcoke/rpc/codec/CokeRequest.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import lombok.Getter; import org.needcoke.rpc.common.enums.ConnectRequestEnum; import org.needcoke.rpc.invoker.InvokeResult; + import java.util.HashMap; import java.util.Map; @@ -21,11 +22,18 @@ public class CokeRequest { private Map params; - private Map headers; + private Map headers; + + private String cokeRequestId; @Getter private InvokeResult result; + public CokeRequest setCokeRequestId(String cokeRequestId) { + this.cokeRequestId = cokeRequestId; + return this; + } + public CokeRequest setRequestType(ConnectRequestEnum requestType) { this.requestType = requestType; @@ -47,11 +55,11 @@ public class CokeRequest { return this; } - public CokeRequest addParam(String name,Object param) { + public CokeRequest addParam(String name, Object param) { if (null == params) { params = new HashMap<>(); } - params.put(name,param); + params.put(name, param); return this; } @@ -61,15 +69,15 @@ public class CokeRequest { return this; } - public String getHeader(String name){ + public String getHeader(String name) { return this.headers.get(name); } - public CokeRequest addHeader(String name,String header) { + public CokeRequest addHeader(String name, String header) { if (null == headers) { headers = new HashMap<>(); } - headers.put(name,header); + headers.put(name, header); return this; } @@ -78,7 +86,7 @@ public class CokeRequest { return this; } - public byte[] toBytes(){ + public byte[] toBytes() { String jsonString = JSONObject.toJSONString(this); return jsonString.getBytes(); } diff --git a/connect-core/src/main/java/org/needcoke/rpc/config/ServerConfig.java b/connect-core/src/main/java/org/needcoke/rpc/config/ServerConfig.java index 624c5e2..d56b78d 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/config/ServerConfig.java +++ b/connect-core/src/main/java/org/needcoke/rpc/config/ServerConfig.java @@ -4,12 +4,9 @@ import lombok.Getter; import org.needcoke.rpc.common.enums.RpcTypeEnum; import org.needcoke.rpc.invoker.ConnectInvoker; import org.needcoke.rpc.invoker.OkHttpsInvoker; -import org.needcoke.rpc.invoker.SmartSocketInvoker; import org.needcoke.rpc.loadBalance.LoadBalance; import org.needcoke.rpc.loadBalance.RoundRobinLoadBalance; -import org.needcoke.rpc.server.SmartSocketServer; import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -47,16 +44,6 @@ public class ServerConfig { public RoundRobinLoadBalance roundRobinLoadBalance(){ return new RoundRobinLoadBalance(); } - - /** - * 当远程调用方式修改为SmartSocketInvoker时启动SmartSocketServer - */ - @ConditionalOnBean(SmartSocketInvoker.class) - @Bean - public SmartSocketServer smartSocketServer(){ - return new SmartSocketServer(); - } - /** * server uri -> 端口号 */ diff --git a/connect-core/src/main/java/org/needcoke/rpc/controller/RpcController.java b/connect-core/src/main/java/org/needcoke/rpc/controller/RpcController.java index a3a4bae..10ea37d 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/controller/RpcController.java +++ b/connect-core/src/main/java/org/needcoke/rpc/controller/RpcController.java @@ -10,7 +10,6 @@ import org.needcoke.rpc.common.enums.RpcTypeEnum; import org.needcoke.rpc.common.exception.CokeConnectException; import org.needcoke.rpc.config.ServerConfig; import org.needcoke.rpc.invoker.OkHttpsInvoker; -import org.needcoke.rpc.invoker.SmartSocketInvoker; import org.needcoke.rpc.utils.SpringContextUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; @@ -78,10 +77,10 @@ public class RpcController { @GetMapping("rpcType") public RpcTypeEnum getRpcType(){ try { - SmartSocketInvoker bean = applicationContext.getBean(SmartSocketInvoker.class); + OkHttpsInvoker bean = applicationContext.getBean(OkHttpsInvoker.class); }catch (Exception e){ - return RpcTypeEnum.okHttp3; + return RpcTypeEnum.smartSocket; } - return RpcTypeEnum.smartSocket; + return RpcTypeEnum.okHttp3; } } diff --git a/connect-core/src/main/java/org/needcoke/rpc/invoker/ConnectInvoker.java b/connect-core/src/main/java/org/needcoke/rpc/invoker/ConnectInvoker.java index d33b5da..8d650c4 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/invoker/ConnectInvoker.java +++ b/connect-core/src/main/java/org/needcoke/rpc/invoker/ConnectInvoker.java @@ -5,6 +5,7 @@ import com.ejlchina.okhttps.HTTP; import com.ejlchina.okhttps.HttpResult; import com.ejlchina.okhttps.SHttpTask; import com.ejlchina.okhttps.jackson.JacksonMsgConvertor; +import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.needcoke.rpc.common.constant.ConnectConstant; import org.needcoke.rpc.common.enums.HttpContentTypeEnum; @@ -15,8 +16,15 @@ import java.util.HashMap; import java.util.Map; @Slf4j +@NoArgsConstructor public abstract class ConnectInvoker { + private RpcTypeEnum rpcTypeEnum; + + public ConnectInvoker(RpcTypeEnum rpcTypeEnum) { + this.rpcTypeEnum = rpcTypeEnum; + } + public abstract InvokeResult execute(Connector connector, ServiceInstance instance, String beanName, String methodName, Map params); @@ -49,4 +57,15 @@ public abstract class ConnectInvoker { remoteRpcTypeMap.put(instance, rpcTypeEnum); return rpcTypeEnum; } + + protected InvokeResult runDefaultExecute(Connector connector, ServiceInstance instance, String beanName, String methodName, Map params){ + RpcTypeEnum remoteRpcType = getRemoteRpcType(instance); + if(remoteRpcType == RpcTypeEnum.okHttp3){ + if (null == connector.getHttpInvoker()) { + connector.setHttpInvoker(new OkHttpsInvoker(RpcTypeEnum.okHttp3)); + } + return connector.compensationExecute(instance,beanName,methodName,params); + } + return null; + } } diff --git a/connect-core/src/main/java/org/needcoke/rpc/invoker/OkHttpsInvoker.java b/connect-core/src/main/java/org/needcoke/rpc/invoker/OkHttpsInvoker.java index 92a6391..c384c08 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/invoker/OkHttpsInvoker.java +++ b/connect-core/src/main/java/org/needcoke/rpc/invoker/OkHttpsInvoker.java @@ -4,6 +4,7 @@ import com.ejlchina.okhttps.HTTP; import com.ejlchina.okhttps.HttpResult; import com.ejlchina.okhttps.SHttpTask; import com.ejlchina.okhttps.jackson.JacksonMsgConvertor; +import lombok.NoArgsConstructor; import org.connect.rpc.link.tracking.util.TrackingUtil; import org.needcoke.rpc.common.constant.ConnectConstant; import org.needcoke.rpc.common.enums.HttpContentTypeEnum; @@ -21,6 +22,7 @@ import java.util.Map; /** * 采用okHttps的跨服务调用器 */ +@NoArgsConstructor public class OkHttpsInvoker extends ConnectInvoker { diff --git a/connect-core/src/main/java/org/needcoke/rpc/utils/GsonUtil.java b/connect-core/src/main/java/org/needcoke/rpc/utils/GsonUtil.java new file mode 100644 index 0000000..9c802a4 --- /dev/null +++ b/connect-core/src/main/java/org/needcoke/rpc/utils/GsonUtil.java @@ -0,0 +1,6 @@ +package org.needcoke.rpc.utils; + +public class GsonUtil { + + +} diff --git a/connect-link-tracking/src/main/java/org/connect/rpc/link/tracking/config/LinkTrackingContextHolder.java b/connect-link-tracking/src/main/java/org/connect/rpc/link/tracking/config/LinkTrackingContextHolder.java index f5f5d0c..cf155a2 100644 --- a/connect-link-tracking/src/main/java/org/connect/rpc/link/tracking/config/LinkTrackingContextHolder.java +++ b/connect-link-tracking/src/main/java/org/connect/rpc/link/tracking/config/LinkTrackingContextHolder.java @@ -1,7 +1,6 @@ package org.connect.rpc.link.tracking.config; import com.alibaba.ttl.TransmittableThreadLocal; -import com.alibaba.ttl.TtlRunnable; import lombok.experimental.UtilityClass; import org.connect.rpc.link.tracking.net.LinkTracking; diff --git a/connect-link-tracking/src/main/java/org/connect/rpc/link/tracking/config/LinkTrackingThreadPool.java b/connect-link-tracking/src/main/java/org/connect/rpc/link/tracking/config/LinkTrackingThreadPool.java deleted file mode 100644 index 2f4a90c..0000000 --- a/connect-link-tracking/src/main/java/org/connect/rpc/link/tracking/config/LinkTrackingThreadPool.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.connect.rpc.link.tracking.config; - -import lombok.experimental.UtilityClass; - -import java.util.concurrent.Callable; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Future; - -@UtilityClass -public class LinkTrackingThreadPool { - - ExecutorService executorService = Executors.newFixedThreadPool(3); - - public void submit(Runnable task){ - executorService.submit(task); - } - - public Future submit(Callable task){ - return executorService.submit(task); - } -} diff --git a/connect-link-tracking/src/main/java/org/connect/rpc/link/tracking/util/TrackingUtil.java b/connect-link-tracking/src/main/java/org/connect/rpc/link/tracking/util/TrackingUtil.java index cd8c091..8103c80 100644 --- a/connect-link-tracking/src/main/java/org/connect/rpc/link/tracking/util/TrackingUtil.java +++ b/connect-link-tracking/src/main/java/org/connect/rpc/link/tracking/util/TrackingUtil.java @@ -13,7 +13,7 @@ import javax.servlet.http.HttpServletResponse; @UtilityClass public class TrackingUtil { - private Gson gson = new Gson(); + private final Gson gson = new Gson(); public void preHttp(HttpServletRequest request, HttpServletResponse response, Object handler, int port) { String cokeRequestIdJson = request.getHeader(CommonConstant.COKE_REQUEST_ID_HEADER_ID_NAME); if (StrUtil.isEmpty(cokeRequestIdJson)) { diff --git a/connect-server-netty/pom.xml b/connect-server-netty/pom.xml new file mode 100644 index 0000000..e2e53b5 --- /dev/null +++ b/connect-server-netty/pom.xml @@ -0,0 +1,34 @@ + + + + coke-connect + org.needcoke + abandon + + 4.0.0 + + connect-server-netty + + + 11 + 11 + + + + + org.needcoke + connect-core + abandon + provided + + + + io.netty + netty-all + 4.1.76.Final + + + + \ No newline at end of file diff --git a/connect-server-netty/src/main/java/org/needcoke/rpc/netty/client/NettyClient.java b/connect-server-netty/src/main/java/org/needcoke/rpc/netty/client/NettyClient.java new file mode 100644 index 0000000..bdb7993 --- /dev/null +++ b/connect-server-netty/src/main/java/org/needcoke/rpc/netty/client/NettyClient.java @@ -0,0 +1,47 @@ +package org.needcoke.rpc.netty.client; + +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.*; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioSocketChannel; +import org.needcoke.rpc.codec.CokeRequest; +import org.needcoke.rpc.netty.codec.RpcDecoder; +import org.needcoke.rpc.netty.codec.RpcEncoder; + +public class NettyClient { + + private Channel channel; + + private String ip; + + private int port; + + public NettyClient(String ip, int port) { + this.ip = ip; + this.port = port; + } + + public Channel start() throws InterruptedException { + + final EventLoopGroup group = new NioEventLoopGroup(); + + Bootstrap b = new Bootstrap(); + b.group(group).channel(NioSocketChannel.class)// 使用NioSocketChannel来作为连接用的channel类 + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 500) + .handler(new ChannelInitializer() { // 绑定连接初始化器 + @Override + public void initChannel(SocketChannel ch) throws Exception { + ChannelPipeline pipeline = ch.pipeline(); + pipeline.addLast(new RpcEncoder(CokeRequest.class)); //编码request + pipeline.addLast(new RpcDecoder(CokeRequest.class)); //解码response + pipeline.addLast(new SenderHandlerAdapter()); //客户端处理类 + + } + }); + //发起异步连接请求,绑定连接端口和host信息 + final ChannelFuture future = b.connect(ip, port).sync(); + this.channel = future.channel(); + return this.channel; + } +} diff --git a/connect-server-netty/src/main/java/org/needcoke/rpc/netty/client/NettySession.java b/connect-server-netty/src/main/java/org/needcoke/rpc/netty/client/NettySession.java new file mode 100644 index 0000000..f216acc --- /dev/null +++ b/connect-server-netty/src/main/java/org/needcoke/rpc/netty/client/NettySession.java @@ -0,0 +1,4 @@ +package org.needcoke.rpc.netty.client; + +public class NettySession { +} diff --git a/connect-server-netty/src/main/java/org/needcoke/rpc/netty/client/SenderHandlerAdapter.java b/connect-server-netty/src/main/java/org/needcoke/rpc/netty/client/SenderHandlerAdapter.java new file mode 100644 index 0000000..981bbc4 --- /dev/null +++ b/connect-server-netty/src/main/java/org/needcoke/rpc/netty/client/SenderHandlerAdapter.java @@ -0,0 +1,35 @@ +package org.needcoke.rpc.netty.client; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; +import org.needcoke.rpc.codec.CokeRequest; +import org.needcoke.rpc.netty.processor.ReadMessageClientProcessor; + +public class SenderHandlerAdapter extends SimpleChannelInboundHandler { + + private final ReadMessageClientProcessor clientProcessor; + + public SenderHandlerAdapter(){ + this.clientProcessor = new ReadMessageClientProcessor(); + } + + @Override + protected void channelRead0(ChannelHandlerContext ctx, CokeRequest request) throws Exception { + clientProcessor.channelRead(ctx,request); + } + + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + super.channelActive(ctx); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + super.exceptionCaught(ctx, cause); + } + + @Override + public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { + super.userEventTriggered(ctx, evt); + } +} diff --git a/connect-server-netty/src/main/java/org/needcoke/rpc/netty/codec/RpcDecoder.java b/connect-server-netty/src/main/java/org/needcoke/rpc/netty/codec/RpcDecoder.java new file mode 100644 index 0000000..36a9dad --- /dev/null +++ b/connect-server-netty/src/main/java/org/needcoke/rpc/netty/codec/RpcDecoder.java @@ -0,0 +1,37 @@ +package org.needcoke.rpc.netty.codec; + +import com.alibaba.fastjson.JSON; +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.ByteToMessageDecoder; + +import java.util.List; + +public class RpcDecoder extends ByteToMessageDecoder { + + //目标对象类型进行解码 + private Class target; + + public RpcDecoder(Class target) { + this.target = target; + } + + @Override + protected void decode(ChannelHandlerContext ctx, ByteBuf in, List out) throws Exception { + if (in.readableBytes() < 4) { //不够长度丢弃 + return; + } + in.markReaderIndex(); //标记一下当前的readIndex的位置 + int dataLength = in.readInt(); // 读取传送过来的消息的长度。ByteBuf 的readInt()方法会让他的readIndex增加4 + + if (in.readableBytes() < dataLength) { //读到的消息体长度如果小于我们传送过来的消息长度,则resetReaderIndex. 这个配合markReaderIndex使用的。把readIndex重置到mark的地方 + in.resetReaderIndex(); + return; + } + byte[] data = new byte[dataLength]; + in.readBytes(data); + + Object obj = JSON.parseObject(data, target); //将byte数据转化为我们需要的对象 + out.add(obj); + } +} diff --git a/connect-server-netty/src/main/java/org/needcoke/rpc/netty/codec/RpcEncoder.java b/connect-server-netty/src/main/java/org/needcoke/rpc/netty/codec/RpcEncoder.java new file mode 100644 index 0000000..a020fd7 --- /dev/null +++ b/connect-server-netty/src/main/java/org/needcoke/rpc/netty/codec/RpcEncoder.java @@ -0,0 +1,25 @@ +package org.needcoke.rpc.netty.codec; + +import com.alibaba.fastjson.JSON; +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.MessageToByteEncoder; + +public class RpcEncoder extends MessageToByteEncoder { + + //目标对象类型进行编码 + private Class target; + + public RpcEncoder(Class target) { + this.target = target; + } + + @Override + protected void encode(ChannelHandlerContext ctx, Object msg, ByteBuf out) throws Exception { + if (target.isInstance(msg)) { + byte[] data = JSON.toJSONBytes(msg); //使用fastJson将对象转换为byte + out.writeInt(data.length); //先将消息长度写入,也就是消息头 + out.writeBytes(data); //消息体中包含我们要发送的数据 + } + } +} diff --git a/connect-server-netty/src/main/java/org/needcoke/rpc/netty/invoker/NettyInvoker.java b/connect-server-netty/src/main/java/org/needcoke/rpc/netty/invoker/NettyInvoker.java new file mode 100644 index 0000000..b699fa8 --- /dev/null +++ b/connect-server-netty/src/main/java/org/needcoke/rpc/netty/invoker/NettyInvoker.java @@ -0,0 +1,91 @@ +package org.needcoke.rpc.netty.invoker; + +import cn.hutool.core.date.DateUtil; +import io.netty.channel.Channel; +import lombok.NoArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.connect.rpc.link.tracking.util.TrackingUtil; +import org.needcoke.rpc.codec.CokeRequest; +import org.needcoke.rpc.codec.CokeRequestProtocol; +import org.needcoke.rpc.common.constant.ConnectConstant; +import org.needcoke.rpc.common.enums.ConnectionExceptionEnum; +import org.needcoke.rpc.common.enums.RpcTypeEnum; +import org.needcoke.rpc.common.exception.CokeConnectException; +import org.needcoke.rpc.invoker.ConnectInvoker; +import org.needcoke.rpc.invoker.InvokeResult; +import org.needcoke.rpc.invoker.OkHttpsInvoker; +import org.needcoke.rpc.net.Connector; +import org.needcoke.rpc.netty.client.NettyClient; +import org.needcoke.rpc.utils.ConnectUtil; +import org.springframework.cloud.client.ServiceInstance; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.locks.LockSupport; + +@Slf4j +@NoArgsConstructor +public class NettyInvoker extends ConnectInvoker { + + public NettyInvoker(RpcTypeEnum rpcTypeEnum) { + super(rpcTypeEnum); + } + + private final Map clientMap = new ConcurrentHashMap<>(); + + private final Map channelMap = new ConcurrentHashMap<>(); + @Override + public InvokeResult execute(Connector connector, ServiceInstance instance, String beanName, String methodName, Map params) { + InvokeResult res = runDefaultExecute(connector, instance, beanName, methodName, params); + if(null != res){ + return res; + } + String uri = instance.getHost() + ConnectConstant.COLON + instance.getPort(); + Integer serverPort = ConnectUtil.getCokeServerPort(instance); + if (0 == serverPort) { + throw new CokeConnectException(ConnectionExceptionEnum.REMOTE_SERVICE_DOES_NOT_OPEN_THE_COKE_SERVICE_PORT); + } + if (!channelMap.containsKey(uri)) { + NettyClient nettyClient = new NettyClient(instance.getHost(), serverPort); + clientMap.put(uri, nettyClient); + try { + Channel channel = nettyClient.start(); + channelMap.put(uri, channel); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + Channel channel = channelMap.get(uri); + CokeRequest request = new CokeRequest().setBeanName(beanName) + .setMethodName(methodName) + .setParams(params) + .addHeader(TrackingUtil.headerKey(), TrackingUtil.headerValue()); + byte[] bytes = request.toBytes(); + try { + channel.writeAndFlush(request); + } catch (Exception e) { + //一般是channel close失效了 + log.error(e.getMessage()); + try { + channel = clientMap.get(uri).start(); + } catch (InterruptedException ex) { + if (null == connector.getHttpInvoker()) { + connector.setHttpInvoker(new OkHttpsInvoker(RpcTypeEnum.okHttp3)); + } + return connector.compensationExecute(instance,beanName,methodName,params); + } + channelMap.put(uri,channel); + return execute(connector,instance,beanName,methodName,params); + } + InvokeResult tmp = new InvokeResult(); + long start = DateUtil.current(); + ConnectUtil.putRequestMap(tmp); + ConnectUtil.putThreadMap(TrackingUtil.getRequestId(), Thread.currentThread()); + LockSupport.park(); + InvokeResult result = ConnectUtil.getFromRequestMap(TrackingUtil.getRequestId()); + long end = DateUtil.current(); + log.info("requestId = {} , start = {} , end = {} ,cost = {}", TrackingUtil.getRequestId(), start, end, end - start); + result.setTime(end - start); + return result; + } +} diff --git a/connect-server-netty/src/main/java/org/needcoke/rpc/netty/processor/ReadMessageClientProcessor.java b/connect-server-netty/src/main/java/org/needcoke/rpc/netty/processor/ReadMessageClientProcessor.java new file mode 100644 index 0000000..eb69047 --- /dev/null +++ b/connect-server-netty/src/main/java/org/needcoke/rpc/netty/processor/ReadMessageClientProcessor.java @@ -0,0 +1,24 @@ +package org.needcoke.rpc.netty.processor; + +import io.netty.channel.ChannelHandlerContext; +import lombok.extern.slf4j.Slf4j; +import org.connect.rpc.link.tracking.util.TrackingUtil; +import org.needcoke.rpc.codec.CokeRequest; +import org.needcoke.rpc.common.enums.ConnectRequestEnum; +import org.needcoke.rpc.utils.ConnectUtil; + +import java.util.concurrent.locks.LockSupport; + +@Slf4j +public class ReadMessageClientProcessor implements ReadMessageProcessor{ + @Override + public void channelRead(ChannelHandlerContext ctx, CokeRequest request) { + if (ConnectRequestEnum.INTERNAL_RESPONSE == request.getRequestType()) { + log.info("smart socket client receive back linkTracking = {} , request json = {}", + TrackingUtil.linkTrackingJsonStr(), new String(request.toBytes())); + ConnectUtil.putRequestMap(request.getCokeRequestId(), request.getResult()); + Thread thread = ConnectUtil.getFromThreadMap(request.getCokeRequestId()); + LockSupport.unpark(thread); + } + } +} diff --git a/connect-server-netty/src/main/java/org/needcoke/rpc/netty/processor/ReadMessageProcessor.java b/connect-server-netty/src/main/java/org/needcoke/rpc/netty/processor/ReadMessageProcessor.java new file mode 100644 index 0000000..3935a00 --- /dev/null +++ b/connect-server-netty/src/main/java/org/needcoke/rpc/netty/processor/ReadMessageProcessor.java @@ -0,0 +1,9 @@ +package org.needcoke.rpc.netty.processor; + +import io.netty.channel.ChannelHandlerContext; +import org.needcoke.rpc.codec.CokeRequest; + +public interface ReadMessageProcessor { + + void channelRead(ChannelHandlerContext ctx, CokeRequest request); +} diff --git a/connect-server-netty/src/main/java/org/needcoke/rpc/netty/processor/ReadMessageServerProcessor.java b/connect-server-netty/src/main/java/org/needcoke/rpc/netty/processor/ReadMessageServerProcessor.java new file mode 100644 index 0000000..d87af08 --- /dev/null +++ b/connect-server-netty/src/main/java/org/needcoke/rpc/netty/processor/ReadMessageServerProcessor.java @@ -0,0 +1,57 @@ +package org.needcoke.rpc.netty.processor; + +import cn.hutool.core.collection.CollUtil; +import com.alibaba.fastjson.JSONObject; +import io.netty.channel.ChannelHandlerContext; +import lombok.extern.slf4j.Slf4j; +import org.connect.rpc.link.tracking.util.TrackingUtil; +import org.needcoke.rpc.codec.CokeRequest; +import org.needcoke.rpc.common.constant.ConnectConstant; +import org.needcoke.rpc.common.enums.ConnectRequestEnum; +import org.needcoke.rpc.common.enums.ConnectionExceptionEnum; +import org.needcoke.rpc.common.exception.CokeConnectException; +import org.needcoke.rpc.invoker.InvokeResult; +import org.needcoke.rpc.utils.SpringContextUtils; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.Map; + +@Slf4j +public class ReadMessageServerProcessor implements ReadMessageProcessor{ + + @Override + public void channelRead(ChannelHandlerContext ctx, CokeRequest request) { + if(ConnectRequestEnum.INTERNAL_REQUEST == request.getRequestType()){ + String beanName = request.getBeanName(); + String methodName = request.getMethodName(); + Map params = request.getParams(); + log.info("execute smart socket linkTracking = {} , -- beanName : {} , methodName : {} , param : {}", + TrackingUtil.linkTrackingJsonStr(), beanName, methodName, JSONObject.toJSONString(params)); + Method method = SpringContextUtils.getMethod(beanName, methodName); + if (null == method) { + log.error(ConnectionExceptionEnum.BEAN_WITHOUT_METHOD.logStatement("beanName {} , methodName {} , linkTracking = {}"), beanName, methodName, TrackingUtil.linkTrackingJsonStr()); + throw new CokeConnectException(ConnectionExceptionEnum.BEAN_WITHOUT_METHOD); + } + Object bean = SpringContextUtils.getBean(beanName); + try { + Object invoke = null; + if (CollUtil.isEmpty(params)) { + invoke = method.invoke(bean); + } else { + invoke = method.invoke(bean, params.values().toArray()); + } + InvokeResult invokeResult = new InvokeResult().setBody(invoke).setStatus(200).setTime(30L); + ctx.writeAndFlush(request.setRequestType(ConnectRequestEnum.INTERNAL_RESPONSE) + .setResult(invokeResult) + .setCokeRequestId(TrackingUtil.getRequestId())); + } catch (Exception e) { + log.error(ConnectionExceptionEnum.INVOKE_METHOD_ERROR.logStatement(ConnectConstant.EXECUTE_RELATIVE_PATH)); + if(e instanceof InvocationTargetException){ + ((InvocationTargetException) e).getTargetException().printStackTrace(); + } + throw new CokeConnectException(ConnectionExceptionEnum.INVOKE_METHOD_ERROR, e); + } + } + } +} diff --git a/connect-server-netty/src/main/java/org/needcoke/rpc/netty/server/NettyServer.java b/connect-server-netty/src/main/java/org/needcoke/rpc/netty/server/NettyServer.java new file mode 100644 index 0000000..405b4b1 --- /dev/null +++ b/connect-server-netty/src/main/java/org/needcoke/rpc/netty/server/NettyServer.java @@ -0,0 +1,62 @@ +package org.needcoke.rpc.netty.server; + +import io.netty.bootstrap.ServerBootstrap; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelOption; +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 org.needcoke.rpc.codec.CokeRequest; +import org.needcoke.rpc.config.ServerConfig; +import org.needcoke.rpc.netty.codec.RpcDecoder; +import org.needcoke.rpc.netty.codec.RpcEncoder; +import org.needcoke.rpc.server.ConnectionServer; + +import javax.annotation.PostConstruct; +import javax.annotation.Resource; + +public class NettyServer implements ConnectionServer { + + @Resource + private ServerConfig serverConfig; + + + @PostConstruct + @Override + public void start() { + EventLoopGroup bossGroup = new NioEventLoopGroup(); //bossGroup就是parentGroup,是负责处理TCP/IP连接的 + EventLoopGroup workerGroup = new NioEventLoopGroup(); //workerGroup就是childGroup,是负责处理Channel(通道)的I/O事件 + + ServerBootstrap sb = new ServerBootstrap(); + sb.group(bossGroup, workerGroup) + .channel(NioServerSocketChannel.class) + .option(ChannelOption.SO_BACKLOG, 128) //初始化服务端可连接队列,指定了队列的大小128 + .childOption(ChannelOption.SO_KEEPALIVE, false) //保持长连接 + .childHandler(new ChannelInitializer() { // 绑定客户端连接时候触发操作 + @Override + protected void initChannel(SocketChannel sh) throws Exception { + sh.pipeline() + .addLast(new RpcDecoder(CokeRequest.class)) //解码request + .addLast(new RpcEncoder(CokeRequest.class)) //编码response + .addLast(new NettyServerHandlerAdapter()); //使用ServerHandler类来处理接收到的消息 + } + }); + //绑定监听端口,调用sync同步阻塞方法等待绑定操作完 + ChannelFuture future = null; + try { + future = sb.bind(serverConfig.getCokeServerPort()).sync(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + //成功绑定到端口之后,给channel增加一个 管道关闭的监听器并同步阻塞,直到channel关闭,线程才会往下执行,结束进程。 + try { + future.channel().closeFuture().sync(); + } catch (InterruptedException e) { + throw new RuntimeException(); + } + } + +} diff --git a/connect-server-netty/src/main/java/org/needcoke/rpc/netty/server/NettyServerHandlerAdapter.java b/connect-server-netty/src/main/java/org/needcoke/rpc/netty/server/NettyServerHandlerAdapter.java new file mode 100644 index 0000000..d790834 --- /dev/null +++ b/connect-server-netty/src/main/java/org/needcoke/rpc/netty/server/NettyServerHandlerAdapter.java @@ -0,0 +1,41 @@ +package org.needcoke.rpc.netty.server; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelInboundHandlerAdapter; +import org.connect.rpc.link.tracking.common.CommonConstant; +import org.connect.rpc.link.tracking.config.LinkTrackingContextHolder; +import org.connect.rpc.link.tracking.net.LinkTracking; +import org.needcoke.rpc.codec.CokeRequest; +import org.needcoke.rpc.config.ServerConfig; +import org.needcoke.rpc.netty.processor.ReadMessageServerProcessor; +import org.needcoke.rpc.utils.SpringContextUtils; + +public class NettyServerHandlerAdapter extends ChannelInboundHandlerAdapter { + + private final ReadMessageServerProcessor readMessageProcessor; + + public NettyServerHandlerAdapter() { + this.readMessageProcessor = new ReadMessageServerProcessor(); + } + + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + CokeRequest request = (CokeRequest)msg; + String json = request.getHeader(CommonConstant.COKE_REQUEST_ID_HEADER_ID_NAME); + int mvcPort = SpringContextUtils.getBean(ServerConfig.class).getMvcPort(); + if (StrUtil.isEmpty(json)) { + LinkTracking linkTracking = new LinkTracking(mvcPort); + linkTracking.setIndex(1); + LinkTrackingContextHolder.setLinkTracking(linkTracking); + } else { + LinkTracking linkTracking = JSONUtil.toBean(json, LinkTracking.class); + linkTracking.setIndex(linkTracking.getIndex() + 1); + linkTracking.changeIp(); + linkTracking.setPort(mvcPort); + LinkTrackingContextHolder.setLinkTracking(linkTracking); + } + readMessageProcessor.channelRead(ctx,request); + } +} diff --git a/connect-server-smart-socket/pom.xml b/connect-server-smart-socket/pom.xml new file mode 100644 index 0000000..e1550ad --- /dev/null +++ b/connect-server-smart-socket/pom.xml @@ -0,0 +1,35 @@ + + + + coke-connect + org.needcoke + abandon + + 4.0.0 + + connect-server-smart-socket + + + 11 + 11 + + + + + org.needcoke + connect-core + abandon + provided + + + + org.smartboot.socket + aio-core + 1.5.17 + provided + + + + \ No newline at end of file diff --git a/connect-core/src/main/java/org/needcoke/rpc/invoker/SmartSocketInvoker.java b/connect-server-smart-socket/src/main/java/org/needcoke/rpc/smartsocket/Invoker/SmartSocketInvoker.java similarity index 86% rename from connect-core/src/main/java/org/needcoke/rpc/invoker/SmartSocketInvoker.java rename to connect-server-smart-socket/src/main/java/org/needcoke/rpc/smartsocket/Invoker/SmartSocketInvoker.java index f618881..6fdd971 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/invoker/SmartSocketInvoker.java +++ b/connect-server-smart-socket/src/main/java/org/needcoke/rpc/smartsocket/Invoker/SmartSocketInvoker.java @@ -1,16 +1,20 @@ -package org.needcoke.rpc.invoker; +package org.needcoke.rpc.smartsocket.Invoker; import cn.hutool.core.date.DateUtil; +import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.connect.rpc.link.tracking.util.TrackingUtil; import org.needcoke.rpc.codec.CokeRequest; -import org.needcoke.rpc.codec.CokeRequestProtocol; +import org.needcoke.rpc.smartsocket.codec.CokeRequestProtocol; import org.needcoke.rpc.common.constant.ConnectConstant; import org.needcoke.rpc.common.enums.ConnectionExceptionEnum; import org.needcoke.rpc.common.enums.RpcTypeEnum; import org.needcoke.rpc.common.exception.CokeConnectException; +import org.needcoke.rpc.invoker.ConnectInvoker; +import org.needcoke.rpc.invoker.InvokeResult; +import org.needcoke.rpc.invoker.OkHttpsInvoker; import org.needcoke.rpc.net.Connector; -import org.needcoke.rpc.processor.smart_socket.SmartSocketClientProcessor; +import org.needcoke.rpc.smartsocket.processor.SmartSocketClientProcessor; import org.needcoke.rpc.utils.ConnectUtil; import org.smartboot.socket.transport.AioQuickClient; import org.smartboot.socket.transport.AioSession; @@ -22,14 +26,9 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.locks.LockSupport; @Slf4j +@NoArgsConstructor public class SmartSocketInvoker extends ConnectInvoker { - private RpcTypeEnum rpcTypeEnum; - - public SmartSocketInvoker(RpcTypeEnum rpcTypeEnum) { - this.rpcTypeEnum = rpcTypeEnum; - } - /** * 给AioQuickClient加个引用,防止垃圾回收。 */ @@ -37,14 +36,17 @@ public class SmartSocketInvoker extends ConnectInvoker { private final Map sessionMap = new ConcurrentHashMap<>(); + public SmartSocketInvoker(RpcTypeEnum rpcTypeEnum) { + super(rpcTypeEnum); + } + + + @Override public InvokeResult execute(Connector connector, ServiceInstance instance, String beanName, String methodName, Map params) { - RpcTypeEnum remoteRpcType = getRemoteRpcType(instance); - if(remoteRpcType == RpcTypeEnum.okHttp3){ - if (null == connector.getHttpInvoker()) { - connector.setHttpInvoker(new OkHttpsInvoker(RpcTypeEnum.okHttp3)); - } - return connector.compensationExecute(instance,beanName,methodName,params); + InvokeResult res = runDefaultExecute(connector, instance, beanName, methodName, params); + if(null != res){ + return res; } String uri = instance.getHost() + ConnectConstant.COLON + instance.getPort(); Integer serverPort = ConnectUtil.getCokeServerPort(instance); diff --git a/connect-core/src/main/java/org/needcoke/rpc/codec/CokeRequestProtocol.java b/connect-server-smart-socket/src/main/java/org/needcoke/rpc/smartsocket/codec/CokeRequestProtocol.java similarity index 92% rename from connect-core/src/main/java/org/needcoke/rpc/codec/CokeRequestProtocol.java rename to connect-server-smart-socket/src/main/java/org/needcoke/rpc/smartsocket/codec/CokeRequestProtocol.java index a8d0935..090bede 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/codec/CokeRequestProtocol.java +++ b/connect-server-smart-socket/src/main/java/org/needcoke/rpc/smartsocket/codec/CokeRequestProtocol.java @@ -1,6 +1,7 @@ -package org.needcoke.rpc.codec; +package org.needcoke.rpc.smartsocket.codec; import com.alibaba.fastjson.JSONObject; +import org.needcoke.rpc.codec.CokeRequest; import org.smartboot.socket.Protocol; import org.smartboot.socket.transport.AioSession; diff --git a/connect-core/src/main/java/org/needcoke/rpc/processor/smart_socket/SmartSocketClientProcessor.java b/connect-server-smart-socket/src/main/java/org/needcoke/rpc/smartsocket/processor/SmartSocketClientProcessor.java similarity index 62% rename from connect-core/src/main/java/org/needcoke/rpc/processor/smart_socket/SmartSocketClientProcessor.java rename to connect-server-smart-socket/src/main/java/org/needcoke/rpc/smartsocket/processor/SmartSocketClientProcessor.java index 62a6870..ec432b5 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/processor/smart_socket/SmartSocketClientProcessor.java +++ b/connect-server-smart-socket/src/main/java/org/needcoke/rpc/smartsocket/processor/SmartSocketClientProcessor.java @@ -1,4 +1,4 @@ -package org.needcoke.rpc.processor.smart_socket; +package org.needcoke.rpc.smartsocket.processor; import lombok.extern.slf4j.Slf4j; import org.connect.rpc.link.tracking.util.TrackingUtil; @@ -12,15 +12,14 @@ import java.util.concurrent.locks.LockSupport; @Slf4j public class SmartSocketClientProcessor extends SmartSocketMessageProcessor { @Override - public void process(AioSession aioSession, CokeRequest request) { + public void process(AioSession session, CokeRequest request) { if (ConnectRequestEnum.INTERNAL_RESPONSE == request.getRequestType()) { log.info("smart socket client receive back linkTracking = {} , request json = {}", - TrackingUtil.linkTrackingJsonStr(),new String(request.toBytes())); - ConnectUtil.putRequestMap(TrackingUtil.getRequestId(),request.getResult()); - Thread thread = ConnectUtil.getFromThreadMap(TrackingUtil.getRequestId()); + TrackingUtil.linkTrackingJsonStr(), new String(request.toBytes())); + ConnectUtil.putRequestMap(request.getCokeRequestId(), request.getResult()); + Thread thread = ConnectUtil.getFromThreadMap(request.getCokeRequestId()); LockSupport.unpark(thread); - //TODO 抛出异常 } } diff --git a/connect-core/src/main/java/org/needcoke/rpc/processor/smart_socket/SmartSocketMessageProcessor.java b/connect-server-smart-socket/src/main/java/org/needcoke/rpc/smartsocket/processor/SmartSocketMessageProcessor.java similarity index 96% rename from connect-core/src/main/java/org/needcoke/rpc/processor/smart_socket/SmartSocketMessageProcessor.java rename to connect-server-smart-socket/src/main/java/org/needcoke/rpc/smartsocket/processor/SmartSocketMessageProcessor.java index 448aaac..d86783c 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/processor/smart_socket/SmartSocketMessageProcessor.java +++ b/connect-server-smart-socket/src/main/java/org/needcoke/rpc/smartsocket/processor/SmartSocketMessageProcessor.java @@ -1,4 +1,4 @@ -package org.needcoke.rpc.processor.smart_socket; +package org.needcoke.rpc.smartsocket.processor; import org.needcoke.rpc.codec.CokeRequest; import org.needcoke.rpc.invoker.InvokeResult; diff --git a/connect-core/src/main/java/org/needcoke/rpc/processor/smart_socket/SmartSocketServerProcessor.java b/connect-server-smart-socket/src/main/java/org/needcoke/rpc/smartsocket/processor/SmartSocketServerProcessor.java similarity index 91% rename from connect-core/src/main/java/org/needcoke/rpc/processor/smart_socket/SmartSocketServerProcessor.java rename to connect-server-smart-socket/src/main/java/org/needcoke/rpc/smartsocket/processor/SmartSocketServerProcessor.java index 9d57a4c..fae050b 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/processor/smart_socket/SmartSocketServerProcessor.java +++ b/connect-server-smart-socket/src/main/java/org/needcoke/rpc/smartsocket/processor/SmartSocketServerProcessor.java @@ -1,4 +1,4 @@ -package org.needcoke.rpc.processor.smart_socket; +package org.needcoke.rpc.smartsocket.processor; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; @@ -46,7 +46,8 @@ public class SmartSocketServerProcessor extends SmartSocketMessageProcessor params = request.getParams(); - log.info("execute smart socket linkTracking = {} , -- beanName : {} , methodName : {} , param : {}", TrackingUtil.linkTrackingJsonStr(), beanName, methodName, JSONObject.toJSONString(params)); + log.info("execute smart socket linkTracking = {} , -- beanName : {} , methodName : {} , param : {}", + TrackingUtil.linkTrackingJsonStr(), beanName, methodName, JSONObject.toJSONString(params)); Method method = SpringContextUtils.getMethod(beanName, methodName); if (null == method) { log.error(ConnectionExceptionEnum.BEAN_WITHOUT_METHOD.logStatement("beanName {} , methodName {} , linkTracking = {}"), beanName, methodName, TrackingUtil.linkTrackingJsonStr()); @@ -61,7 +62,9 @@ public class SmartSocketServerProcessor extends SmartSocketMessageProcessorbusiness-b business-c connect-link-tracking + connect-server-netty + connect-server-smart-socket -- Gitee From 163754ebb9f336ed6015aed513b77c0af6b1950f Mon Sep 17 00:00:00 2001 From: warren Date: Wed, 22 Jun 2022 16:24:22 +0800 Subject: [PATCH 09/22] =?UTF-8?q?=E6=96=B0=E5=A2=9Enetty=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E7=BB=84=E4=BB=B6=E8=B0=83=E7=94=A8=E6=96=B9=E5=BC=8F=E4=BB=A5?= =?UTF-8?q?=E5=8F=8Asmartsocket=E8=B0=83=E7=94=A8=E6=96=B9=E5=BC=8F?= =?UTF-8?q?=E4=BD=9C=E4=B8=BA=E7=8B=AC=E7=AB=8B=E7=9A=84module=E6=8A=BD?= =?UTF-8?q?=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business-b/pom.xml | 11 ++++ .../needcoke/b/component/TestComponent.java | 22 ++++++-- .../needcoke/b/controller/TestController.java | 6 -- business-b/src/main/resources/application.yml | 1 + business-c/pom.xml | 12 ++++ .../needcoke/c/controller/CController.java | 20 +++++-- business-c/src/main/resources/application.yml | 3 + bussiness-a/pom.xml | 12 ++++ .../org/needcoke/a/configuration/Config.java | 20 +++++-- .../src/main/resources/application.yml | 3 + .../common/enums/ConnectionExceptionEnum.java | 4 ++ .../needcoke/rpc/invoker/ConnectInvoker.java | 11 ---- .../needcoke/rpc/invoker/InvokeResult.java | 1 - .../java/org/needcoke/rpc/net/Connector.java | 56 ++++++++++++++++++- .../rpc/netty/invoker/NettyInvoker.java | 1 - .../processor/ReadMessageClientProcessor.java | 2 +- .../processor/ReadMessageServerProcessor.java | 2 +- .../rpc/netty/server/NettyServer.java | 14 +++-- .../SmartSocketInvoker.java | 2 +- 19 files changed, 158 insertions(+), 45 deletions(-) rename connect-server-smart-socket/src/main/java/org/needcoke/rpc/smartsocket/{Invoker => invoker}/SmartSocketInvoker.java (98%) diff --git a/business-b/pom.xml b/business-b/pom.xml index ddf542c..7eff521 100644 --- a/business-b/pom.xml +++ b/business-b/pom.xml @@ -37,6 +37,17 @@ nacos-common 1.4.1 + + org.needcoke + connect-server-smart-socket + abandon + + + + org.needcoke + connect-server-netty + abandon + \ No newline at end of file diff --git a/business-b/src/main/java/org/needcoke/b/component/TestComponent.java b/business-b/src/main/java/org/needcoke/b/component/TestComponent.java index 77dcc51..9fe45c3 100644 --- a/business-b/src/main/java/org/needcoke/b/component/TestComponent.java +++ b/business-b/src/main/java/org/needcoke/b/component/TestComponent.java @@ -1,6 +1,11 @@ package org.needcoke.b.component; -import org.needcoke.rpc.invoker.SmartSocketInvoker; +import org.needcoke.rpc.common.enums.RpcTypeEnum; +import org.needcoke.rpc.netty.invoker.NettyInvoker; +import org.needcoke.rpc.netty.server.NettyServer; +import org.needcoke.rpc.smartsocket.invoker.SmartSocketInvoker; +import org.needcoke.rpc.smartsocket.server.SmartSocketServer; +import org.springframework.context.annotation.Bean; import org.springframework.stereotype.Component; /** @@ -14,11 +19,16 @@ public class TestComponent { // @Primary // public WeightedResponseTimeBalance weightedResponseTimeBalance(){ // return new WeightedResponseTimeBalance(); -// } +// }d -// @Bean -// public SmartSocketInvoker smartSocketInvoker(RpcTypeEnum rpcTypeEnum){ -// return new SmartSocketInvoker(rpcTypeEnum); -// } + @Bean + public NettyInvoker nettyInvoker(RpcTypeEnum rpcTypeEnum){ + return new NettyInvoker(rpcTypeEnum); + } + + @Bean + public NettyServer nettyServer(){ + return new NettyServer(); + } } diff --git a/business-b/src/main/java/org/needcoke/b/controller/TestController.java b/business-b/src/main/java/org/needcoke/b/controller/TestController.java index 8a57cd2..8e026e9 100644 --- a/business-b/src/main/java/org/needcoke/b/controller/TestController.java +++ b/business-b/src/main/java/org/needcoke/b/controller/TestController.java @@ -1,21 +1,15 @@ package org.needcoke.b.controller; -import cn.hutool.core.collection.CollUtil; import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.needcoke.rpc.annotation.Rpc; import org.needcoke.rpc.invoker.InvokeResult; import org.needcoke.rpc.loadBalance.LoadBalance; import org.needcoke.rpc.net.ConnectorFactory; import org.needcoke.rpc.utils.ConnectUtil; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.discovery.DiscoveryClient; -import org.springframework.stereotype.Component; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.context.request.RequestAttributes; -import org.springframework.web.context.request.RequestContextHolder; import javax.annotation.Resource; import java.util.HashMap; diff --git a/business-b/src/main/resources/application.yml b/business-b/src/main/resources/application.yml index b16e9b6..380c943 100644 --- a/business-b/src/main/resources/application.yml +++ b/business-b/src/main/resources/application.yml @@ -9,6 +9,7 @@ spring: discovery: metadata: coke-server-port: 13001 + rpcType: netty #server-addr: http://192.168.*:8848 server-addr: http://127.0.0.1:8848 cluster-name: 严鸣是吕诗文爸爸 diff --git a/business-c/pom.xml b/business-c/pom.xml index 9f1ed51..1d10892 100644 --- a/business-c/pom.xml +++ b/business-c/pom.xml @@ -34,6 +34,18 @@ spring-cloud-starter-alibaba-nacos-discovery 2.2.5.RELEASE + + + org.needcoke + connect-server-smart-socket + abandon + + + + org.needcoke + connect-server-netty + abandon + diff --git a/business-c/src/main/java/org/needcoke/c/controller/CController.java b/business-c/src/main/java/org/needcoke/c/controller/CController.java index d75cfa0..d534fb6 100644 --- a/business-c/src/main/java/org/needcoke/c/controller/CController.java +++ b/business-c/src/main/java/org/needcoke/c/controller/CController.java @@ -2,9 +2,14 @@ package org.needcoke.c.controller; import org.needcoke.rpc.annotation.Call; import org.needcoke.rpc.annotation.Rpc; +import org.needcoke.rpc.common.enums.RpcTypeEnum; import org.needcoke.rpc.invoker.InvokeResult; -import org.needcoke.rpc.invoker.SmartSocketInvoker; import org.needcoke.rpc.net.ConnectorFactory; +import org.needcoke.rpc.netty.invoker.NettyInvoker; +import org.needcoke.rpc.netty.server.NettyServer; +import org.needcoke.rpc.smartsocket.invoker.SmartSocketInvoker; +import org.needcoke.rpc.smartsocket.server.SmartSocketServer; +import org.springframework.context.annotation.Bean; import org.springframework.stereotype.Component; import javax.annotation.Resource; @@ -15,10 +20,15 @@ import java.util.Map; @Rpc public class CController { -// @Bean -// public SmartSocketInvoker smartSocketInvoker(RpcTypeEnum rpcTypeEnum){ -// return new SmartSocketInvoker(rpcTypeEnum); -// } + @Bean + public NettyInvoker nettyInvoker(RpcTypeEnum rpcTypeEnum){ + return new NettyInvoker(rpcTypeEnum); + } + + @Bean + public NettyServer nettyServer(){ + return new NettyServer(); + } @Resource private ConnectorFactory connectorFactory; diff --git a/business-c/src/main/resources/application.yml b/business-c/src/main/resources/application.yml index 53e1a0c..5b2f610 100644 --- a/business-c/src/main/resources/application.yml +++ b/business-c/src/main/resources/application.yml @@ -7,6 +7,9 @@ spring: nacos: #注册中心 discovery: + metadata: + coke-server-port: 13001 + rpcType: netty #server-addr: http://192.168.*:8848 server-addr: http://127.0.0.1:8848 cluster-name: 严鸣是吕诗文爸爸 diff --git a/bussiness-a/pom.xml b/bussiness-a/pom.xml index 1febe49..f6fc961 100644 --- a/bussiness-a/pom.xml +++ b/bussiness-a/pom.xml @@ -27,6 +27,18 @@ spring-cloud-starter-alibaba-nacos-discovery 2.2.5.RELEASE + + + org.needcoke + connect-server-smart-socket + abandon + + + + org.needcoke + connect-server-netty + abandon + \ No newline at end of file diff --git a/bussiness-a/src/main/java/org/needcoke/a/configuration/Config.java b/bussiness-a/src/main/java/org/needcoke/a/configuration/Config.java index 8975e7b..be7c23d 100644 --- a/bussiness-a/src/main/java/org/needcoke/a/configuration/Config.java +++ b/bussiness-a/src/main/java/org/needcoke/a/configuration/Config.java @@ -3,7 +3,12 @@ package org.needcoke.a.configuration; import lombok.extern.slf4j.Slf4j; import org.needcoke.rpc.annotation.Call; import org.needcoke.rpc.annotation.Rpc; -import org.needcoke.rpc.invoker.SmartSocketInvoker; +import org.needcoke.rpc.common.enums.RpcTypeEnum; +import org.needcoke.rpc.netty.invoker.NettyInvoker; +import org.needcoke.rpc.netty.server.NettyServer; +import org.needcoke.rpc.smartsocket.invoker.SmartSocketInvoker; +import org.needcoke.rpc.smartsocket.server.SmartSocketServer; +import org.springframework.context.annotation.Bean; import org.springframework.stereotype.Component; /** @@ -29,8 +34,13 @@ public class Config { return "say : "+word; } -// @Bean -// public SmartSocketInvoker smartSocketInvoker(RpcTypeEnum rpcTypeEnum){ -// return new SmartSocketInvoker(rpcTypeEnum); -// } + @Bean + public NettyInvoker nettyInvoker(RpcTypeEnum rpcTypeEnum){ + return new NettyInvoker(rpcTypeEnum); + } + + @Bean + public NettyServer nettyServer(){ + return new NettyServer(); + } } diff --git a/bussiness-a/src/main/resources/application.yml b/bussiness-a/src/main/resources/application.yml index 43c6995..06fd744 100644 --- a/bussiness-a/src/main/resources/application.yml +++ b/bussiness-a/src/main/resources/application.yml @@ -7,6 +7,9 @@ spring: nacos: #注册中心 discovery: + metadata: + coke-server-port: 13001 + rpcType: netty #server-addr: http://192.168.*:8848 server-addr: http://127.0.0.1:8848 cluster-name: 严鸣是吕诗文爸爸 diff --git a/connect-core/src/main/java/org/needcoke/rpc/common/enums/ConnectionExceptionEnum.java b/connect-core/src/main/java/org/needcoke/rpc/common/enums/ConnectionExceptionEnum.java index d9c546c..2477fca 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/common/enums/ConnectionExceptionEnum.java +++ b/connect-core/src/main/java/org/needcoke/rpc/common/enums/ConnectionExceptionEnum.java @@ -23,6 +23,10 @@ public enum ConnectionExceptionEnum { RECONNECTION_WITH_REMOTE_SERVICE_FAILED("0006","reconnection with remote service failed","与远程服务重建连接失败"), CONNECTION_WITH_REMOTE_SERVICE_FAILED("0007","reconnection with remote service failed","与远程服务重建连接失败"), + + THE_FORMAT_OF_THE_REMOTE_SERVICE_PORT_NUMBER_IS_INCORRECT_PLEASE_CHECK_THE_CONFIGURATION_OF_THE_REMOTE_SERVICE_PORT_NUMBER + ("0008","The format of the remote service port number is incorrect. Please check the configuration of the remote service port number", + "远程服务端口号格式错误,请检查远程服务端口号配置") ; private final String code; diff --git a/connect-core/src/main/java/org/needcoke/rpc/invoker/ConnectInvoker.java b/connect-core/src/main/java/org/needcoke/rpc/invoker/ConnectInvoker.java index 8d650c4..6af5477 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/invoker/ConnectInvoker.java +++ b/connect-core/src/main/java/org/needcoke/rpc/invoker/ConnectInvoker.java @@ -57,15 +57,4 @@ public abstract class ConnectInvoker { remoteRpcTypeMap.put(instance, rpcTypeEnum); return rpcTypeEnum; } - - protected InvokeResult runDefaultExecute(Connector connector, ServiceInstance instance, String beanName, String methodName, Map params){ - RpcTypeEnum remoteRpcType = getRemoteRpcType(instance); - if(remoteRpcType == RpcTypeEnum.okHttp3){ - if (null == connector.getHttpInvoker()) { - connector.setHttpInvoker(new OkHttpsInvoker(RpcTypeEnum.okHttp3)); - } - return connector.compensationExecute(instance,beanName,methodName,params); - } - return null; - } } diff --git a/connect-core/src/main/java/org/needcoke/rpc/invoker/InvokeResult.java b/connect-core/src/main/java/org/needcoke/rpc/invoker/InvokeResult.java index 3c81c58..9ef02fb 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/invoker/InvokeResult.java +++ b/connect-core/src/main/java/org/needcoke/rpc/invoker/InvokeResult.java @@ -7,7 +7,6 @@ import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; import java.io.Serializable; -import java.nio.charset.StandardCharsets; /** * 调用器的调用结果 diff --git a/connect-core/src/main/java/org/needcoke/rpc/net/Connector.java b/connect-core/src/main/java/org/needcoke/rpc/net/Connector.java index 77aa1ca..c92cc5e 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/net/Connector.java +++ b/connect-core/src/main/java/org/needcoke/rpc/net/Connector.java @@ -1,12 +1,16 @@ package org.needcoke.rpc.net; +import cn.hutool.core.collection.CollUtil; +import org.needcoke.rpc.common.enums.ConnectionExceptionEnum; import org.needcoke.rpc.common.enums.RpcTypeEnum; +import org.needcoke.rpc.common.exception.CokeConnectException; import org.needcoke.rpc.invoker.ConnectInvoker; import org.needcoke.rpc.invoker.InvokeResult; import org.needcoke.rpc.loadBalance.LoadBalance; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.discovery.DiscoveryClient; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -23,17 +27,28 @@ public class Connector { private ConnectInvoker httpInvoker; - private final ConcurrentHashMap requestTypeMap; + private final Map requestTypeMap; + + public RpcTypeEnum getRpcType(ServiceInstance instance){ + return requestTypeMap.get(instance); + } + + private final Map severPortMap; + + public Integer getServerPort(ServiceInstance instance){ + return severPortMap.get(instance); + } public Connector(String serviceId, DiscoveryClient discoveryClient, ConnectInvoker invoker, LoadBalance loadBalance) { this.serviceId = serviceId; this.discoveryClient = discoveryClient; this.invoker = invoker; this.loadBalance = loadBalance; - this.requestTypeMap = new ConcurrentHashMap<>(); + this.requestTypeMap = new HashMap<>(); + this.severPortMap = new HashMap<>(); } - public ConcurrentHashMap getRequestTypeMap() { + public Map getRequestTypeMap() { return requestTypeMap; } @@ -49,6 +64,41 @@ public class Connector { Map params) { List instances = discoveryClient.getInstances(serviceId); ServiceInstance instance = loadBalance.choose(serviceId, instances); + if (!requestTypeMap.containsKey(instance)) { + Map metadata = instance.getMetadata(); + if (CollUtil.isNotEmpty(metadata)) { + String rpcType = metadata.get("rpcType"); + String cokeServerPort = metadata.get("coke-server-port"); + if (null != rpcType) { + RpcTypeEnum rp = RpcTypeEnum.okHttp3; + switch (rpcType) { + case "netty": + rp = RpcTypeEnum.netty; + break; + case "smart socket": + case "smartSocket": + + case "smart-socket": + rp = RpcTypeEnum.smartSocket; + break; + + case "okHttp3": + rp = RpcTypeEnum.okHttp3; + break; + + default: + rp = RpcTypeEnum.okHttp3; + } + this.requestTypeMap.put(instance,rp); + try { + int port = Integer.parseInt(cokeServerPort); + this.severPortMap.put(instance,port); + }catch (Exception e){ + throw new CokeConnectException(ConnectionExceptionEnum.THE_FORMAT_OF_THE_REMOTE_SERVICE_PORT_NUMBER_IS_INCORRECT_PLEASE_CHECK_THE_CONFIGURATION_OF_THE_REMOTE_SERVICE_PORT_NUMBER); + } + } + } + } InvokeResult result = invoker.execute(this, instance, beanName, methodName, params); return result; } diff --git a/connect-server-netty/src/main/java/org/needcoke/rpc/netty/invoker/NettyInvoker.java b/connect-server-netty/src/main/java/org/needcoke/rpc/netty/invoker/NettyInvoker.java index b699fa8..2fecb1d 100644 --- a/connect-server-netty/src/main/java/org/needcoke/rpc/netty/invoker/NettyInvoker.java +++ b/connect-server-netty/src/main/java/org/needcoke/rpc/netty/invoker/NettyInvoker.java @@ -6,7 +6,6 @@ import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.connect.rpc.link.tracking.util.TrackingUtil; import org.needcoke.rpc.codec.CokeRequest; -import org.needcoke.rpc.codec.CokeRequestProtocol; import org.needcoke.rpc.common.constant.ConnectConstant; import org.needcoke.rpc.common.enums.ConnectionExceptionEnum; import org.needcoke.rpc.common.enums.RpcTypeEnum; diff --git a/connect-server-netty/src/main/java/org/needcoke/rpc/netty/processor/ReadMessageClientProcessor.java b/connect-server-netty/src/main/java/org/needcoke/rpc/netty/processor/ReadMessageClientProcessor.java index eb69047..96bc3f3 100644 --- a/connect-server-netty/src/main/java/org/needcoke/rpc/netty/processor/ReadMessageClientProcessor.java +++ b/connect-server-netty/src/main/java/org/needcoke/rpc/netty/processor/ReadMessageClientProcessor.java @@ -14,7 +14,7 @@ public class ReadMessageClientProcessor implements ReadMessageProcessor{ @Override public void channelRead(ChannelHandlerContext ctx, CokeRequest request) { if (ConnectRequestEnum.INTERNAL_RESPONSE == request.getRequestType()) { - log.info("smart socket client receive back linkTracking = {} , request json = {}", + log.info("netty client receive back linkTracking = {} , request json = {}", TrackingUtil.linkTrackingJsonStr(), new String(request.toBytes())); ConnectUtil.putRequestMap(request.getCokeRequestId(), request.getResult()); Thread thread = ConnectUtil.getFromThreadMap(request.getCokeRequestId()); diff --git a/connect-server-netty/src/main/java/org/needcoke/rpc/netty/processor/ReadMessageServerProcessor.java b/connect-server-netty/src/main/java/org/needcoke/rpc/netty/processor/ReadMessageServerProcessor.java index d87af08..c500307 100644 --- a/connect-server-netty/src/main/java/org/needcoke/rpc/netty/processor/ReadMessageServerProcessor.java +++ b/connect-server-netty/src/main/java/org/needcoke/rpc/netty/processor/ReadMessageServerProcessor.java @@ -26,7 +26,7 @@ public class ReadMessageServerProcessor implements ReadMessageProcessor{ String beanName = request.getBeanName(); String methodName = request.getMethodName(); Map params = request.getParams(); - log.info("execute smart socket linkTracking = {} , -- beanName : {} , methodName : {} , param : {}", + log.info("execute netty linkTracking = {} , -- beanName : {} , methodName : {} , param : {}", TrackingUtil.linkTrackingJsonStr(), beanName, methodName, JSONObject.toJSONString(params)); Method method = SpringContextUtils.getMethod(beanName, methodName); if (null == method) { diff --git a/connect-server-netty/src/main/java/org/needcoke/rpc/netty/server/NettyServer.java b/connect-server-netty/src/main/java/org/needcoke/rpc/netty/server/NettyServer.java index 405b4b1..1b9548a 100644 --- a/connect-server-netty/src/main/java/org/needcoke/rpc/netty/server/NettyServer.java +++ b/connect-server-netty/src/main/java/org/needcoke/rpc/netty/server/NettyServer.java @@ -8,6 +8,7 @@ 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 lombok.extern.slf4j.Slf4j; import org.needcoke.rpc.codec.CokeRequest; import org.needcoke.rpc.config.ServerConfig; import org.needcoke.rpc.netty.codec.RpcDecoder; @@ -17,15 +18,14 @@ import org.needcoke.rpc.server.ConnectionServer; import javax.annotation.PostConstruct; import javax.annotation.Resource; -public class NettyServer implements ConnectionServer { +@Slf4j +public class NettyServer extends Thread implements ConnectionServer { @Resource private ServerConfig serverConfig; - - @PostConstruct @Override - public void start() { + public void run() { EventLoopGroup bossGroup = new NioEventLoopGroup(); //bossGroup就是parentGroup,是负责处理TCP/IP连接的 EventLoopGroup workerGroup = new NioEventLoopGroup(); //workerGroup就是childGroup,是负责处理Channel(通道)的I/O事件 @@ -53,10 +53,16 @@ public class NettyServer implements ConnectionServer { //成功绑定到端口之后,给channel增加一个 管道关闭的监听器并同步阻塞,直到channel关闭,线程才会往下执行,结束进程。 try { + log.info("netty server start bind port {}",serverConfig.getCokeServerPort()); future.channel().closeFuture().sync(); } catch (InterruptedException e) { throw new RuntimeException(); } } + @PostConstruct + @Override + public synchronized void start() { + super.start(); + } } diff --git a/connect-server-smart-socket/src/main/java/org/needcoke/rpc/smartsocket/Invoker/SmartSocketInvoker.java b/connect-server-smart-socket/src/main/java/org/needcoke/rpc/smartsocket/invoker/SmartSocketInvoker.java similarity index 98% rename from connect-server-smart-socket/src/main/java/org/needcoke/rpc/smartsocket/Invoker/SmartSocketInvoker.java rename to connect-server-smart-socket/src/main/java/org/needcoke/rpc/smartsocket/invoker/SmartSocketInvoker.java index 6fdd971..5b5e8d2 100644 --- a/connect-server-smart-socket/src/main/java/org/needcoke/rpc/smartsocket/Invoker/SmartSocketInvoker.java +++ b/connect-server-smart-socket/src/main/java/org/needcoke/rpc/smartsocket/invoker/SmartSocketInvoker.java @@ -1,4 +1,4 @@ -package org.needcoke.rpc.smartsocket.Invoker; +package org.needcoke.rpc.smartsocket.invoker; import cn.hutool.core.date.DateUtil; import lombok.NoArgsConstructor; -- Gitee From 6a358aa64914b1ca22b71c8d782efa7c3fd21a93 Mon Sep 17 00:00:00 2001 From: warren Date: Wed, 22 Jun 2022 18:33:58 +0800 Subject: [PATCH 10/22] =?UTF-8?q?=E8=B6=85=E6=97=B6=E7=86=94=E6=96=AD?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=E5=BC=80=E5=A7=8B=E8=BF=AD=E4=BB=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../needcoke/b/component/TestComponent.java | 19 +++-- .../needcoke/b/controller/TestController.java | 6 +- business-b/src/main/resources/application.yml | 3 +- .../needcoke/c/controller/CController.java | 18 +++-- business-c/src/main/resources/application.yml | 5 +- .../org/needcoke/a/configuration/Config.java | 19 +++-- .../src/main/resources/application.yml | 5 +- connect-core/pom.xml | 6 ++ .../org/needcoke/rpc/config/FuseConfig.java | 12 ++++ .../org/needcoke/rpc/config/ServerConfig.java | 4 +- .../rpc/controller/RpcController.java | 24 ------- .../main/java/org/needcoke/rpc/fuse/Fuse.java | 25 +++++++ .../java/org/needcoke/rpc/fuse/FuseTask.java | 41 +++++++++++ .../org/needcoke/rpc/fuse/FuseThreadPool.java | 72 +++++++++++++++++++ .../needcoke/rpc/invoker/ConnectInvoker.java | 33 +++------ .../needcoke/rpc/invoker/OkHttpsInvoker.java | 5 -- .../java/org/needcoke/rpc/net/Connector.java | 21 +++--- .../org/needcoke/rpc/utils/ConnectUtil.java | 10 --- .../rpc/netty/invoker/NettyInvoker.java | 8 +-- .../invoker/SmartSocketInvoker.java | 10 +-- 20 files changed, 230 insertions(+), 116 deletions(-) create mode 100644 connect-core/src/main/java/org/needcoke/rpc/config/FuseConfig.java create mode 100644 connect-core/src/main/java/org/needcoke/rpc/fuse/Fuse.java create mode 100644 connect-core/src/main/java/org/needcoke/rpc/fuse/FuseTask.java create mode 100644 connect-core/src/main/java/org/needcoke/rpc/fuse/FuseThreadPool.java diff --git a/business-b/src/main/java/org/needcoke/b/component/TestComponent.java b/business-b/src/main/java/org/needcoke/b/component/TestComponent.java index 9fe45c3..a48e494 100644 --- a/business-b/src/main/java/org/needcoke/b/component/TestComponent.java +++ b/business-b/src/main/java/org/needcoke/b/component/TestComponent.java @@ -1,6 +1,5 @@ package org.needcoke.b.component; -import org.needcoke.rpc.common.enums.RpcTypeEnum; import org.needcoke.rpc.netty.invoker.NettyInvoker; import org.needcoke.rpc.netty.server.NettyServer; import org.needcoke.rpc.smartsocket.invoker.SmartSocketInvoker; @@ -21,14 +20,24 @@ public class TestComponent { // return new WeightedResponseTimeBalance(); // }d +// @Bean +// public NettyInvoker nettyInvoker(){ +// return new NettyInvoker(); +// } +// +// @Bean +// public NettyServer nettyServer(){ +// return new NettyServer(); +// } + @Bean - public NettyInvoker nettyInvoker(RpcTypeEnum rpcTypeEnum){ - return new NettyInvoker(rpcTypeEnum); + public SmartSocketInvoker smartSocketInvoker(){ + return new SmartSocketInvoker(); } @Bean - public NettyServer nettyServer(){ - return new NettyServer(); + public SmartSocketServer smartSocketServer(){ + return new SmartSocketServer(); } } diff --git a/business-b/src/main/java/org/needcoke/b/controller/TestController.java b/business-b/src/main/java/org/needcoke/b/controller/TestController.java index 8e026e9..a11d9aa 100644 --- a/business-b/src/main/java/org/needcoke/b/controller/TestController.java +++ b/business-b/src/main/java/org/needcoke/b/controller/TestController.java @@ -40,9 +40,5 @@ public class TestController { @Resource private LoadBalance loadBalance; - @GetMapping("testPort") - public Integer testPort(){ - List instances = discoveryClient.getInstances("bussiness-a"); - return ConnectUtil.getCokeServerPort(loadBalance.choose("bussiness-a",instances)); - } + } diff --git a/business-b/src/main/resources/application.yml b/business-b/src/main/resources/application.yml index 380c943..91eedac 100644 --- a/business-b/src/main/resources/application.yml +++ b/business-b/src/main/resources/application.yml @@ -9,7 +9,8 @@ spring: discovery: metadata: coke-server-port: 13001 - rpcType: netty +# rpcType: netty + rpcType: smart socket #server-addr: http://192.168.*:8848 server-addr: http://127.0.0.1:8848 cluster-name: 严鸣是吕诗文爸爸 diff --git a/business-c/src/main/java/org/needcoke/c/controller/CController.java b/business-c/src/main/java/org/needcoke/c/controller/CController.java index d534fb6..68875f5 100644 --- a/business-c/src/main/java/org/needcoke/c/controller/CController.java +++ b/business-c/src/main/java/org/needcoke/c/controller/CController.java @@ -20,14 +20,24 @@ import java.util.Map; @Rpc public class CController { +// @Bean +// public NettyInvoker nettyInvoker(){ +// return new NettyInvoker(); +// } +// +// @Bean +// public NettyServer nettyServer(){ +// return new NettyServer(); +// } + @Bean - public NettyInvoker nettyInvoker(RpcTypeEnum rpcTypeEnum){ - return new NettyInvoker(rpcTypeEnum); + public SmartSocketInvoker smartSocketInvoker(){ + return new SmartSocketInvoker(); } @Bean - public NettyServer nettyServer(){ - return new NettyServer(); + public SmartSocketServer smartSocketServer(){ + return new SmartSocketServer(); } @Resource diff --git a/business-c/src/main/resources/application.yml b/business-c/src/main/resources/application.yml index 5b2f610..fd3c76b 100644 --- a/business-c/src/main/resources/application.yml +++ b/business-c/src/main/resources/application.yml @@ -8,8 +8,9 @@ spring: #注册中心 discovery: metadata: - coke-server-port: 13001 - rpcType: netty + coke-server-port: 13007 +# rpcType: netty + rpcType: smart socket #server-addr: http://192.168.*:8848 server-addr: http://127.0.0.1:8848 cluster-name: 严鸣是吕诗文爸爸 diff --git a/bussiness-a/src/main/java/org/needcoke/a/configuration/Config.java b/bussiness-a/src/main/java/org/needcoke/a/configuration/Config.java index be7c23d..108b772 100644 --- a/bussiness-a/src/main/java/org/needcoke/a/configuration/Config.java +++ b/bussiness-a/src/main/java/org/needcoke/a/configuration/Config.java @@ -3,7 +3,6 @@ package org.needcoke.a.configuration; import lombok.extern.slf4j.Slf4j; import org.needcoke.rpc.annotation.Call; import org.needcoke.rpc.annotation.Rpc; -import org.needcoke.rpc.common.enums.RpcTypeEnum; import org.needcoke.rpc.netty.invoker.NettyInvoker; import org.needcoke.rpc.netty.server.NettyServer; import org.needcoke.rpc.smartsocket.invoker.SmartSocketInvoker; @@ -34,13 +33,23 @@ public class Config { return "say : "+word; } +// @Bean +// public NettyInvoker nettyInvoker(){ +// return new NettyInvoker(); +// } +// +// @Bean +// public NettyServer nettyServer(){ +// return new NettyServer(); +// } + @Bean - public NettyInvoker nettyInvoker(RpcTypeEnum rpcTypeEnum){ - return new NettyInvoker(rpcTypeEnum); + public SmartSocketInvoker smartSocketInvoker(){ + return new SmartSocketInvoker(); } @Bean - public NettyServer nettyServer(){ - return new NettyServer(); + public SmartSocketServer smartSocketServer(){ + return new SmartSocketServer(); } } diff --git a/bussiness-a/src/main/resources/application.yml b/bussiness-a/src/main/resources/application.yml index 06fd744..eb281f4 100644 --- a/bussiness-a/src/main/resources/application.yml +++ b/bussiness-a/src/main/resources/application.yml @@ -8,8 +8,9 @@ spring: #注册中心 discovery: metadata: - coke-server-port: 13001 - rpcType: netty + coke-server-port: 13005 +# rpcType: netty + rpcType: smart socket #server-addr: http://192.168.*:8848 server-addr: http://127.0.0.1:8848 cluster-name: 严鸣是吕诗文爸爸 diff --git a/connect-core/pom.xml b/connect-core/pom.xml index 0f024d2..0d47aaa 100644 --- a/connect-core/pom.xml +++ b/connect-core/pom.xml @@ -81,6 +81,12 @@ connect-link-tracking abandon + + com.google.guava + guava + 31.0.1-jre + compile + diff --git a/connect-core/src/main/java/org/needcoke/rpc/config/FuseConfig.java b/connect-core/src/main/java/org/needcoke/rpc/config/FuseConfig.java new file mode 100644 index 0000000..008ddd9 --- /dev/null +++ b/connect-core/src/main/java/org/needcoke/rpc/config/FuseConfig.java @@ -0,0 +1,12 @@ +package org.needcoke.rpc.config; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class FuseConfig { + + @Value("${coke.fuse.timeout}") + private long fuseTimeOut; + +} diff --git a/connect-core/src/main/java/org/needcoke/rpc/config/ServerConfig.java b/connect-core/src/main/java/org/needcoke/rpc/config/ServerConfig.java index d56b78d..434a6c9 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/config/ServerConfig.java +++ b/connect-core/src/main/java/org/needcoke/rpc/config/ServerConfig.java @@ -32,8 +32,8 @@ public class ServerConfig { */ @ConditionalOnMissingBean(ConnectInvoker.class) @Bean - public OkHttpsInvoker okHttpsInvoker(RpcTypeEnum rpcTypeEnum){ - return new OkHttpsInvoker(rpcTypeEnum); + public OkHttpsInvoker okHttpsInvoker(){ + return new OkHttpsInvoker(); } /** diff --git a/connect-core/src/main/java/org/needcoke/rpc/controller/RpcController.java b/connect-core/src/main/java/org/needcoke/rpc/controller/RpcController.java index 10ea37d..363fe39 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/controller/RpcController.java +++ b/connect-core/src/main/java/org/needcoke/rpc/controller/RpcController.java @@ -59,28 +59,4 @@ public class RpcController { throw new CokeConnectException(ConnectionExceptionEnum.INVOKE_METHOD_ERROR); } } - - @GetMapping("port") - public Integer cokeServerPort() { - if (null == serverConfig) { - return 0; - } - try{ - applicationContext.getBean(OkHttpsInvoker.class); - }catch (Exception e){ - return serverConfig.getCokeServerPort(); - - } - return 0; - } - - @GetMapping("rpcType") - public RpcTypeEnum getRpcType(){ - try { - OkHttpsInvoker bean = applicationContext.getBean(OkHttpsInvoker.class); - }catch (Exception e){ - return RpcTypeEnum.smartSocket; - } - return RpcTypeEnum.okHttp3; - } } diff --git a/connect-core/src/main/java/org/needcoke/rpc/fuse/Fuse.java b/connect-core/src/main/java/org/needcoke/rpc/fuse/Fuse.java new file mode 100644 index 0000000..cef85cc --- /dev/null +++ b/connect-core/src/main/java/org/needcoke/rpc/fuse/Fuse.java @@ -0,0 +1,25 @@ +package org.needcoke.rpc.fuse; + +import java.util.concurrent.BlockingQueue; + +public class Fuse implements Runnable { + + private final BlockingQueue queue; + + public Fuse(BlockingQueue queue) { + this.queue = queue; + } + + @Override + public void run() { + FuseTask task = null; + try { + while (true) { + task = queue.take(); + task.execTask(); + FuseTask.taskCount.decrementAndGet(); + } + } catch (InterruptedException e) { + } + } +} diff --git a/connect-core/src/main/java/org/needcoke/rpc/fuse/FuseTask.java b/connect-core/src/main/java/org/needcoke/rpc/fuse/FuseTask.java new file mode 100644 index 0000000..bdb7f8f --- /dev/null +++ b/connect-core/src/main/java/org/needcoke/rpc/fuse/FuseTask.java @@ -0,0 +1,41 @@ +package org.needcoke.rpc.fuse; + +import java.util.concurrent.Delayed; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; + +public class FuseTask implements Delayed { + private static long currentTime = System.currentTimeMillis(); + protected final String taskName; + protected final int timeCost; + protected final long scheduleTime; + + protected static final AtomicInteger taskCount = new AtomicInteger(0); + + public FuseTask(String taskName, int timeCost) { + this.taskName = taskName; + this.timeCost = timeCost; + taskCount.incrementAndGet(); + currentTime += 1000 + (long) (Math.random() * 1000); + scheduleTime = currentTime; + } + @Override + public long getDelay(TimeUnit unit) { + long expirationTime = scheduleTime - System.currentTimeMillis(); + return unit.convert(expirationTime, TimeUnit.MILLISECONDS); + } + + @Override + public int compareTo(Delayed o) { + return (int) (this.scheduleTime - ((FuseTask) o).scheduleTime); + } + + public void execTask() { + long startTime = System.currentTimeMillis(); + try { + Thread.sleep(timeCost); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } +} diff --git a/connect-core/src/main/java/org/needcoke/rpc/fuse/FuseThreadPool.java b/connect-core/src/main/java/org/needcoke/rpc/fuse/FuseThreadPool.java new file mode 100644 index 0000000..3dfa3ab --- /dev/null +++ b/connect-core/src/main/java/org/needcoke/rpc/fuse/FuseThreadPool.java @@ -0,0 +1,72 @@ +package org.needcoke.rpc.fuse; + + +import com.google.common.util.concurrent.ThreadFactoryBuilder; +import org.springframework.stereotype.Component; + +import java.util.concurrent.*; + +@Component +public class FuseThreadPool { + + /** + * 自定义线程名称,方便的出错的时候溯源 + */ + private ThreadFactory namedThreadFactory = new ThreadFactoryBuilder().setNameFormat("coke-connect-Fuse-pool-%d").build(); + + + private int iocCoreThreadPoolSize = 2; + + + private int iocMaximumPoolSize = 4; + + + private long iocKeepAliveTime = 2000; + + + private int iocPoolCapacity = 9999; + + + /** + * corePoolSize 线程池核心池的大小 + * maximumPoolSize 线程池中允许的最大线程数量 + * keepAliveTime 当线程数大于核心时,此为终止前多余的空闲线程等待新任务的最长时间 + * unit keepAliveTime 的时间单位 + * workQueue 用来储存等待执行任务的队列 + * threadFactory 创建线程的工厂类 + * handler 拒绝策略类,当线程池数量达到上线并且workQueue队列长度达到上限时就需要对到来的任务做拒绝处理 + */ + private ExecutorService service = new ThreadPoolExecutor( + iocCoreThreadPoolSize, + iocMaximumPoolSize, + iocKeepAliveTime, + TimeUnit.MILLISECONDS, + new ArrayBlockingQueue<>(iocPoolCapacity), + namedThreadFactory, + new ThreadPoolExecutor.AbortPolicy() + ); + + /** + * 获取线程池 + * @return 线程池 + */ + public ExecutorService getExecutorService() { + return service; + } + + /** + * 使用线程池创建线程并异步执行任务 + * @param r 任务 + */ + public void newTask(Runnable r) { + service.execute(r); + } + + /** + * 使用线程池创建线程并异步执行任务 + * @param r 任务 + */ + public Future newTask(Callable r){ + return service.submit(r); + } +} diff --git a/connect-core/src/main/java/org/needcoke/rpc/invoker/ConnectInvoker.java b/connect-core/src/main/java/org/needcoke/rpc/invoker/ConnectInvoker.java index 6af5477..01a827c 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/invoker/ConnectInvoker.java +++ b/connect-core/src/main/java/org/needcoke/rpc/invoker/ConnectInvoker.java @@ -1,14 +1,9 @@ package org.needcoke.rpc.invoker; import com.alibaba.fastjson.JSONObject; -import com.ejlchina.okhttps.HTTP; import com.ejlchina.okhttps.HttpResult; -import com.ejlchina.okhttps.SHttpTask; -import com.ejlchina.okhttps.jackson.JacksonMsgConvertor; import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.needcoke.rpc.common.constant.ConnectConstant; -import org.needcoke.rpc.common.enums.HttpContentTypeEnum; import org.needcoke.rpc.common.enums.RpcTypeEnum; import org.needcoke.rpc.net.Connector; import org.springframework.cloud.client.ServiceInstance; @@ -19,12 +14,6 @@ import java.util.Map; @NoArgsConstructor public abstract class ConnectInvoker { - private RpcTypeEnum rpcTypeEnum; - - public ConnectInvoker(RpcTypeEnum rpcTypeEnum) { - this.rpcTypeEnum = rpcTypeEnum; - } - public abstract InvokeResult execute(Connector connector, ServiceInstance instance, String beanName, String methodName, Map params); @@ -41,20 +30,14 @@ public abstract class ConnectInvoker { " , params = " + JSONObject.toJSONString(params); log.debug(builder); } - - private final Map remoteRpcTypeMap = new HashMap<>(); - - public RpcTypeEnum getRemoteRpcType(ServiceInstance instance) { - if (remoteRpcTypeMap.containsKey(instance)) { - return remoteRpcTypeMap.get(instance); + protected InvokeResult runDefaultExecute(Connector connector, ServiceInstance instance, String beanName, String methodName, Map params){ + RpcTypeEnum remoteRpcType = connector.getRpcType(instance); + if(remoteRpcType == RpcTypeEnum.okHttp3){ + if (null == connector.getHttpInvoker()) { + connector.setHttpInvoker(new OkHttpsInvoker()); + } + return connector.compensationExecute(instance,beanName,methodName,params); } - SHttpTask sHttpTask = HTTP.builder().addMsgConvertor(new JacksonMsgConvertor()).build() - .sync(instance.getUri() + ConnectConstant.COKE_RPC_TYPE_RELATIVE_PATH) - .bodyType(HttpContentTypeEnum.JSON.getValue()); - HttpResult result = sHttpTask - .get(); - RpcTypeEnum rpcTypeEnum = result.getBody().toBean(RpcTypeEnum.class); - remoteRpcTypeMap.put(instance, rpcTypeEnum); - return rpcTypeEnum; + return null; } } diff --git a/connect-core/src/main/java/org/needcoke/rpc/invoker/OkHttpsInvoker.java b/connect-core/src/main/java/org/needcoke/rpc/invoker/OkHttpsInvoker.java index c384c08..b1b5db6 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/invoker/OkHttpsInvoker.java +++ b/connect-core/src/main/java/org/needcoke/rpc/invoker/OkHttpsInvoker.java @@ -25,11 +25,6 @@ import java.util.Map; @NoArgsConstructor public class OkHttpsInvoker extends ConnectInvoker { - - public OkHttpsInvoker(RpcTypeEnum rpcTypeEnum) { - rpcTypeEnum = RpcTypeEnum.okHttp3; - } - @Override public InvokeResult execute(Connector connector, ServiceInstance instance, String beanName, String methodName, Map params) { RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes(); diff --git a/connect-core/src/main/java/org/needcoke/rpc/net/Connector.java b/connect-core/src/main/java/org/needcoke/rpc/net/Connector.java index c92cc5e..5042b02 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/net/Connector.java +++ b/connect-core/src/main/java/org/needcoke/rpc/net/Connector.java @@ -48,10 +48,6 @@ public class Connector { this.severPortMap = new HashMap<>(); } - public Map getRequestTypeMap() { - return requestTypeMap; - } - /** * 执行远程方法 * @@ -69,8 +65,9 @@ public class Connector { if (CollUtil.isNotEmpty(metadata)) { String rpcType = metadata.get("rpcType"); String cokeServerPort = metadata.get("coke-server-port"); + RpcTypeEnum rp = RpcTypeEnum.okHttp3; if (null != rpcType) { - RpcTypeEnum rp = RpcTypeEnum.okHttp3; + switch (rpcType) { case "netty": rp = RpcTypeEnum.netty; @@ -89,13 +86,13 @@ public class Connector { default: rp = RpcTypeEnum.okHttp3; } - this.requestTypeMap.put(instance,rp); - try { - int port = Integer.parseInt(cokeServerPort); - this.severPortMap.put(instance,port); - }catch (Exception e){ - throw new CokeConnectException(ConnectionExceptionEnum.THE_FORMAT_OF_THE_REMOTE_SERVICE_PORT_NUMBER_IS_INCORRECT_PLEASE_CHECK_THE_CONFIGURATION_OF_THE_REMOTE_SERVICE_PORT_NUMBER); - } + } + this.requestTypeMap.put(instance,rp); + try { + int port = Integer.parseInt(cokeServerPort); + this.severPortMap.put(instance,port); + }catch (Exception e){ + throw new CokeConnectException(ConnectionExceptionEnum.THE_FORMAT_OF_THE_REMOTE_SERVICE_PORT_NUMBER_IS_INCORRECT_PLEASE_CHECK_THE_CONFIGURATION_OF_THE_REMOTE_SERVICE_PORT_NUMBER); } } } diff --git a/connect-core/src/main/java/org/needcoke/rpc/utils/ConnectUtil.java b/connect-core/src/main/java/org/needcoke/rpc/utils/ConnectUtil.java index e99e9b1..bf7ad2b 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/utils/ConnectUtil.java +++ b/connect-core/src/main/java/org/needcoke/rpc/utils/ConnectUtil.java @@ -107,14 +107,4 @@ public class ConnectUtil { InvokeResult result = connectInvoker.execute(null,instance, beanName, methodName, params); return result; } - - - public static Integer getCokeServerPort(ServiceInstance instance){ - SHttpTask sHttpTask = HTTP.builder().addMsgConvertor(new JacksonMsgConvertor()).build() - .sync(instance.getUri() + ConnectConstant.COKE_PORT_RELATIVE_PATH) - .bodyType(HttpContentTypeEnum.JSON.getValue()); - HttpResult result = sHttpTask - .get(); - return result.getBody().toBean(Integer.class); - } } diff --git a/connect-server-netty/src/main/java/org/needcoke/rpc/netty/invoker/NettyInvoker.java b/connect-server-netty/src/main/java/org/needcoke/rpc/netty/invoker/NettyInvoker.java index 2fecb1d..6f471ec 100644 --- a/connect-server-netty/src/main/java/org/needcoke/rpc/netty/invoker/NettyInvoker.java +++ b/connect-server-netty/src/main/java/org/needcoke/rpc/netty/invoker/NettyInvoker.java @@ -26,10 +26,6 @@ import java.util.concurrent.locks.LockSupport; @NoArgsConstructor public class NettyInvoker extends ConnectInvoker { - public NettyInvoker(RpcTypeEnum rpcTypeEnum) { - super(rpcTypeEnum); - } - private final Map clientMap = new ConcurrentHashMap<>(); private final Map channelMap = new ConcurrentHashMap<>(); @@ -40,7 +36,7 @@ public class NettyInvoker extends ConnectInvoker { return res; } String uri = instance.getHost() + ConnectConstant.COLON + instance.getPort(); - Integer serverPort = ConnectUtil.getCokeServerPort(instance); + Integer serverPort = connector.getServerPort(instance); if (0 == serverPort) { throw new CokeConnectException(ConnectionExceptionEnum.REMOTE_SERVICE_DOES_NOT_OPEN_THE_COKE_SERVICE_PORT); } @@ -69,7 +65,7 @@ public class NettyInvoker extends ConnectInvoker { channel = clientMap.get(uri).start(); } catch (InterruptedException ex) { if (null == connector.getHttpInvoker()) { - connector.setHttpInvoker(new OkHttpsInvoker(RpcTypeEnum.okHttp3)); + connector.setHttpInvoker(new OkHttpsInvoker()); } return connector.compensationExecute(instance,beanName,methodName,params); } diff --git a/connect-server-smart-socket/src/main/java/org/needcoke/rpc/smartsocket/invoker/SmartSocketInvoker.java b/connect-server-smart-socket/src/main/java/org/needcoke/rpc/smartsocket/invoker/SmartSocketInvoker.java index 5b5e8d2..a213ac0 100644 --- a/connect-server-smart-socket/src/main/java/org/needcoke/rpc/smartsocket/invoker/SmartSocketInvoker.java +++ b/connect-server-smart-socket/src/main/java/org/needcoke/rpc/smartsocket/invoker/SmartSocketInvoker.java @@ -36,12 +36,6 @@ public class SmartSocketInvoker extends ConnectInvoker { private final Map sessionMap = new ConcurrentHashMap<>(); - public SmartSocketInvoker(RpcTypeEnum rpcTypeEnum) { - super(rpcTypeEnum); - } - - - @Override public InvokeResult execute(Connector connector, ServiceInstance instance, String beanName, String methodName, Map params) { InvokeResult res = runDefaultExecute(connector, instance, beanName, methodName, params); @@ -49,7 +43,7 @@ public class SmartSocketInvoker extends ConnectInvoker { return res; } String uri = instance.getHost() + ConnectConstant.COLON + instance.getPort(); - Integer serverPort = ConnectUtil.getCokeServerPort(instance); + Integer serverPort = connector.getServerPort(instance); if (0 == serverPort) { throw new CokeConnectException(ConnectionExceptionEnum.REMOTE_SERVICE_DOES_NOT_OPEN_THE_COKE_SERVICE_PORT); } @@ -80,7 +74,7 @@ public class SmartSocketInvoker extends ConnectInvoker { session = clientMap.get(uri).start(); } catch (IOException ex) { if (null == connector.getHttpInvoker()) { - connector.setHttpInvoker(new OkHttpsInvoker(RpcTypeEnum.okHttp3)); + connector.setHttpInvoker(new OkHttpsInvoker()); } return connector.compensationExecute(instance,beanName,methodName,params); } -- Gitee From 125dedbe6265c51f39b37f347fb0ef4a0974961b Mon Sep 17 00:00:00 2001 From: warren <2410818122@qq.com> Date: Wed, 22 Jun 2022 23:24:32 +0800 Subject: [PATCH 11/22] =?UTF-8?q?Fuse=E7=86=94=E6=96=AD=E5=99=A8=E5=BC=80?= =?UTF-8?q?=E7=AF=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/CokeHandlerInterceptorAdapter.java | 8 ++- .../org/needcoke/rpc/config/FuseConfig.java | 25 ++++++- .../rpc/controller/RpcController.java | 2 - .../main/java/org/needcoke/rpc/fuse/Fuse.java | 16 ++--- .../java/org/needcoke/rpc/fuse/FuseTask.java | 68 ++++++++++++------- .../org/needcoke/rpc/fuse/FuseThreadPool.java | 24 +++---- .../needcoke/rpc/invoker/ConnectInvoker.java | 30 +++++++- .../needcoke/rpc/invoker/OkHttpsInvoker.java | 11 ++- .../needcoke/rpc/loadBalance/LoadBalance.java | 2 - .../java/org/needcoke/rpc/net/Connector.java | 1 - .../needcoke/rpc/net/ConnectorFactory.java | 3 + .../rpc/netty/invoker/NettyInvoker.java | 3 + .../processor/ReadMessageClientProcessor.java | 4 +- .../server/NettyServerHandlerAdapter.java | 1 + .../invoker/SmartSocketInvoker.java | 2 + .../SmartSocketMessageProcessor.java | 3 + 16 files changed, 146 insertions(+), 57 deletions(-) diff --git a/connect-core/src/main/java/org/needcoke/rpc/config/CokeHandlerInterceptorAdapter.java b/connect-core/src/main/java/org/needcoke/rpc/config/CokeHandlerInterceptorAdapter.java index 167b208..65ea0d8 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/config/CokeHandlerInterceptorAdapter.java +++ b/connect-core/src/main/java/org/needcoke/rpc/config/CokeHandlerInterceptorAdapter.java @@ -22,9 +22,15 @@ public class CokeHandlerInterceptorAdapter implements HandlerInterceptor { TrackingUtil.preHttp(request,response,handler,port); LinkTracking linkTracking = LinkTrackingContextHolder.getLinkTracking(); if(request instanceof RequestFacade){ - String requestURI = ((RequestFacade) request).getRequestURI(); + String requestURI = request.getRequestURI(); linkTracking.addMataData("http path",requestURI); } return true; } + + @Override + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { + LinkTrackingContextHolder.clear(); + HandlerInterceptor.super.afterCompletion(request, response, handler, ex); + } } diff --git a/connect-core/src/main/java/org/needcoke/rpc/config/FuseConfig.java b/connect-core/src/main/java/org/needcoke/rpc/config/FuseConfig.java index 008ddd9..871a81e 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/config/FuseConfig.java +++ b/connect-core/src/main/java/org/needcoke/rpc/config/FuseConfig.java @@ -1,12 +1,35 @@ package org.needcoke.rpc.config; +import lombok.Getter; +import org.needcoke.rpc.fuse.FuseTask; import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import java.util.concurrent.DelayQueue; + +@Getter @Configuration public class FuseConfig { - @Value("${coke.fuse.timeout}") + @Value("${coke.fuse.timeout:2000}") private long fuseTimeOut; + @Value("${coke.fuse.pool.coreThreadPoolSize:2}") + private int coreThreadPoolSize; + + @Value("${coke.fuse.pool.maximumPoolSize:4}") + private int maximumPoolSize; + + @Value("${coke.fuse.pool.keepAliveTime:2000}") + private long keepAliveTime; + + @Value("${coke.fuse.pool.poolCapacity:9999}") + private int poolCapacity; + + @Bean + public DelayQueue fuseTaskDelayQueue(){ + return new DelayQueue<>(); + } + } diff --git a/connect-core/src/main/java/org/needcoke/rpc/controller/RpcController.java b/connect-core/src/main/java/org/needcoke/rpc/controller/RpcController.java index 363fe39..b066603 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/controller/RpcController.java +++ b/connect-core/src/main/java/org/needcoke/rpc/controller/RpcController.java @@ -6,10 +6,8 @@ import lombok.extern.slf4j.Slf4j; import org.connect.rpc.link.tracking.util.TrackingUtil; import org.needcoke.rpc.common.constant.ConnectConstant; import org.needcoke.rpc.common.enums.ConnectionExceptionEnum; -import org.needcoke.rpc.common.enums.RpcTypeEnum; import org.needcoke.rpc.common.exception.CokeConnectException; import org.needcoke.rpc.config.ServerConfig; -import org.needcoke.rpc.invoker.OkHttpsInvoker; import org.needcoke.rpc.utils.SpringContextUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; diff --git a/connect-core/src/main/java/org/needcoke/rpc/fuse/Fuse.java b/connect-core/src/main/java/org/needcoke/rpc/fuse/Fuse.java index cef85cc..88cfc27 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/fuse/Fuse.java +++ b/connect-core/src/main/java/org/needcoke/rpc/fuse/Fuse.java @@ -1,23 +1,23 @@ package org.needcoke.rpc.fuse; -import java.util.concurrent.BlockingQueue; +import java.util.concurrent.DelayQueue; +import java.util.concurrent.locks.LockSupport; public class Fuse implements Runnable { - private final BlockingQueue queue; + private final DelayQueue queue; - public Fuse(BlockingQueue queue) { + public Fuse(DelayQueue queue) { this.queue = queue; } @Override public void run() { - FuseTask task = null; try { - while (true) { - task = queue.take(); - task.execTask(); - FuseTask.taskCount.decrementAndGet(); + FuseTask fuseTask = queue.take(); + Thread thread = fuseTask.getThread(); + if(!thread.getState().equals(Thread.State.WAITING)) { + LockSupport.unpark(thread); } } catch (InterruptedException e) { } diff --git a/connect-core/src/main/java/org/needcoke/rpc/fuse/FuseTask.java b/connect-core/src/main/java/org/needcoke/rpc/fuse/FuseTask.java index bdb7f8f..db11171 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/fuse/FuseTask.java +++ b/connect-core/src/main/java/org/needcoke/rpc/fuse/FuseTask.java @@ -1,41 +1,59 @@ package org.needcoke.rpc.fuse; +import lombok.Getter; + import java.util.concurrent.Delayed; import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicInteger; +/** + * 熔断任务实体 + * + * @author Gilgamesh + * @since abandon + */ +@Getter public class FuseTask implements Delayed { - private static long currentTime = System.currentTimeMillis(); - protected final String taskName; - protected final int timeCost; - protected final long scheduleTime; - - protected static final AtomicInteger taskCount = new AtomicInteger(0); - - public FuseTask(String taskName, int timeCost) { - this.taskName = taskName; - this.timeCost = timeCost; - taskCount.incrementAndGet(); - currentTime += 1000 + (long) (Math.random() * 1000); - scheduleTime = currentTime; + + /* by warren: 请求id */ + private Long requestId; + + /* by warren: 需要释放的线程 */ + + private Thread thread; + + /* by warren: 数据失效时间点 */ + private long time; + + public FuseTask(String requestId, Thread thread,long time) { + this.requestId = Long.parseLong(requestId); + this.thread = thread; + this.time = System.currentTimeMillis()+time; } + @Override public long getDelay(TimeUnit unit) { - long expirationTime = scheduleTime - System.currentTimeMillis(); - return unit.convert(expirationTime, TimeUnit.MILLISECONDS); + return unit.convert(this.time - System.currentTimeMillis(), TimeUnit.NANOSECONDS); } @Override public int compareTo(Delayed o) { - return (int) (this.scheduleTime - ((FuseTask) o).scheduleTime); - } - - public void execTask() { - long startTime = System.currentTimeMillis(); - try { - Thread.sleep(timeCost); - } catch (InterruptedException e) { - e.printStackTrace(); + if (o == this) // compare zero if same object + return 0; + if (o instanceof FuseTask) { + FuseTask x = (FuseTask) o; + // 优先比较失效时间 + long diff = this.time - x.time; + if (diff < 0) + return -1; + else if (diff > 0) + return 1; + else if (this.requestId < x.requestId) // 剩余时间相同则比较序号 + return -1; + else + return 1; } + // 一般不会执行到此处,除非元素不是MessageData类型 + long diff = this.getDelay(TimeUnit.NANOSECONDS) - o.getDelay(TimeUnit.NANOSECONDS); + return (diff < 0) ? -1 : (diff > 0) ? 1 : 0; } } diff --git a/connect-core/src/main/java/org/needcoke/rpc/fuse/FuseThreadPool.java b/connect-core/src/main/java/org/needcoke/rpc/fuse/FuseThreadPool.java index 3dfa3ab..096612c 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/fuse/FuseThreadPool.java +++ b/connect-core/src/main/java/org/needcoke/rpc/fuse/FuseThreadPool.java @@ -2,29 +2,25 @@ package org.needcoke.rpc.fuse; import com.google.common.util.concurrent.ThreadFactoryBuilder; +import org.needcoke.rpc.config.FuseConfig; import org.springframework.stereotype.Component; +import javax.annotation.Resource; import java.util.concurrent.*; @Component public class FuseThreadPool { + @Resource + private FuseConfig fuseConfig; + /** * 自定义线程名称,方便的出错的时候溯源 */ - private ThreadFactory namedThreadFactory = new ThreadFactoryBuilder().setNameFormat("coke-connect-Fuse-pool-%d").build(); - - - private int iocCoreThreadPoolSize = 2; - - - private int iocMaximumPoolSize = 4; - + private final ThreadFactory namedThreadFactory = new ThreadFactoryBuilder().setNameFormat("coke-connect-Fuse-pool-%d").build(); - private long iocKeepAliveTime = 2000; - private int iocPoolCapacity = 9999; /** @@ -37,11 +33,11 @@ public class FuseThreadPool { * handler 拒绝策略类,当线程池数量达到上线并且workQueue队列长度达到上限时就需要对到来的任务做拒绝处理 */ private ExecutorService service = new ThreadPoolExecutor( - iocCoreThreadPoolSize, - iocMaximumPoolSize, - iocKeepAliveTime, + fuseConfig.getCoreThreadPoolSize(), + fuseConfig.getMaximumPoolSize(), + fuseConfig.getKeepAliveTime(), TimeUnit.MILLISECONDS, - new ArrayBlockingQueue<>(iocPoolCapacity), + new ArrayBlockingQueue<>(fuseConfig.getPoolCapacity()), namedThreadFactory, new ThreadPoolExecutor.AbortPolicy() ); diff --git a/connect-core/src/main/java/org/needcoke/rpc/invoker/ConnectInvoker.java b/connect-core/src/main/java/org/needcoke/rpc/invoker/ConnectInvoker.java index 01a827c..2367fec 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/invoker/ConnectInvoker.java +++ b/connect-core/src/main/java/org/needcoke/rpc/invoker/ConnectInvoker.java @@ -4,16 +4,34 @@ import com.alibaba.fastjson.JSONObject; import com.ejlchina.okhttps.HttpResult; import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.connect.rpc.link.tracking.util.TrackingUtil; import org.needcoke.rpc.common.enums.RpcTypeEnum; +import org.needcoke.rpc.config.FuseConfig; +import org.needcoke.rpc.fuse.Fuse; +import org.needcoke.rpc.fuse.FuseTask; +import org.needcoke.rpc.fuse.FuseThreadPool; import org.needcoke.rpc.net.Connector; +import org.needcoke.rpc.utils.SpringContextUtils; import org.springframework.cloud.client.ServiceInstance; import java.util.HashMap; import java.util.Map; +import java.util.concurrent.DelayQueue; @Slf4j -@NoArgsConstructor public abstract class ConnectInvoker { + private DelayQueue fuseTaskDelayQueue; + + private FuseConfig fuseConfig; + + private FuseThreadPool fuseThreadPool; + + public ConnectInvoker() { + this.fuseTaskDelayQueue = SpringContextUtils.getBean("fuseTaskDelayQueue"); + this.fuseConfig = SpringContextUtils.getBean("fuseConfig"); + this.fuseThreadPool = SpringContextUtils.getBean("fuseThreadPool"); + } + public abstract InvokeResult execute(Connector connector, ServiceInstance instance, String beanName, String methodName, Map params); @@ -40,4 +58,14 @@ public abstract class ConnectInvoker { } return null; } + + protected void fuse(){ + fuseTaskDelayQueue.put( + new FuseTask(TrackingUtil.getRequestId(), + Thread.currentThread(), + fuseConfig.getFuseTimeOut() + ) + ); + fuseThreadPool.newTask(new Fuse(fuseTaskDelayQueue)); + } } diff --git a/connect-core/src/main/java/org/needcoke/rpc/invoker/OkHttpsInvoker.java b/connect-core/src/main/java/org/needcoke/rpc/invoker/OkHttpsInvoker.java index b1b5db6..84051f7 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/invoker/OkHttpsInvoker.java +++ b/connect-core/src/main/java/org/needcoke/rpc/invoker/OkHttpsInvoker.java @@ -5,11 +5,19 @@ import com.ejlchina.okhttps.HttpResult; import com.ejlchina.okhttps.SHttpTask; import com.ejlchina.okhttps.jackson.JacksonMsgConvertor; import lombok.NoArgsConstructor; +import org.connect.rpc.link.tracking.config.LinkTrackingContextHolder; import org.connect.rpc.link.tracking.util.TrackingUtil; import org.needcoke.rpc.common.constant.ConnectConstant; import org.needcoke.rpc.common.enums.HttpContentTypeEnum; import org.needcoke.rpc.common.enums.RpcTypeEnum; +import org.needcoke.rpc.config.FuseConfig; +import org.needcoke.rpc.fuse.Fuse; +import org.needcoke.rpc.fuse.FuseTask; +import org.needcoke.rpc.fuse.FuseThreadPool; import org.needcoke.rpc.net.Connector; +import org.needcoke.rpc.utils.SpringContextUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.cloud.client.ServiceInstance; import org.springframework.web.context.request.RequestAttributes; import org.springframework.web.context.request.RequestContextHolder; @@ -18,11 +26,11 @@ import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; import java.util.Enumeration; import java.util.Map; +import java.util.concurrent.DelayQueue; /** * 采用okHttps的跨服务调用器 */ -@NoArgsConstructor public class OkHttpsInvoker extends ConnectInvoker { @Override @@ -42,6 +50,7 @@ public class OkHttpsInvoker extends ConnectInvoker { String header = request.getHeader(nextElement); sHttpTask.addHeader(nextElement, header); } + fuse(); HttpResult result = sHttpTask .post(); handleResult(instance.getServiceId(), beanName, methodName, params, result); diff --git a/connect-core/src/main/java/org/needcoke/rpc/loadBalance/LoadBalance.java b/connect-core/src/main/java/org/needcoke/rpc/loadBalance/LoadBalance.java index 6d29ab3..7660a16 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/loadBalance/LoadBalance.java +++ b/connect-core/src/main/java/org/needcoke/rpc/loadBalance/LoadBalance.java @@ -15,8 +15,6 @@ public abstract class LoadBalance { /** * 从实例列表选择一个远程服务 - *

- * TODO 扩展负载均衡策略 * * @param instances 从注册中心获取的实例列表 * @return 某一个特定的实例 diff --git a/connect-core/src/main/java/org/needcoke/rpc/net/Connector.java b/connect-core/src/main/java/org/needcoke/rpc/net/Connector.java index 5042b02..4e951a6 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/net/Connector.java +++ b/connect-core/src/main/java/org/needcoke/rpc/net/Connector.java @@ -13,7 +13,6 @@ import org.springframework.cloud.client.discovery.DiscoveryClient; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; public class Connector { diff --git a/connect-core/src/main/java/org/needcoke/rpc/net/ConnectorFactory.java b/connect-core/src/main/java/org/needcoke/rpc/net/ConnectorFactory.java index 0cc0d55..f141d6d 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/net/ConnectorFactory.java +++ b/connect-core/src/main/java/org/needcoke/rpc/net/ConnectorFactory.java @@ -1,12 +1,15 @@ package org.needcoke.rpc.net; +import org.needcoke.rpc.fuse.FuseTask; import org.needcoke.rpc.invoker.ConnectInvoker; import org.needcoke.rpc.loadBalance.LoadBalance; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.stereotype.Component; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.DelayQueue; @Component public class ConnectorFactory { diff --git a/connect-server-netty/src/main/java/org/needcoke/rpc/netty/invoker/NettyInvoker.java b/connect-server-netty/src/main/java/org/needcoke/rpc/netty/invoker/NettyInvoker.java index 6f471ec..84c9814 100644 --- a/connect-server-netty/src/main/java/org/needcoke/rpc/netty/invoker/NettyInvoker.java +++ b/connect-server-netty/src/main/java/org/needcoke/rpc/netty/invoker/NettyInvoker.java @@ -4,6 +4,7 @@ import cn.hutool.core.date.DateUtil; import io.netty.channel.Channel; import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.connect.rpc.link.tracking.config.LinkTrackingContextHolder; import org.connect.rpc.link.tracking.util.TrackingUtil; import org.needcoke.rpc.codec.CokeRequest; import org.needcoke.rpc.common.constant.ConnectConstant; @@ -76,8 +77,10 @@ public class NettyInvoker extends ConnectInvoker { long start = DateUtil.current(); ConnectUtil.putRequestMap(tmp); ConnectUtil.putThreadMap(TrackingUtil.getRequestId(), Thread.currentThread()); + fuse(); LockSupport.park(); InvokeResult result = ConnectUtil.getFromRequestMap(TrackingUtil.getRequestId()); + LinkTrackingContextHolder.clear(); long end = DateUtil.current(); log.info("requestId = {} , start = {} , end = {} ,cost = {}", TrackingUtil.getRequestId(), start, end, end - start); result.setTime(end - start); diff --git a/connect-server-netty/src/main/java/org/needcoke/rpc/netty/processor/ReadMessageClientProcessor.java b/connect-server-netty/src/main/java/org/needcoke/rpc/netty/processor/ReadMessageClientProcessor.java index 96bc3f3..89a6088 100644 --- a/connect-server-netty/src/main/java/org/needcoke/rpc/netty/processor/ReadMessageClientProcessor.java +++ b/connect-server-netty/src/main/java/org/needcoke/rpc/netty/processor/ReadMessageClientProcessor.java @@ -18,7 +18,9 @@ public class ReadMessageClientProcessor implements ReadMessageProcessor{ TrackingUtil.linkTrackingJsonStr(), new String(request.toBytes())); ConnectUtil.putRequestMap(request.getCokeRequestId(), request.getResult()); Thread thread = ConnectUtil.getFromThreadMap(request.getCokeRequestId()); - LockSupport.unpark(thread); + if(thread.getState().equals(Thread.State.WAITING)) { + LockSupport.unpark(thread); + } } } } diff --git a/connect-server-netty/src/main/java/org/needcoke/rpc/netty/server/NettyServerHandlerAdapter.java b/connect-server-netty/src/main/java/org/needcoke/rpc/netty/server/NettyServerHandlerAdapter.java index d790834..fb22346 100644 --- a/connect-server-netty/src/main/java/org/needcoke/rpc/netty/server/NettyServerHandlerAdapter.java +++ b/connect-server-netty/src/main/java/org/needcoke/rpc/netty/server/NettyServerHandlerAdapter.java @@ -37,5 +37,6 @@ public class NettyServerHandlerAdapter extends ChannelInboundHandlerAdapter { LinkTrackingContextHolder.setLinkTracking(linkTracking); } readMessageProcessor.channelRead(ctx,request); + LinkTrackingContextHolder.clear(); } } diff --git a/connect-server-smart-socket/src/main/java/org/needcoke/rpc/smartsocket/invoker/SmartSocketInvoker.java b/connect-server-smart-socket/src/main/java/org/needcoke/rpc/smartsocket/invoker/SmartSocketInvoker.java index a213ac0..80d4af6 100644 --- a/connect-server-smart-socket/src/main/java/org/needcoke/rpc/smartsocket/invoker/SmartSocketInvoker.java +++ b/connect-server-smart-socket/src/main/java/org/needcoke/rpc/smartsocket/invoker/SmartSocketInvoker.java @@ -3,6 +3,7 @@ package org.needcoke.rpc.smartsocket.invoker; import cn.hutool.core.date.DateUtil; import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.connect.rpc.link.tracking.config.LinkTrackingContextHolder; import org.connect.rpc.link.tracking.util.TrackingUtil; import org.needcoke.rpc.codec.CokeRequest; import org.needcoke.rpc.smartsocket.codec.CokeRequestProtocol; @@ -87,6 +88,7 @@ public class SmartSocketInvoker extends ConnectInvoker { ConnectUtil.putThreadMap(TrackingUtil.getRequestId(), Thread.currentThread()); LockSupport.park(); InvokeResult result = ConnectUtil.getFromRequestMap(TrackingUtil.getRequestId()); + LinkTrackingContextHolder.clear(); long end = DateUtil.current(); log.info("requestId = {} , start = {} , end = {} ,cost = {}", TrackingUtil.getRequestId(), start, end, end - start); result.setTime(end - start); diff --git a/connect-server-smart-socket/src/main/java/org/needcoke/rpc/smartsocket/processor/SmartSocketMessageProcessor.java b/connect-server-smart-socket/src/main/java/org/needcoke/rpc/smartsocket/processor/SmartSocketMessageProcessor.java index d86783c..9701787 100644 --- a/connect-server-smart-socket/src/main/java/org/needcoke/rpc/smartsocket/processor/SmartSocketMessageProcessor.java +++ b/connect-server-smart-socket/src/main/java/org/needcoke/rpc/smartsocket/processor/SmartSocketMessageProcessor.java @@ -1,5 +1,6 @@ package org.needcoke.rpc.smartsocket.processor; +import org.connect.rpc.link.tracking.config.LinkTrackingContextHolder; import org.needcoke.rpc.codec.CokeRequest; import org.needcoke.rpc.invoker.InvokeResult; import org.smartboot.socket.MessageProcessor; @@ -21,6 +22,7 @@ public abstract class SmartSocketMessageProcessor implements MessageProcessor throw new RuntimeException(e); // TODO 未来需要处理返回失败的场景 } + LinkTrackingContextHolder.clear(); } public void response(AioSession session, CokeRequest response){ @@ -33,6 +35,7 @@ public abstract class SmartSocketMessageProcessor implements MessageProcessor } catch (IOException e) { e.printStackTrace(); } + LinkTrackingContextHolder.clear(); } } -- Gitee From 6ab64b6a4675d067544699dcad8044f7ee239736 Mon Sep 17 00:00:00 2001 From: warren <2410818122@qq.com> Date: Wed, 22 Jun 2022 23:49:12 +0800 Subject: [PATCH 12/22] =?UTF-8?q?Fuse=E7=86=94=E6=96=AD=E5=99=A8=E5=BC=80?= =?UTF-8?q?=E7=AF=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business-b/src/main/resources/application.yml | 2 +- .../org/needcoke/rpc/config/FuseConfig.java | 1 + .../org/needcoke/rpc/config/ServerConfig.java | 17 ++++++------ .../org/needcoke/rpc/fuse/FuseThreadPool.java | 26 ++++++++++++------- .../needcoke/rpc/invoker/ConnectInvoker.java | 15 ++++++----- .../needcoke/rpc/net/ConnectorFactory.java | 2 ++ .../org/needcoke/rpc/utils/ConnectUtil.java | 1 + .../rpc/utils/SpringContextUtils.java | 1 - 8 files changed, 40 insertions(+), 25 deletions(-) diff --git a/business-b/src/main/resources/application.yml b/business-b/src/main/resources/application.yml index 47bf85a..bd2596f 100644 --- a/business-b/src/main/resources/application.yml +++ b/business-b/src/main/resources/application.yml @@ -12,7 +12,7 @@ spring: # rpcType: netty rpcType: smart socket #server-addr: http://192.168.*:8848 - server-addr: http://192.168.0.109:8848 + server-addr: http://127.0.0.1:8848 cluster-name: 严鸣是吕诗文爸爸 group: 相亲相爱一家人 server: diff --git a/connect-core/src/main/java/org/needcoke/rpc/config/FuseConfig.java b/connect-core/src/main/java/org/needcoke/rpc/config/FuseConfig.java index 871a81e..e04d8f8 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/config/FuseConfig.java +++ b/connect-core/src/main/java/org/needcoke/rpc/config/FuseConfig.java @@ -5,6 +5,7 @@ import org.needcoke.rpc.fuse.FuseTask; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.stereotype.Component; import java.util.concurrent.DelayQueue; diff --git a/connect-core/src/main/java/org/needcoke/rpc/config/ServerConfig.java b/connect-core/src/main/java/org/needcoke/rpc/config/ServerConfig.java index 434a6c9..543135e 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/config/ServerConfig.java +++ b/connect-core/src/main/java/org/needcoke/rpc/config/ServerConfig.java @@ -15,7 +15,7 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @Getter -@Configuration +@Configuration(proxyBeanMethods = false) public class ServerConfig { @Value("${coke.server.port:12001}") @@ -32,29 +32,30 @@ public class ServerConfig { */ @ConditionalOnMissingBean(ConnectInvoker.class) @Bean - public OkHttpsInvoker okHttpsInvoker(){ + public OkHttpsInvoker okHttpsInvoker() { return new OkHttpsInvoker(); } - /** - * coke-connect的默认负载均衡策略为轮询 - */ + /** + * coke-connect的默认负载均衡策略为轮询 + */ @ConditionalOnMissingBean(LoadBalance.class) @Bean - public RoundRobinLoadBalance roundRobinLoadBalance(){ + public RoundRobinLoadBalance roundRobinLoadBalance() { return new RoundRobinLoadBalance(); } + /** * server uri -> 端口号 */ @ConditionalOnMissingBean(OkHttpsInvoker.class) @Bean - public Map cokeServerPortMap(){ + public Map cokeServerPortMap() { return new ConcurrentHashMap<>(); } @Bean - public RpcTypeEnum rpcType(){ + public RpcTypeEnum rpcType() { return RpcTypeEnum.okHttp3; } } diff --git a/connect-core/src/main/java/org/needcoke/rpc/fuse/FuseThreadPool.java b/connect-core/src/main/java/org/needcoke/rpc/fuse/FuseThreadPool.java index 096612c..2beed91 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/fuse/FuseThreadPool.java +++ b/connect-core/src/main/java/org/needcoke/rpc/fuse/FuseThreadPool.java @@ -3,8 +3,10 @@ package org.needcoke.rpc.fuse; import com.google.common.util.concurrent.ThreadFactoryBuilder; import org.needcoke.rpc.config.FuseConfig; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import javax.annotation.PostConstruct; import javax.annotation.Resource; import java.util.concurrent.*; @@ -14,6 +16,7 @@ public class FuseThreadPool { @Resource private FuseConfig fuseConfig; + /** * 自定义线程名称,方便的出错的时候溯源 */ @@ -32,15 +35,20 @@ public class FuseThreadPool { * threadFactory 创建线程的工厂类 * handler 拒绝策略类,当线程池数量达到上线并且workQueue队列长度达到上限时就需要对到来的任务做拒绝处理 */ - private ExecutorService service = new ThreadPoolExecutor( - fuseConfig.getCoreThreadPoolSize(), - fuseConfig.getMaximumPoolSize(), - fuseConfig.getKeepAliveTime(), - TimeUnit.MILLISECONDS, - new ArrayBlockingQueue<>(fuseConfig.getPoolCapacity()), - namedThreadFactory, - new ThreadPoolExecutor.AbortPolicy() - ); + private ExecutorService service = null; + + @PostConstruct + public void init() { + new ThreadPoolExecutor( + fuseConfig.getCoreThreadPoolSize(), + fuseConfig.getMaximumPoolSize(), + fuseConfig.getKeepAliveTime(), + TimeUnit.MILLISECONDS, + new ArrayBlockingQueue<>(fuseConfig.getPoolCapacity()), + namedThreadFactory, + new ThreadPoolExecutor.AbortPolicy() + ); + } /** * 获取线程池 diff --git a/connect-core/src/main/java/org/needcoke/rpc/invoker/ConnectInvoker.java b/connect-core/src/main/java/org/needcoke/rpc/invoker/ConnectInvoker.java index 2367fec..9cbc9a5 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/invoker/ConnectInvoker.java +++ b/connect-core/src/main/java/org/needcoke/rpc/invoker/ConnectInvoker.java @@ -12,7 +12,12 @@ import org.needcoke.rpc.fuse.FuseTask; import org.needcoke.rpc.fuse.FuseThreadPool; import org.needcoke.rpc.net.Connector; import org.needcoke.rpc.utils.SpringContextUtils; +import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.cloud.client.ServiceInstance; +import org.springframework.context.annotation.Lazy; + +import javax.annotation.PostConstruct; +import javax.annotation.Resource; import java.util.HashMap; import java.util.Map; import java.util.concurrent.DelayQueue; @@ -20,18 +25,16 @@ import java.util.concurrent.DelayQueue; @Slf4j public abstract class ConnectInvoker { + @Resource private DelayQueue fuseTaskDelayQueue; + @Resource private FuseConfig fuseConfig; + @Resource + @Lazy private FuseThreadPool fuseThreadPool; - public ConnectInvoker() { - this.fuseTaskDelayQueue = SpringContextUtils.getBean("fuseTaskDelayQueue"); - this.fuseConfig = SpringContextUtils.getBean("fuseConfig"); - this.fuseThreadPool = SpringContextUtils.getBean("fuseThreadPool"); - } - public abstract InvokeResult execute(Connector connector, ServiceInstance instance, String beanName, String methodName, Map params); diff --git a/connect-core/src/main/java/org/needcoke/rpc/net/ConnectorFactory.java b/connect-core/src/main/java/org/needcoke/rpc/net/ConnectorFactory.java index f141d6d..5ef53f1 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/net/ConnectorFactory.java +++ b/connect-core/src/main/java/org/needcoke/rpc/net/ConnectorFactory.java @@ -6,6 +6,7 @@ import org.needcoke.rpc.loadBalance.LoadBalance; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.cloud.client.discovery.DiscoveryClient; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; import java.util.concurrent.ConcurrentHashMap; @@ -25,6 +26,7 @@ public class ConnectorFactory { this.lb = lb; } @Autowired + @Lazy public void setCi(ConnectInvoker ci) { this.ci = ci; } diff --git a/connect-core/src/main/java/org/needcoke/rpc/utils/ConnectUtil.java b/connect-core/src/main/java/org/needcoke/rpc/utils/ConnectUtil.java index bf7ad2b..1b39411 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/utils/ConnectUtil.java +++ b/connect-core/src/main/java/org/needcoke/rpc/utils/ConnectUtil.java @@ -15,6 +15,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.discovery.DiscoveryClient; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; diff --git a/connect-core/src/main/java/org/needcoke/rpc/utils/SpringContextUtils.java b/connect-core/src/main/java/org/needcoke/rpc/utils/SpringContextUtils.java index ac4eaec..9bc307e 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/utils/SpringContextUtils.java +++ b/connect-core/src/main/java/org/needcoke/rpc/utils/SpringContextUtils.java @@ -24,7 +24,6 @@ public class SpringContextUtils { @Resource private ApplicationContext context; - @Resource(name = "beanNameMethodMap") private Map beanNameMethodMap; -- Gitee From ca69bd5a44ef13b34065076566b3e9ace4bb7070 Mon Sep 17 00:00:00 2001 From: warren Date: Thu, 23 Jun 2022 17:13:44 +0800 Subject: [PATCH 13/22] =?UTF-8?q?=E6=9B=B4=E6=94=B9=E7=86=94=E6=96=AD?= =?UTF-8?q?=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../needcoke/b/component/TestComponent.java | 28 ++++---- business-b/src/main/resources/application.yml | 6 +- .../needcoke/c/controller/CController.java | 34 +++++----- business-c/src/main/resources/application.yml | 4 +- .../org/needcoke/a/configuration/Config.java | 28 ++++---- .../src/main/resources/application.yml | 9 ++- .../common/enums/ConnectionExceptionEnum.java | 2 +- .../exception/CokeConnectException.java | 1 - .../rpc/config/CokeConfiguration.java | 2 +- .../config/CokeHandlerInterceptorAdapter.java | 1 - .../rpc/config/ConnectExceptionAdvice.java | 1 + .../org/needcoke/rpc/config/FuseConfig.java | 13 +--- .../org/needcoke/rpc/config/ServerConfig.java | 18 ----- .../main/java/org/needcoke/rpc/fuse/Fuse.java | 65 ++++++++++++++++--- .../java/org/needcoke/rpc/fuse/FuseTask.java | 59 ----------------- .../org/needcoke/rpc/fuse/FuseThreadPool.java | 3 +- .../needcoke/rpc/invoker/ConnectInvoker.java | 27 +------- .../needcoke/rpc/invoker/OkHttpsInvoker.java | 12 ---- .../needcoke/rpc/net/ConnectorFactory.java | 3 - .../rpc/netty/invoker/NettyInvoker.java | 16 ++--- .../processor/ReadMessageClientProcessor.java | 12 ++-- .../processor/ReadMessageServerProcessor.java | 2 +- .../server/NettyServerHandlerAdapter.java | 1 - .../invoker/SmartSocketInvoker.java | 1 - .../SmartSocketMessageProcessor.java | 3 +- 25 files changed, 135 insertions(+), 216 deletions(-) delete mode 100644 connect-core/src/main/java/org/needcoke/rpc/fuse/FuseTask.java diff --git a/business-b/src/main/java/org/needcoke/b/component/TestComponent.java b/business-b/src/main/java/org/needcoke/b/component/TestComponent.java index a48e494..4b557f2 100644 --- a/business-b/src/main/java/org/needcoke/b/component/TestComponent.java +++ b/business-b/src/main/java/org/needcoke/b/component/TestComponent.java @@ -20,24 +20,24 @@ public class TestComponent { // return new WeightedResponseTimeBalance(); // }d -// @Bean -// public NettyInvoker nettyInvoker(){ -// return new NettyInvoker(); -// } -// -// @Bean -// public NettyServer nettyServer(){ -// return new NettyServer(); -// } - @Bean - public SmartSocketInvoker smartSocketInvoker(){ - return new SmartSocketInvoker(); + public NettyInvoker nettyInvoker(){ + return new NettyInvoker(); } @Bean - public SmartSocketServer smartSocketServer(){ - return new SmartSocketServer(); + public NettyServer nettyServer(){ + return new NettyServer(); } +// @Bean +// public SmartSocketInvoker smartSocketInvoker(){ +// return new SmartSocketInvoker(); +// } +// +// @Bean +// public SmartSocketServer smartSocketServer(){ +// return new SmartSocketServer(); +// } + } diff --git a/business-b/src/main/resources/application.yml b/business-b/src/main/resources/application.yml index bd2596f..02ae719 100644 --- a/business-b/src/main/resources/application.yml +++ b/business-b/src/main/resources/application.yml @@ -1,7 +1,7 @@ spring: application: - name: bussiness-c + name: bussiness-b # nacos默认可以不写 但是 如果不是默认的必须要写 cloud: nacos: @@ -9,8 +9,8 @@ spring: discovery: metadata: coke-server-port: 13001 -# rpcType: netty - rpcType: smart socket + rpcType: netty +# rpcType: smart socket #server-addr: http://192.168.*:8848 server-addr: http://127.0.0.1:8848 cluster-name: 严鸣是吕诗文爸爸 diff --git a/business-c/src/main/java/org/needcoke/c/controller/CController.java b/business-c/src/main/java/org/needcoke/c/controller/CController.java index 68875f5..aab273b 100644 --- a/business-c/src/main/java/org/needcoke/c/controller/CController.java +++ b/business-c/src/main/java/org/needcoke/c/controller/CController.java @@ -15,39 +15,41 @@ import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.util.HashMap; import java.util.Map; +import java.util.concurrent.atomic.AtomicInteger; @Component("cCon") @Rpc public class CController { -// @Bean -// public NettyInvoker nettyInvoker(){ -// return new NettyInvoker(); -// } -// -// @Bean -// public NettyServer nettyServer(){ -// return new NettyServer(); -// } - @Bean - public SmartSocketInvoker smartSocketInvoker(){ - return new SmartSocketInvoker(); + public NettyInvoker nettyInvoker(){ + return new NettyInvoker(); } @Bean - public SmartSocketServer smartSocketServer(){ - return new SmartSocketServer(); + public NettyServer nettyServer(){ + return new NettyServer(); } +// @Bean +// public SmartSocketInvoker smartSocketInvoker(){ +// return new SmartSocketInvoker(); +// } +// +// @Bean +// public SmartSocketServer smartSocketServer(){ +// return new SmartSocketServer(); +// } + @Resource private ConnectorFactory connectorFactory; @Call("cTest2") - public String cTest(String word){ + public Object cTest(String word){ Map map = new HashMap<>(); map.put("word",word); + InvokeResult execute = connectorFactory.connector("bussiness-a").execute("config", "hahha2", map); - return execute.getBody().toString(); + return execute.getBody(); } } diff --git a/business-c/src/main/resources/application.yml b/business-c/src/main/resources/application.yml index fd3c76b..f7049eb 100644 --- a/business-c/src/main/resources/application.yml +++ b/business-c/src/main/resources/application.yml @@ -9,8 +9,8 @@ spring: discovery: metadata: coke-server-port: 13007 -# rpcType: netty - rpcType: smart socket + rpcType: netty +# rpcType: smart socket #server-addr: http://192.168.*:8848 server-addr: http://127.0.0.1:8848 cluster-name: 严鸣是吕诗文爸爸 diff --git a/bussiness-a/src/main/java/org/needcoke/a/configuration/Config.java b/bussiness-a/src/main/java/org/needcoke/a/configuration/Config.java index 108b772..b44c5bb 100644 --- a/bussiness-a/src/main/java/org/needcoke/a/configuration/Config.java +++ b/bussiness-a/src/main/java/org/needcoke/a/configuration/Config.java @@ -33,23 +33,23 @@ public class Config { return "say : "+word; } -// @Bean -// public NettyInvoker nettyInvoker(){ -// return new NettyInvoker(); -// } -// -// @Bean -// public NettyServer nettyServer(){ -// return new NettyServer(); -// } - @Bean - public SmartSocketInvoker smartSocketInvoker(){ - return new SmartSocketInvoker(); + public NettyInvoker nettyInvoker(){ + return new NettyInvoker(); } @Bean - public SmartSocketServer smartSocketServer(){ - return new SmartSocketServer(); + public NettyServer nettyServer(){ + return new NettyServer(); } + +// @Bean +// public SmartSocketInvoker smartSocketInvoker(){ +// return new SmartSocketInvoker(); +// } +// +// @Bean +// public SmartSocketServer smartSocketServer(){ +// return new SmartSocketServer(); +// } } diff --git a/bussiness-a/src/main/resources/application.yml b/bussiness-a/src/main/resources/application.yml index 93e648c..aca96ae 100644 --- a/bussiness-a/src/main/resources/application.yml +++ b/bussiness-a/src/main/resources/application.yml @@ -9,16 +9,15 @@ spring: discovery: metadata: coke-server-port: 13005 -# rpcType: netty - rpcType: smart socket + rpcType: netty +# rpcType: smart socket #server-addr: http://192.168.*:8848 - server-addr: http://192.168.0.109:8848 + server-addr: http://127.0.0.1:8848 cluster-name: 严鸣是吕诗文爸爸 group: 相亲相爱一家人 - access-key: server: port: 8002 coke: server: - port: 13291 \ No newline at end of file + port: 13005 \ No newline at end of file diff --git a/connect-core/src/main/java/org/needcoke/rpc/common/enums/ConnectionExceptionEnum.java b/connect-core/src/main/java/org/needcoke/rpc/common/enums/ConnectionExceptionEnum.java index 2477fca..b45990a 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/common/enums/ConnectionExceptionEnum.java +++ b/connect-core/src/main/java/org/needcoke/rpc/common/enums/ConnectionExceptionEnum.java @@ -10,7 +10,7 @@ public enum ConnectionExceptionEnum { NO_SUCH_BEAN_NAME("0001", "no such bean name", "没有找到对应的beanName的bean"), BEAN_WITHOUT_METHOD("0002", - "the bean name ${beanName} without method name ${method} ,you can use annotation @call or check method public.", + "the bean name {} without method name {} ,you can use annotation @call or check method public.", "您请求的bean没有该方法,您可以考虑添加@call注解,或者修改method的访问权限为public。"), INVOKE_METHOD_ERROR("0003","invoke remote method error,please check the method name or param list ,if @Call ,you need to use @Call.value" diff --git a/connect-core/src/main/java/org/needcoke/rpc/common/exception/CokeConnectException.java b/connect-core/src/main/java/org/needcoke/rpc/common/exception/CokeConnectException.java index f8f9783..eaa311f 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/common/exception/CokeConnectException.java +++ b/connect-core/src/main/java/org/needcoke/rpc/common/exception/CokeConnectException.java @@ -42,7 +42,6 @@ public class CokeConnectException extends RuntimeException { super(connectionExceptionEnum.getValue(),e); this.errorCode = connectionExceptionEnum.getErrorCode(); this.note = connectionExceptionEnum.getNote(); - this.requestId = TrackingUtil.getRequestId(); } public CokeConnectException(String requestId ,ConnectionExceptionEnum connectionExceptionEnum,Throwable e) { diff --git a/connect-core/src/main/java/org/needcoke/rpc/config/CokeConfiguration.java b/connect-core/src/main/java/org/needcoke/rpc/config/CokeConfiguration.java index 06388b0..512f6c4 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/config/CokeConfiguration.java +++ b/connect-core/src/main/java/org/needcoke/rpc/config/CokeConfiguration.java @@ -11,7 +11,7 @@ import java.util.Map; * @author Gilgamesh * @date 2022/4/2 */ -@Configuration +@Configuration(proxyBeanMethods = false) public class CokeConfiguration { /** diff --git a/connect-core/src/main/java/org/needcoke/rpc/config/CokeHandlerInterceptorAdapter.java b/connect-core/src/main/java/org/needcoke/rpc/config/CokeHandlerInterceptorAdapter.java index 65ea0d8..f2c32f0 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/config/CokeHandlerInterceptorAdapter.java +++ b/connect-core/src/main/java/org/needcoke/rpc/config/CokeHandlerInterceptorAdapter.java @@ -30,7 +30,6 @@ public class CokeHandlerInterceptorAdapter implements HandlerInterceptor { @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { - LinkTrackingContextHolder.clear(); HandlerInterceptor.super.afterCompletion(request, response, handler, ex); } } diff --git a/connect-core/src/main/java/org/needcoke/rpc/config/ConnectExceptionAdvice.java b/connect-core/src/main/java/org/needcoke/rpc/config/ConnectExceptionAdvice.java index 06c55d0..9e376fe 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/config/ConnectExceptionAdvice.java +++ b/connect-core/src/main/java/org/needcoke/rpc/config/ConnectExceptionAdvice.java @@ -1,5 +1,6 @@ package org.needcoke.rpc.config; +import org.connect.rpc.link.tracking.config.LinkTrackingContextHolder; import org.needcoke.rpc.common.exception.CokeConnectException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; diff --git a/connect-core/src/main/java/org/needcoke/rpc/config/FuseConfig.java b/connect-core/src/main/java/org/needcoke/rpc/config/FuseConfig.java index e04d8f8..2b5b635 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/config/FuseConfig.java +++ b/connect-core/src/main/java/org/needcoke/rpc/config/FuseConfig.java @@ -1,19 +1,14 @@ package org.needcoke.rpc.config; import lombok.Getter; -import org.needcoke.rpc.fuse.FuseTask; import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.stereotype.Component; - -import java.util.concurrent.DelayQueue; @Getter @Configuration public class FuseConfig { - @Value("${coke.fuse.timeout:2000}") + @Value("${coke.fuse.timeout:1000}") private long fuseTimeOut; @Value("${coke.fuse.pool.coreThreadPoolSize:2}") @@ -27,10 +22,4 @@ public class FuseConfig { @Value("${coke.fuse.pool.poolCapacity:9999}") private int poolCapacity; - - @Bean - public DelayQueue fuseTaskDelayQueue(){ - return new DelayQueue<>(); - } - } diff --git a/connect-core/src/main/java/org/needcoke/rpc/config/ServerConfig.java b/connect-core/src/main/java/org/needcoke/rpc/config/ServerConfig.java index 543135e..5dcbbc1 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/config/ServerConfig.java +++ b/connect-core/src/main/java/org/needcoke/rpc/config/ServerConfig.java @@ -1,7 +1,6 @@ package org.needcoke.rpc.config; import lombok.Getter; -import org.needcoke.rpc.common.enums.RpcTypeEnum; import org.needcoke.rpc.invoker.ConnectInvoker; import org.needcoke.rpc.invoker.OkHttpsInvoker; import org.needcoke.rpc.loadBalance.LoadBalance; @@ -11,9 +10,6 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - @Getter @Configuration(proxyBeanMethods = false) public class ServerConfig { @@ -44,18 +40,4 @@ public class ServerConfig { public RoundRobinLoadBalance roundRobinLoadBalance() { return new RoundRobinLoadBalance(); } - - /** - * server uri -> 端口号 - */ - @ConditionalOnMissingBean(OkHttpsInvoker.class) - @Bean - public Map cokeServerPortMap() { - return new ConcurrentHashMap<>(); - } - - @Bean - public RpcTypeEnum rpcType() { - return RpcTypeEnum.okHttp3; - } } diff --git a/connect-core/src/main/java/org/needcoke/rpc/fuse/Fuse.java b/connect-core/src/main/java/org/needcoke/rpc/fuse/Fuse.java index 88cfc27..51faf98 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/fuse/Fuse.java +++ b/connect-core/src/main/java/org/needcoke/rpc/fuse/Fuse.java @@ -1,25 +1,72 @@ package org.needcoke.rpc.fuse; -import java.util.concurrent.DelayQueue; +import lombok.extern.slf4j.Slf4j; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.LockSupport; -public class Fuse implements Runnable { +@Slf4j +public class Fuse implements Runnable{ + + private long timeout; + + private TimeUnit unit; + + /* 锁字段 */ + private final Object lockField; + + /* 超时需要唤醒的线程 */ + private Thread unParkThread; + + private static Map unParkThreadMap = new ConcurrentHashMap<>(); + + private static Map unParkMap = new ConcurrentHashMap<>(); - private final DelayQueue queue; + public Fuse(long timeout, TimeUnit unit, Object lockField) { + this.timeout = timeout; + this.unit = unit; + this.lockField = lockField; + this.unParkThread = Thread.currentThread(); + } - public Fuse(DelayQueue queue) { - this.queue = queue; + public Fuse(long timeout, Object lockField) { + this.timeout = timeout; + this.unit = TimeUnit.MILLISECONDS; + this.lockField = lockField; + this.unParkThread = Thread.currentThread(); } + + @Override public void run() { + unParkMap.put(lockField,true); + unParkThreadMap.put(lockField,unParkThread); try { - FuseTask fuseTask = queue.take(); - Thread thread = fuseTask.getThread(); - if(!thread.getState().equals(Thread.State.WAITING)) { - LockSupport.unpark(thread); + unit.sleep(timeout); + synchronized (lockField){ + if(unParkMap.containsKey(lockField)){ + unParkMap.remove(lockField); + LockSupport.unpark(unParkThread); + unParkThreadMap.remove(lockField); + log.warn("coke connect fuse lockField = {},fuseTimeOut = {}",lockField,timeout); + } } } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + + public static boolean unPark(final Object lockField){ + synchronized (lockField){ + if(unParkMap.containsKey(lockField)){ + LockSupport.unpark(unParkThreadMap.get(lockField)); + unParkMap.remove(lockField); + return true; + } } + return false; } } diff --git a/connect-core/src/main/java/org/needcoke/rpc/fuse/FuseTask.java b/connect-core/src/main/java/org/needcoke/rpc/fuse/FuseTask.java deleted file mode 100644 index db11171..0000000 --- a/connect-core/src/main/java/org/needcoke/rpc/fuse/FuseTask.java +++ /dev/null @@ -1,59 +0,0 @@ -package org.needcoke.rpc.fuse; - -import lombok.Getter; - -import java.util.concurrent.Delayed; -import java.util.concurrent.TimeUnit; - -/** - * 熔断任务实体 - * - * @author Gilgamesh - * @since abandon - */ -@Getter -public class FuseTask implements Delayed { - - /* by warren: 请求id */ - private Long requestId; - - /* by warren: 需要释放的线程 */ - - private Thread thread; - - /* by warren: 数据失效时间点 */ - private long time; - - public FuseTask(String requestId, Thread thread,long time) { - this.requestId = Long.parseLong(requestId); - this.thread = thread; - this.time = System.currentTimeMillis()+time; - } - - @Override - public long getDelay(TimeUnit unit) { - return unit.convert(this.time - System.currentTimeMillis(), TimeUnit.NANOSECONDS); - } - - @Override - public int compareTo(Delayed o) { - if (o == this) // compare zero if same object - return 0; - if (o instanceof FuseTask) { - FuseTask x = (FuseTask) o; - // 优先比较失效时间 - long diff = this.time - x.time; - if (diff < 0) - return -1; - else if (diff > 0) - return 1; - else if (this.requestId < x.requestId) // 剩余时间相同则比较序号 - return -1; - else - return 1; - } - // 一般不会执行到此处,除非元素不是MessageData类型 - long diff = this.getDelay(TimeUnit.NANOSECONDS) - o.getDelay(TimeUnit.NANOSECONDS); - return (diff < 0) ? -1 : (diff > 0) ? 1 : 0; - } -} diff --git a/connect-core/src/main/java/org/needcoke/rpc/fuse/FuseThreadPool.java b/connect-core/src/main/java/org/needcoke/rpc/fuse/FuseThreadPool.java index 2beed91..0c4e167 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/fuse/FuseThreadPool.java +++ b/connect-core/src/main/java/org/needcoke/rpc/fuse/FuseThreadPool.java @@ -3,7 +3,6 @@ package org.needcoke.rpc.fuse; import com.google.common.util.concurrent.ThreadFactoryBuilder; import org.needcoke.rpc.config.FuseConfig; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; @@ -39,7 +38,7 @@ public class FuseThreadPool { @PostConstruct public void init() { - new ThreadPoolExecutor( + service = new ThreadPoolExecutor( fuseConfig.getCoreThreadPoolSize(), fuseConfig.getMaximumPoolSize(), fuseConfig.getKeepAliveTime(), diff --git a/connect-core/src/main/java/org/needcoke/rpc/invoker/ConnectInvoker.java b/connect-core/src/main/java/org/needcoke/rpc/invoker/ConnectInvoker.java index 9cbc9a5..e68f27e 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/invoker/ConnectInvoker.java +++ b/connect-core/src/main/java/org/needcoke/rpc/invoker/ConnectInvoker.java @@ -2,38 +2,25 @@ package org.needcoke.rpc.invoker; import com.alibaba.fastjson.JSONObject; import com.ejlchina.okhttps.HttpResult; -import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.connect.rpc.link.tracking.util.TrackingUtil; import org.needcoke.rpc.common.enums.RpcTypeEnum; import org.needcoke.rpc.config.FuseConfig; -import org.needcoke.rpc.fuse.Fuse; -import org.needcoke.rpc.fuse.FuseTask; import org.needcoke.rpc.fuse.FuseThreadPool; import org.needcoke.rpc.net.Connector; -import org.needcoke.rpc.utils.SpringContextUtils; -import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.cloud.client.ServiceInstance; import org.springframework.context.annotation.Lazy; - -import javax.annotation.PostConstruct; import javax.annotation.Resource; -import java.util.HashMap; import java.util.Map; -import java.util.concurrent.DelayQueue; @Slf4j public abstract class ConnectInvoker { @Resource - private DelayQueue fuseTaskDelayQueue; - - @Resource - private FuseConfig fuseConfig; + protected FuseConfig fuseConfig; @Resource @Lazy - private FuseThreadPool fuseThreadPool; + protected FuseThreadPool fuseThreadPool; public abstract InvokeResult execute(Connector connector, ServiceInstance instance, String beanName, String methodName, Map params); @@ -61,14 +48,4 @@ public abstract class ConnectInvoker { } return null; } - - protected void fuse(){ - fuseTaskDelayQueue.put( - new FuseTask(TrackingUtil.getRequestId(), - Thread.currentThread(), - fuseConfig.getFuseTimeOut() - ) - ); - fuseThreadPool.newTask(new Fuse(fuseTaskDelayQueue)); - } } diff --git a/connect-core/src/main/java/org/needcoke/rpc/invoker/OkHttpsInvoker.java b/connect-core/src/main/java/org/needcoke/rpc/invoker/OkHttpsInvoker.java index 84051f7..0060956 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/invoker/OkHttpsInvoker.java +++ b/connect-core/src/main/java/org/needcoke/rpc/invoker/OkHttpsInvoker.java @@ -4,20 +4,10 @@ import com.ejlchina.okhttps.HTTP; import com.ejlchina.okhttps.HttpResult; import com.ejlchina.okhttps.SHttpTask; import com.ejlchina.okhttps.jackson.JacksonMsgConvertor; -import lombok.NoArgsConstructor; -import org.connect.rpc.link.tracking.config.LinkTrackingContextHolder; import org.connect.rpc.link.tracking.util.TrackingUtil; import org.needcoke.rpc.common.constant.ConnectConstant; import org.needcoke.rpc.common.enums.HttpContentTypeEnum; -import org.needcoke.rpc.common.enums.RpcTypeEnum; -import org.needcoke.rpc.config.FuseConfig; -import org.needcoke.rpc.fuse.Fuse; -import org.needcoke.rpc.fuse.FuseTask; -import org.needcoke.rpc.fuse.FuseThreadPool; import org.needcoke.rpc.net.Connector; -import org.needcoke.rpc.utils.SpringContextUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.cloud.client.ServiceInstance; import org.springframework.web.context.request.RequestAttributes; import org.springframework.web.context.request.RequestContextHolder; @@ -26,7 +16,6 @@ import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; import java.util.Enumeration; import java.util.Map; -import java.util.concurrent.DelayQueue; /** * 采用okHttps的跨服务调用器 @@ -50,7 +39,6 @@ public class OkHttpsInvoker extends ConnectInvoker { String header = request.getHeader(nextElement); sHttpTask.addHeader(nextElement, header); } - fuse(); HttpResult result = sHttpTask .post(); handleResult(instance.getServiceId(), beanName, methodName, params, result); diff --git a/connect-core/src/main/java/org/needcoke/rpc/net/ConnectorFactory.java b/connect-core/src/main/java/org/needcoke/rpc/net/ConnectorFactory.java index 5ef53f1..fb7031f 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/net/ConnectorFactory.java +++ b/connect-core/src/main/java/org/needcoke/rpc/net/ConnectorFactory.java @@ -1,16 +1,13 @@ package org.needcoke.rpc.net; -import org.needcoke.rpc.fuse.FuseTask; import org.needcoke.rpc.invoker.ConnectInvoker; import org.needcoke.rpc.loadBalance.LoadBalance; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.DelayQueue; @Component public class ConnectorFactory { diff --git a/connect-server-netty/src/main/java/org/needcoke/rpc/netty/invoker/NettyInvoker.java b/connect-server-netty/src/main/java/org/needcoke/rpc/netty/invoker/NettyInvoker.java index 84c9814..ccca968 100644 --- a/connect-server-netty/src/main/java/org/needcoke/rpc/netty/invoker/NettyInvoker.java +++ b/connect-server-netty/src/main/java/org/needcoke/rpc/netty/invoker/NettyInvoker.java @@ -4,13 +4,12 @@ import cn.hutool.core.date.DateUtil; import io.netty.channel.Channel; import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.connect.rpc.link.tracking.config.LinkTrackingContextHolder; import org.connect.rpc.link.tracking.util.TrackingUtil; import org.needcoke.rpc.codec.CokeRequest; import org.needcoke.rpc.common.constant.ConnectConstant; import org.needcoke.rpc.common.enums.ConnectionExceptionEnum; -import org.needcoke.rpc.common.enums.RpcTypeEnum; import org.needcoke.rpc.common.exception.CokeConnectException; +import org.needcoke.rpc.fuse.Fuse; import org.needcoke.rpc.invoker.ConnectInvoker; import org.needcoke.rpc.invoker.InvokeResult; import org.needcoke.rpc.invoker.OkHttpsInvoker; @@ -57,6 +56,10 @@ public class NettyInvoker extends ConnectInvoker { .setParams(params) .addHeader(TrackingUtil.headerKey(), TrackingUtil.headerValue()); byte[] bytes = request.toBytes(); + InvokeResult tmp = new InvokeResult(); + long start = DateUtil.current(); + ConnectUtil.putRequestMap(tmp); + fuseThreadPool.newTask(new Fuse(fuseConfig.getFuseTimeOut(),TrackingUtil.getRequestId())); try { channel.writeAndFlush(request); } catch (Exception e) { @@ -73,14 +76,11 @@ public class NettyInvoker extends ConnectInvoker { channelMap.put(uri,channel); return execute(connector,instance,beanName,methodName,params); } - InvokeResult tmp = new InvokeResult(); - long start = DateUtil.current(); - ConnectUtil.putRequestMap(tmp); - ConnectUtil.putThreadMap(TrackingUtil.getRequestId(), Thread.currentThread()); - fuse(); +// ConnectUtil.putThreadMap(TrackingUtil.getRequestId(), Thread.currentThread()); + Fuse fuse = new Fuse(fuseConfig.getFuseTimeOut(), TrackingUtil.getRequestId()); + fuseThreadPool.newTask(fuse); LockSupport.park(); InvokeResult result = ConnectUtil.getFromRequestMap(TrackingUtil.getRequestId()); - LinkTrackingContextHolder.clear(); long end = DateUtil.current(); log.info("requestId = {} , start = {} , end = {} ,cost = {}", TrackingUtil.getRequestId(), start, end, end - start); result.setTime(end - start); diff --git a/connect-server-netty/src/main/java/org/needcoke/rpc/netty/processor/ReadMessageClientProcessor.java b/connect-server-netty/src/main/java/org/needcoke/rpc/netty/processor/ReadMessageClientProcessor.java index 89a6088..19b7c43 100644 --- a/connect-server-netty/src/main/java/org/needcoke/rpc/netty/processor/ReadMessageClientProcessor.java +++ b/connect-server-netty/src/main/java/org/needcoke/rpc/netty/processor/ReadMessageClientProcessor.java @@ -5,21 +5,23 @@ import lombok.extern.slf4j.Slf4j; import org.connect.rpc.link.tracking.util.TrackingUtil; import org.needcoke.rpc.codec.CokeRequest; import org.needcoke.rpc.common.enums.ConnectRequestEnum; +import org.needcoke.rpc.fuse.Fuse; import org.needcoke.rpc.utils.ConnectUtil; +import org.needcoke.rpc.utils.SpringContextUtils; +import java.util.Map; import java.util.concurrent.locks.LockSupport; @Slf4j -public class ReadMessageClientProcessor implements ReadMessageProcessor{ +public class ReadMessageClientProcessor implements ReadMessageProcessor { @Override public void channelRead(ChannelHandlerContext ctx, CokeRequest request) { if (ConnectRequestEnum.INTERNAL_RESPONSE == request.getRequestType()) { log.info("netty client receive back linkTracking = {} , request json = {}", TrackingUtil.linkTrackingJsonStr(), new String(request.toBytes())); - ConnectUtil.putRequestMap(request.getCokeRequestId(), request.getResult()); - Thread thread = ConnectUtil.getFromThreadMap(request.getCokeRequestId()); - if(thread.getState().equals(Thread.State.WAITING)) { - LockSupport.unpark(thread); + boolean bool = Fuse.unPark(request.getCokeRequestId()); + if(bool) { + ConnectUtil.putRequestMap(request.getCokeRequestId(), request.getResult()); } } } diff --git a/connect-server-netty/src/main/java/org/needcoke/rpc/netty/processor/ReadMessageServerProcessor.java b/connect-server-netty/src/main/java/org/needcoke/rpc/netty/processor/ReadMessageServerProcessor.java index c500307..8389c38 100644 --- a/connect-server-netty/src/main/java/org/needcoke/rpc/netty/processor/ReadMessageServerProcessor.java +++ b/connect-server-netty/src/main/java/org/needcoke/rpc/netty/processor/ReadMessageServerProcessor.java @@ -30,7 +30,7 @@ public class ReadMessageServerProcessor implements ReadMessageProcessor{ TrackingUtil.linkTrackingJsonStr(), beanName, methodName, JSONObject.toJSONString(params)); Method method = SpringContextUtils.getMethod(beanName, methodName); if (null == method) { - log.error(ConnectionExceptionEnum.BEAN_WITHOUT_METHOD.logStatement("beanName {} , methodName {} , linkTracking = {}"), beanName, methodName, TrackingUtil.linkTrackingJsonStr()); + log.error("beanName {} , methodName {} , linkTracking = {}", beanName, methodName, TrackingUtil.linkTrackingJsonStr()); throw new CokeConnectException(ConnectionExceptionEnum.BEAN_WITHOUT_METHOD); } Object bean = SpringContextUtils.getBean(beanName); diff --git a/connect-server-netty/src/main/java/org/needcoke/rpc/netty/server/NettyServerHandlerAdapter.java b/connect-server-netty/src/main/java/org/needcoke/rpc/netty/server/NettyServerHandlerAdapter.java index fb22346..d790834 100644 --- a/connect-server-netty/src/main/java/org/needcoke/rpc/netty/server/NettyServerHandlerAdapter.java +++ b/connect-server-netty/src/main/java/org/needcoke/rpc/netty/server/NettyServerHandlerAdapter.java @@ -37,6 +37,5 @@ public class NettyServerHandlerAdapter extends ChannelInboundHandlerAdapter { LinkTrackingContextHolder.setLinkTracking(linkTracking); } readMessageProcessor.channelRead(ctx,request); - LinkTrackingContextHolder.clear(); } } diff --git a/connect-server-smart-socket/src/main/java/org/needcoke/rpc/smartsocket/invoker/SmartSocketInvoker.java b/connect-server-smart-socket/src/main/java/org/needcoke/rpc/smartsocket/invoker/SmartSocketInvoker.java index 80d4af6..a35a3fe 100644 --- a/connect-server-smart-socket/src/main/java/org/needcoke/rpc/smartsocket/invoker/SmartSocketInvoker.java +++ b/connect-server-smart-socket/src/main/java/org/needcoke/rpc/smartsocket/invoker/SmartSocketInvoker.java @@ -88,7 +88,6 @@ public class SmartSocketInvoker extends ConnectInvoker { ConnectUtil.putThreadMap(TrackingUtil.getRequestId(), Thread.currentThread()); LockSupport.park(); InvokeResult result = ConnectUtil.getFromRequestMap(TrackingUtil.getRequestId()); - LinkTrackingContextHolder.clear(); long end = DateUtil.current(); log.info("requestId = {} , start = {} , end = {} ,cost = {}", TrackingUtil.getRequestId(), start, end, end - start); result.setTime(end - start); diff --git a/connect-server-smart-socket/src/main/java/org/needcoke/rpc/smartsocket/processor/SmartSocketMessageProcessor.java b/connect-server-smart-socket/src/main/java/org/needcoke/rpc/smartsocket/processor/SmartSocketMessageProcessor.java index 9701787..a68a06c 100644 --- a/connect-server-smart-socket/src/main/java/org/needcoke/rpc/smartsocket/processor/SmartSocketMessageProcessor.java +++ b/connect-server-smart-socket/src/main/java/org/needcoke/rpc/smartsocket/processor/SmartSocketMessageProcessor.java @@ -22,7 +22,7 @@ public abstract class SmartSocketMessageProcessor implements MessageProcessor throw new RuntimeException(e); // TODO 未来需要处理返回失败的场景 } - LinkTrackingContextHolder.clear(); + } public void response(AioSession session, CokeRequest response){ @@ -35,7 +35,6 @@ public abstract class SmartSocketMessageProcessor implements MessageProcessor } catch (IOException e) { e.printStackTrace(); } - LinkTrackingContextHolder.clear(); } } -- Gitee From 12d2d06867d46e49f958956af17d29cc0700e905 Mon Sep 17 00:00:00 2001 From: warren <2410818122@qq.com> Date: Thu, 23 Jun 2022 21:54:56 +0800 Subject: [PATCH 14/22] =?UTF-8?q?Fuse=E7=86=94=E6=96=AD=E5=99=A8=E5=BC=80?= =?UTF-8?q?=E7=AF=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../rpc/config/ConnectExceptionAdvice.java | 16 ++++- .../main/java/org/needcoke/rpc/fuse/Fuse.java | 62 +++++++++++++------ .../rpc/netty/invoker/NettyInvoker.java | 3 +- .../processor/ReadMessageServerProcessor.java | 2 + .../server/NettyServerHandlerAdapter.java | 17 +++++ 5 files changed, 76 insertions(+), 24 deletions(-) diff --git a/connect-core/src/main/java/org/needcoke/rpc/config/ConnectExceptionAdvice.java b/connect-core/src/main/java/org/needcoke/rpc/config/ConnectExceptionAdvice.java index 9e376fe..d1104d2 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/config/ConnectExceptionAdvice.java +++ b/connect-core/src/main/java/org/needcoke/rpc/config/ConnectExceptionAdvice.java @@ -17,12 +17,24 @@ import java.util.Map; @RestControllerAdvice public class ConnectExceptionAdvice { - @ExceptionHandler(value = CokeConnectException.class) - public Map exceptionHandle(CokeConnectException exception) { + + public Map connectExceptionHandle(CokeConnectException exception) { Map ret = new HashMap<>(); ret.put("message", exception.getMessage()); ret.put("note", exception.getNote()); ret.put("errorCode", exception.getErrorCode()); return ret; } + + @ExceptionHandler(value = Exception.class) + public Map exceptionHandle(Exception exception) { + if(exception instanceof CokeConnectException){ + return connectExceptionHandle((CokeConnectException)exception); + } + Map ret = new HashMap<>(); + ret.put("message", exception.getMessage()); + ret.put("note", exception.getLocalizedMessage()); + ret.put("errorCode", "502"); + return ret; + } } diff --git a/connect-core/src/main/java/org/needcoke/rpc/fuse/Fuse.java b/connect-core/src/main/java/org/needcoke/rpc/fuse/Fuse.java index 51faf98..a0d282f 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/fuse/Fuse.java +++ b/connect-core/src/main/java/org/needcoke/rpc/fuse/Fuse.java @@ -5,10 +5,14 @@ import lombok.extern.slf4j.Slf4j; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; +import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.LockSupport; +import java.util.concurrent.locks.ReentrantLock; @Slf4j -public class Fuse implements Runnable{ +public class Fuse implements Runnable { + + private Lock lock = new ReentrantLock(); private long timeout; @@ -18,17 +22,19 @@ public class Fuse implements Runnable{ private final Object lockField; /* 超时需要唤醒的线程 */ - private Thread unParkThread; + private final Thread unParkThread; - private static Map unParkThreadMap = new ConcurrentHashMap<>(); + private static final Map unParkThreadMap = new ConcurrentHashMap<>(); + private static final Map unParkMap = new ConcurrentHashMap<>(); - private static Map unParkMap = new ConcurrentHashMap<>(); + private static final Map lockMap = new ConcurrentHashMap<>(); public Fuse(long timeout, TimeUnit unit, Object lockField) { this.timeout = timeout; this.unit = unit; this.lockField = lockField; this.unParkThread = Thread.currentThread(); + lockMap.put(lockField, lock); } public Fuse(long timeout, Object lockField) { @@ -36,35 +42,51 @@ public class Fuse implements Runnable{ this.unit = TimeUnit.MILLISECONDS; this.lockField = lockField; this.unParkThread = Thread.currentThread(); + lockMap.put(lockField, lock); } - @Override public void run() { - unParkMap.put(lockField,true); - unParkThreadMap.put(lockField,unParkThread); + unParkMap.put(lockField, true); + unParkThreadMap.put(lockField, unParkThread); try { unit.sleep(timeout); - synchronized (lockField){ - if(unParkMap.containsKey(lockField)){ - unParkMap.remove(lockField); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + if (lock.tryLock()) { + lock.lock(); + try { + if (unParkMap.containsKey(lockField)) { LockSupport.unpark(unParkThread); - unParkThreadMap.remove(lockField); - log.warn("coke connect fuse lockField = {},fuseTimeOut = {}",lockField,timeout); + log.warn("coke connect fuse lockField = {},fuseTimeOut = {}", lockField, timeout); } + } catch (Exception e) { + throw new RuntimeException(e); + } finally { + lock.unlock(); + unParkMap.remove(lockField); + unParkThreadMap.remove(lockField); } - } catch (InterruptedException e) { - throw new RuntimeException(e); } + } - public static boolean unPark(final Object lockField){ - synchronized (lockField){ - if(unParkMap.containsKey(lockField)){ - LockSupport.unpark(unParkThreadMap.get(lockField)); - unParkMap.remove(lockField); - return true; + public static boolean unPark(Object lockField) { + Lock tLock = lockMap.get(lockField); + if(tLock.tryLock()) { + tLock.lock(); + try { + if (unParkMap.containsKey(lockField)) { + LockSupport.unpark(unParkThreadMap.get(lockField)); + unParkMap.remove(lockField); + return true; + } + }catch (Exception e){ + throw new RuntimeException(e); + }finally { + tLock.unlock(); } } return false; diff --git a/connect-server-netty/src/main/java/org/needcoke/rpc/netty/invoker/NettyInvoker.java b/connect-server-netty/src/main/java/org/needcoke/rpc/netty/invoker/NettyInvoker.java index ccca968..83e97d0 100644 --- a/connect-server-netty/src/main/java/org/needcoke/rpc/netty/invoker/NettyInvoker.java +++ b/connect-server-netty/src/main/java/org/needcoke/rpc/netty/invoker/NettyInvoker.java @@ -59,7 +59,7 @@ public class NettyInvoker extends ConnectInvoker { InvokeResult tmp = new InvokeResult(); long start = DateUtil.current(); ConnectUtil.putRequestMap(tmp); - fuseThreadPool.newTask(new Fuse(fuseConfig.getFuseTimeOut(),TrackingUtil.getRequestId())); + try { channel.writeAndFlush(request); } catch (Exception e) { @@ -76,7 +76,6 @@ public class NettyInvoker extends ConnectInvoker { channelMap.put(uri,channel); return execute(connector,instance,beanName,methodName,params); } -// ConnectUtil.putThreadMap(TrackingUtil.getRequestId(), Thread.currentThread()); Fuse fuse = new Fuse(fuseConfig.getFuseTimeOut(), TrackingUtil.getRequestId()); fuseThreadPool.newTask(fuse); LockSupport.park(); diff --git a/connect-server-netty/src/main/java/org/needcoke/rpc/netty/processor/ReadMessageServerProcessor.java b/connect-server-netty/src/main/java/org/needcoke/rpc/netty/processor/ReadMessageServerProcessor.java index 8389c38..1ae9d02 100644 --- a/connect-server-netty/src/main/java/org/needcoke/rpc/netty/processor/ReadMessageServerProcessor.java +++ b/connect-server-netty/src/main/java/org/needcoke/rpc/netty/processor/ReadMessageServerProcessor.java @@ -54,4 +54,6 @@ public class ReadMessageServerProcessor implements ReadMessageProcessor{ } } } + + } diff --git a/connect-server-netty/src/main/java/org/needcoke/rpc/netty/server/NettyServerHandlerAdapter.java b/connect-server-netty/src/main/java/org/needcoke/rpc/netty/server/NettyServerHandlerAdapter.java index d790834..1571af5 100644 --- a/connect-server-netty/src/main/java/org/needcoke/rpc/netty/server/NettyServerHandlerAdapter.java +++ b/connect-server-netty/src/main/java/org/needcoke/rpc/netty/server/NettyServerHandlerAdapter.java @@ -38,4 +38,21 @@ public class NettyServerHandlerAdapter extends ChannelInboundHandlerAdapter { } readMessageProcessor.channelRead(ctx,request); } + + @Override + public void channelRegistered(ChannelHandlerContext ctx) throws Exception { + super.channelRegistered(ctx); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + super.exceptionCaught(ctx, cause); + } + + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + super.channelInactive(ctx); + } + + } -- Gitee From a92e94c47c5406163e5ecf3a7caa5b60fe7f9791 Mon Sep 17 00:00:00 2001 From: warren <2410818122@qq.com> Date: Thu, 23 Jun 2022 22:16:53 +0800 Subject: [PATCH 15/22] =?UTF-8?q?Fuse=E7=86=94=E6=96=AD=E5=99=A8=E5=BC=80?= =?UTF-8?q?=E7=AF=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../needcoke/rpc/controller/ApiController.java | 18 ++++++++++++++++++ .../main/java/org/needcoke/rpc/fuse/Fuse.java | 2 ++ 2 files changed, 20 insertions(+) create mode 100644 connect-core/src/main/java/org/needcoke/rpc/controller/ApiController.java diff --git a/connect-core/src/main/java/org/needcoke/rpc/controller/ApiController.java b/connect-core/src/main/java/org/needcoke/rpc/controller/ApiController.java new file mode 100644 index 0000000..d42014b --- /dev/null +++ b/connect-core/src/main/java/org/needcoke/rpc/controller/ApiController.java @@ -0,0 +1,18 @@ +package org.needcoke.rpc.controller; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author Gilgamesh + * @date 2022/4/2 + */ + +@RestController +@Slf4j +@RequestMapping("coke/api") +@RequiredArgsConstructor +public class ApiController { +} diff --git a/connect-core/src/main/java/org/needcoke/rpc/fuse/Fuse.java b/connect-core/src/main/java/org/needcoke/rpc/fuse/Fuse.java index a0d282f..fe9d895 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/fuse/Fuse.java +++ b/connect-core/src/main/java/org/needcoke/rpc/fuse/Fuse.java @@ -66,6 +66,7 @@ public class Fuse implements Runnable { throw new RuntimeException(e); } finally { lock.unlock(); + lockMap.remove(lockField); unParkMap.remove(lockField); unParkThreadMap.remove(lockField); } @@ -87,6 +88,7 @@ public class Fuse implements Runnable { throw new RuntimeException(e); }finally { tLock.unlock(); + lockMap.remove(lockField); } } return false; -- Gitee From 6037e0e5360cb7427f88fd41d3e843fa8933fafd Mon Sep 17 00:00:00 2001 From: warren Date: Fri, 24 Jun 2022 15:42:09 +0800 Subject: [PATCH 16/22] =?UTF-8?q?=E7=86=94=E6=96=AD=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../needcoke/b/component/TestComponent.java | 28 +++++----- business-b/src/main/resources/application.yml | 4 +- .../needcoke/c/controller/CController.java | 28 +++++----- business-c/src/main/resources/application.yml | 4 +- .../org/needcoke/a/configuration/Config.java | 28 +++++----- .../src/main/resources/application.yml | 4 +- .../rpc/controller/ApiController.java | 56 ++++++++++++++++++- .../main/java/org/needcoke/rpc/fuse/Fuse.java | 27 +++++---- .../org/needcoke/rpc/fuse/FuseContext.java | 18 ++++++ .../org/needcoke/rpc/fuse/FuseReportDTO.java | 42 ++++++++++++++ .../org/needcoke/rpc/fuse/FuseThreadPool.java | 7 +-- .../config/LinkTrackingContextHolder.java | 5 ++ .../link/tracking/export/ExportHandle.java | 16 ++++++ .../rpc/link/tracking/net/LinkTracking.java | 2 + .../rpc/link/tracking/util/TrackingUtil.java | 1 + .../rpc/netty/client/NettySession.java | 4 -- .../rpc/netty/invoker/NettyInvoker.java | 6 +- .../processor/ReadMessageClientProcessor.java | 2 +- .../processor/ReadMessageServerProcessor.java | 4 +- .../invoker/SmartSocketInvoker.java | 11 ++-- .../processor/SmartSocketClientProcessor.java | 10 ++-- .../SmartSocketMessageProcessor.java | 1 - 22 files changed, 225 insertions(+), 83 deletions(-) create mode 100644 connect-core/src/main/java/org/needcoke/rpc/fuse/FuseContext.java create mode 100644 connect-core/src/main/java/org/needcoke/rpc/fuse/FuseReportDTO.java create mode 100644 connect-link-tracking/src/main/java/org/connect/rpc/link/tracking/export/ExportHandle.java delete mode 100644 connect-server-netty/src/main/java/org/needcoke/rpc/netty/client/NettySession.java diff --git a/business-b/src/main/java/org/needcoke/b/component/TestComponent.java b/business-b/src/main/java/org/needcoke/b/component/TestComponent.java index 4b557f2..a48e494 100644 --- a/business-b/src/main/java/org/needcoke/b/component/TestComponent.java +++ b/business-b/src/main/java/org/needcoke/b/component/TestComponent.java @@ -20,24 +20,24 @@ public class TestComponent { // return new WeightedResponseTimeBalance(); // }d - @Bean - public NettyInvoker nettyInvoker(){ - return new NettyInvoker(); - } - - @Bean - public NettyServer nettyServer(){ - return new NettyServer(); - } - // @Bean -// public SmartSocketInvoker smartSocketInvoker(){ -// return new SmartSocketInvoker(); +// public NettyInvoker nettyInvoker(){ +// return new NettyInvoker(); // } // // @Bean -// public SmartSocketServer smartSocketServer(){ -// return new SmartSocketServer(); +// public NettyServer nettyServer(){ +// return new NettyServer(); // } + @Bean + public SmartSocketInvoker smartSocketInvoker(){ + return new SmartSocketInvoker(); + } + + @Bean + public SmartSocketServer smartSocketServer(){ + return new SmartSocketServer(); + } + } diff --git a/business-b/src/main/resources/application.yml b/business-b/src/main/resources/application.yml index 02ae719..91eedac 100644 --- a/business-b/src/main/resources/application.yml +++ b/business-b/src/main/resources/application.yml @@ -9,8 +9,8 @@ spring: discovery: metadata: coke-server-port: 13001 - rpcType: netty -# rpcType: smart socket +# rpcType: netty + rpcType: smart socket #server-addr: http://192.168.*:8848 server-addr: http://127.0.0.1:8848 cluster-name: 严鸣是吕诗文爸爸 diff --git a/business-c/src/main/java/org/needcoke/c/controller/CController.java b/business-c/src/main/java/org/needcoke/c/controller/CController.java index aab273b..70fac5e 100644 --- a/business-c/src/main/java/org/needcoke/c/controller/CController.java +++ b/business-c/src/main/java/org/needcoke/c/controller/CController.java @@ -21,26 +21,26 @@ import java.util.concurrent.atomic.AtomicInteger; @Rpc public class CController { - @Bean - public NettyInvoker nettyInvoker(){ - return new NettyInvoker(); - } - - @Bean - public NettyServer nettyServer(){ - return new NettyServer(); - } - // @Bean -// public SmartSocketInvoker smartSocketInvoker(){ -// return new SmartSocketInvoker(); +// public NettyInvoker nettyInvoker(){ +// return new NettyInvoker(); // } // // @Bean -// public SmartSocketServer smartSocketServer(){ -// return new SmartSocketServer(); +// public NettyServer nettyServer(){ +// return new NettyServer(); // } + @Bean + public SmartSocketInvoker smartSocketInvoker(){ + return new SmartSocketInvoker(); + } + + @Bean + public SmartSocketServer smartSocketServer(){ + return new SmartSocketServer(); + } + @Resource private ConnectorFactory connectorFactory; diff --git a/business-c/src/main/resources/application.yml b/business-c/src/main/resources/application.yml index f7049eb..fd3c76b 100644 --- a/business-c/src/main/resources/application.yml +++ b/business-c/src/main/resources/application.yml @@ -9,8 +9,8 @@ spring: discovery: metadata: coke-server-port: 13007 - rpcType: netty -# rpcType: smart socket +# rpcType: netty + rpcType: smart socket #server-addr: http://192.168.*:8848 server-addr: http://127.0.0.1:8848 cluster-name: 严鸣是吕诗文爸爸 diff --git a/bussiness-a/src/main/java/org/needcoke/a/configuration/Config.java b/bussiness-a/src/main/java/org/needcoke/a/configuration/Config.java index b44c5bb..108b772 100644 --- a/bussiness-a/src/main/java/org/needcoke/a/configuration/Config.java +++ b/bussiness-a/src/main/java/org/needcoke/a/configuration/Config.java @@ -33,23 +33,23 @@ public class Config { return "say : "+word; } - @Bean - public NettyInvoker nettyInvoker(){ - return new NettyInvoker(); - } - - @Bean - public NettyServer nettyServer(){ - return new NettyServer(); - } - // @Bean -// public SmartSocketInvoker smartSocketInvoker(){ -// return new SmartSocketInvoker(); +// public NettyInvoker nettyInvoker(){ +// return new NettyInvoker(); // } // // @Bean -// public SmartSocketServer smartSocketServer(){ -// return new SmartSocketServer(); +// public NettyServer nettyServer(){ +// return new NettyServer(); // } + + @Bean + public SmartSocketInvoker smartSocketInvoker(){ + return new SmartSocketInvoker(); + } + + @Bean + public SmartSocketServer smartSocketServer(){ + return new SmartSocketServer(); + } } diff --git a/bussiness-a/src/main/resources/application.yml b/bussiness-a/src/main/resources/application.yml index aca96ae..fd8ae5a 100644 --- a/bussiness-a/src/main/resources/application.yml +++ b/bussiness-a/src/main/resources/application.yml @@ -9,8 +9,8 @@ spring: discovery: metadata: coke-server-port: 13005 - rpcType: netty -# rpcType: smart socket +# rpcType: netty + rpcType: smart socket #server-addr: http://192.168.*:8848 server-addr: http://127.0.0.1:8848 cluster-name: 严鸣是吕诗文爸爸 diff --git a/connect-core/src/main/java/org/needcoke/rpc/controller/ApiController.java b/connect-core/src/main/java/org/needcoke/rpc/controller/ApiController.java index d42014b..fd88deb 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/controller/ApiController.java +++ b/connect-core/src/main/java/org/needcoke/rpc/controller/ApiController.java @@ -2,9 +2,16 @@ package org.needcoke.rpc.controller; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.needcoke.rpc.fuse.FuseContext; +import org.needcoke.rpc.fuse.FuseThreadPool; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.*; + /** * @author Gilgamesh * @date 2022/4/2 @@ -12,7 +19,54 @@ import org.springframework.web.bind.annotation.RestController; @RestController @Slf4j -@RequestMapping("coke/api") +@RequestMapping("coke/connect/api") @RequiredArgsConstructor public class ApiController { + + private final FuseThreadPool threadPool; + + /** + * 熔断监控 + */ + @GetMapping(value = "/fuse/monitoring") + public Map fuseMonitoring(){ + Map map = new HashMap<>(); + ThreadPoolExecutor pool = (ThreadPoolExecutor)threadPool.getExecutorService(); + int poolSize = pool.getPoolSize(); + long taskCount = pool.getTaskCount(); + int activeCount = pool.getActiveCount(); + long completedTaskCount = pool.getCompletedTaskCount(); + int corePoolSize = pool.getCorePoolSize(); + int largestPoolSize = pool.getLargestPoolSize(); + int maximumPoolSize = pool.getMaximumPoolSize(); + ThreadFactory threadFactory = pool.getThreadFactory(); + String threadFactoryName = threadFactory.getClass().getName(); + RejectedExecutionHandler rejectedExecutionHandler = pool.getRejectedExecutionHandler(); + String rejectedExecutionHandlerName = rejectedExecutionHandler.getClass().getName(); + BlockingQueue queue = pool.getQueue(); + int remainingCapacity = queue.remainingCapacity(); + map.put("poolSize",""+poolSize); + map.put("taskCount",""+taskCount); + map.put("activeCount",""+activeCount); + map.put("remainingCapacity",""+remainingCapacity); + map.put("completedTaskCount",""+completedTaskCount); + + map.put("corePoolSize",""+corePoolSize); + map.put("largestPoolSize",""+largestPoolSize); + map.put("maximumPoolSize",""+maximumPoolSize); + map.put("threadFactoryName",threadFactoryName); + map.put("rejectedExecutionHandlerName",rejectedExecutionHandlerName); + return map; + } + + + @GetMapping(value = "/fuse2/monitoring") + public Map fuse2Monitoring(){ + Map map = new HashMap<>(); + map.put("open num",""+ FuseContext.fuse2StartNumber.get()); + map.put("close num",""+ FuseContext.fuse2EndNumber.get()); + return map; + } } + + diff --git a/connect-core/src/main/java/org/needcoke/rpc/fuse/Fuse.java b/connect-core/src/main/java/org/needcoke/rpc/fuse/Fuse.java index fe9d895..75d8574 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/fuse/Fuse.java +++ b/connect-core/src/main/java/org/needcoke/rpc/fuse/Fuse.java @@ -3,6 +3,7 @@ package org.needcoke.rpc.fuse; import lombok.extern.slf4j.Slf4j; import java.util.Map; +import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Lock; @@ -10,9 +11,9 @@ import java.util.concurrent.locks.LockSupport; import java.util.concurrent.locks.ReentrantLock; @Slf4j -public class Fuse implements Runnable { +public class Fuse extends Thread { - private Lock lock = new ReentrantLock(); + private final ReentrantLock lock = new ReentrantLock(); private long timeout; @@ -27,14 +28,20 @@ public class Fuse implements Runnable { private static final Map unParkThreadMap = new ConcurrentHashMap<>(); private static final Map unParkMap = new ConcurrentHashMap<>(); - private static final Map lockMap = new ConcurrentHashMap<>(); + private static ArrayBlockingQueue blockQueue; + + public static void setBlockQueue(ArrayBlockingQueue blockQueue) { + Fuse.blockQueue = blockQueue; + } public Fuse(long timeout, TimeUnit unit, Object lockField) { this.timeout = timeout; this.unit = unit; this.lockField = lockField; this.unParkThread = Thread.currentThread(); - lockMap.put(lockField, lock); + FuseContext.lockPool.put(lockField, lock); + unParkMap.put(lockField, true); + unParkThreadMap.put(lockField, unParkThread); } public Fuse(long timeout, Object lockField) { @@ -42,14 +49,14 @@ public class Fuse implements Runnable { this.unit = TimeUnit.MILLISECONDS; this.lockField = lockField; this.unParkThread = Thread.currentThread(); - lockMap.put(lockField, lock); + FuseContext.lockPool.put(lockField, lock); + unParkMap.put(lockField, true); + unParkThreadMap.put(lockField, unParkThread); } @Override public void run() { - unParkMap.put(lockField, true); - unParkThreadMap.put(lockField, unParkThread); try { unit.sleep(timeout); } catch (InterruptedException e) { @@ -66,7 +73,7 @@ public class Fuse implements Runnable { throw new RuntimeException(e); } finally { lock.unlock(); - lockMap.remove(lockField); + FuseContext.lockPool.remove(lockField); unParkMap.remove(lockField); unParkThreadMap.remove(lockField); } @@ -75,7 +82,7 @@ public class Fuse implements Runnable { } public static boolean unPark(Object lockField) { - Lock tLock = lockMap.get(lockField); + Lock tLock = FuseContext.lockPool.get(lockField); if(tLock.tryLock()) { tLock.lock(); try { @@ -88,7 +95,7 @@ public class Fuse implements Runnable { throw new RuntimeException(e); }finally { tLock.unlock(); - lockMap.remove(lockField); + FuseContext.lockPool.remove(lockField); } } return false; diff --git a/connect-core/src/main/java/org/needcoke/rpc/fuse/FuseContext.java b/connect-core/src/main/java/org/needcoke/rpc/fuse/FuseContext.java new file mode 100644 index 0000000..a970fe3 --- /dev/null +++ b/connect-core/src/main/java/org/needcoke/rpc/fuse/FuseContext.java @@ -0,0 +1,18 @@ +package org.needcoke.rpc.fuse; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.locks.ReentrantLock; + +public class FuseContext { + + /** + * 拒绝策略锁池 + */ + public static final Map lockPool = new ConcurrentHashMap<>(); + + public static AtomicInteger fuse2StartNumber = new AtomicInteger(0); + + public static AtomicInteger fuse2EndNumber = new AtomicInteger(0); +} diff --git a/connect-core/src/main/java/org/needcoke/rpc/fuse/FuseReportDTO.java b/connect-core/src/main/java/org/needcoke/rpc/fuse/FuseReportDTO.java new file mode 100644 index 0000000..1b0a290 --- /dev/null +++ b/connect-core/src/main/java/org/needcoke/rpc/fuse/FuseReportDTO.java @@ -0,0 +1,42 @@ +package org.needcoke.rpc.fuse; + +import lombok.Data; +import org.needcoke.rpc.config.FuseConfig; + +import java.io.Serializable; + +@Data +public class FuseReportDTO implements Serializable { + + /** + * 未释放的锁的数量 + */ + private int unParkLockNumber; + + /** + * 阻塞住的线程数量 + */ + private int parkThreadNumber; + + /** + * 未解锁的请求数量 + */ + private int unParkNumber; + + /** + * 关于熔断的一些基础配置 + */ + private FuseConfig fuseConfig; + + /** + * 被熔断掉的任务数量 + */ + private int fuseRequestNumber; + + /** + * 实时线程池线程数 + */ + private int poolSize; + + +} diff --git a/connect-core/src/main/java/org/needcoke/rpc/fuse/FuseThreadPool.java b/connect-core/src/main/java/org/needcoke/rpc/fuse/FuseThreadPool.java index 0c4e167..065ff6b 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/fuse/FuseThreadPool.java +++ b/connect-core/src/main/java/org/needcoke/rpc/fuse/FuseThreadPool.java @@ -22,9 +22,6 @@ public class FuseThreadPool { private final ThreadFactory namedThreadFactory = new ThreadFactoryBuilder().setNameFormat("coke-connect-Fuse-pool-%d").build(); - - - /** * corePoolSize 线程池核心池的大小 * maximumPoolSize 线程池中允许的最大线程数量 @@ -38,12 +35,14 @@ public class FuseThreadPool { @PostConstruct public void init() { + ArrayBlockingQueue blockingQueue = new ArrayBlockingQueue<>(fuseConfig.getPoolCapacity()); + Fuse.setBlockQueue(blockingQueue); service = new ThreadPoolExecutor( fuseConfig.getCoreThreadPoolSize(), fuseConfig.getMaximumPoolSize(), fuseConfig.getKeepAliveTime(), TimeUnit.MILLISECONDS, - new ArrayBlockingQueue<>(fuseConfig.getPoolCapacity()), + blockingQueue, namedThreadFactory, new ThreadPoolExecutor.AbortPolicy() ); diff --git a/connect-link-tracking/src/main/java/org/connect/rpc/link/tracking/config/LinkTrackingContextHolder.java b/connect-link-tracking/src/main/java/org/connect/rpc/link/tracking/config/LinkTrackingContextHolder.java index cf155a2..9c8c15a 100644 --- a/connect-link-tracking/src/main/java/org/connect/rpc/link/tracking/config/LinkTrackingContextHolder.java +++ b/connect-link-tracking/src/main/java/org/connect/rpc/link/tracking/config/LinkTrackingContextHolder.java @@ -2,15 +2,19 @@ package org.connect.rpc.link.tracking.config; import com.alibaba.ttl.TransmittableThreadLocal; import lombok.experimental.UtilityClass; +import org.connect.rpc.link.tracking.export.ExportHandle; import org.connect.rpc.link.tracking.net.LinkTracking; @UtilityClass public class LinkTrackingContextHolder { + private final ExportHandle exportHandle = new ExportHandle(); + private final TransmittableThreadLocal THREAD_LOCAL_LINK_TRACKING = new TransmittableThreadLocal<>(); public void setLinkTracking(LinkTracking tracking) { THREAD_LOCAL_LINK_TRACKING.set(tracking); + exportHandle.in(); } public LinkTracking getLinkTracking() { @@ -19,6 +23,7 @@ public class LinkTrackingContextHolder { public void clear() { THREAD_LOCAL_LINK_TRACKING.remove(); + exportHandle.out(); } diff --git a/connect-link-tracking/src/main/java/org/connect/rpc/link/tracking/export/ExportHandle.java b/connect-link-tracking/src/main/java/org/connect/rpc/link/tracking/export/ExportHandle.java new file mode 100644 index 0000000..fb3ddff --- /dev/null +++ b/connect-link-tracking/src/main/java/org/connect/rpc/link/tracking/export/ExportHandle.java @@ -0,0 +1,16 @@ +package org.connect.rpc.link.tracking.export; + +public class ExportHandle { + + public void in(){ + + } + + public void out(){ + + } + + public void exception(){ + + } +} diff --git a/connect-link-tracking/src/main/java/org/connect/rpc/link/tracking/net/LinkTracking.java b/connect-link-tracking/src/main/java/org/connect/rpc/link/tracking/net/LinkTracking.java index 1542956..db4d4e6 100644 --- a/connect-link-tracking/src/main/java/org/connect/rpc/link/tracking/net/LinkTracking.java +++ b/connect-link-tracking/src/main/java/org/connect/rpc/link/tracking/net/LinkTracking.java @@ -27,6 +27,8 @@ public class LinkTracking { private String serviceId; + private long startTime; + private static final AtomicLong requestIdMaker = new AtomicLong(1); public LinkTracking(int port) { diff --git a/connect-link-tracking/src/main/java/org/connect/rpc/link/tracking/util/TrackingUtil.java b/connect-link-tracking/src/main/java/org/connect/rpc/link/tracking/util/TrackingUtil.java index 8103c80..fc8da87 100644 --- a/connect-link-tracking/src/main/java/org/connect/rpc/link/tracking/util/TrackingUtil.java +++ b/connect-link-tracking/src/main/java/org/connect/rpc/link/tracking/util/TrackingUtil.java @@ -19,6 +19,7 @@ public class TrackingUtil { if (StrUtil.isEmpty(cokeRequestIdJson)) { LinkTracking linkTracking = new LinkTracking(port); linkTracking.setIndex(1); + linkTracking.setStartTime(System.currentTimeMillis()); LinkTrackingContextHolder.setLinkTracking(linkTracking); } else { LinkTracking linkTracking = gson.fromJson(cokeRequestIdJson, LinkTracking.class); diff --git a/connect-server-netty/src/main/java/org/needcoke/rpc/netty/client/NettySession.java b/connect-server-netty/src/main/java/org/needcoke/rpc/netty/client/NettySession.java deleted file mode 100644 index f216acc..0000000 --- a/connect-server-netty/src/main/java/org/needcoke/rpc/netty/client/NettySession.java +++ /dev/null @@ -1,4 +0,0 @@ -package org.needcoke.rpc.netty.client; - -public class NettySession { -} diff --git a/connect-server-netty/src/main/java/org/needcoke/rpc/netty/invoker/NettyInvoker.java b/connect-server-netty/src/main/java/org/needcoke/rpc/netty/invoker/NettyInvoker.java index 83e97d0..f143fe2 100644 --- a/connect-server-netty/src/main/java/org/needcoke/rpc/netty/invoker/NettyInvoker.java +++ b/connect-server-netty/src/main/java/org/needcoke/rpc/netty/invoker/NettyInvoker.java @@ -4,6 +4,7 @@ import cn.hutool.core.date.DateUtil; import io.netty.channel.Channel; import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.connect.rpc.link.tracking.config.LinkTrackingContextHolder; import org.connect.rpc.link.tracking.util.TrackingUtil; import org.needcoke.rpc.codec.CokeRequest; import org.needcoke.rpc.common.constant.ConnectConstant; @@ -57,9 +58,7 @@ public class NettyInvoker extends ConnectInvoker { .addHeader(TrackingUtil.headerKey(), TrackingUtil.headerValue()); byte[] bytes = request.toBytes(); InvokeResult tmp = new InvokeResult(); - long start = DateUtil.current(); ConnectUtil.putRequestMap(tmp); - try { channel.writeAndFlush(request); } catch (Exception e) { @@ -80,8 +79,9 @@ public class NettyInvoker extends ConnectInvoker { fuseThreadPool.newTask(fuse); LockSupport.park(); InvokeResult result = ConnectUtil.getFromRequestMap(TrackingUtil.getRequestId()); + long start = LinkTrackingContextHolder.getLinkTracking().getStartTime(); long end = DateUtil.current(); - log.info("requestId = {} , start = {} , end = {} ,cost = {}", TrackingUtil.getRequestId(), start, end, end - start); + log.debug("requestId = {} , start = {} , end = {} ,cost = {}", TrackingUtil.getRequestId(), start, end, end - start); result.setTime(end - start); return result; } diff --git a/connect-server-netty/src/main/java/org/needcoke/rpc/netty/processor/ReadMessageClientProcessor.java b/connect-server-netty/src/main/java/org/needcoke/rpc/netty/processor/ReadMessageClientProcessor.java index 19b7c43..742de28 100644 --- a/connect-server-netty/src/main/java/org/needcoke/rpc/netty/processor/ReadMessageClientProcessor.java +++ b/connect-server-netty/src/main/java/org/needcoke/rpc/netty/processor/ReadMessageClientProcessor.java @@ -17,7 +17,7 @@ public class ReadMessageClientProcessor implements ReadMessageProcessor { @Override public void channelRead(ChannelHandlerContext ctx, CokeRequest request) { if (ConnectRequestEnum.INTERNAL_RESPONSE == request.getRequestType()) { - log.info("netty client receive back linkTracking = {} , request json = {}", + log.debug("netty client receive back linkTracking = {} , request json = {}", TrackingUtil.linkTrackingJsonStr(), new String(request.toBytes())); boolean bool = Fuse.unPark(request.getCokeRequestId()); if(bool) { diff --git a/connect-server-netty/src/main/java/org/needcoke/rpc/netty/processor/ReadMessageServerProcessor.java b/connect-server-netty/src/main/java/org/needcoke/rpc/netty/processor/ReadMessageServerProcessor.java index 1ae9d02..d2cbe6d 100644 --- a/connect-server-netty/src/main/java/org/needcoke/rpc/netty/processor/ReadMessageServerProcessor.java +++ b/connect-server-netty/src/main/java/org/needcoke/rpc/netty/processor/ReadMessageServerProcessor.java @@ -26,7 +26,7 @@ public class ReadMessageServerProcessor implements ReadMessageProcessor{ String beanName = request.getBeanName(); String methodName = request.getMethodName(); Map params = request.getParams(); - log.info("execute netty linkTracking = {} , -- beanName : {} , methodName : {} , param : {}", + log.debug("execute netty linkTracking = {} , -- beanName : {} , methodName : {} , param : {}", TrackingUtil.linkTrackingJsonStr(), beanName, methodName, JSONObject.toJSONString(params)); Method method = SpringContextUtils.getMethod(beanName, methodName); if (null == method) { @@ -35,7 +35,7 @@ public class ReadMessageServerProcessor implements ReadMessageProcessor{ } Object bean = SpringContextUtils.getBean(beanName); try { - Object invoke = null; + Object invoke; if (CollUtil.isEmpty(params)) { invoke = method.invoke(bean); } else { diff --git a/connect-server-smart-socket/src/main/java/org/needcoke/rpc/smartsocket/invoker/SmartSocketInvoker.java b/connect-server-smart-socket/src/main/java/org/needcoke/rpc/smartsocket/invoker/SmartSocketInvoker.java index a35a3fe..d546427 100644 --- a/connect-server-smart-socket/src/main/java/org/needcoke/rpc/smartsocket/invoker/SmartSocketInvoker.java +++ b/connect-server-smart-socket/src/main/java/org/needcoke/rpc/smartsocket/invoker/SmartSocketInvoker.java @@ -6,10 +6,10 @@ import lombok.extern.slf4j.Slf4j; import org.connect.rpc.link.tracking.config.LinkTrackingContextHolder; import org.connect.rpc.link.tracking.util.TrackingUtil; import org.needcoke.rpc.codec.CokeRequest; +import org.needcoke.rpc.fuse.Fuse; import org.needcoke.rpc.smartsocket.codec.CokeRequestProtocol; import org.needcoke.rpc.common.constant.ConnectConstant; import org.needcoke.rpc.common.enums.ConnectionExceptionEnum; -import org.needcoke.rpc.common.enums.RpcTypeEnum; import org.needcoke.rpc.common.exception.CokeConnectException; import org.needcoke.rpc.invoker.ConnectInvoker; import org.needcoke.rpc.invoker.InvokeResult; @@ -64,6 +64,8 @@ public class SmartSocketInvoker extends ConnectInvoker { .setParams(params) .addHeader(TrackingUtil.headerKey(), TrackingUtil.headerValue()); byte[] bytes = request.toBytes(); + InvokeResult tmp = new InvokeResult(); + ConnectUtil.putRequestMap(tmp); try { session.writeBuffer().writeInt(bytes.length); session.writeBuffer().write(bytes); @@ -82,12 +84,11 @@ public class SmartSocketInvoker extends ConnectInvoker { sessionMap.put(uri,session); return execute(connector,instance,beanName,methodName,params); } - InvokeResult tmp = new InvokeResult(); - long start = DateUtil.current(); - ConnectUtil.putRequestMap(tmp); - ConnectUtil.putThreadMap(TrackingUtil.getRequestId(), Thread.currentThread()); + Fuse fuse = new Fuse(fuseConfig.getFuseTimeOut(), TrackingUtil.getRequestId()); + fuseThreadPool.newTask(fuse); LockSupport.park(); InvokeResult result = ConnectUtil.getFromRequestMap(TrackingUtil.getRequestId()); + long start = LinkTrackingContextHolder.getLinkTracking().getStartTime(); long end = DateUtil.current(); log.info("requestId = {} , start = {} , end = {} ,cost = {}", TrackingUtil.getRequestId(), start, end, end - start); result.setTime(end - start); diff --git a/connect-server-smart-socket/src/main/java/org/needcoke/rpc/smartsocket/processor/SmartSocketClientProcessor.java b/connect-server-smart-socket/src/main/java/org/needcoke/rpc/smartsocket/processor/SmartSocketClientProcessor.java index ec432b5..ebacc1a 100644 --- a/connect-server-smart-socket/src/main/java/org/needcoke/rpc/smartsocket/processor/SmartSocketClientProcessor.java +++ b/connect-server-smart-socket/src/main/java/org/needcoke/rpc/smartsocket/processor/SmartSocketClientProcessor.java @@ -4,6 +4,7 @@ import lombok.extern.slf4j.Slf4j; import org.connect.rpc.link.tracking.util.TrackingUtil; import org.needcoke.rpc.codec.CokeRequest; import org.needcoke.rpc.common.enums.ConnectRequestEnum; +import org.needcoke.rpc.fuse.Fuse; import org.needcoke.rpc.utils.ConnectUtil; import org.smartboot.socket.transport.AioSession; @@ -15,11 +16,12 @@ public class SmartSocketClientProcessor extends SmartSocketMessageProcessor implements MessageProcessor writer.flush(); } catch (IOException e) { throw new RuntimeException(e); - // TODO 未来需要处理返回失败的场景 } } -- Gitee From 2d4ce17943c1e409ef7893d967d48f7986ea0224 Mon Sep 17 00:00:00 2001 From: warren Date: Mon, 27 Jun 2022 17:32:12 +0800 Subject: [PATCH 17/22] =?UTF-8?q?=E6=96=B0=E5=A2=9ErpcClient?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../needcoke/c/controller/CController.java | 1 - .../needcoke/rpc/annotation/RpcClient.java | 8 + .../rpc/config/RpcClientRegister.java | 174 ++++++++++++++++++ .../rpc/proxy/ClientProxyCreateFactory.java | 58 ++++++ .../rpc/proxy/RpcClientFactoryBean.java | 100 ++++++++++ 5 files changed, 340 insertions(+), 1 deletion(-) create mode 100644 connect-core/src/main/java/org/needcoke/rpc/config/RpcClientRegister.java create mode 100644 connect-core/src/main/java/org/needcoke/rpc/proxy/ClientProxyCreateFactory.java create mode 100644 connect-core/src/main/java/org/needcoke/rpc/proxy/RpcClientFactoryBean.java diff --git a/business-c/src/main/java/org/needcoke/c/controller/CController.java b/business-c/src/main/java/org/needcoke/c/controller/CController.java index 70fac5e..c87bb95 100644 --- a/business-c/src/main/java/org/needcoke/c/controller/CController.java +++ b/business-c/src/main/java/org/needcoke/c/controller/CController.java @@ -15,7 +15,6 @@ import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.util.HashMap; import java.util.Map; -import java.util.concurrent.atomic.AtomicInteger; @Component("cCon") @Rpc diff --git a/connect-core/src/main/java/org/needcoke/rpc/annotation/RpcClient.java b/connect-core/src/main/java/org/needcoke/rpc/annotation/RpcClient.java index 14b0bf8..df13bb7 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/annotation/RpcClient.java +++ b/connect-core/src/main/java/org/needcoke/rpc/annotation/RpcClient.java @@ -7,6 +7,14 @@ import java.lang.annotation.*; @Documented public @interface RpcClient { + String name() default ""; + + String value() default ""; + + String beanName(); + String serviceId(); + + } diff --git a/connect-core/src/main/java/org/needcoke/rpc/config/RpcClientRegister.java b/connect-core/src/main/java/org/needcoke/rpc/config/RpcClientRegister.java new file mode 100644 index 0000000..c2fb65e --- /dev/null +++ b/connect-core/src/main/java/org/needcoke/rpc/config/RpcClientRegister.java @@ -0,0 +1,174 @@ +package org.needcoke.rpc.config; + +import org.needcoke.rpc.annotation.RpcClient; +import org.needcoke.rpc.proxy.RpcClientFactoryBean; +import org.springframework.beans.factory.annotation.AnnotatedBeanDefinition; +import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.beans.factory.config.BeanDefinitionHolder; +import org.springframework.beans.factory.support.AbstractBeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.support.BeanDefinitionReaderUtils; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.context.EnvironmentAware; +import org.springframework.context.ResourceLoaderAware; +import org.springframework.context.annotation.ClassPathBeanDefinitionScanner; +import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider; +import org.springframework.context.annotation.ImportBeanDefinitionRegistrar; +import org.springframework.core.env.Environment; +import org.springframework.core.io.ResourceLoader; +import org.springframework.core.type.AnnotationMetadata; +import org.springframework.core.type.filter.AnnotationTypeFilter; +import org.springframework.util.Assert; +import org.springframework.util.ClassUtils; +import org.springframework.util.StringUtils; + +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +public class RpcClientRegister implements ImportBeanDefinitionRegistrar, ResourceLoaderAware, EnvironmentAware { + + /** + * 资源加载器 + */ + private ResourceLoader resourceLoader; + /** + * 环境 + */ + private Environment environment; + + @Override + public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) { + // 创建scanner + ClassPathScanningCandidateComponentProvider scanner = getScanner(); + scanner.setResourceLoader(resourceLoader); + + // 设置扫描器scanner扫描的过滤条件 + AnnotationTypeFilter annotationTypeFilter = new AnnotationTypeFilter(RpcClient.class); + scanner.addIncludeFilter(annotationTypeFilter); + + // 获取指定要扫描的basePackages + Set basePackages = getBasePackages(metadata); + + ClassPathBeanDefinitionScanner classPathBeanDefinitionScanner = new ClassPathBeanDefinitionScanner(registry, true, environment); + classPathBeanDefinitionScanner. + + // 遍历每一个basePackages + for (String basePackage : basePackages) { + + // 通过scanner获取basePackage下的候选类(有标@SimpleRpcClient注解的类) + Set candidateComponents = scanner.findCandidateComponents(basePackage); + // 遍历每一个候选类,如果符合条件就把他们注册到容器 + for (BeanDefinition candidateComponent : candidateComponents) { + if (candidateComponent instanceof AnnotatedBeanDefinition) { + // verify annotated class is an interface + AnnotatedBeanDefinition beanDefinition = (AnnotatedBeanDefinition) candidateComponent; + AnnotationMetadata annotationMetadata = beanDefinition.getMetadata(); + Assert.isTrue(annotationMetadata.isInterface(), "@SimpleRpcClient can only be specified on an interface"); + // 获取@SimpleRpcClient注解的属性 + Map attributes = annotationMetadata.getAnnotationAttributes(RpcClient.class.getCanonicalName()); + // 注册到容器 + registerSimpleRpcClient(registry, annotationMetadata, attributes); + } + } + } + } + + /** + * 利用factoryBean创建代理对象,并注册到容器 + */ + private static void registerSimpleRpcClient(BeanDefinitionRegistry registry, + AnnotationMetadata annotationMetadata, + Map attributes) { + // 类名(接口全限定名) + String className = annotationMetadata.getClassName(); + // 创建SimpleRpcClientFactoryBean的BeanDefinition + BeanDefinitionBuilder definition = BeanDefinitionBuilder.genericBeanDefinition(RpcClientFactoryBean.class); + // 解析出@SimpleRpcClient注解的name + String name = getName(attributes); + if (!StringUtils.hasText(name)) { + throw new RuntimeException(String.format("class [%s] , @SimpleRpcClient name or value can not be null, please check.", className)); + } + + // 给factoryBean添加属性值 + definition.addPropertyValue("name", name); + definition.addPropertyValue("type", className); + definition.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_TYPE); + String alias = name + "SimpleRpcClient"; + AbstractBeanDefinition beanDefinition = definition.getBeanDefinition(); + + // 注册bean定义信息到容器 + BeanDefinitionHolder holder = new BeanDefinitionHolder(beanDefinition, className, new String[]{alias}); + BeanDefinitionReaderUtils.registerBeanDefinition(holder, registry); + } + + /** + * 创建扫描器 + */ + protected ClassPathScanningCandidateComponentProvider getScanner() { + return new ClassPathScanningCandidateComponentProvider(false, environment) { + @Override + protected boolean isCandidateComponent(AnnotatedBeanDefinition beanDefinition) { + boolean isCandidate = false; + if (beanDefinition.getMetadata().isIndependent()) { + if (!beanDefinition.getMetadata().isAnnotation()) { + isCandidate = true; + } + } + return isCandidate; + } + }; + } + + /** + * 获取base packages + */ + protected static Set getBasePackages(AnnotationMetadata importingClassMetadata) { + // 获取到@EnableSimpleRpcClients注解所有属性 + Map attributes = importingClassMetadata.getAnnotationAttributes(EnableSimpleRpcClients.class.getCanonicalName()); + Set basePackages = new HashSet<>(); + assert attributes != null; + // value 属性是否有配置值,如果有则添加 + for (String pkg : (String[]) attributes.get("value")) { + if (StringUtils.hasText(pkg)) { + basePackages.add(pkg); + } + } + + // basePackages 属性是否有配置值,如果有则添加 + for (String pkg : (String[]) attributes.get("basePackages")) { + if (StringUtils.hasText(pkg)) { + basePackages.add(pkg); + } + } + + // 如果上面两步都没有获取到basePackages,那么这里就默认使用当前项目启动类所在的包为basePackages + if (basePackages.isEmpty()) { + basePackages.add(ClassUtils.getPackageName(importingClassMetadata.getClassName())); + } + + return basePackages; + } + + /** + * 获取name + */ + protected static String getName(Map attributes) { + String name = (String) attributes.get("name"); + if (!StringUtils.hasText(name)) { + name = (String) attributes.get("value"); + } + return name; + } + + @Override + public void setEnvironment(Environment environment) { + this.environment = environment; + } + + @Override + public void setResourceLoader(ResourceLoader resourceLoader) { + this.resourceLoader = resourceLoader; + } +} + diff --git a/connect-core/src/main/java/org/needcoke/rpc/proxy/ClientProxyCreateFactory.java b/connect-core/src/main/java/org/needcoke/rpc/proxy/ClientProxyCreateFactory.java new file mode 100644 index 0000000..26cbeb6 --- /dev/null +++ b/connect-core/src/main/java/org/needcoke/rpc/proxy/ClientProxyCreateFactory.java @@ -0,0 +1,58 @@ +package org.needcoke.rpc.proxy; + +import cn.hutool.core.util.StrUtil; +import lombok.extern.slf4j.Slf4j; +import org.needcoke.rpc.annotation.RpcClient; +import org.needcoke.rpc.invoker.InvokeResult; +import org.needcoke.rpc.net.ConnectorFactory; +import org.needcoke.rpc.utils.SpringContextUtils; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.util.HashMap; +import java.util.Map; + +/** + * 客户端代理创建工厂 + */ +@Slf4j +public class ClientProxyCreateFactory { + + /** + * 通过接口的class创建该接口的代理对象(这里直接基于JDK提供的创建动态代理的工具来创建代理对象) + * + * @param serviceClass 接口的class + * @return T 代理对象 + */ + public static T getProxyService(Class serviceClass) { + // 该接口的Class对象是被那个类加载器加载的 + ClassLoader classLoader = serviceClass.getClassLoader(); + // 获取到该接口所有的interface + Class[] interfaces = {serviceClass}; + RpcClient rpcClient = serviceClass.getAnnotation(RpcClient.class); + String providerName = StrUtil.isBlank(rpcClient.name()) ? rpcClient.value() : rpcClient.name(); + + // jdk代理必须的handler,代理对象的方法执行就会调用这里的invoke方法。自动传入调用的方法 + 方法参数 + InvocationHandler invocationHandler = new InvocationHandler() { + @Override + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + ConnectorFactory connectorFactory = SpringContextUtils.getBean(ConnectorFactory.class); + if(StrUtil.isEmpty(rpcClient.serviceId())){ + throw new RuntimeException(serviceClass.getName()+" need serviceId"); + } + Map params = new HashMap<>(); + for (int i = 1; i <= args.length; i++) { + params.put("arg"+i,args[i]); + } + InvokeResult result = connectorFactory.connector(rpcClient.serviceId()).execute(rpcClient.beanName(), method.getName(), params); + return result.getBody(); + } + }; + + Object proxy = Proxy.newProxyInstance(classLoader, interfaces, invocationHandler); + + // 返回代理对象 + return (T) proxy; + } +} diff --git a/connect-core/src/main/java/org/needcoke/rpc/proxy/RpcClientFactoryBean.java b/connect-core/src/main/java/org/needcoke/rpc/proxy/RpcClientFactoryBean.java new file mode 100644 index 0000000..a6fea93 --- /dev/null +++ b/connect-core/src/main/java/org/needcoke/rpc/proxy/RpcClientFactoryBean.java @@ -0,0 +1,100 @@ +package org.needcoke.rpc.proxy; + +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.FactoryBean; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.util.Assert; + +import java.util.Objects; + +public class RpcClientFactoryBean implements FactoryBean, InitializingBean, ApplicationContextAware { + + /** + * 服务提供者名称 + */ + private String name; + + /** + * object类型 + */ + private Class type; + + private ApplicationContext applicationContext; + + @Override + public void afterPropertiesSet() throws Exception { + Assert.hasText(name, "Name must be set"); + } + + @Override + public void setApplicationContext(ApplicationContext context) throws BeansException { + applicationContext = context; + } + + @Override + public Object getObject() throws Exception { + // todo do something + // 创建一个代理对象并返回 + return ClientProxyCreateFactory.getProxyService(type); + } + + @Override + public Class getObjectType() { + return type; + } + + @Override + public boolean isSingleton() { + return true; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Class getType() { + return type; + } + + public void setType(Class type) { + this.type = type; + } + + public ApplicationContext getApplicationContext() { + return applicationContext; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + RpcClientFactoryBean that = (RpcClientFactoryBean) o; + return Objects.equals(name, that.name) && + Objects.equals(type, that.type) && + Objects.equals(applicationContext, that.applicationContext); + } + + @Override + public int hashCode() { + return Objects.hash(name, type, applicationContext); + } + + @Override + public String toString() { + return "SimpleRpcClientFactoryBean{" + + "name='" + name + '\'' + + ", type=" + type + + ", applicationContext=" + applicationContext + + '}'; + } +} \ No newline at end of file -- Gitee From 66fe30c2275fa28ef481cf2e62415ccc78023962 Mon Sep 17 00:00:00 2001 From: warren Date: Mon, 27 Jun 2022 18:34:43 +0800 Subject: [PATCH 18/22] =?UTF-8?q?=E6=96=B0=E5=A2=9ErpcClient?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/org/needcoke/rpc/config/RpcClientRegister.java | 1 - 1 file changed, 1 deletion(-) diff --git a/connect-core/src/main/java/org/needcoke/rpc/config/RpcClientRegister.java b/connect-core/src/main/java/org/needcoke/rpc/config/RpcClientRegister.java index c2fb65e..fb699b6 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/config/RpcClientRegister.java +++ b/connect-core/src/main/java/org/needcoke/rpc/config/RpcClientRegister.java @@ -51,7 +51,6 @@ public class RpcClientRegister implements ImportBeanDefinitionRegistrar, Resourc Set basePackages = getBasePackages(metadata); ClassPathBeanDefinitionScanner classPathBeanDefinitionScanner = new ClassPathBeanDefinitionScanner(registry, true, environment); - classPathBeanDefinitionScanner. // 遍历每一个basePackages for (String basePackage : basePackages) { -- Gitee From 1b72f6ca3d84187e176cb8d97e6aa54e3609ad0f Mon Sep 17 00:00:00 2001 From: warren Date: Wed, 29 Jun 2022 18:35:03 +0800 Subject: [PATCH 19/22] =?UTF-8?q?=E6=96=B0=E5=A2=9ErpcClient?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business-b/pom.xml | 4 +- .../java/org/needcoke/b/BApplication.java | 12 +- .../main/java/org/needcoke/b/client/ABC.java | 7 + .../java/org/needcoke/b/client/ConClient.java | 9 + .../needcoke/b/component/TestComponent.java | 28 +-- .../needcoke/b/controller/TestController.java | 8 +- business-c/pom.xml | 4 +- .../needcoke/c/controller/CController.java | 3 - bussiness-a/pom.xml | 4 +- connect-core/pom.xml | 4 +- .../rpc/annotation/EnableRpcClient.java | 32 +++ .../common/enums/ConnectionExceptionEnum.java | 2 +- .../rpc/common/enums/EnumInterface.java | 10 + .../rpc/common/enums/LoadExceptionEnum.java | 30 +++ .../exception/CokeConnectException.java | 5 +- .../rpc/config/CokeConfiguration.java | 2 +- .../rpc/config/RpcClientRegister.java | 200 +++++++++++++----- .../rpc/proxy/ClientProxyCreateFactory.java | 23 +- .../needcoke/rpc/proxy/InvocationHandler.java | 34 +++ .../org/needcoke/rpc/proxy/RpcClient.java | 4 + .../rpc/proxy/RpcClientFactoryBean.java | 6 +- connect-link-tracking/pom.xml | 4 +- connect-server-netty/pom.xml | 4 +- connect-server-smart-socket/pom.xml | 4 +- register-eureka/pom.xml | 4 +- register-nacos/pom.xml | 4 +- 26 files changed, 329 insertions(+), 122 deletions(-) create mode 100644 business-b/src/main/java/org/needcoke/b/client/ABC.java create mode 100644 business-b/src/main/java/org/needcoke/b/client/ConClient.java create mode 100644 connect-core/src/main/java/org/needcoke/rpc/annotation/EnableRpcClient.java create mode 100644 connect-core/src/main/java/org/needcoke/rpc/common/enums/EnumInterface.java create mode 100644 connect-core/src/main/java/org/needcoke/rpc/common/enums/LoadExceptionEnum.java create mode 100644 connect-core/src/main/java/org/needcoke/rpc/proxy/InvocationHandler.java create mode 100644 connect-core/src/main/java/org/needcoke/rpc/proxy/RpcClient.java diff --git a/business-b/pom.xml b/business-b/pom.xml index 7eff521..55c42d1 100644 --- a/business-b/pom.xml +++ b/business-b/pom.xml @@ -12,8 +12,8 @@ business-b - 11 - 11 + 8 + 8 diff --git a/business-b/src/main/java/org/needcoke/b/BApplication.java b/business-b/src/main/java/org/needcoke/b/BApplication.java index a1a0e71..1ef9387 100644 --- a/business-b/src/main/java/org/needcoke/b/BApplication.java +++ b/business-b/src/main/java/org/needcoke/b/BApplication.java @@ -1,18 +1,28 @@ package org.needcoke.b; +import org.needcoke.b.client.ConClient; +import org.needcoke.rpc.annotation.EnableRpcClient; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; +import org.springframework.context.ConfigurableApplicationContext; /** * @author Gilgamesh * @date 2022/4/2 */ +@EnableRpcClient(basePackages = {"org.needcoke.b.client"}) @EnableDiscoveryClient @SpringBootApplication public class BApplication { public static void main(String[] args) { - SpringApplication.run(BApplication.class, args); + try { + ConfigurableApplicationContext run = SpringApplication.run(BApplication.class, args); + Object conClient2 = run.getBean(ConClient.class); + System.out.println(123); + }catch (Exception e){ + e.printStackTrace(); + } } } diff --git a/business-b/src/main/java/org/needcoke/b/client/ABC.java b/business-b/src/main/java/org/needcoke/b/client/ABC.java new file mode 100644 index 0000000..33e0184 --- /dev/null +++ b/business-b/src/main/java/org/needcoke/b/client/ABC.java @@ -0,0 +1,7 @@ +package org.needcoke.b.client; + +import org.needcoke.rpc.annotation.Rpc; + +@Rpc +public interface ABC { +} diff --git a/business-b/src/main/java/org/needcoke/b/client/ConClient.java b/business-b/src/main/java/org/needcoke/b/client/ConClient.java new file mode 100644 index 0000000..a26d677 --- /dev/null +++ b/business-b/src/main/java/org/needcoke/b/client/ConClient.java @@ -0,0 +1,9 @@ +package org.needcoke.b.client; + +import org.needcoke.rpc.annotation.RpcClient; + +@RpcClient(name = "conClient2" , serviceId = "business-c" ,beanName = "cCon") +public interface ConClient extends org.needcoke.rpc.proxy.RpcClient { + + Object cTest2(String word); +} diff --git a/business-b/src/main/java/org/needcoke/b/component/TestComponent.java b/business-b/src/main/java/org/needcoke/b/component/TestComponent.java index a48e494..52861ac 100644 --- a/business-b/src/main/java/org/needcoke/b/component/TestComponent.java +++ b/business-b/src/main/java/org/needcoke/b/component/TestComponent.java @@ -20,24 +20,24 @@ public class TestComponent { // return new WeightedResponseTimeBalance(); // }d -// @Bean -// public NettyInvoker nettyInvoker(){ -// return new NettyInvoker(); -// } -// -// @Bean -// public NettyServer nettyServer(){ -// return new NettyServer(); -// } - @Bean - public SmartSocketInvoker smartSocketInvoker(){ - return new SmartSocketInvoker(); + public NettyInvoker nettyInvoker(){ + return new NettyInvoker(); } @Bean - public SmartSocketServer smartSocketServer(){ - return new SmartSocketServer(); + public NettyServer nettyServer(){ + return new NettyServer(); } +// +// @Bean +// public SmartSocketInvoker smartSocketInvoker(){ +// return new SmartSocketInvoker(); +// } +// +// @Bean +// public SmartSocketServer smartSocketServer(){ +// return new SmartSocketServer(); +// } } diff --git a/business-b/src/main/java/org/needcoke/b/controller/TestController.java b/business-b/src/main/java/org/needcoke/b/controller/TestController.java index a11d9aa..491e3ef 100644 --- a/business-b/src/main/java/org/needcoke/b/controller/TestController.java +++ b/business-b/src/main/java/org/needcoke/b/controller/TestController.java @@ -1,6 +1,7 @@ package org.needcoke.b.controller; import lombok.RequiredArgsConstructor; +import org.needcoke.b.client.ConClient; import org.needcoke.rpc.invoker.InvokeResult; import org.needcoke.rpc.loadBalance.LoadBalance; import org.needcoke.rpc.net.ConnectorFactory; @@ -27,12 +28,15 @@ public class TestController { private final ConnectorFactory connectorFactory; + private final ConClient client; + @GetMapping("test") public InvokeResult test(){ Map map = new HashMap<>(); map.put("word","刘勇是死废物"); - InvokeResult execute = connectorFactory.connector("bussiness-c").execute( "cCon", "cTest2", map); - return execute; + //InvokeResult execute = connectorFactory.connector("bussiness-c").execute( "cCon", "cTest2", map); + //return execute; + return new InvokeResult().setBody(client.cTest2("刘勇是死废物")); } @Resource diff --git a/business-c/pom.xml b/business-c/pom.xml index 1d10892..71104aa 100644 --- a/business-c/pom.xml +++ b/business-c/pom.xml @@ -12,8 +12,8 @@ business-c - 11 - 11 + 8 + 8 diff --git a/business-c/src/main/java/org/needcoke/c/controller/CController.java b/business-c/src/main/java/org/needcoke/c/controller/CController.java index c87bb95..436356e 100644 --- a/business-c/src/main/java/org/needcoke/c/controller/CController.java +++ b/business-c/src/main/java/org/needcoke/c/controller/CController.java @@ -2,11 +2,8 @@ package org.needcoke.c.controller; import org.needcoke.rpc.annotation.Call; import org.needcoke.rpc.annotation.Rpc; -import org.needcoke.rpc.common.enums.RpcTypeEnum; import org.needcoke.rpc.invoker.InvokeResult; import org.needcoke.rpc.net.ConnectorFactory; -import org.needcoke.rpc.netty.invoker.NettyInvoker; -import org.needcoke.rpc.netty.server.NettyServer; import org.needcoke.rpc.smartsocket.invoker.SmartSocketInvoker; import org.needcoke.rpc.smartsocket.server.SmartSocketServer; import org.springframework.context.annotation.Bean; diff --git a/bussiness-a/pom.xml b/bussiness-a/pom.xml index f6fc961..733d6f7 100644 --- a/bussiness-a/pom.xml +++ b/bussiness-a/pom.xml @@ -12,8 +12,8 @@ bussiness-a - 11 - 11 + 8 + 8 diff --git a/connect-core/pom.xml b/connect-core/pom.xml index 0d47aaa..00faf3f 100644 --- a/connect-core/pom.xml +++ b/connect-core/pom.xml @@ -12,8 +12,8 @@ connect-core - 11 - 11 + 8 + 8 diff --git a/connect-core/src/main/java/org/needcoke/rpc/annotation/EnableRpcClient.java b/connect-core/src/main/java/org/needcoke/rpc/annotation/EnableRpcClient.java new file mode 100644 index 0000000..cece67c --- /dev/null +++ b/connect-core/src/main/java/org/needcoke/rpc/annotation/EnableRpcClient.java @@ -0,0 +1,32 @@ +package org.needcoke.rpc.annotation; + +import org.needcoke.rpc.config.RpcClientRegister; +import org.springframework.context.annotation.Import; + +import java.lang.annotation.*; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +@Documented +@Import({RpcClientRegister.class}) +public @interface EnableRpcClient { + + + /** + * Alias for the {@link #basePackages()} attribute. Allows for more concise annotation + * declarations e.g.: {@code @ComponentScan("org.my.pkg")} instead of {@code @ComponentScan(basePackages="org.my.pkg")}. + * + * @return the array of 'basePackages'. + */ + String[] value() default {}; + + /** + * Base packages to scan for annotated components. + *

+ * {@link #value()} is an alias for (and mutually exclusive with) this attribute. + *

+ * + * @return the array of 'basePackages'. + */ + String[] basePackages() default {}; +} diff --git a/connect-core/src/main/java/org/needcoke/rpc/common/enums/ConnectionExceptionEnum.java b/connect-core/src/main/java/org/needcoke/rpc/common/enums/ConnectionExceptionEnum.java index b45990a..e14ec7f 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/common/enums/ConnectionExceptionEnum.java +++ b/connect-core/src/main/java/org/needcoke/rpc/common/enums/ConnectionExceptionEnum.java @@ -6,7 +6,7 @@ package org.needcoke.rpc.common.enums; * @author yanming * @date 2022/5/12 */ -public enum ConnectionExceptionEnum { +public enum ConnectionExceptionEnum implements EnumInterface{ NO_SUCH_BEAN_NAME("0001", "no such bean name", "没有找到对应的beanName的bean"), BEAN_WITHOUT_METHOD("0002", diff --git a/connect-core/src/main/java/org/needcoke/rpc/common/enums/EnumInterface.java b/connect-core/src/main/java/org/needcoke/rpc/common/enums/EnumInterface.java new file mode 100644 index 0000000..715e4c3 --- /dev/null +++ b/connect-core/src/main/java/org/needcoke/rpc/common/enums/EnumInterface.java @@ -0,0 +1,10 @@ +package org.needcoke.rpc.common.enums; + +public interface EnumInterface { + + String getErrorCode(); + String getNote() ; + + public String getValue(); + +} diff --git a/connect-core/src/main/java/org/needcoke/rpc/common/enums/LoadExceptionEnum.java b/connect-core/src/main/java/org/needcoke/rpc/common/enums/LoadExceptionEnum.java new file mode 100644 index 0000000..6764511 --- /dev/null +++ b/connect-core/src/main/java/org/needcoke/rpc/common/enums/LoadExceptionEnum.java @@ -0,0 +1,30 @@ +package org.needcoke.rpc.common.enums; + +public enum LoadExceptionEnum implements EnumInterface{ + RPC_CLIENT_SCAN_ANNOTATION_IS_NOT_ADDED_TO_THE_STARTUP_CLASS("001","Rpcclient scan annotation is not added to the startup class","没有在启动类加上RpcClient扫描注解"), + ; + + private final String code; + + private final String value; + + private final String note; + + LoadExceptionEnum(String code, String value, String note) { + this.code = code; + this.value = value; + this.note = note; + } + + public String getErrorCode() { + return "1002" + code; + } + + public String getNote() { + return note; + } + + public String getValue() { + return value; + } +} diff --git a/connect-core/src/main/java/org/needcoke/rpc/common/exception/CokeConnectException.java b/connect-core/src/main/java/org/needcoke/rpc/common/exception/CokeConnectException.java index eaa311f..3140d70 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/common/exception/CokeConnectException.java +++ b/connect-core/src/main/java/org/needcoke/rpc/common/exception/CokeConnectException.java @@ -3,6 +3,7 @@ package org.needcoke.rpc.common.exception; import lombok.Data; import org.connect.rpc.link.tracking.util.TrackingUtil; import org.needcoke.rpc.common.enums.ConnectionExceptionEnum; +import org.needcoke.rpc.common.enums.EnumInterface; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ResponseStatus; @@ -32,13 +33,13 @@ public class CokeConnectException extends RuntimeException { this.errorCode = errorCode; } - public CokeConnectException(ConnectionExceptionEnum connectionExceptionEnum) { + public CokeConnectException(EnumInterface connectionExceptionEnum) { super(connectionExceptionEnum.getValue()); this.errorCode = connectionExceptionEnum.getErrorCode(); this.note = connectionExceptionEnum.getNote(); } - public CokeConnectException(ConnectionExceptionEnum connectionExceptionEnum,Throwable e) { + public CokeConnectException(EnumInterface connectionExceptionEnum,Throwable e) { super(connectionExceptionEnum.getValue(),e); this.errorCode = connectionExceptionEnum.getErrorCode(); this.note = connectionExceptionEnum.getNote(); diff --git a/connect-core/src/main/java/org/needcoke/rpc/config/CokeConfiguration.java b/connect-core/src/main/java/org/needcoke/rpc/config/CokeConfiguration.java index 512f6c4..3e88d96 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/config/CokeConfiguration.java +++ b/connect-core/src/main/java/org/needcoke/rpc/config/CokeConfiguration.java @@ -2,7 +2,6 @@ package org.needcoke.rpc.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; - import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; @@ -29,4 +28,5 @@ public class CokeConfiguration { public Map classNameMethodMap(){ return new HashMap<>(); } + } diff --git a/connect-core/src/main/java/org/needcoke/rpc/config/RpcClientRegister.java b/connect-core/src/main/java/org/needcoke/rpc/config/RpcClientRegister.java index fb699b6..50b752f 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/config/RpcClientRegister.java +++ b/connect-core/src/main/java/org/needcoke/rpc/config/RpcClientRegister.java @@ -1,5 +1,7 @@ package org.needcoke.rpc.config; +import cn.hutool.core.util.StrUtil; +import org.needcoke.rpc.annotation.EnableRpcClient; import org.needcoke.rpc.annotation.RpcClient; import org.needcoke.rpc.proxy.RpcClientFactoryBean; import org.springframework.beans.factory.annotation.AnnotatedBeanDefinition; @@ -11,21 +13,27 @@ import org.springframework.beans.factory.support.BeanDefinitionReaderUtils; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.context.EnvironmentAware; import org.springframework.context.ResourceLoaderAware; -import org.springframework.context.annotation.ClassPathBeanDefinitionScanner; import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider; import org.springframework.context.annotation.ImportBeanDefinitionRegistrar; import org.springframework.core.env.Environment; import org.springframework.core.io.ResourceLoader; import org.springframework.core.type.AnnotationMetadata; +import org.springframework.core.type.classreading.MetadataReader; +import org.springframework.core.type.classreading.MetadataReaderFactory; import org.springframework.core.type.filter.AnnotationTypeFilter; +import org.springframework.core.type.filter.TypeFilter; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.util.StringUtils; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; +import java.io.IOException; +import java.util.*; +/** + * simple rpc 客户端扫描注册器 + * + * @author Mr_wenpan@163.com 2022/1/19 2:11 下午 + */ public class RpcClientRegister implements ImportBeanDefinitionRegistrar, ResourceLoaderAware, EnvironmentAware { /** @@ -37,72 +45,143 @@ public class RpcClientRegister implements ImportBeanDefinitionRegistrar, Resourc */ private Environment environment; + public RpcClientRegister() { + } + + @Override + public void setResourceLoader(ResourceLoader resourceLoader) { + this.resourceLoader = resourceLoader; + } + + @Override + public void setEnvironment(Environment environment) { + this.environment = environment; + } + @Override - public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) { - // 创建scanner + public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { + // 注册bean客户端 + registerSimpleRpcClients(importingClassMetadata, registry); + } + + /** + * 注册simple rpc 客户端 + */ + public void registerSimpleRpcClients(AnnotationMetadata metadata, BeanDefinitionRegistry registry) { ClassPathScanningCandidateComponentProvider scanner = getScanner(); scanner.setResourceLoader(resourceLoader); - // 设置扫描器scanner扫描的过滤条件 AnnotationTypeFilter annotationTypeFilter = new AnnotationTypeFilter(RpcClient.class); + // 这里只会走if,暂时不会走else去 scanner.addIncludeFilter(annotationTypeFilter); - - // 获取指定要扫描的basePackages Set basePackages = getBasePackages(metadata); - ClassPathBeanDefinitionScanner classPathBeanDefinitionScanner = new ClassPathBeanDefinitionScanner(registry, true, environment); - // 遍历每一个basePackages for (String basePackage : basePackages) { - - // 通过scanner获取basePackage下的候选类(有标@SimpleRpcClient注解的类) + // 通过scanner获取候选组件 Set candidateComponents = scanner.findCandidateComponents(basePackage); - // 遍历每一个候选类,如果符合条件就把他们注册到容器 for (BeanDefinition candidateComponent : candidateComponents) { if (candidateComponent instanceof AnnotatedBeanDefinition) { // verify annotated class is an interface AnnotatedBeanDefinition beanDefinition = (AnnotatedBeanDefinition) candidateComponent; AnnotationMetadata annotationMetadata = beanDefinition.getMetadata(); Assert.isTrue(annotationMetadata.isInterface(), "@SimpleRpcClient can only be specified on an interface"); - // 获取@SimpleRpcClient注解的属性 + // 获取SimpleRpcClient注解的属性 Map attributes = annotationMetadata.getAnnotationAttributes(RpcClient.class.getCanonicalName()); - // 注册到容器 - registerSimpleRpcClient(registry, annotationMetadata, attributes); + registerSimpleRpcClient(registry, annotationMetadata, attributes,beanDefinition); } } } } + public Class getClass(String beanClassName){ + try { + return Class.forName(beanClassName); + } catch (ClassNotFoundException e) { + throw new RuntimeException(e); + } + } + /** - * 利用factoryBean创建代理对象,并注册到容器 + * 注册simple rpc 客户端 + * + * @param registry bean定义信息注册器 + * @param annotationMetadata 元数据 + * @param attributes @SimpleRpcClient注解的属性 + * @author Mr_wenpan@163.com 2022/1/19 2:48 下午 */ - private static void registerSimpleRpcClient(BeanDefinitionRegistry registry, - AnnotationMetadata annotationMetadata, - Map attributes) { + private void registerSimpleRpcClient(BeanDefinitionRegistry registry, + AnnotationMetadata annotationMetadata, + Map attributes, + AnnotatedBeanDefinition bd) { // 类名(接口全限定名) String className = annotationMetadata.getClassName(); - // 创建SimpleRpcClientFactoryBean的BeanDefinition - BeanDefinitionBuilder definition = BeanDefinitionBuilder.genericBeanDefinition(RpcClientFactoryBean.class); + BeanDefinitionBuilder definitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(RpcClientFactoryBean.class); // 解析出@SimpleRpcClient注解的name String name = getName(attributes); if (!StringUtils.hasText(name)) { throw new RuntimeException(String.format("class [%s] , @SimpleRpcClient name or value can not be null, please check.", className)); } - - // 给factoryBean添加属性值 - definition.addPropertyValue("name", name); - definition.addPropertyValue("type", className); - definition.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_TYPE); + definitionBuilder.addPropertyValue("name", name); + definitionBuilder.addPropertyValue("type",getClass(className)); + definitionBuilder.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_TYPE); String alias = name + "SimpleRpcClient"; - AbstractBeanDefinition beanDefinition = definition.getBeanDefinition(); + AbstractBeanDefinition beanDefinition = definitionBuilder.getBeanDefinition(); - // 注册bean定义信息到容器 + beanDefinition.setPrimary(true); + + // 设置qualifier,优先使用qualifier + String qualifier = getQualifier(attributes); + if (StringUtils.hasText(qualifier)) { + alias = qualifier; + } + + // 注册bean定义信息 BeanDefinitionHolder holder = new BeanDefinitionHolder(beanDefinition, className, new String[]{alias}); BeanDefinitionReaderUtils.registerBeanDefinition(holder, registry); } /** - * 创建扫描器 + * 获取qualifier + */ + private static String getQualifier(Map client) { + if (client == null) { + return null; + } + String qualifier = (String) client.get("qualifier"); + if (StringUtils.hasText(qualifier)) { + return qualifier; + } + return null; + } + + /** + * 获取name + */ + protected String getName(Map attributes) { + String name = (String) attributes.get("name"); + if (!StringUtils.hasText(name)) { + name = (String) attributes.get("value"); + } + if (StrUtil.isEmpty(name)) { + name = resolve(name); + } + ; + return name; + } + + /** + * 解析name + */ + private String resolve(String value) { + if (StringUtils.hasText(value)) { + return environment.resolvePlaceholders(value); + } + return value; + } + + /** + * 获取扫描器 */ protected ClassPathScanningCandidateComponentProvider getScanner() { return new ClassPathScanningCandidateComponentProvider(false, environment) { @@ -124,50 +203,61 @@ public class RpcClientRegister implements ImportBeanDefinitionRegistrar, Resourc */ protected static Set getBasePackages(AnnotationMetadata importingClassMetadata) { // 获取到@EnableSimpleRpcClients注解所有属性 - Map attributes = importingClassMetadata.getAnnotationAttributes(EnableSimpleRpcClients.class.getCanonicalName()); + Map attributes = importingClassMetadata + .getAnnotationAttributes(EnableRpcClient.class.getCanonicalName()); + if (null == attributes) { + return null; + } Set basePackages = new HashSet<>(); assert attributes != null; - // value 属性是否有配置值,如果有则添加 - for (String pkg : (String[]) attributes.get("value")) { + String[] values = (String[]) attributes.get("value"); + for (String pkg : values) { if (StringUtils.hasText(pkg)) { basePackages.add(pkg); } } - - // basePackages 属性是否有配置值,如果有则添加 - for (String pkg : (String[]) attributes.get("basePackages")) { + String[] bgs = (String[]) attributes.get("basePackages"); + for (String pkg : bgs) { if (StringUtils.hasText(pkg)) { basePackages.add(pkg); } } - // 如果上面两步都没有获取到basePackages,那么这里就默认使用当前项目启动类所在的包为basePackages if (basePackages.isEmpty()) { basePackages.add(ClassUtils.getPackageName(importingClassMetadata.getClassName())); } - return basePackages; } /** - * 获取name + * Helper class to create a {@link TypeFilter} that matches if all the delegates match. + * + * @author Oliver Gierke */ - protected static String getName(Map attributes) { - String name = (String) attributes.get("name"); - if (!StringUtils.hasText(name)) { - name = (String) attributes.get("value"); + private static class AllTypeFilter implements TypeFilter { + + private final List delegates; + + /** + * Creates a new {@link AllTypeFilter} to match if all the given delegates match. + * + * @param delegates must not be {@literal null}. + */ + public AllTypeFilter(List delegates) { + Assert.notNull(delegates, "This argument is required, it must not be null"); + this.delegates = delegates; } - return name; - } - @Override - public void setEnvironment(Environment environment) { - this.environment = environment; - } + @Override + public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException { - @Override - public void setResourceLoader(ResourceLoader resourceLoader) { - this.resourceLoader = resourceLoader; - } -} + for (TypeFilter filter : delegates) { + if (!filter.match(metadataReader, metadataReaderFactory)) { + return false; + } + } + return true; + } + } +} \ No newline at end of file diff --git a/connect-core/src/main/java/org/needcoke/rpc/proxy/ClientProxyCreateFactory.java b/connect-core/src/main/java/org/needcoke/rpc/proxy/ClientProxyCreateFactory.java index 26cbeb6..1ffda77 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/proxy/ClientProxyCreateFactory.java +++ b/connect-core/src/main/java/org/needcoke/rpc/proxy/ClientProxyCreateFactory.java @@ -7,7 +7,6 @@ import org.needcoke.rpc.invoker.InvokeResult; import org.needcoke.rpc.net.ConnectorFactory; import org.needcoke.rpc.utils.SpringContextUtils; -import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.HashMap; @@ -30,28 +29,8 @@ public class ClientProxyCreateFactory { ClassLoader classLoader = serviceClass.getClassLoader(); // 获取到该接口所有的interface Class[] interfaces = {serviceClass}; - RpcClient rpcClient = serviceClass.getAnnotation(RpcClient.class); - String providerName = StrUtil.isBlank(rpcClient.name()) ? rpcClient.value() : rpcClient.name(); - // jdk代理必须的handler,代理对象的方法执行就会调用这里的invoke方法。自动传入调用的方法 + 方法参数 - InvocationHandler invocationHandler = new InvocationHandler() { - @Override - public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { - ConnectorFactory connectorFactory = SpringContextUtils.getBean(ConnectorFactory.class); - if(StrUtil.isEmpty(rpcClient.serviceId())){ - throw new RuntimeException(serviceClass.getName()+" need serviceId"); - } - Map params = new HashMap<>(); - for (int i = 1; i <= args.length; i++) { - params.put("arg"+i,args[i]); - } - InvokeResult result = connectorFactory.connector(rpcClient.serviceId()).execute(rpcClient.beanName(), method.getName(), params); - return result.getBody(); - } - }; - - Object proxy = Proxy.newProxyInstance(classLoader, interfaces, invocationHandler); - + Object proxy = Proxy.newProxyInstance(classLoader, interfaces, new InvocationHandler(serviceClass)); // 返回代理对象 return (T) proxy; } diff --git a/connect-core/src/main/java/org/needcoke/rpc/proxy/InvocationHandler.java b/connect-core/src/main/java/org/needcoke/rpc/proxy/InvocationHandler.java new file mode 100644 index 0000000..1a936c4 --- /dev/null +++ b/connect-core/src/main/java/org/needcoke/rpc/proxy/InvocationHandler.java @@ -0,0 +1,34 @@ +package org.needcoke.rpc.proxy; + +import cn.hutool.core.util.StrUtil; +import org.needcoke.rpc.annotation.RpcClient; +import org.needcoke.rpc.invoker.InvokeResult; +import org.needcoke.rpc.net.ConnectorFactory; +import org.needcoke.rpc.utils.SpringContextUtils; + +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; + +public class InvocationHandler implements java.lang.reflect.InvocationHandler { + private Class serviceClass; + + public InvocationHandler(Class serviceClass) { + this.serviceClass = serviceClass; + } + + @Override + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + RpcClient rpcClient = serviceClass.getAnnotation(RpcClient.class); + ConnectorFactory connectorFactory = SpringContextUtils.getBean(ConnectorFactory.class); + if(StrUtil.isEmpty(rpcClient.serviceId())){ + throw new RuntimeException(serviceClass.getName()+" need serviceId"); + } + Map params = new HashMap<>(); + for (int i = 1; i <= args.length; i++) { + params.put("arg"+i,args[i]); + } + InvokeResult result = connectorFactory.connector(rpcClient.serviceId()).execute(rpcClient.beanName(), method.getName(), params); + return result.getBody(); + } +} diff --git a/connect-core/src/main/java/org/needcoke/rpc/proxy/RpcClient.java b/connect-core/src/main/java/org/needcoke/rpc/proxy/RpcClient.java new file mode 100644 index 0000000..ffd3476 --- /dev/null +++ b/connect-core/src/main/java/org/needcoke/rpc/proxy/RpcClient.java @@ -0,0 +1,4 @@ +package org.needcoke.rpc.proxy; + +public interface RpcClient { +} diff --git a/connect-core/src/main/java/org/needcoke/rpc/proxy/RpcClientFactoryBean.java b/connect-core/src/main/java/org/needcoke/rpc/proxy/RpcClientFactoryBean.java index a6fea93..38bd9e0 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/proxy/RpcClientFactoryBean.java +++ b/connect-core/src/main/java/org/needcoke/rpc/proxy/RpcClientFactoryBean.java @@ -12,7 +12,7 @@ import java.util.Objects; public class RpcClientFactoryBean implements FactoryBean, InitializingBean, ApplicationContextAware { /** - * 服务提供者名称 + * beanName */ private String name; @@ -35,9 +35,9 @@ public class RpcClientFactoryBean implements FactoryBean, InitializingBe @Override public Object getObject() throws Exception { - // todo do something // 创建一个代理对象并返回 - return ClientProxyCreateFactory.getProxyService(type); + Object proxyService = ClientProxyCreateFactory.getProxyService(type); + return proxyService; } @Override diff --git a/connect-link-tracking/pom.xml b/connect-link-tracking/pom.xml index cf6eb83..acb3f70 100644 --- a/connect-link-tracking/pom.xml +++ b/connect-link-tracking/pom.xml @@ -12,8 +12,8 @@ connect-link-tracking - 11 - 11 + 8 + 8 diff --git a/connect-server-netty/pom.xml b/connect-server-netty/pom.xml index e2e53b5..fae08d7 100644 --- a/connect-server-netty/pom.xml +++ b/connect-server-netty/pom.xml @@ -12,8 +12,8 @@ connect-server-netty - 11 - 11 + 8 + 8 diff --git a/connect-server-smart-socket/pom.xml b/connect-server-smart-socket/pom.xml index e1550ad..e5a428b 100644 --- a/connect-server-smart-socket/pom.xml +++ b/connect-server-smart-socket/pom.xml @@ -12,8 +12,8 @@ connect-server-smart-socket - 11 - 11 + 8 + 8 diff --git a/register-eureka/pom.xml b/register-eureka/pom.xml index 2679ee9..01986b9 100644 --- a/register-eureka/pom.xml +++ b/register-eureka/pom.xml @@ -12,8 +12,8 @@ register-eureka - 11 - 11 + 8 + 8 \ No newline at end of file diff --git a/register-nacos/pom.xml b/register-nacos/pom.xml index 79567d1..ecaf069 100644 --- a/register-nacos/pom.xml +++ b/register-nacos/pom.xml @@ -12,8 +12,8 @@ register-nacos - 11 - 11 + 8 + 8 -- Gitee From 137722bc5493426d265b87e3a14e0b2de644b267 Mon Sep 17 00:00:00 2001 From: warren Date: Wed, 29 Jun 2022 22:04:28 +0800 Subject: [PATCH 20/22] =?UTF-8?q?=E6=96=B0=E5=A2=9ErpcClient?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/needcoke/b/controller/TestController.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/business-b/src/main/java/org/needcoke/b/controller/TestController.java b/business-b/src/main/java/org/needcoke/b/controller/TestController.java index 491e3ef..f4e2325 100644 --- a/business-b/src/main/java/org/needcoke/b/controller/TestController.java +++ b/business-b/src/main/java/org/needcoke/b/controller/TestController.java @@ -34,9 +34,9 @@ public class TestController { public InvokeResult test(){ Map map = new HashMap<>(); map.put("word","刘勇是死废物"); - //InvokeResult execute = connectorFactory.connector("bussiness-c").execute( "cCon", "cTest2", map); - //return execute; - return new InvokeResult().setBody(client.cTest2("刘勇是死废物")); + InvokeResult execute = connectorFactory.connector("bussiness-c").execute( "cCon", "cTest2", map); + return execute; +// return new InvokeResult().setBody(client.cTest2("刘勇是死废物")); } @Resource -- Gitee From 3c225486ccd984ad42fb43b9fdee3158aa219717 Mon Sep 17 00:00:00 2001 From: warren Date: Thu, 30 Jun 2022 10:05:25 +0800 Subject: [PATCH 21/22] =?UTF-8?q?rpcClient=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/org/needcoke/b/client/ConClient.java | 2 +- .../main/java/org/needcoke/b/component/TestComponent.java | 2 +- .../java/org/needcoke/b/controller/TestController.java | 6 +++--- .../java/org/needcoke/rpc/proxy/InvocationHandler.java | 8 ++++---- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/business-b/src/main/java/org/needcoke/b/client/ConClient.java b/business-b/src/main/java/org/needcoke/b/client/ConClient.java index a26d677..e1931a8 100644 --- a/business-b/src/main/java/org/needcoke/b/client/ConClient.java +++ b/business-b/src/main/java/org/needcoke/b/client/ConClient.java @@ -2,7 +2,7 @@ package org.needcoke.b.client; import org.needcoke.rpc.annotation.RpcClient; -@RpcClient(name = "conClient2" , serviceId = "business-c" ,beanName = "cCon") +@RpcClient(name = "conClient2" , serviceId = "bussiness-c" ,beanName = "cCon") public interface ConClient extends org.needcoke.rpc.proxy.RpcClient { Object cTest2(String word); diff --git a/business-b/src/main/java/org/needcoke/b/component/TestComponent.java b/business-b/src/main/java/org/needcoke/b/component/TestComponent.java index 52861ac..0cb06ef 100644 --- a/business-b/src/main/java/org/needcoke/b/component/TestComponent.java +++ b/business-b/src/main/java/org/needcoke/b/component/TestComponent.java @@ -18,7 +18,7 @@ public class TestComponent { // @Primary // public WeightedResponseTimeBalance weightedResponseTimeBalance(){ // return new WeightedResponseTimeBalance(); -// }d +// } @Bean public NettyInvoker nettyInvoker(){ diff --git a/business-b/src/main/java/org/needcoke/b/controller/TestController.java b/business-b/src/main/java/org/needcoke/b/controller/TestController.java index f4e2325..90eff3a 100644 --- a/business-b/src/main/java/org/needcoke/b/controller/TestController.java +++ b/business-b/src/main/java/org/needcoke/b/controller/TestController.java @@ -34,9 +34,9 @@ public class TestController { public InvokeResult test(){ Map map = new HashMap<>(); map.put("word","刘勇是死废物"); - InvokeResult execute = connectorFactory.connector("bussiness-c").execute( "cCon", "cTest2", map); - return execute; -// return new InvokeResult().setBody(client.cTest2("刘勇是死废物")); +// InvokeResult execute = connectorFactory.connector("bussiness-c").execute( "cCon", "cTest2", map); +// return execute; + return new InvokeResult().setBody(client.cTest2("刘勇是死废物")); } @Resource diff --git a/connect-core/src/main/java/org/needcoke/rpc/proxy/InvocationHandler.java b/connect-core/src/main/java/org/needcoke/rpc/proxy/InvocationHandler.java index 1a936c4..d37918c 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/proxy/InvocationHandler.java +++ b/connect-core/src/main/java/org/needcoke/rpc/proxy/InvocationHandler.java @@ -21,12 +21,12 @@ public class InvocationHandler implements java.lang.reflect.InvocationHandler public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { RpcClient rpcClient = serviceClass.getAnnotation(RpcClient.class); ConnectorFactory connectorFactory = SpringContextUtils.getBean(ConnectorFactory.class); - if(StrUtil.isEmpty(rpcClient.serviceId())){ - throw new RuntimeException(serviceClass.getName()+" need serviceId"); + if (StrUtil.isEmpty(rpcClient.serviceId())) { + throw new RuntimeException(serviceClass.getName() + " need serviceId"); } - Map params = new HashMap<>(); + Map params = new HashMap<>(); for (int i = 1; i <= args.length; i++) { - params.put("arg"+i,args[i]); + params.put("arg" + i, args[i-1]); } InvokeResult result = connectorFactory.connector(rpcClient.serviceId()).execute(rpcClient.beanName(), method.getName(), params); return result.getBody(); -- Gitee From ed26533034ec0144549e98e71352221bff260a99 Mon Sep 17 00:00:00 2001 From: warren Date: Mon, 4 Jul 2022 18:05:15 +0800 Subject: [PATCH 22/22] =?UTF-8?q?abandon.x=E6=9E=84=E5=BB=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business-b/pom.xml | 53 -- .../nacos/client/naming/net/NamingProxy.java | 721 ------------------ .../common/constant/RequestUrlConstants.java | 29 - .../java/org/needcoke/b/BApplication.java | 28 - .../main/java/org/needcoke/b/client/ABC.java | 7 - .../java/org/needcoke/b/client/ConClient.java | 9 - .../needcoke/b/component/TestComponent.java | 43 -- .../needcoke/b/controller/TestController.java | 48 -- business-b/src/main/resources/application.yml | 23 - .../java/org/needcoke/c/CApplication.java | 18 - .../needcoke/c/controller/CController.java | 51 -- .../needcoke/c/controller/TestController.java | 32 - business-c/src/main/resources/application.yml | 23 - .../java/org/needcoke/a/AApplication.java | 18 - .../org/needcoke/a/configuration/Config.java | 55 -- .../needcoke/a/controller/AController.java | 39 - .../src/main/resources/application.yml | 23 - connect-core/pom.xml | 32 +- .../needcoke/rpc/invoker/ConnectInvoker.java | 2 +- {business-c => connect-fuse}/pom.xml | 40 +- .../src/main/java/org/needcoke/rpc}/Fuse.java | 2 +- .../java/org/needcoke/rpc}/FuseContext.java | 2 +- .../java/org/needcoke/rpc}/FuseReportDTO.java | 2 +- .../org/needcoke/rpc}/FuseThreadPool.java | 2 +- .../org/needcoke/rpc/config/FuseConfig.java | 0 .../rpc/controller/FuseController.java | 6 +- .../rpc/netty/invoker/NettyInvoker.java | 2 +- .../processor/ReadMessageClientProcessor.java | 6 +- .../invoker/SmartSocketInvoker.java | 2 +- .../processor/SmartSocketClientProcessor.java | 4 +- pom.xml | 15 +- register-eureka/pom.xml | 19 - register-nacos/pom.xml | 57 -- register-nacos/src/main/java/Test.java | 11 - .../pom.xml | 7 +- 35 files changed, 53 insertions(+), 1378 deletions(-) delete mode 100644 business-b/pom.xml delete mode 100644 business-b/src/main/java/com/alibaba/nacos/client/naming/net/NamingProxy.java delete mode 100644 business-b/src/main/java/com/alibaba/nacos/common/constant/RequestUrlConstants.java delete mode 100644 business-b/src/main/java/org/needcoke/b/BApplication.java delete mode 100644 business-b/src/main/java/org/needcoke/b/client/ABC.java delete mode 100644 business-b/src/main/java/org/needcoke/b/client/ConClient.java delete mode 100644 business-b/src/main/java/org/needcoke/b/component/TestComponent.java delete mode 100644 business-b/src/main/java/org/needcoke/b/controller/TestController.java delete mode 100644 business-b/src/main/resources/application.yml delete mode 100644 business-c/src/main/java/org/needcoke/c/CApplication.java delete mode 100644 business-c/src/main/java/org/needcoke/c/controller/CController.java delete mode 100644 business-c/src/main/java/org/needcoke/c/controller/TestController.java delete mode 100644 business-c/src/main/resources/application.yml delete mode 100644 bussiness-a/src/main/java/org/needcoke/a/AApplication.java delete mode 100644 bussiness-a/src/main/java/org/needcoke/a/configuration/Config.java delete mode 100644 bussiness-a/src/main/java/org/needcoke/a/controller/AController.java delete mode 100644 bussiness-a/src/main/resources/application.yml rename {business-c => connect-fuse}/pom.xml (44%) rename {connect-core/src/main/java/org/needcoke/rpc/fuse => connect-fuse/src/main/java/org/needcoke/rpc}/Fuse.java (99%) rename {connect-core/src/main/java/org/needcoke/rpc/fuse => connect-fuse/src/main/java/org/needcoke/rpc}/FuseContext.java (93%) rename {connect-core/src/main/java/org/needcoke/rpc/fuse => connect-fuse/src/main/java/org/needcoke/rpc}/FuseReportDTO.java (95%) rename {connect-core/src/main/java/org/needcoke/rpc/fuse => connect-fuse/src/main/java/org/needcoke/rpc}/FuseThreadPool.java (98%) rename {connect-core => connect-fuse}/src/main/java/org/needcoke/rpc/config/FuseConfig.java (100%) rename connect-core/src/main/java/org/needcoke/rpc/controller/ApiController.java => connect-fuse/src/main/java/org/needcoke/rpc/controller/FuseController.java (95%) delete mode 100644 register-eureka/pom.xml delete mode 100644 register-nacos/pom.xml delete mode 100644 register-nacos/src/main/java/Test.java rename {bussiness-a => spring-cloud-starter-needcoke-coke-connect}/pom.xml (82%) diff --git a/business-b/pom.xml b/business-b/pom.xml deleted file mode 100644 index 55c42d1..0000000 --- a/business-b/pom.xml +++ /dev/null @@ -1,53 +0,0 @@ - - - - coke-connect - org.needcoke - abandon - - 4.0.0 - - business-b - - - 8 - 8 - - - - org.needcoke - connect-core - abandon - - - - com.alibaba.cloud - spring-cloud-starter-alibaba-nacos-discovery - 2.2.5.RELEASE - - - com.alibaba.nacos - nacos-client - 1.4.1 - - - com.alibaba.nacos - nacos-common - 1.4.1 - - - org.needcoke - connect-server-smart-socket - abandon - - - - org.needcoke - connect-server-netty - abandon - - - - \ No newline at end of file diff --git a/business-b/src/main/java/com/alibaba/nacos/client/naming/net/NamingProxy.java b/business-b/src/main/java/com/alibaba/nacos/client/naming/net/NamingProxy.java deleted file mode 100644 index d43ebef..0000000 --- a/business-b/src/main/java/com/alibaba/nacos/client/naming/net/NamingProxy.java +++ /dev/null @@ -1,721 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * 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 - * - * 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. - */ - -package com.alibaba.nacos.client.naming.net; - -import com.alibaba.nacos.api.PropertyKeyConst; -import com.alibaba.nacos.api.SystemPropertyKeyConst; -import com.alibaba.nacos.api.common.Constants; -import com.alibaba.nacos.api.exception.NacosException; -import com.alibaba.nacos.api.naming.CommonParams; -import com.alibaba.nacos.api.naming.pojo.Instance; -import com.alibaba.nacos.api.naming.pojo.ListView; -import com.alibaba.nacos.api.naming.pojo.Service; -import com.alibaba.nacos.api.selector.AbstractSelector; -import com.alibaba.nacos.api.selector.ExpressionSelector; -import com.alibaba.nacos.api.selector.SelectorType; -import com.alibaba.nacos.client.config.impl.SpasAdapter; -import com.alibaba.nacos.client.monitor.MetricsMonitor; -import com.alibaba.nacos.client.naming.beat.BeatInfo; -import com.alibaba.nacos.client.naming.utils.CollectionUtils; -import com.alibaba.nacos.client.naming.utils.NetUtils; -import com.alibaba.nacos.client.naming.utils.SignUtil; -import com.alibaba.nacos.client.naming.utils.UtilAndComs; -import com.alibaba.nacos.client.security.SecurityProxy; -import com.alibaba.nacos.client.utils.AppNameUtils; -import com.alibaba.nacos.client.utils.TemplateUtils; -import com.alibaba.nacos.common.constant.HttpHeaderConsts; -import com.alibaba.nacos.common.http.HttpRestResult; -import com.alibaba.nacos.common.http.client.NacosRestTemplate; -import com.alibaba.nacos.common.http.param.Header; -import com.alibaba.nacos.common.http.param.Query; -import com.alibaba.nacos.common.lifecycle.Closeable; -import com.alibaba.nacos.common.utils.*; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.JsonNode; -import lombok.extern.slf4j.Slf4j; -import org.apache.http.HttpStatus; - -import java.io.IOException; -import java.io.StringReader; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Properties; -import java.util.Random; -import java.util.concurrent.Callable; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.ScheduledThreadPoolExecutor; -import java.util.concurrent.ThreadFactory; -import java.util.concurrent.TimeUnit; - -import static com.alibaba.nacos.client.utils.LogUtils.NAMING_LOGGER; - -/** - * Naming proxy. - * - * @author nkorange - */ -@Slf4j -public class NamingProxy implements Closeable { - - private final NacosRestTemplate nacosRestTemplate = NamingHttpClientManager.getInstance().getNacosRestTemplate(); - - private static final int DEFAULT_SERVER_PORT = 8848; - - private int serverPort = DEFAULT_SERVER_PORT; - - private final String namespaceId; - - private final String endpoint; - - private String nacosDomain; - - private List serverList; - - private List serversFromEndpoint = new ArrayList(); - - private final SecurityProxy securityProxy; - - private long lastSrvRefTime = 0L; - - private final long vipSrvRefInterMillis = TimeUnit.SECONDS.toMillis(30); - - private final long securityInfoRefreshIntervalMills = TimeUnit.SECONDS.toMillis(5); - - private Properties properties; - - private ScheduledExecutorService executorService; - - private int maxRetry; - - public NamingProxy(String namespaceId, String endpoint, String serverList, Properties properties) { - - this.securityProxy = new SecurityProxy(properties, nacosRestTemplate); - this.properties = properties; - this.setServerPort(DEFAULT_SERVER_PORT); - this.namespaceId = namespaceId; - this.endpoint = endpoint; - this.maxRetry = ConvertUtils.toInt(properties.getProperty(PropertyKeyConst.NAMING_REQUEST_DOMAIN_RETRY_COUNT, - String.valueOf(UtilAndComs.REQUEST_DOMAIN_RETRY_COUNT))); - - if (StringUtils.isNotEmpty(serverList)) { - this.serverList = Arrays.asList(serverList.split(",")); - if (this.serverList.size() == 1) { - this.nacosDomain = serverList; - } - } - this.initRefreshTask(); - } - - private void initRefreshTask() { - - this.executorService = new ScheduledThreadPoolExecutor(2, new ThreadFactory() { - @Override - public Thread newThread(Runnable r) { - Thread t = new Thread(r); - t.setName("com.alibaba.nacos.client.naming.updater"); - t.setDaemon(true); - return t; - } - }); - - refreshSrvIfNeed(); - this.securityProxy.login(getServerList()); - - this.executorService.scheduleWithFixedDelay(new Runnable() { - @Override - public void run() { - refreshSrvIfNeed(); - } - }, 0, vipSrvRefInterMillis, TimeUnit.MILLISECONDS); - - this.executorService.scheduleWithFixedDelay(new Runnable() { - @Override - public void run() { - securityProxy.login(getServerList()); - } - }, 0, securityInfoRefreshIntervalMills, TimeUnit.MILLISECONDS); - } - - public List getServerListFromEndpoint() { - - try { - String urlString = "http://" + endpoint + "/nacos/serverlist"; - Header header = builderHeader(); - HttpRestResult restResult = nacosRestTemplate.get(urlString, header, Query.EMPTY, String.class); - if (!restResult.ok()) { - throw new IOException( - "Error while requesting: " + urlString + "'. Server returned: " + restResult.getCode()); - } - - String content = restResult.getData(); - List list = new ArrayList(); - for (String line : IoUtils.readLines(new StringReader(content))) { - if (!line.trim().isEmpty()) { - list.add(line.trim()); - } - } - - return list; - - } catch (Exception e) { - e.printStackTrace(); - } - - return null; - } - - private void refreshSrvIfNeed() { - try { - - if (!CollectionUtils.isEmpty(serverList)) { - NAMING_LOGGER.debug("server list provided by user: " + serverList); - return; - } - - if (System.currentTimeMillis() - lastSrvRefTime < vipSrvRefInterMillis) { - return; - } - - List list = getServerListFromEndpoint(); - - if (CollectionUtils.isEmpty(list)) { - throw new Exception("Can not acquire Nacos list"); - } - - if (!CollectionUtils.isEqualCollection(list, serversFromEndpoint)) { - NAMING_LOGGER.info("[SERVER-LIST] server list is updated: " + list); - } - - serversFromEndpoint = list; - lastSrvRefTime = System.currentTimeMillis(); - } catch (Throwable e) { - NAMING_LOGGER.warn("failed to update server list", e); - } - } - - /** - * register a instance to service with specified instance properties. - * - * @param serviceName name of service - * @param groupName group of service - * @param instance instance to register - * @throws NacosException nacos exception - */ - public void registerService(String serviceName, String groupName, Instance instance) throws NacosException { - - NAMING_LOGGER.info("[REGISTER-SERVICE] {} registering service {} with instance: {}", namespaceId, serviceName, - instance); - - final Map params = new HashMap(16); - params.put(CommonParams.NAMESPACE_ID, namespaceId); - params.put(CommonParams.SERVICE_NAME, serviceName); - params.put(CommonParams.GROUP_NAME, groupName); - params.put(CommonParams.CLUSTER_NAME, instance.getClusterName()); - params.put("ip", instance.getIp()); - params.put("port", String.valueOf(instance.getPort())); - params.put("weight", String.valueOf(instance.getWeight())); - params.put("enable", String.valueOf(instance.isEnabled())); - params.put("healthy", String.valueOf(instance.isHealthy())); - params.put("ephemeral", String.valueOf(instance.isEphemeral())); - params.put("metadata", JacksonUtils.toJson(instance.getMetadata())); - - reqApi(UtilAndComs.nacosUrlInstance, params, HttpMethod.POST); - - } - - /** - * deregister instance from a service. - * - * @param serviceName name of service - * @param instance instance - * @throws NacosException nacos exception - */ - public void deregisterService(String serviceName, Instance instance) throws NacosException { - - NAMING_LOGGER - .info("[DEREGISTER-SERVICE] {} deregistering service {} with instance: {}", namespaceId, serviceName, - instance); - - final Map params = new HashMap(8); - params.put(CommonParams.NAMESPACE_ID, namespaceId); - params.put(CommonParams.SERVICE_NAME, serviceName); - params.put(CommonParams.CLUSTER_NAME, instance.getClusterName()); - params.put("ip", instance.getIp()); - params.put("port", String.valueOf(instance.getPort())); - params.put("ephemeral", String.valueOf(instance.isEphemeral())); - - reqApi(UtilAndComs.nacosUrlInstance, params, HttpMethod.DELETE); - } - - /** - * Update instance to service. - * - * @param serviceName service name - * @param groupName group name - * @param instance instance - * @throws NacosException nacos exception - */ - public void updateInstance(String serviceName, String groupName, Instance instance) throws NacosException { - NAMING_LOGGER - .info("[UPDATE-SERVICE] {} update service {} with instance: {}", namespaceId, serviceName, instance); - - final Map params = new HashMap(8); - params.put(CommonParams.NAMESPACE_ID, namespaceId); - params.put(CommonParams.SERVICE_NAME, serviceName); - params.put(CommonParams.GROUP_NAME, groupName); - params.put(CommonParams.CLUSTER_NAME, instance.getClusterName()); - params.put("ip", instance.getIp()); - params.put("port", String.valueOf(instance.getPort())); - params.put("weight", String.valueOf(instance.getWeight())); - params.put("enabled", String.valueOf(instance.isEnabled())); - params.put("ephemeral", String.valueOf(instance.isEphemeral())); - params.put("metadata", JacksonUtils.toJson(instance.getMetadata())); - - reqApi(UtilAndComs.nacosUrlInstance, params, HttpMethod.PUT); - } - - /** - * Query Service. - * - * @param serviceName service name - * @param groupName group name - * @return service - * @throws NacosException nacos exception - */ - public Service queryService(String serviceName, String groupName) throws NacosException { - NAMING_LOGGER.info("[QUERY-SERVICE] {} query service : {}, {}", namespaceId, serviceName, groupName); - - final Map params = new HashMap(3); - params.put(CommonParams.NAMESPACE_ID, namespaceId); - params.put(CommonParams.SERVICE_NAME, serviceName); - params.put(CommonParams.GROUP_NAME, groupName); - - String result = reqApi(UtilAndComs.nacosUrlService, params, HttpMethod.GET); - return JacksonUtils.toObj(result, Service.class); - } - - /** - * Create service. - * - * @param service service - * @param selector selector - * @throws NacosException nacos exception - */ - public void createService(Service service, AbstractSelector selector) throws NacosException { - - NAMING_LOGGER.info("[CREATE-SERVICE] {} creating service : {}", namespaceId, service); - - final Map params = new HashMap(6); - params.put(CommonParams.NAMESPACE_ID, namespaceId); - params.put(CommonParams.SERVICE_NAME, service.getName()); - params.put(CommonParams.GROUP_NAME, service.getGroupName()); - params.put("protectThreshold", String.valueOf(service.getProtectThreshold())); - params.put("metadata", JacksonUtils.toJson(service.getMetadata())); - params.put("selector", JacksonUtils.toJson(selector)); - - reqApi(UtilAndComs.nacosUrlService, params, HttpMethod.POST); - - } - - /** - * Delete service. - * - * @param serviceName service name - * @param groupName group name - * @return true if delete ok - * @throws NacosException nacos exception - */ - public boolean deleteService(String serviceName, String groupName) throws NacosException { - NAMING_LOGGER.info("[DELETE-SERVICE] {} deleting service : {} with groupName : {}", namespaceId, serviceName, - groupName); - - final Map params = new HashMap(6); - params.put(CommonParams.NAMESPACE_ID, namespaceId); - params.put(CommonParams.SERVICE_NAME, serviceName); - params.put(CommonParams.GROUP_NAME, groupName); - - String result = reqApi(UtilAndComs.nacosUrlService, params, HttpMethod.DELETE); - return "ok".equals(result); - } - - /** - * Update service. - * - * @param service service - * @param selector selector - * @throws NacosException nacos exception - */ - public void updateService(Service service, AbstractSelector selector) throws NacosException { - NAMING_LOGGER.info("[UPDATE-SERVICE] {} updating service : {}", namespaceId, service); - - final Map params = new HashMap(6); - params.put(CommonParams.NAMESPACE_ID, namespaceId); - params.put(CommonParams.SERVICE_NAME, service.getName()); - params.put(CommonParams.GROUP_NAME, service.getGroupName()); - params.put("protectThreshold", String.valueOf(service.getProtectThreshold())); - params.put("metadata", JacksonUtils.toJson(service.getMetadata())); - params.put("selector", JacksonUtils.toJson(selector)); - - reqApi(UtilAndComs.nacosUrlService, params, HttpMethod.PUT); - } - - /** - * Query instance list. - * - * @param serviceName service name - * @param clusters clusters - * @param udpPort udp port - * @param healthyOnly healthy only - * @return instance list - * @throws NacosException nacos exception - */ - public String queryList(String serviceName, String clusters, int udpPort, boolean healthyOnly) - throws NacosException { - - final Map params = new HashMap(8); - params.put(CommonParams.NAMESPACE_ID, namespaceId); - params.put(CommonParams.SERVICE_NAME, serviceName); - params.put("clusters", clusters); - params.put("udpPort", String.valueOf(udpPort)); - params.put("clientIP", NetUtils.localIP()); - params.put("healthyOnly", String.valueOf(healthyOnly)); - - return reqApi(UtilAndComs.nacosUrlBase + "/instance/list", params, HttpMethod.GET); - } - - /** - * Send beat. - * - * @param beatInfo beat info - * @param lightBeatEnabled light beat - * @return beat result - * @throws NacosException nacos exception - */ - public JsonNode sendBeat(BeatInfo beatInfo, boolean lightBeatEnabled) throws NacosException { - - if (NAMING_LOGGER.isDebugEnabled()) { - NAMING_LOGGER.debug("[BEAT] {} sending beat to server: {}", namespaceId, beatInfo.toString()); - } - Map params = new HashMap(8); - Map bodyMap = new HashMap(2); - if (!lightBeatEnabled) { - bodyMap.put("beat", JacksonUtils.toJson(beatInfo)); - } - params.put(CommonParams.NAMESPACE_ID, namespaceId); - params.put(CommonParams.SERVICE_NAME, beatInfo.getServiceName()); - params.put(CommonParams.CLUSTER_NAME, beatInfo.getCluster()); - params.put("ip", beatInfo.getIp()); - params.put("port", String.valueOf(beatInfo.getPort())); - String result = reqApi(UtilAndComs.nacosUrlBase + "/instance/beat", params, bodyMap, HttpMethod.PUT); - LoggerUtils.printIfErrorEnabled(log,"心跳维持 --- result = {}",result); - return JacksonUtils.toObj(result); - } - - /** - * Check Server healthy. - * - * @return true if server is healthy - */ - public boolean serverHealthy() { - - try { - String result = reqApi(UtilAndComs.nacosUrlBase + "/operator/metrics", new HashMap(2), - HttpMethod.GET); - JsonNode json = JacksonUtils.toObj(result); - String serverStatus = json.get("status").asText(); - return "UP".equals(serverStatus); - } catch (Exception e) { - return false; - } - } - - public ListView getServiceList(int pageNo, int pageSize, String groupName) throws NacosException { - return getServiceList(pageNo, pageSize, groupName, null); - } - - public ListView getServiceList(int pageNo, int pageSize, String groupName, AbstractSelector selector) - throws NacosException { - - Map params = new HashMap(4); - params.put("pageNo", String.valueOf(pageNo)); - params.put("pageSize", String.valueOf(pageSize)); - params.put(CommonParams.NAMESPACE_ID, namespaceId); - params.put(CommonParams.GROUP_NAME, groupName); - - if (selector != null) { - switch (SelectorType.valueOf(selector.getType())) { - case none: - break; - case label: - ExpressionSelector expressionSelector = (ExpressionSelector) selector; - params.put("selector", JacksonUtils.toJson(expressionSelector)); - break; - default: - break; - } - } - - String result = reqApi(UtilAndComs.nacosUrlBase + "/service/list", params, HttpMethod.GET); - - JsonNode json = JacksonUtils.toObj(result); - ListView listView = new ListView(); - listView.setCount(json.get("count").asInt()); - listView.setData(JacksonUtils.toObj(json.get("doms").toString(), new TypeReference>() { - })); - - return listView; - } - - public String reqApi(String api, Map params, String method) throws NacosException { - return reqApi(api, params, Collections.EMPTY_MAP, method); - } - - public String reqApi(String api, Map params, Map body, String method) - throws NacosException { - return reqApi(api, params, body, getServerList(), method); - } - - /** - * Request api. - * - * @param api api - * @param params parameters - * @param body body - * @param servers servers - * @param method http method - * @return result - * @throws NacosException nacos exception - */ - public String reqApi(String api, Map params, Map body, List servers, - String method) throws NacosException { - - params.put(CommonParams.NAMESPACE_ID, getNamespaceId()); - - if (CollectionUtils.isEmpty(servers) && StringUtils.isBlank(nacosDomain)) { - throw new NacosException(NacosException.INVALID_PARAM, "no server available"); - } - - NacosException exception = new NacosException(); - - if (StringUtils.isNotBlank(nacosDomain)) { - for (int i = 0; i < maxRetry; i++) { - try { - return callServer(api, params, body, nacosDomain, method); - } catch (NacosException e) { - exception = e; - if (NAMING_LOGGER.isDebugEnabled()) { - NAMING_LOGGER.debug("request {} failed.", nacosDomain, e); - } - } - } - } else { - Random random = new Random(System.currentTimeMillis()); - int index = random.nextInt(servers.size()); - - for (int i = 0; i < servers.size(); i++) { - String server = servers.get(index); - try { - return callServer(api, params, body, server, method); - } catch (NacosException e) { - exception = e; - if (NAMING_LOGGER.isDebugEnabled()) { - NAMING_LOGGER.debug("request {} failed.", server, e); - } - } - index = (index + 1) % servers.size(); - } - } - - NAMING_LOGGER.error("request: {} failed, servers: {}, code: {}, msg: {}", api, servers, exception.getErrCode(), - exception.getErrMsg()); - - throw new NacosException(exception.getErrCode(), - "failed to req API:" + api + " after all servers(" + servers + ") tried: " + exception.getMessage()); - - } - - private List getServerList() { - List snapshot = serversFromEndpoint; - if (!CollectionUtils.isEmpty(serverList)) { - snapshot = serverList; - } - return snapshot; - } - - public String callServer(String api, Map params, Map body, String curServer) - throws NacosException { - return callServer(api, params, body, curServer, HttpMethod.GET); - } - - /** - * Call server. - * - * @param api api - * @param params parameters - * @param body body - * @param curServer ? - * @param method http method - * @return result - * @throws NacosException nacos exception - */ - public String callServer(String api, Map params, Map body, String curServer, - String method) throws NacosException { - long start = System.currentTimeMillis(); - long end = 0; - injectSecurityInfo(params); - Header header = builderHeader(); - - String url; - if (curServer.startsWith(UtilAndComs.HTTPS) || curServer.startsWith(UtilAndComs.HTTP)) { - url = curServer + api; - } else { - if (!IPUtil.containsPort(curServer)) { - curServer = curServer + IPUtil.IP_PORT_SPLITER + serverPort; - } - url = NamingHttpClientManager.getInstance().getPrefix() + curServer + api; - } - - try { - HttpRestResult restResult = nacosRestTemplate - .exchangeForm(url, header, Query.newInstance().initParams(params), body, method, String.class); - end = System.currentTimeMillis(); - - MetricsMonitor.getNamingRequestMonitor(method, url, String.valueOf(restResult.getCode())) - .observe(end - start); - - if (restResult.ok()) { - return restResult.getData(); - } - if (HttpStatus.SC_NOT_MODIFIED == restResult.getCode()) { - return StringUtils.EMPTY; - } - throw new NacosException(restResult.getCode(), restResult.getMessage()); - } catch (Exception e) { - NAMING_LOGGER.error("[NA] failed to request", e); - throw new NacosException(NacosException.SERVER_ERROR, e); - } - } - - private void injectSecurityInfo(Map params) { - - // Inject token if exist: - if (StringUtils.isNotBlank(securityProxy.getAccessToken())) { - params.put(Constants.ACCESS_TOKEN, securityProxy.getAccessToken()); - } - - // Inject ak/sk if exist: - String ak = getAccessKey(); - String sk = getSecretKey(); - params.put("app", AppNameUtils.getAppName()); - if (StringUtils.isNotBlank(ak) && StringUtils.isNotBlank(sk)) { - try { - String signData = getSignData(params.get("serviceName")); - String signature = SignUtil.sign(signData, sk); - params.put("signature", signature); - params.put("data", signData); - params.put("ak", ak); - } catch (Exception e) { - NAMING_LOGGER.error("inject ak/sk failed.", e); - } - } - } - - /** - * Build header. - * - * @return header - */ - public Header builderHeader() { - Header header = Header.newInstance(); - header.addParam(HttpHeaderConsts.CLIENT_VERSION_HEADER, VersionUtils.version); - header.addParam(HttpHeaderConsts.USER_AGENT_HEADER, UtilAndComs.VERSION); - header.addParam(HttpHeaderConsts.ACCEPT_ENCODING, "gzip,deflate,sdch"); - header.addParam(HttpHeaderConsts.CONNECTION, "Keep-Alive"); - header.addParam(HttpHeaderConsts.REQUEST_ID, UuidUtils.generateUuid()); - header.addParam(HttpHeaderConsts.REQUEST_MODULE, "Naming"); - return header; - } - - private static String getSignData(String serviceName) { - return StringUtils.isNotEmpty(serviceName) ? System.currentTimeMillis() + "@@" + serviceName - : String.valueOf(System.currentTimeMillis()); - } - - public String getAccessKey() { - if (properties == null) { - - return SpasAdapter.getAk(); - } - - return TemplateUtils - .stringEmptyAndThenExecute(properties.getProperty(PropertyKeyConst.ACCESS_KEY), new Callable() { - - @Override - public String call() { - return SpasAdapter.getAk(); - } - }); - } - - public String getSecretKey() { - if (properties == null) { - - return SpasAdapter.getSk(); - } - - return TemplateUtils - .stringEmptyAndThenExecute(properties.getProperty(PropertyKeyConst.SECRET_KEY), new Callable() { - @Override - public String call() throws Exception { - return SpasAdapter.getSk(); - } - }); - } - - public void setProperties(Properties properties) { - this.properties = properties; - setServerPort(DEFAULT_SERVER_PORT); - } - - public String getNamespaceId() { - return namespaceId; - } - - public void setServerPort(int serverPort) { - this.serverPort = serverPort; - - String sp = System.getProperty(SystemPropertyKeyConst.NAMING_SERVER_PORT); - if (StringUtils.isNotBlank(sp)) { - this.serverPort = Integer.parseInt(sp); - } - } - - @Override - public void shutdown() throws NacosException { - String className = this.getClass().getName(); - NAMING_LOGGER.info("{} do shutdown begin", className); - ThreadUtils.shutdownThreadPool(executorService, NAMING_LOGGER); - NamingHttpClientManager.getInstance().shutdown(); - SpasAdapter.freeCredentialInstance(); - NAMING_LOGGER.info("{} do shutdown stop", className); - } -} - diff --git a/business-b/src/main/java/com/alibaba/nacos/common/constant/RequestUrlConstants.java b/business-b/src/main/java/com/alibaba/nacos/common/constant/RequestUrlConstants.java deleted file mode 100644 index 9e4e17a..0000000 --- a/business-b/src/main/java/com/alibaba/nacos/common/constant/RequestUrlConstants.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * 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 - * - * 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. - */ - -package com.alibaba.nacos.common.constant; - -/** - * Nacos request url constants. - * - * @author chenhao26 - */ -public interface RequestUrlConstants { - - String HTTP_PREFIX = "http://"; - String HTTPS_PREFIX = "https://"; - -} diff --git a/business-b/src/main/java/org/needcoke/b/BApplication.java b/business-b/src/main/java/org/needcoke/b/BApplication.java deleted file mode 100644 index 1ef9387..0000000 --- a/business-b/src/main/java/org/needcoke/b/BApplication.java +++ /dev/null @@ -1,28 +0,0 @@ -package org.needcoke.b; - -import org.needcoke.b.client.ConClient; -import org.needcoke.rpc.annotation.EnableRpcClient; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.client.discovery.EnableDiscoveryClient; -import org.springframework.context.ConfigurableApplicationContext; - -/** - * @author Gilgamesh - * @date 2022/4/2 - */ -@EnableRpcClient(basePackages = {"org.needcoke.b.client"}) -@EnableDiscoveryClient -@SpringBootApplication -public class BApplication { - - public static void main(String[] args) { - try { - ConfigurableApplicationContext run = SpringApplication.run(BApplication.class, args); - Object conClient2 = run.getBean(ConClient.class); - System.out.println(123); - }catch (Exception e){ - e.printStackTrace(); - } - } -} diff --git a/business-b/src/main/java/org/needcoke/b/client/ABC.java b/business-b/src/main/java/org/needcoke/b/client/ABC.java deleted file mode 100644 index 33e0184..0000000 --- a/business-b/src/main/java/org/needcoke/b/client/ABC.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.needcoke.b.client; - -import org.needcoke.rpc.annotation.Rpc; - -@Rpc -public interface ABC { -} diff --git a/business-b/src/main/java/org/needcoke/b/client/ConClient.java b/business-b/src/main/java/org/needcoke/b/client/ConClient.java deleted file mode 100644 index e1931a8..0000000 --- a/business-b/src/main/java/org/needcoke/b/client/ConClient.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.needcoke.b.client; - -import org.needcoke.rpc.annotation.RpcClient; - -@RpcClient(name = "conClient2" , serviceId = "bussiness-c" ,beanName = "cCon") -public interface ConClient extends org.needcoke.rpc.proxy.RpcClient { - - Object cTest2(String word); -} diff --git a/business-b/src/main/java/org/needcoke/b/component/TestComponent.java b/business-b/src/main/java/org/needcoke/b/component/TestComponent.java deleted file mode 100644 index 0cb06ef..0000000 --- a/business-b/src/main/java/org/needcoke/b/component/TestComponent.java +++ /dev/null @@ -1,43 +0,0 @@ -package org.needcoke.b.component; - -import org.needcoke.rpc.netty.invoker.NettyInvoker; -import org.needcoke.rpc.netty.server.NettyServer; -import org.needcoke.rpc.smartsocket.invoker.SmartSocketInvoker; -import org.needcoke.rpc.smartsocket.server.SmartSocketServer; -import org.springframework.context.annotation.Bean; -import org.springframework.stereotype.Component; - -/** - * @author Gilgamesh - * @date 2022/4/2 - */ -@Component -public class TestComponent { - -// @Bean -// @Primary -// public WeightedResponseTimeBalance weightedResponseTimeBalance(){ -// return new WeightedResponseTimeBalance(); -// } - - @Bean - public NettyInvoker nettyInvoker(){ - return new NettyInvoker(); - } - - @Bean - public NettyServer nettyServer(){ - return new NettyServer(); - } -// -// @Bean -// public SmartSocketInvoker smartSocketInvoker(){ -// return new SmartSocketInvoker(); -// } -// -// @Bean -// public SmartSocketServer smartSocketServer(){ -// return new SmartSocketServer(); -// } - -} diff --git a/business-b/src/main/java/org/needcoke/b/controller/TestController.java b/business-b/src/main/java/org/needcoke/b/controller/TestController.java deleted file mode 100644 index 90eff3a..0000000 --- a/business-b/src/main/java/org/needcoke/b/controller/TestController.java +++ /dev/null @@ -1,48 +0,0 @@ -package org.needcoke.b.controller; - -import lombok.RequiredArgsConstructor; -import org.needcoke.b.client.ConClient; -import org.needcoke.rpc.invoker.InvokeResult; -import org.needcoke.rpc.loadBalance.LoadBalance; -import org.needcoke.rpc.net.ConnectorFactory; -import org.needcoke.rpc.utils.ConnectUtil; -import org.springframework.cloud.client.ServiceInstance; -import org.springframework.cloud.client.discovery.DiscoveryClient; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import javax.annotation.Resource; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * @author Gilgamesh - * @date 2022/4/2 - */ -@RestController -@RequestMapping("api/b") -@RequiredArgsConstructor -public class TestController { - - private final ConnectorFactory connectorFactory; - - private final ConClient client; - - @GetMapping("test") - public InvokeResult test(){ - Map map = new HashMap<>(); - map.put("word","刘勇是死废物"); -// InvokeResult execute = connectorFactory.connector("bussiness-c").execute( "cCon", "cTest2", map); -// return execute; - return new InvokeResult().setBody(client.cTest2("刘勇是死废物")); - } - - @Resource - private DiscoveryClient discoveryClient; - - @Resource - private LoadBalance loadBalance; - -} diff --git a/business-b/src/main/resources/application.yml b/business-b/src/main/resources/application.yml deleted file mode 100644 index 91eedac..0000000 --- a/business-b/src/main/resources/application.yml +++ /dev/null @@ -1,23 +0,0 @@ - -spring: - application: - name: bussiness-b - # nacos默认可以不写 但是 如果不是默认的必须要写 - cloud: - nacos: - #注册中心 - discovery: - metadata: - coke-server-port: 13001 -# rpcType: netty - rpcType: smart socket - #server-addr: http://192.168.*:8848 - server-addr: http://127.0.0.1:8848 - cluster-name: 严鸣是吕诗文爸爸 - group: 相亲相爱一家人 -server: - port: 8081 - -coke: - server: - port: 13001 \ No newline at end of file diff --git a/business-c/src/main/java/org/needcoke/c/CApplication.java b/business-c/src/main/java/org/needcoke/c/CApplication.java deleted file mode 100644 index f3cab60..0000000 --- a/business-c/src/main/java/org/needcoke/c/CApplication.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.needcoke.c; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.client.discovery.EnableDiscoveryClient; - -/** - * @author Gilgamesh - * @date 2022/4/2 - */ -@EnableDiscoveryClient -@SpringBootApplication -public class CApplication { - - public static void main(String[] args) { - SpringApplication.run(CApplication.class, args); - } -} diff --git a/business-c/src/main/java/org/needcoke/c/controller/CController.java b/business-c/src/main/java/org/needcoke/c/controller/CController.java deleted file mode 100644 index 436356e..0000000 --- a/business-c/src/main/java/org/needcoke/c/controller/CController.java +++ /dev/null @@ -1,51 +0,0 @@ -package org.needcoke.c.controller; - -import org.needcoke.rpc.annotation.Call; -import org.needcoke.rpc.annotation.Rpc; -import org.needcoke.rpc.invoker.InvokeResult; -import org.needcoke.rpc.net.ConnectorFactory; -import org.needcoke.rpc.smartsocket.invoker.SmartSocketInvoker; -import org.needcoke.rpc.smartsocket.server.SmartSocketServer; -import org.springframework.context.annotation.Bean; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.HashMap; -import java.util.Map; - -@Component("cCon") -@Rpc -public class CController { - -// @Bean -// public NettyInvoker nettyInvoker(){ -// return new NettyInvoker(); -// } -// -// @Bean -// public NettyServer nettyServer(){ -// return new NettyServer(); -// } - - @Bean - public SmartSocketInvoker smartSocketInvoker(){ - return new SmartSocketInvoker(); - } - - @Bean - public SmartSocketServer smartSocketServer(){ - return new SmartSocketServer(); - } - - @Resource - private ConnectorFactory connectorFactory; - - @Call("cTest2") - public Object cTest(String word){ - Map map = new HashMap<>(); - map.put("word",word); - - InvokeResult execute = connectorFactory.connector("bussiness-a").execute("config", "hahha2", map); - return execute.getBody(); - } -} diff --git a/business-c/src/main/java/org/needcoke/c/controller/TestController.java b/business-c/src/main/java/org/needcoke/c/controller/TestController.java deleted file mode 100644 index 9e98bf3..0000000 --- a/business-c/src/main/java/org/needcoke/c/controller/TestController.java +++ /dev/null @@ -1,32 +0,0 @@ -package org.needcoke.c.controller; - -import lombok.RequiredArgsConstructor; -import org.needcoke.rpc.utils.ConnectUtil; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -/** - * @author Gilgamesh - * @date 2022/4/2 - */ -@RestController -@RequestMapping("api/c") -@RequiredArgsConstructor -public class TestController { - - - @GetMapping("exec") - public void exec() { - for (int i = 0; i < 1000000; i++) { - ConnectUtil.execute("bussiness-b", "testController", "test", null); - if (i % 10000 == 0) { - try { - Thread.sleep(500); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - } - } - } -} diff --git a/business-c/src/main/resources/application.yml b/business-c/src/main/resources/application.yml deleted file mode 100644 index fd3c76b..0000000 --- a/business-c/src/main/resources/application.yml +++ /dev/null @@ -1,23 +0,0 @@ - -spring: - application: - name: bussiness-c - # nacos默认可以不写 但是 如果不是默认的必须要写 - cloud: - nacos: - #注册中心 - discovery: - metadata: - coke-server-port: 13007 -# rpcType: netty - rpcType: smart socket - #server-addr: http://192.168.*:8848 - server-addr: http://127.0.0.1:8848 - cluster-name: 严鸣是吕诗文爸爸 - group: 相亲相爱一家人 -server: - port: 8089 - -coke: - server: - port: 13007 \ No newline at end of file diff --git a/bussiness-a/src/main/java/org/needcoke/a/AApplication.java b/bussiness-a/src/main/java/org/needcoke/a/AApplication.java deleted file mode 100644 index 2c814e1..0000000 --- a/bussiness-a/src/main/java/org/needcoke/a/AApplication.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.needcoke.a; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.client.discovery.EnableDiscoveryClient; - -/** - * @author Gilgamesh - * @date 2022/4/2 - */ -@EnableDiscoveryClient -@SpringBootApplication -public class AApplication { - - public static void main(String[] args) { - SpringApplication.run(AApplication.class, args); - } -} diff --git a/bussiness-a/src/main/java/org/needcoke/a/configuration/Config.java b/bussiness-a/src/main/java/org/needcoke/a/configuration/Config.java deleted file mode 100644 index 108b772..0000000 --- a/bussiness-a/src/main/java/org/needcoke/a/configuration/Config.java +++ /dev/null @@ -1,55 +0,0 @@ -package org.needcoke.a.configuration; - -import lombok.extern.slf4j.Slf4j; -import org.needcoke.rpc.annotation.Call; -import org.needcoke.rpc.annotation.Rpc; -import org.needcoke.rpc.netty.invoker.NettyInvoker; -import org.needcoke.rpc.netty.server.NettyServer; -import org.needcoke.rpc.smartsocket.invoker.SmartSocketInvoker; -import org.needcoke.rpc.smartsocket.server.SmartSocketServer; -import org.springframework.context.annotation.Bean; -import org.springframework.stereotype.Component; - -/** - * - * @author yanming - * @date 2022/5/11 - */ -@Component -@Slf4j -@Rpc -public class Config { - - - public String haha(){ - log.info(this.getClass().getName()+":haha()被调用"); - return "haha"; - } - - - @Call("hahha2") - public String haha(String word){ - log.info(this.getClass().getName()+":say()被调用"); - return "say : "+word; - } - -// @Bean -// public NettyInvoker nettyInvoker(){ -// return new NettyInvoker(); -// } -// -// @Bean -// public NettyServer nettyServer(){ -// return new NettyServer(); -// } - - @Bean - public SmartSocketInvoker smartSocketInvoker(){ - return new SmartSocketInvoker(); - } - - @Bean - public SmartSocketServer smartSocketServer(){ - return new SmartSocketServer(); - } -} diff --git a/bussiness-a/src/main/java/org/needcoke/a/controller/AController.java b/bussiness-a/src/main/java/org/needcoke/a/controller/AController.java deleted file mode 100644 index 54b3725..0000000 --- a/bussiness-a/src/main/java/org/needcoke/a/controller/AController.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.needcoke.a.controller; - -import lombok.RequiredArgsConstructor; -import org.springframework.cloud.client.ServiceInstance; -import org.springframework.cloud.client.discovery.DiscoveryClient; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * @author yanming - * @date 2022/5/11 - */ -@RestController -@RequestMapping("api/a") -@RequiredArgsConstructor -public class AController { - - private final DiscoveryClient discoveryClient; - - @GetMapping("instance") - public List instance() { - return discoveryClient.getServices(); - } - - @GetMapping("instanceInfo") - public Map> instanceInfo() { - List services = discoveryClient.getServices(); - Map> ret = new HashMap<>(); - for (String service : services) { - ret.put(service, discoveryClient.getInstances(service)); - } - return ret; - } -} diff --git a/bussiness-a/src/main/resources/application.yml b/bussiness-a/src/main/resources/application.yml deleted file mode 100644 index fd8ae5a..0000000 --- a/bussiness-a/src/main/resources/application.yml +++ /dev/null @@ -1,23 +0,0 @@ - -spring: - application: - name: bussiness-a - # nacos默认可以不写 但是 如果不是默认的必须要写 - cloud: - nacos: - #注册中心 - discovery: - metadata: - coke-server-port: 13005 -# rpcType: netty - rpcType: smart socket - #server-addr: http://192.168.*:8848 - server-addr: http://127.0.0.1:8848 - cluster-name: 严鸣是吕诗文爸爸 - group: 相亲相爱一家人 -server: - port: 8002 - -coke: - server: - port: 13005 \ No newline at end of file diff --git a/connect-core/pom.xml b/connect-core/pom.xml index 00faf3f..4d77d5f 100644 --- a/connect-core/pom.xml +++ b/connect-core/pom.xml @@ -28,11 +28,6 @@ lombok ${lombok-version} - - org.apache.httpcomponents - httpclient - 4.5.3 - org.slf4j slf4j-api @@ -53,39 +48,52 @@ hutool-all ${hutool-version} + org.smartboot.socket aio-core 1.5.17 - org.projectlombok - lombok + org.apache.httpcomponents + httpclient + 4.5.3 - net.dreamlu mica-auto 2.3.1 provided + org.springframework.cloud spring-cloud-commons 2.2.5.RELEASE compile + + org.projectlombok + lombok + + + + net.dreamlu + mica-auto + 2.3.1 + provided + org.needcoke connect-link-tracking abandon + - com.google.guava - guava - 31.0.1-jre - compile + org.needcoke + connect-fuse + abandon diff --git a/connect-core/src/main/java/org/needcoke/rpc/invoker/ConnectInvoker.java b/connect-core/src/main/java/org/needcoke/rpc/invoker/ConnectInvoker.java index e68f27e..9d6b4cf 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/invoker/ConnectInvoker.java +++ b/connect-core/src/main/java/org/needcoke/rpc/invoker/ConnectInvoker.java @@ -3,9 +3,9 @@ package org.needcoke.rpc.invoker; import com.alibaba.fastjson.JSONObject; import com.ejlchina.okhttps.HttpResult; import lombok.extern.slf4j.Slf4j; +import org.needcoke.rpc.FuseThreadPool; import org.needcoke.rpc.common.enums.RpcTypeEnum; import org.needcoke.rpc.config.FuseConfig; -import org.needcoke.rpc.fuse.FuseThreadPool; import org.needcoke.rpc.net.Connector; import org.springframework.cloud.client.ServiceInstance; import org.springframework.context.annotation.Lazy; diff --git a/business-c/pom.xml b/connect-fuse/pom.xml similarity index 44% rename from business-c/pom.xml rename to connect-fuse/pom.xml index 71104aa..5407b55 100644 --- a/business-c/pom.xml +++ b/connect-fuse/pom.xml @@ -9,44 +9,32 @@ 4.0.0 - business-c + connect-fuse - 8 + 8 8 - cn.hutool - hutool-all - 5.7.16 - - - - org.needcoke - connect-core - abandon - - - - com.alibaba.cloud - spring-cloud-starter-alibaba-nacos-discovery - 2.2.5.RELEASE + org.springframework.boot + spring-boot-starter-web + 2.3.2.RELEASE + provided - - org.needcoke - connect-server-smart-socket - abandon + org.projectlombok + lombok + ${lombok-version} + provided - - org.needcoke - connect-server-netty - abandon + com.google.guava + guava + 31.0.1-jre + compile - \ No newline at end of file diff --git a/connect-core/src/main/java/org/needcoke/rpc/fuse/Fuse.java b/connect-fuse/src/main/java/org/needcoke/rpc/Fuse.java similarity index 99% rename from connect-core/src/main/java/org/needcoke/rpc/fuse/Fuse.java rename to connect-fuse/src/main/java/org/needcoke/rpc/Fuse.java index 75d8574..9168f17 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/fuse/Fuse.java +++ b/connect-fuse/src/main/java/org/needcoke/rpc/Fuse.java @@ -1,4 +1,4 @@ -package org.needcoke.rpc.fuse; +package org.needcoke.rpc; import lombok.extern.slf4j.Slf4j; diff --git a/connect-core/src/main/java/org/needcoke/rpc/fuse/FuseContext.java b/connect-fuse/src/main/java/org/needcoke/rpc/FuseContext.java similarity index 93% rename from connect-core/src/main/java/org/needcoke/rpc/fuse/FuseContext.java rename to connect-fuse/src/main/java/org/needcoke/rpc/FuseContext.java index a970fe3..610d3f5 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/fuse/FuseContext.java +++ b/connect-fuse/src/main/java/org/needcoke/rpc/FuseContext.java @@ -1,4 +1,4 @@ -package org.needcoke.rpc.fuse; +package org.needcoke.rpc; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; diff --git a/connect-core/src/main/java/org/needcoke/rpc/fuse/FuseReportDTO.java b/connect-fuse/src/main/java/org/needcoke/rpc/FuseReportDTO.java similarity index 95% rename from connect-core/src/main/java/org/needcoke/rpc/fuse/FuseReportDTO.java rename to connect-fuse/src/main/java/org/needcoke/rpc/FuseReportDTO.java index 1b0a290..dcee8d7 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/fuse/FuseReportDTO.java +++ b/connect-fuse/src/main/java/org/needcoke/rpc/FuseReportDTO.java @@ -1,4 +1,4 @@ -package org.needcoke.rpc.fuse; +package org.needcoke.rpc; import lombok.Data; import org.needcoke.rpc.config.FuseConfig; diff --git a/connect-core/src/main/java/org/needcoke/rpc/fuse/FuseThreadPool.java b/connect-fuse/src/main/java/org/needcoke/rpc/FuseThreadPool.java similarity index 98% rename from connect-core/src/main/java/org/needcoke/rpc/fuse/FuseThreadPool.java rename to connect-fuse/src/main/java/org/needcoke/rpc/FuseThreadPool.java index 065ff6b..abc038b 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/fuse/FuseThreadPool.java +++ b/connect-fuse/src/main/java/org/needcoke/rpc/FuseThreadPool.java @@ -1,4 +1,4 @@ -package org.needcoke.rpc.fuse; +package org.needcoke.rpc; import com.google.common.util.concurrent.ThreadFactoryBuilder; diff --git a/connect-core/src/main/java/org/needcoke/rpc/config/FuseConfig.java b/connect-fuse/src/main/java/org/needcoke/rpc/config/FuseConfig.java similarity index 100% rename from connect-core/src/main/java/org/needcoke/rpc/config/FuseConfig.java rename to connect-fuse/src/main/java/org/needcoke/rpc/config/FuseConfig.java diff --git a/connect-core/src/main/java/org/needcoke/rpc/controller/ApiController.java b/connect-fuse/src/main/java/org/needcoke/rpc/controller/FuseController.java similarity index 95% rename from connect-core/src/main/java/org/needcoke/rpc/controller/ApiController.java rename to connect-fuse/src/main/java/org/needcoke/rpc/controller/FuseController.java index fd88deb..85acf54 100644 --- a/connect-core/src/main/java/org/needcoke/rpc/controller/ApiController.java +++ b/connect-fuse/src/main/java/org/needcoke/rpc/controller/FuseController.java @@ -2,8 +2,8 @@ package org.needcoke.rpc.controller; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.needcoke.rpc.fuse.FuseContext; -import org.needcoke.rpc.fuse.FuseThreadPool; +import org.needcoke.rpc.FuseContext; +import org.needcoke.rpc.FuseThreadPool; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -21,7 +21,7 @@ import java.util.concurrent.*; @Slf4j @RequestMapping("coke/connect/api") @RequiredArgsConstructor -public class ApiController { +public class FuseController { private final FuseThreadPool threadPool; diff --git a/connect-server-netty/src/main/java/org/needcoke/rpc/netty/invoker/NettyInvoker.java b/connect-server-netty/src/main/java/org/needcoke/rpc/netty/invoker/NettyInvoker.java index f143fe2..cbadc99 100644 --- a/connect-server-netty/src/main/java/org/needcoke/rpc/netty/invoker/NettyInvoker.java +++ b/connect-server-netty/src/main/java/org/needcoke/rpc/netty/invoker/NettyInvoker.java @@ -6,11 +6,11 @@ import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.connect.rpc.link.tracking.config.LinkTrackingContextHolder; import org.connect.rpc.link.tracking.util.TrackingUtil; +import org.needcoke.rpc.Fuse; import org.needcoke.rpc.codec.CokeRequest; import org.needcoke.rpc.common.constant.ConnectConstant; import org.needcoke.rpc.common.enums.ConnectionExceptionEnum; import org.needcoke.rpc.common.exception.CokeConnectException; -import org.needcoke.rpc.fuse.Fuse; import org.needcoke.rpc.invoker.ConnectInvoker; import org.needcoke.rpc.invoker.InvokeResult; import org.needcoke.rpc.invoker.OkHttpsInvoker; diff --git a/connect-server-netty/src/main/java/org/needcoke/rpc/netty/processor/ReadMessageClientProcessor.java b/connect-server-netty/src/main/java/org/needcoke/rpc/netty/processor/ReadMessageClientProcessor.java index 742de28..42bbeb4 100644 --- a/connect-server-netty/src/main/java/org/needcoke/rpc/netty/processor/ReadMessageClientProcessor.java +++ b/connect-server-netty/src/main/java/org/needcoke/rpc/netty/processor/ReadMessageClientProcessor.java @@ -3,14 +3,10 @@ package org.needcoke.rpc.netty.processor; import io.netty.channel.ChannelHandlerContext; import lombok.extern.slf4j.Slf4j; import org.connect.rpc.link.tracking.util.TrackingUtil; +import org.needcoke.rpc.Fuse; import org.needcoke.rpc.codec.CokeRequest; import org.needcoke.rpc.common.enums.ConnectRequestEnum; -import org.needcoke.rpc.fuse.Fuse; import org.needcoke.rpc.utils.ConnectUtil; -import org.needcoke.rpc.utils.SpringContextUtils; - -import java.util.Map; -import java.util.concurrent.locks.LockSupport; @Slf4j public class ReadMessageClientProcessor implements ReadMessageProcessor { diff --git a/connect-server-smart-socket/src/main/java/org/needcoke/rpc/smartsocket/invoker/SmartSocketInvoker.java b/connect-server-smart-socket/src/main/java/org/needcoke/rpc/smartsocket/invoker/SmartSocketInvoker.java index d546427..d8a67c2 100644 --- a/connect-server-smart-socket/src/main/java/org/needcoke/rpc/smartsocket/invoker/SmartSocketInvoker.java +++ b/connect-server-smart-socket/src/main/java/org/needcoke/rpc/smartsocket/invoker/SmartSocketInvoker.java @@ -5,8 +5,8 @@ import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.connect.rpc.link.tracking.config.LinkTrackingContextHolder; import org.connect.rpc.link.tracking.util.TrackingUtil; +import org.needcoke.rpc.Fuse; import org.needcoke.rpc.codec.CokeRequest; -import org.needcoke.rpc.fuse.Fuse; import org.needcoke.rpc.smartsocket.codec.CokeRequestProtocol; import org.needcoke.rpc.common.constant.ConnectConstant; import org.needcoke.rpc.common.enums.ConnectionExceptionEnum; diff --git a/connect-server-smart-socket/src/main/java/org/needcoke/rpc/smartsocket/processor/SmartSocketClientProcessor.java b/connect-server-smart-socket/src/main/java/org/needcoke/rpc/smartsocket/processor/SmartSocketClientProcessor.java index ebacc1a..f0c864c 100644 --- a/connect-server-smart-socket/src/main/java/org/needcoke/rpc/smartsocket/processor/SmartSocketClientProcessor.java +++ b/connect-server-smart-socket/src/main/java/org/needcoke/rpc/smartsocket/processor/SmartSocketClientProcessor.java @@ -2,14 +2,12 @@ package org.needcoke.rpc.smartsocket.processor; import lombok.extern.slf4j.Slf4j; import org.connect.rpc.link.tracking.util.TrackingUtil; +import org.needcoke.rpc.Fuse; import org.needcoke.rpc.codec.CokeRequest; import org.needcoke.rpc.common.enums.ConnectRequestEnum; -import org.needcoke.rpc.fuse.Fuse; import org.needcoke.rpc.utils.ConnectUtil; import org.smartboot.socket.transport.AioSession; -import java.util.concurrent.locks.LockSupport; - @Slf4j public class SmartSocketClientProcessor extends SmartSocketMessageProcessor { @Override diff --git a/pom.xml b/pom.xml index 0dafc9d..9930c0f 100644 --- a/pom.xml +++ b/pom.xml @@ -11,19 +11,19 @@ abandon这个单词是词汇表的第一单词,coke-connect用于作为初始版本 - connect-core - register-nacos - register-eureka - bussiness-a - business-b - business-c + + connect-fuse connect-link-tracking + connect-core connect-server-netty connect-server-smart-socket + spring-cloud-starter-needcoke-coke-connect + 8 + 8 1.18.20 4.1.70.Final 2.15.0 @@ -31,7 +31,4 @@ Hoxton.SR12 5.7.16 - - - \ No newline at end of file diff --git a/register-eureka/pom.xml b/register-eureka/pom.xml deleted file mode 100644 index 01986b9..0000000 --- a/register-eureka/pom.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - coke-connect - org.needcoke - abandon - - 4.0.0 - - register-eureka - - - 8 - 8 - - - \ No newline at end of file diff --git a/register-nacos/pom.xml b/register-nacos/pom.xml deleted file mode 100644 index ecaf069..0000000 --- a/register-nacos/pom.xml +++ /dev/null @@ -1,57 +0,0 @@ - - - - coke-connect - org.needcoke - abandon - - 4.0.0 - - register-nacos - - - 8 - 8 - - - - - org.needcoke - connect-core - abandon - - - - org.springframework.cloud - spring-cloud-starter-parent - ${spring-cloud-version} - pom - - - com.alibaba.cloud - spring-cloud-starter-alibaba-nacos-discovery - 2.2.5.RC1 - - - - - - - - org.springframework.cloud - spring-cloud-dependencies - ${spring-cloud-version} - - - - com.alibaba.cloud - spring-cloud-alibaba-dependencies - 2.2.3.RELEASE - - - - - - \ No newline at end of file diff --git a/register-nacos/src/main/java/Test.java b/register-nacos/src/main/java/Test.java deleted file mode 100644 index b033f91..0000000 --- a/register-nacos/src/main/java/Test.java +++ /dev/null @@ -1,11 +0,0 @@ -/** - * @author Gilgamesh - * @date 2022/4/2 - */ - -public class Test { - - public static void main(String[] args) { - - } -} diff --git a/bussiness-a/pom.xml b/spring-cloud-starter-needcoke-coke-connect/pom.xml similarity index 82% rename from bussiness-a/pom.xml rename to spring-cloud-starter-needcoke-coke-connect/pom.xml index 733d6f7..c766d10 100644 --- a/bussiness-a/pom.xml +++ b/spring-cloud-starter-needcoke-coke-connect/pom.xml @@ -9,7 +9,7 @@ 4.0.0 - bussiness-a + spring-cloud-starter-needcoke-coke-connect 8 @@ -22,11 +22,6 @@ connect-core abandon - - com.alibaba.cloud - spring-cloud-starter-alibaba-nacos-discovery - 2.2.5.RELEASE - org.needcoke -- Gitee