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
new file mode 100644
index 0000000000000000000000000000000000000000..9e98bf3f415294e53bea2451692f98437889f9f8
--- /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/bussiness-a/target/classes/application.yml b/business-c/src/main/resources/application.yml
similarity index 65%
rename from bussiness-a/target/classes/application.yml
rename to business-c/src/main/resources/application.yml
index 5fe70a0add403f81d09cd8083e2bcc8084ec38bc..fd3c76beefc26b67fb20f69aaae4f66f175c12f2 100644
--- a/bussiness-a/target/classes/application.yml
+++ b/business-c/src/main/resources/application.yml
@@ -1,16 +1,23 @@
spring:
application:
- name: bussiness-a
+ 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: 相亲相爱一家人
- 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 3f32b917c25a22965a441a6b0eac8e485452e180..733d6f7f67157481d7cc8588f07b9ff2f11fa597 100644
--- a/bussiness-a/pom.xml
+++ b/bussiness-a/pom.xml
@@ -22,6 +22,23 @@
connect-core
abandon
+
+ com.alibaba.cloud
+ 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 567cce6ab73753b519b3c7d78f5aeb85870a68a9..108b7729f99e1c4d8ea3abde387b297f0da4a779 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,10 @@ 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.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;
@@ -30,8 +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();
}
+
+ @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 43c6995ad20c63380096a80fd4b25d1c28cc0e9b..fd8ae5ab632ff149ff68156fc4c14f6a1124e632 100644
--- a/bussiness-a/src/main/resources/application.yml
+++ b/bussiness-a/src/main/resources/application.yml
@@ -7,14 +7,17 @@ spring:
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: 相亲相爱一家人
- access-key:
server:
- port: 8000
+ port: 8002
coke:
- server:
- port: 13005
\ No newline at end of file
+ server:
+ port: 13005
\ No newline at end of file
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
Binary files a/bussiness-a/target/classes/org/needcoke/a/AApplication.class and /dev/null differ
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
Binary files a/bussiness-a/target/classes/org/needcoke/a/controller/AController.class and /dev/null differ
diff --git a/connect-core/pom.xml b/connect-core/pom.xml
index e080cee759604dcc3ee0aa09c8828eb34431c74b..00faf3fb4f65313c1013b841ea93ad1af35ca054 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
@@ -42,23 +38,11 @@
slf4j-api
1.7.16
-
-
- org.smartboot.http
- smart-http-client
- 1.1.12
-
com.ejlchina
okhttps-jackson
3.5.1
-
-
- org.springframework.cloud
- spring-cloud-starter-netflix-ribbon
- 2.2.5.RELEASE
-
com.alibaba
fastjson
@@ -74,6 +58,35 @@
aio-core
1.5.17
+
+ org.projectlombok
+ lombok
+
+
+
+ net.dreamlu
+ mica-auto
+ 2.3.1
+ provided
+
+
+ org.springframework.cloud
+ spring-cloud-commons
+ 2.2.5.RELEASE
+ compile
+
+
+
+ org.needcoke
+ connect-link-tracking
+ abandon
+
+
+ com.google.guava
+ guava
+ 31.0.1-jre
+ compile
+
@@ -87,17 +100,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/EnableRpcClient.java b/connect-core/src/main/java/org/needcoke/rpc/annotation/EnableRpcClient.java
new file mode 100644
index 0000000000000000000000000000000000000000..cece67c25a3e291ac1816eaf1ee295537093a105
--- /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/annotation/Rpc.java b/connect-core/src/main/java/org/needcoke/rpc/annotation/Rpc.java
index 90173cd2353c23c92af853511441f519e3218710..4dc6aa3b0c8e52297be6e2d6b18fd15d68ea4076 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 0000000000000000000000000000000000000000..df13bb73b5484f37141da44bc64650b217cbe4e7
--- /dev/null
+++ b/connect-core/src/main/java/org/needcoke/rpc/annotation/RpcClient.java
@@ -0,0 +1,20 @@
+package org.needcoke.rpc.annotation;
+
+import java.lang.annotation.*;
+
+@Target({ElementType.TYPE})
+@Retention(RetentionPolicy.RUNTIME)
+@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/codec/CokeRequest.java b/connect-core/src/main/java/org/needcoke/rpc/codec/CokeRequest.java
index 0232e07fc64192dbd3a7021fea9e81a5e03fbf11..3780848af2f0d055b6715263c5931c064ac63d59 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
@@ -5,7 +5,6 @@ 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;
@@ -23,12 +22,17 @@ public class CokeRequest {
private Map params;
- private Map headers;
+ private Map headers;
+
+ private String cokeRequestId;
@Getter
private InvokeResult result;
- private Integer requestId;
+ public CokeRequest setCokeRequestId(String cokeRequestId) {
+ this.cokeRequestId = cokeRequestId;
+ return this;
+ }
public CokeRequest setRequestType(ConnectRequestEnum requestType) {
@@ -51,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;
}
@@ -65,11 +69,15 @@ public class CokeRequest {
return this;
}
- public CokeRequest addHeader(String name,String header) {
+ public String getHeader(String name) {
+ return this.headers.get(name);
+ }
+
+ public CokeRequest addHeader(String name, String header) {
if (null == headers) {
headers = new HashMap<>();
}
- headers.put(name,header);
+ headers.put(name, header);
return this;
}
@@ -78,13 +86,9 @@ public class CokeRequest {
return this;
}
- public byte[] toBytes(){
+ public byte[] toBytes() {
String jsonString = JSONObject.toJSONString(this);
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 2af99f447746816e22052328d906a1accf2368d2..95591cea861237b77ce471b7e4e4290cee386bfa 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";
+
/**
* 实例名称
*/
@@ -34,4 +36,6 @@ public interface ConnectConstant {
* 冒号 :
*/
String COLON = ":";
+
+ String COKE_REQUEST_ID_HEADER_ID_NAME = "COKE-LINK-TRACKING-INFO";
}
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 ab7ad2588fbe6f3b6c5b3e588a2ef78db0809198..e14ec7ff26a741d93e8fed6540631043f0dbbd5c 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,11 +6,11 @@ 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",
- "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"
@@ -18,6 +18,15 @@ 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服务端口"),
+
+ 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/common/enums/EnumInterface.java b/connect-core/src/main/java/org/needcoke/rpc/common/enums/EnumInterface.java
new file mode 100644
index 0000000000000000000000000000000000000000..715e4c3e9757ca68f346b7f5f280635bd05fce2b
--- /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 0000000000000000000000000000000000000000..67645110169dda9e1ffcba227a53d8440e2870aa
--- /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/enums/RpcTypeEnum.java b/connect-core/src/main/java/org/needcoke/rpc/common/enums/RpcTypeEnum.java
new file mode 100644
index 0000000000000000000000000000000000000000..09a21ca1efecf3fed72c532568f5a113c50958c3
--- /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 7a4e66acc37e3628c421d3387bd068b0b741ddfe..3140d708ed7518be1dc9d9b9ec3cd0f5341b6af3 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,7 +1,11 @@
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;
/**
* coke通用异常
@@ -10,12 +14,15 @@ 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;
private String note;
+ private String requestId;
+
public CokeConnectException(String message, Throwable cause, String errorCode) {
super(message, cause);
this.errorCode = errorCode;
@@ -26,15 +33,22 @@ 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();
+ }
+
+ 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/common/exception/CokeSmartSocketException.java b/connect-core/src/main/java/org/needcoke/rpc/common/exception/CokeSmartSocketException.java
index 613e13b8a851e6901c9ec0cf0ac378d32af90c36..b68c7bae81511d1c730e55a6aa96aed333804555 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/CokeConfiguration.java b/connect-core/src/main/java/org/needcoke/rpc/config/CokeConfiguration.java
index 06388b0bd6efa99cb0e7b796d313ecfee4f4ef74..3e88d96c28b324de7d957ac24289536bdf95db17 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;
@@ -11,7 +10,7 @@ import java.util.Map;
* @author Gilgamesh
* @date 2022/4/2
*/
-@Configuration
+@Configuration(proxyBeanMethods = false)
public class CokeConfiguration {
/**
@@ -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/CokeConnectContextInitializer.java b/connect-core/src/main/java/org/needcoke/rpc/config/CokeConnectContextInitializer.java
deleted file mode 100644
index da2bac660d81593eaed579b53f1cb0f2167fc813..0000000000000000000000000000000000000000
--- 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/config/CokeHandlerInterceptorAdapter.java b/connect-core/src/main/java/org/needcoke/rpc/config/CokeHandlerInterceptorAdapter.java
new file mode 100644
index 0000000000000000000000000000000000000000..f2c32f0ab72c9b90c34aa346c86ee67feca5c574
--- /dev/null
+++ b/connect-core/src/main/java/org/needcoke/rpc/config/CokeHandlerInterceptorAdapter.java
@@ -0,0 +1,35 @@
+package org.needcoke.rpc.config;
+
+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;
+
+@Slf4j
+public class CokeHandlerInterceptorAdapter implements HandlerInterceptor {
+
+ @Override
+ 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 = request.getRequestURI();
+ linkTracking.addMataData("http path",requestURI);
+ }
+ return true;
+ }
+
+ @Override
+ public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
+ HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
+ }
+}
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 0000000000000000000000000000000000000000..ed792e72fe96ce6b546e0074fcc8bd3be9fb65c9
--- /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/ConnectExceptionAdvice.java b/connect-core/src/main/java/org/needcoke/rpc/config/ConnectExceptionAdvice.java
index 06c55d056bba50a0521dc6f302f034759a042238..d1104d2ec705ab4f01747a85a2b3923d5f837144 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;
@@ -16,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/config/FuseConfig.java b/connect-core/src/main/java/org/needcoke/rpc/config/FuseConfig.java
new file mode 100644
index 0000000000000000000000000000000000000000..2b5b6357d750d4d86d6038920f423a5772b41e52
--- /dev/null
+++ b/connect-core/src/main/java/org/needcoke/rpc/config/FuseConfig.java
@@ -0,0 +1,25 @@
+package org.needcoke.rpc.config;
+
+import lombok.Getter;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Configuration;
+
+@Getter
+@Configuration
+public class FuseConfig {
+
+ @Value("${coke.fuse.timeout:1000}")
+ 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;
+}
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 0000000000000000000000000000000000000000..50b752f7ea5ca43ef94cfda382ec2b8079aff16b
--- /dev/null
+++ b/connect-core/src/main/java/org/needcoke/rpc/config/RpcClientRegister.java
@@ -0,0 +1,263 @@
+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;
+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.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.io.IOException;
+import java.util.*;
+
+/**
+ * simple rpc 客户端扫描注册器
+ *
+ * @author Mr_wenpan@163.com 2022/1/19 2:11 下午
+ */
+public class RpcClientRegister implements ImportBeanDefinitionRegistrar, ResourceLoaderAware, EnvironmentAware {
+
+ /**
+ * 资源加载器
+ */
+ private ResourceLoader resourceLoader;
+ /**
+ * 环境
+ */
+ 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 importingClassMetadata, BeanDefinitionRegistry registry) {
+ // 注册bean客户端
+ registerSimpleRpcClients(importingClassMetadata, registry);
+ }
+
+ /**
+ * 注册simple rpc 客户端
+ */
+ public void registerSimpleRpcClients(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
+ ClassPathScanningCandidateComponentProvider scanner = getScanner();
+ scanner.setResourceLoader(resourceLoader);
+
+ AnnotationTypeFilter annotationTypeFilter = new AnnotationTypeFilter(RpcClient.class);
+ // 这里只会走if,暂时不会走else去
+ scanner.addIncludeFilter(annotationTypeFilter);
+ Set basePackages = getBasePackages(metadata);
+
+ // 遍历每一个basePackages
+ for (String basePackage : basePackages) {
+ // 通过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注解的属性
+ Map attributes = annotationMetadata.getAnnotationAttributes(RpcClient.class.getCanonicalName());
+ registerSimpleRpcClient(registry, annotationMetadata, attributes,beanDefinition);
+ }
+ }
+ }
+ }
+
+ public Class> getClass(String beanClassName){
+ try {
+ return Class.forName(beanClassName);
+ } catch (ClassNotFoundException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
+ * 注册simple rpc 客户端
+ *
+ * @param registry bean定义信息注册器
+ * @param annotationMetadata 元数据
+ * @param attributes @SimpleRpcClient注解的属性
+ * @author Mr_wenpan@163.com 2022/1/19 2:48 下午
+ */
+ private void registerSimpleRpcClient(BeanDefinitionRegistry registry,
+ AnnotationMetadata annotationMetadata,
+ Map attributes,
+ AnnotatedBeanDefinition bd) {
+ // 类名(接口全限定名)
+ String className = annotationMetadata.getClassName();
+ 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));
+ }
+ definitionBuilder.addPropertyValue("name", name);
+ definitionBuilder.addPropertyValue("type",getClass(className));
+ definitionBuilder.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_TYPE);
+ String alias = name + "SimpleRpcClient";
+ AbstractBeanDefinition beanDefinition = definitionBuilder.getBeanDefinition();
+
+ 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) {
+ @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(EnableRpcClient.class.getCanonicalName());
+ if (null == attributes) {
+ return null;
+ }
+ Set basePackages = new HashSet<>();
+ assert attributes != null;
+ String[] values = (String[]) attributes.get("value");
+ for (String pkg : values) {
+ if (StringUtils.hasText(pkg)) {
+ basePackages.add(pkg);
+ }
+ }
+ 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;
+ }
+
+ /**
+ * Helper class to create a {@link TypeFilter} that matches if all the delegates match.
+ *
+ * @author Oliver Gierke
+ */
+ 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;
+ }
+
+ @Override
+ public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
+
+ 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/config/ServerConfig.java b/connect-core/src/main/java/org/needcoke/rpc/config/ServerConfig.java
index 4e59bb9e092fcc7b670b226135fe517a2ed6575c..5dcbbc1687c6c6d9718943e525b958ef2dc0d99e 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
@@ -3,21 +3,15 @@ package org.needcoke.rpc.config;
import lombok.Getter;
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;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
@Getter
-@Configuration
+@Configuration(proxyBeanMethods = false)
public class ServerConfig {
@Value("${coke.server.port:12001}")
@@ -26,39 +20,24 @@ 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(){
+ public OkHttpsInvoker okHttpsInvoker() {
return new OkHttpsInvoker();
}
- /**
- * coke-connect的默认负载均衡策略为轮询
- */
- @ConditionalOnMissingBean(LoadBalance.class)
- @Bean
- public RoundRobinLoadBalance roundRobinLoadBalance(){
- return new RoundRobinLoadBalance();
- }
-
/**
- * 当远程调用方式修改为SmartSocketInvoker时启动SmartSocketServer
+ * coke-connect的默认负载均衡策略为轮询
*/
- @ConditionalOnBean(SmartSocketInvoker.class)
- @Bean
- public SmartSocketServer smartSocketServer(){
- return new SmartSocketServer();
- }
-
- /**
- * server uri -> 端口号
- */
- @ConditionalOnMissingBean(OkHttpsInvoker.class)
+ @ConditionalOnMissingBean(LoadBalance.class)
@Bean
- public Map cokeServerPortMap(){
- return new ConcurrentHashMap<>();
+ public RoundRobinLoadBalance roundRobinLoadBalance() {
+ return new RoundRobinLoadBalance();
}
}
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 0000000000000000000000000000000000000000..fd88deb2f0d0768fed756aefbf487c37438baaa3
--- /dev/null
+++ b/connect-core/src/main/java/org/needcoke/rpc/controller/ApiController.java
@@ -0,0 +1,72 @@
+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
+ */
+
+@RestController
+@Slf4j
+@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/controller/RpcController.java b/connect-core/src/main/java/org/needcoke/rpc/controller/RpcController.java
index 65fda9da2acecab1dfafbf32cdf07c9a48f4d02a..b066603551671114a6d2d77f7e12ca44bc309d61 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.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;
@@ -28,7 +28,6 @@ import java.util.Map;
@RequiredArgsConstructor
public class RpcController {
-
private ServerConfig serverConfig;
@Resource
@@ -43,7 +42,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 : {} ,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));
@@ -58,18 +57,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;
- }
}
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 0000000000000000000000000000000000000000..75d857400c2138017710de053796cea9408e48c3
--- /dev/null
+++ b/connect-core/src/main/java/org/needcoke/rpc/fuse/Fuse.java
@@ -0,0 +1,103 @@
+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;
+import java.util.concurrent.locks.LockSupport;
+import java.util.concurrent.locks.ReentrantLock;
+
+@Slf4j
+public class Fuse extends Thread {
+
+ private final ReentrantLock lock = new ReentrantLock();
+
+ private long timeout;
+
+ private TimeUnit unit;
+
+ /* 锁字段 */
+ private final Object lockField;
+
+ /* 超时需要唤醒的线程 */
+ private final Thread unParkThread;
+
+ private static final Map