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 future = RpcContext.getContext().getFuture(); + System.out.println("future result:"+future.get()); + + System.out.println(word); + + } + } +} diff --git a/xjs-study/dubbo-project/service-consumer/src/main/java/com/xjs/bean/ConsumerComponent.java b/xjs-study/dubbo-project/service-consumer/src/main/java/com/xjs/bean/ConsumerComponent.java index 18187355..03af9efe 100644 --- a/xjs-study/dubbo-project/service-consumer/src/main/java/com/xjs/bean/ConsumerComponent.java +++ b/xjs-study/dubbo-project/service-consumer/src/main/java/com/xjs/bean/ConsumerComponent.java @@ -11,11 +11,11 @@ import org.springframework.stereotype.Component; @Component public class ConsumerComponent { - @Reference + @Reference(loadbalance = "onlyFirst") private HelloService helloService; public String sayHello(String name) { - return helloService.sayHello(name); + return helloService.sayHello(name,10); } } diff --git a/xjs-study/dubbo-project/service-consumer/src/main/resources/consumer.xml b/xjs-study/dubbo-project/service-consumer/src/main/resources/consumer.xml new file mode 100644 index 00000000..6d42ab0c --- /dev/null +++ b/xjs-study/dubbo-project/service-consumer/src/main/resources/consumer.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + diff --git a/xjs-study/dubbo-project/service-provider/pom.xml b/xjs-study/dubbo-project/service-provider/pom.xml index 71be7a2b..988a75b7 100644 --- a/xjs-study/dubbo-project/service-provider/pom.xml +++ b/xjs-study/dubbo-project/service-provider/pom.xml @@ -24,6 +24,12 @@ 1.0 + + 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 +