diff --git a/xjs-study/dubbo-project/dubbo-spi-filter/pom.xml b/xjs-study/dubbo-project/dubbo-spi-filter/pom.xml
new file mode 100644
index 00000000..ba6c82b3
--- /dev/null
+++ b/xjs-study/dubbo-project/dubbo-spi-filter/pom.xml
@@ -0,0 +1,27 @@
+
+
+
+ dubbo-project
+ com.xjs
+ 1.0
+
+ 4.0.0
+ dubbo过滤器
+
+ dubbo-spi-filter
+
+
+ 11
+ 11
+
+
+
+
+ org.apache.dubbo
+ dubbo
+
+
+
+
diff --git a/xjs-study/dubbo-project/dubbo-spi-filter/src/main/java/com/xjs/filter/DubboInvokeFilter.java b/xjs-study/dubbo-project/dubbo-spi-filter/src/main/java/com/xjs/filter/DubboInvokeFilter.java
new file mode 100644
index 00000000..d1523bfe
--- /dev/null
+++ b/xjs-study/dubbo-project/dubbo-spi-filter/src/main/java/com/xjs/filter/DubboInvokeFilter.java
@@ -0,0 +1,33 @@
+package com.xjs.filter;
+
+import org.apache.dubbo.common.constants.CommonConstants;
+import org.apache.dubbo.common.extension.Activate;
+import org.apache.dubbo.rpc.*;
+
+/**
+ * dubbo过滤器
+ *
+ * @author xiejs
+ * @since 2022-05-23
+ */
+@Activate(group = {CommonConstants.CONSUMER})
+public class DubboInvokeFilter implements Filter {
+
+ @Override
+ public Result invoke(Invoker> invoker, Invocation invocation) throws RpcException {
+ long startTime = 0L;
+ long endTime = 0L;
+ try {
+ startTime = System.currentTimeMillis();
+
+ Result invoke = invoker.invoke(invocation);
+
+ endTime = System.currentTimeMillis();
+
+ return invoke;
+ } finally {
+ String serviceName = invocation.getServiceName();
+ System.out.println("serviceName---invoke time : " + (endTime - startTime) + "ms");
+ }
+ }
+}
diff --git a/xjs-study/dubbo-project/dubbo-spi-filter/src/main/resources/META-INF/dubbo/org.apache.dubbo.rpc.Filter b/xjs-study/dubbo-project/dubbo-spi-filter/src/main/resources/META-INF/dubbo/org.apache.dubbo.rpc.Filter
new file mode 100644
index 00000000..266e937a
--- /dev/null
+++ b/xjs-study/dubbo-project/dubbo-spi-filter/src/main/resources/META-INF/dubbo/org.apache.dubbo.rpc.Filter
@@ -0,0 +1 @@
+timeFilter=com.xjs.filter.DubboInvokeFilter
diff --git a/xjs-study/dubbo-project/dubbo-spi-impl/src/main/java/com/xjs/service/impl/DogHelloService.java b/xjs-study/dubbo-project/dubbo-spi-impl/src/main/java/com/xjs/service/impl/DogHelloService.java
index ccb1333b..2ea55a8a 100644
--- a/xjs-study/dubbo-project/dubbo-spi-impl/src/main/java/com/xjs/service/impl/DogHelloService.java
+++ b/xjs-study/dubbo-project/dubbo-spi-impl/src/main/java/com/xjs/service/impl/DogHelloService.java
@@ -13,6 +13,7 @@ public class DogHelloService implements HelloService {
return "你在狗叫什么!";
}
+
@Override
public String sayHello(URL url) {
return "wa wa url";
diff --git a/xjs-study/dubbo-project/dubbo-spi-loadbalance/pom.xml b/xjs-study/dubbo-project/dubbo-spi-loadbalance/pom.xml
new file mode 100644
index 00000000..069f83d8
--- /dev/null
+++ b/xjs-study/dubbo-project/dubbo-spi-loadbalance/pom.xml
@@ -0,0 +1,27 @@
+
+
+
+ dubbo-project
+ com.xjs
+ 1.0
+
+ 4.0.0
+ dubbo负载均衡器
+
+ dubbo-spi-loadbalance
+
+
+ 11
+ 11
+
+
+
+
+ org.apache.dubbo
+ dubbo
+
+
+
+
diff --git a/xjs-study/dubbo-project/dubbo-spi-loadbalance/src/main/java/com/xjs/LoadBalancer.java b/xjs-study/dubbo-project/dubbo-spi-loadbalance/src/main/java/com/xjs/LoadBalancer.java
new file mode 100644
index 00000000..52dde3c7
--- /dev/null
+++ b/xjs-study/dubbo-project/dubbo-spi-loadbalance/src/main/java/com/xjs/LoadBalancer.java
@@ -0,0 +1,33 @@
+package com.xjs;
+
+import org.apache.dubbo.common.URL;
+import org.apache.dubbo.rpc.Invocation;
+import org.apache.dubbo.rpc.Invoker;
+import org.apache.dubbo.rpc.RpcException;
+import org.apache.dubbo.rpc.cluster.LoadBalance;
+
+import java.util.List;
+
+/**
+ * dubbo自定义负载均衡器
+ * @author xiejs
+ * @since 2022-05-24
+ */
+
+public class LoadBalancer implements LoadBalance {
+ @Override
+ public Invoker select(List> invokers, URL url, Invocation invocation) throws RpcException {
+
+ //按照 IP + 端口排序
+
+ Invoker tInvoker = invokers.stream().sorted((i1, i2) -> {
+ final int ipCompare = i1.getUrl().getIp().compareTo(i2.getUrl().getIp());
+ if (ipCompare == 0) {
+ return Integer.compare(i1.getUrl().getPort(), i2.getUrl().getPort());
+ }
+ return ipCompare;
+ }).findFirst().get();
+
+ return tInvoker;
+ }
+}
diff --git a/xjs-study/dubbo-project/dubbo-spi-loadbalance/src/main/resources/META-INF/dubbo/org.apache.dubbo.rpc.cluster.LoadBalance b/xjs-study/dubbo-project/dubbo-spi-loadbalance/src/main/resources/META-INF/dubbo/org.apache.dubbo.rpc.cluster.LoadBalance
new file mode 100644
index 00000000..3cb97060
--- /dev/null
+++ b/xjs-study/dubbo-project/dubbo-spi-loadbalance/src/main/resources/META-INF/dubbo/org.apache.dubbo.rpc.cluster.LoadBalance
@@ -0,0 +1 @@
+onlyFirst=com.xjs.LoadBalancer
diff --git a/xjs-study/dubbo-project/dubbo-spi-threadpool/pom.xml b/xjs-study/dubbo-project/dubbo-spi-threadpool/pom.xml
new file mode 100644
index 00000000..ba5f5f03
--- /dev/null
+++ b/xjs-study/dubbo-project/dubbo-spi-threadpool/pom.xml
@@ -0,0 +1,32 @@
+
+
+
+ dubbo-project
+ com.xjs
+ 1.0
+
+ 4.0.0
+ dubbo线程池
+
+ dubbo-spi-shreadpool
+
+
+ 11
+ 11
+
+
+
+
+ org.apache.dubbo
+ dubbo
+
+
+
+ org.apache.dubbo
+ dubbo-common
+
+
+
+
diff --git a/xjs-study/dubbo-project/dubbo-spi-threadpool/src/main/java/com/xjs/thread/WatchingThreadPool.java b/xjs-study/dubbo-project/dubbo-spi-threadpool/src/main/java/com/xjs/thread/WatchingThreadPool.java
new file mode 100644
index 00000000..e8f508c4
--- /dev/null
+++ b/xjs-study/dubbo-project/dubbo-spi-threadpool/src/main/java/com/xjs/thread/WatchingThreadPool.java
@@ -0,0 +1,61 @@
+package com.xjs.thread;
+
+import org.apache.dubbo.common.URL;
+import org.apache.dubbo.common.threadpool.support.fixed.FixedThreadPool;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Map;
+import java.util.concurrent.*;
+
+/**
+ * @author xiejs
+ * @since 2022-05-24
+ */
+public class WatchingThreadPool extends FixedThreadPool implements Runnable {
+
+ private static final Logger log = LoggerFactory.getLogger(WatchingThreadPool.class);
+
+ //定义阈值
+ private static final double ALARM_PERCENT = 0.90;
+
+ //存储map
+ private final Map THREAD_POOLS = new ConcurrentHashMap<>();
+
+
+ public WatchingThreadPool() {
+ //每隔三秒打印线程使用情况
+ Executors.newSingleThreadScheduledExecutor()
+ .scheduleWithFixedDelay(this, 1, 3, TimeUnit.SECONDS);
+ }
+
+ //通过父类创建线程池
+ @Override
+ public Executor getExecutor(URL url) {
+ final Executor executor = super.getExecutor(url);
+ if (executor instanceof ThreadPoolExecutor) {
+ THREAD_POOLS.put(url, (ThreadPoolExecutor) executor);
+ }
+ return executor;
+ }
+
+ @Override
+ public void run() {
+ //遍历线程池
+ for (Map.Entry entry : THREAD_POOLS.entrySet()) {
+ final URL url = entry.getKey();
+ final ThreadPoolExecutor executor = entry.getValue();
+
+ //开始计算相关指标
+ final int activeCount = executor.getActiveCount();
+ final int poolSize = executor.getCorePoolSize();
+ double usedPercent = activeCount / (poolSize * 1.0);
+
+ log.info("线程池运行状况:[{}/{}:{}%]",activeCount,poolSize,usedPercent);
+
+ if (usedPercent > ALARM_PERCENT) {
+ log.warn("超过警戒值!!!URL:{}",url);
+ }
+ }
+ }
+}
diff --git a/xjs-study/dubbo-project/dubbo-spi-threadpool/src/main/resources/META-INF/dubbo/org.apache.dubbo.common.threadpool.ThreadPool b/xjs-study/dubbo-project/dubbo-spi-threadpool/src/main/resources/META-INF/dubbo/org.apache.dubbo.common.threadpool.ThreadPool
new file mode 100644
index 00000000..77d2f933
--- /dev/null
+++ b/xjs-study/dubbo-project/dubbo-spi-threadpool/src/main/resources/META-INF/dubbo/org.apache.dubbo.common.threadpool.ThreadPool
@@ -0,0 +1 @@
+watching=com.xjs.thread.WatchingThreadPool
diff --git a/xjs-study/dubbo-project/pom.xml b/xjs-study/dubbo-project/pom.xml
index 4d35c229..3b9fc61e 100644
--- a/xjs-study/dubbo-project/pom.xml
+++ b/xjs-study/dubbo-project/pom.xml
@@ -17,6 +17,9 @@
dubbo-spi-api
dubbo-spi-impl
dubbo-spi-main
+ dubbo-spi-filter
+ dubbo-spi-loadbalance
+ dubbo-spi-threadpool
dubbo-project
diff --git a/xjs-study/dubbo-project/service-api/src/main/java/com/xjs/service/HelloService.java b/xjs-study/dubbo-project/service-api/src/main/java/com/xjs/service/HelloService.java
index 6972a56f..3d9c8ab9 100644
--- a/xjs-study/dubbo-project/service-api/src/main/java/com/xjs/service/HelloService.java
+++ b/xjs-study/dubbo-project/service-api/src/main/java/com/xjs/service/HelloService.java
@@ -6,4 +6,6 @@ package com.xjs.service;
*/
public interface HelloService {
String sayHello(String name);
+
+ String sayHello(String name,int timeTowait);
}
diff --git a/xjs-study/dubbo-project/service-consumer/pom.xml b/xjs-study/dubbo-project/service-consumer/pom.xml
index 7cddca10..2de4ca1d 100644
--- a/xjs-study/dubbo-project/service-consumer/pom.xml
+++ b/xjs-study/dubbo-project/service-consumer/pom.xml
@@ -24,6 +24,18 @@
1.0
+
+ com.xjs
+ dubbo-spi-filter
+ 1.0
+
+
+
+ com.xjs
+ dubbo-spi-loadbalance
+ 1.0
+
+
org.apache.dubbo
dubbo
diff --git a/xjs-study/dubbo-project/service-consumer/src/main/java/com/xjs/AnnotationConsumerApplication.java b/xjs-study/dubbo-project/service-consumer/src/main/java/com/xjs/AnnotationConsumerApplication.java
index 164afd30..3eb6bff2 100644
--- a/xjs-study/dubbo-project/service-consumer/src/main/java/com/xjs/AnnotationConsumerApplication.java
+++ b/xjs-study/dubbo-project/service-consumer/src/main/java/com/xjs/AnnotationConsumerApplication.java
@@ -23,12 +23,27 @@ public class AnnotationConsumerApplication {
ConsumerComponent service = context.getBean(ConsumerComponent.class);
while (true) {
- System.in.read();
- String hello = service.sayHello("傻逼");
+ for (int i = 0; i < 1000; i++) {
+ try {
+ Thread.sleep(5);
+ new Thread(new Runnable() {
+ @Override
+ public void run() {
+ String msg = service.sayHello("hello");
+ System.out.println(msg);
+ }
+ }).start();
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
- System.out.println(hello);
}
+
+ //String msg = service.sayHello("hello");
+ //System.out.println(msg);
+
}
@Configuration
diff --git a/xjs-study/dubbo-project/service-consumer/src/main/java/com/xjs/XmlConsumerApplication.java b/xjs-study/dubbo-project/service-consumer/src/main/java/com/xjs/XmlConsumerApplication.java
new file mode 100644
index 00000000..4906018b
--- /dev/null
+++ b/xjs-study/dubbo-project/service-consumer/src/main/java/com/xjs/XmlConsumerApplication.java
@@ -0,0 +1,37 @@
+package com.xjs;
+
+import com.xjs.service.HelloService;
+import org.apache.dubbo.rpc.RpcContext;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+
+import java.io.IOException;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+
+/**
+ * @author xiejs
+ * @since 2022-05-24
+ */
+public class XmlConsumerApplication {
+
+ public static void main(String[] args) throws IOException, ExecutionException, InterruptedException {
+
+ ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("consumer.xml");
+
+ HelloService helloService = context.getBean(HelloService.class);
+
+ while (true) {
+ System.in.read();
+
+ String word = helloService.sayHello("word", 500
+ );
+
+ //利用Future 模式来获取
+ Future
+
+ com.xjs
+ dubbo-spi-shreadpool
+ 1.0
+
+
org.apache.dubbo
dubbo
diff --git a/xjs-study/dubbo-project/service-provider/src/main/java/com/xjs/DubboApplication2.java b/xjs-study/dubbo-project/service-provider/src/main/java/com/xjs/DubboApplication2.java
new file mode 100644
index 00000000..3e4634a4
--- /dev/null
+++ b/xjs-study/dubbo-project/service-provider/src/main/java/com/xjs/DubboApplication2.java
@@ -0,0 +1,35 @@
+package com.xjs;
+
+import org.apache.dubbo.config.RegistryConfig;
+import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
+import org.springframework.context.annotation.AnnotationConfigApplicationContext;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.PropertySource;
+
+import java.io.IOException;
+
+/**
+ * @author xiejs
+ * @since 2022-05-23
+ */
+public class DubboApplication2 {
+
+ public static void main(String[] args) throws IOException {
+ AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ProviderConfiguration.class);
+ context.start();
+ System.in.read();
+ }
+
+ @Configuration
+ @EnableDubbo(scanBasePackages = "com.xjs.service")
+ @PropertySource("classpath:/dubbo-provider2.properties")
+ static class ProviderConfiguration{
+ @Bean
+ public RegistryConfig registryConfig() {
+ RegistryConfig registryConfig = new RegistryConfig();
+ registryConfig.setAddress("nacos://127.0.0.1:8848");
+ return registryConfig;
+ }
+ }
+}
diff --git a/xjs-study/dubbo-project/service-provider/src/main/java/com/xjs/DubboApplication3.java b/xjs-study/dubbo-project/service-provider/src/main/java/com/xjs/DubboApplication3.java
new file mode 100644
index 00000000..a1d6607c
--- /dev/null
+++ b/xjs-study/dubbo-project/service-provider/src/main/java/com/xjs/DubboApplication3.java
@@ -0,0 +1,35 @@
+package com.xjs;
+
+import org.apache.dubbo.config.RegistryConfig;
+import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
+import org.springframework.context.annotation.AnnotationConfigApplicationContext;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.PropertySource;
+
+import java.io.IOException;
+
+/**
+ * @author xiejs
+ * @since 2022-05-23
+ */
+public class DubboApplication3 {
+
+ public static void main(String[] args) throws IOException {
+ AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ProviderConfiguration.class);
+ context.start();
+ System.in.read();
+ }
+
+ @Configuration
+ @EnableDubbo(scanBasePackages = "com.xjs.service")
+ @PropertySource("classpath:/dubbo-provider3.properties")
+ static class ProviderConfiguration{
+ @Bean
+ public RegistryConfig registryConfig() {
+ RegistryConfig registryConfig = new RegistryConfig();
+ registryConfig.setAddress("nacos://127.0.0.1:8848");
+ return registryConfig;
+ }
+ }
+}
diff --git a/xjs-study/dubbo-project/service-provider/src/main/java/com/xjs/service/HelloServiceImpl.java b/xjs-study/dubbo-project/service-provider/src/main/java/com/xjs/service/HelloServiceImpl.java
index 8fb14217..aaa0c44f 100644
--- a/xjs-study/dubbo-project/service-provider/src/main/java/com/xjs/service/HelloServiceImpl.java
+++ b/xjs-study/dubbo-project/service-provider/src/main/java/com/xjs/service/HelloServiceImpl.java
@@ -2,6 +2,8 @@ package com.xjs.service;
import org.apache.dubbo.config.annotation.Service;
+import java.util.concurrent.TimeUnit;
+
/**
* @author xiejs
* @since 2022-05-23
@@ -12,4 +14,19 @@ public class HelloServiceImpl implements HelloService{
public String sayHello(String name) {
return "Hello:"+name;
}
+
+ @Override
+ public String sayHello(String name, int timeTowait) {
+ try {
+ TimeUnit.SECONDS.sleep(1);
+
+ Thread.sleep(timeTowait);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+
+ return "Hello:"+name;
+ }
+
+
}
diff --git a/xjs-study/dubbo-project/service-provider/src/main/resources/dubbo-provider.properties b/xjs-study/dubbo-project/service-provider/src/main/resources/dubbo-provider.properties
index 9441cb13..868ec333 100644
--- a/xjs-study/dubbo-project/service-provider/src/main/resources/dubbo-provider.properties
+++ b/xjs-study/dubbo-project/service-provider/src/main/resources/dubbo-provider.properties
@@ -4,5 +4,9 @@ dubbo.protocol.name=dubbo
dubbo.protocol.port=7711
+dubbo.protocol.host=localhost
+
+dubbo.provider.threadpool=watching
+
diff --git a/xjs-study/dubbo-project/service-provider/src/main/resources/dubbo-provider2.properties b/xjs-study/dubbo-project/service-provider/src/main/resources/dubbo-provider2.properties
new file mode 100644
index 00000000..e3434c96
--- /dev/null
+++ b/xjs-study/dubbo-project/service-provider/src/main/resources/dubbo-provider2.properties
@@ -0,0 +1,9 @@
+dubbo.application.name=service-provider
+
+dubbo.protocol.name=dubbo
+
+dubbo.protocol.port=7712
+
+dubbo.protocol.host=localhost
+
+
diff --git a/xjs-study/dubbo-project/service-provider/src/main/resources/dubbo-provider3.properties b/xjs-study/dubbo-project/service-provider/src/main/resources/dubbo-provider3.properties
new file mode 100644
index 00000000..41df2ea1
--- /dev/null
+++ b/xjs-study/dubbo-project/service-provider/src/main/resources/dubbo-provider3.properties
@@ -0,0 +1,9 @@
+dubbo.application.name=service-provider
+
+dubbo.protocol.name=dubbo
+
+dubbo.protocol.port=7713
+
+
+dubbo.protocol.host=localhost
+