diff --git a/example-client/src/main/java/github/javaguide/NettyClientMain.java b/example-client/src/main/java/github/javaguide/NettyClientMain.java index fade615ff67dc12f0ca23beff53aaab454c62832..7408efab5866f5a578100c93e7646d9c8a3950ff 100644 --- a/example-client/src/main/java/github/javaguide/NettyClientMain.java +++ b/example-client/src/main/java/github/javaguide/NettyClientMain.java @@ -17,6 +17,8 @@ public class NettyClientMain { //如需使用 assert 断言,需要在 VM options 添加参数:-ea assert "Hello description is 222".equals(hello); Thread.sleep(12000); - helloService.hello(new Hello("111", "222")); + for (int i = 0; i < 10; i++) { + helloService.hello(new Hello("111", "222")); + } } } diff --git a/example-server/src/main/java/github/javaguide/NettyServerMain2.java b/example-server/src/main/java/github/javaguide/NettyServerMain2.java new file mode 100644 index 0000000000000000000000000000000000000000..6411376961ba97f9203ded3ff92b00b5aa36d2c4 --- /dev/null +++ b/example-server/src/main/java/github/javaguide/NettyServerMain2.java @@ -0,0 +1,15 @@ +package github.javaguide; + +import github.javaguide.remoting.transport.netty.server.NettyServer; + +/** + * @author shuang.kou + * @createTime 2020年05月10日 07:25:00 + */ +public class NettyServerMain2 { + public static void main(String[] args) { + HelloService helloService = new HelloServiceImpl(); + NettyServer nettyServer = new NettyServer("127.0.0.1", 9998); + nettyServer.publishService(helloService, HelloService.class); + } +} diff --git a/rpc-framework-simple/src/main/java/github/javaguide/loadbalance/AbstractLoadBalance.java b/rpc-framework-simple/src/main/java/github/javaguide/loadbalance/AbstractLoadBalance.java new file mode 100644 index 0000000000000000000000000000000000000000..1af981b9e09b5ae96ceaa2a9732ec9dbaa7844ed --- /dev/null +++ b/rpc-framework-simple/src/main/java/github/javaguide/loadbalance/AbstractLoadBalance.java @@ -0,0 +1,23 @@ +package github.javaguide.loadbalance; + +import java.util.List; + +/** + * @author shuang.kou + * @createTime 2020年06月21日 07:44:00 + */ +public abstract class AbstractLoadBalance implements LoadBalance { + @Override + public String selectServiceAddress(List serviceAddresses) { + if (serviceAddresses == null || serviceAddresses.size() == 0) { + return null; + } + if (serviceAddresses.size() == 1) { + return serviceAddresses.get(0); + } + return doSelect(serviceAddresses); + } + + protected abstract String doSelect(List serviceAddresses); + +} diff --git a/rpc-framework-simple/src/main/java/github/javaguide/loadbalance/LoadBalance.java b/rpc-framework-simple/src/main/java/github/javaguide/loadbalance/LoadBalance.java new file mode 100644 index 0000000000000000000000000000000000000000..e182ee0104b035252f0581ebf3ae7642d6533267 --- /dev/null +++ b/rpc-framework-simple/src/main/java/github/javaguide/loadbalance/LoadBalance.java @@ -0,0 +1,17 @@ +package github.javaguide.loadbalance; + +import java.util.List; + +/** + * @author shuang.kou + * @createTime 2020年06月21日 07:44:00 + */ +public interface LoadBalance { + /** + * 在已有服务提供地址列表中选择一个 + * + * @param serviceAddresses 服务地址列表 + * @return 目标服务地址 + */ + String selectServiceAddress(List serviceAddresses); +} diff --git a/rpc-framework-simple/src/main/java/github/javaguide/loadbalance/RandomLoadBalance.java b/rpc-framework-simple/src/main/java/github/javaguide/loadbalance/RandomLoadBalance.java new file mode 100644 index 0000000000000000000000000000000000000000..de05464166179769151fd062696379e5d37a67a4 --- /dev/null +++ b/rpc-framework-simple/src/main/java/github/javaguide/loadbalance/RandomLoadBalance.java @@ -0,0 +1,16 @@ +package github.javaguide.loadbalance; + +import java.util.List; +import java.util.Random; + +/** + * @author shuang.kou + * @createTime 2020年06月21日 07:47:00 + */ +public class RandomLoadBalance extends AbstractLoadBalance { + @Override + protected String doSelect(List serviceAddresses) { + Random random = new Random(); + return serviceAddresses.get(random.nextInt(serviceAddresses.size())); + } +} diff --git a/rpc-framework-simple/src/main/java/github/javaguide/registry/ZkServiceDiscovery.java b/rpc-framework-simple/src/main/java/github/javaguide/registry/ZkServiceDiscovery.java index aaef68dbdb34549db9287cd7998391cbdf47a643..a7db8209f9db3e02c28c72790d11754a5125c45b 100644 --- a/rpc-framework-simple/src/main/java/github/javaguide/registry/ZkServiceDiscovery.java +++ b/rpc-framework-simple/src/main/java/github/javaguide/registry/ZkServiceDiscovery.java @@ -1,9 +1,12 @@ package github.javaguide.registry; +import github.javaguide.loadbalance.LoadBalance; +import github.javaguide.loadbalance.RandomLoadBalance; import github.javaguide.utils.zk.CuratorUtils; import lombok.extern.slf4j.Slf4j; import java.net.InetSocketAddress; +import java.util.List; /** * 基于 zookeeper 实现服务发现 @@ -13,14 +16,20 @@ import java.net.InetSocketAddress; */ @Slf4j public class ZkServiceDiscovery implements ServiceDiscovery { + private final LoadBalance loadBalance; + + public ZkServiceDiscovery() { + this.loadBalance = new RandomLoadBalance(); + } @Override public InetSocketAddress lookupService(String serviceName) { - // TODO(shuang.kou):feat: 负载均衡 // 这里直接去了第一个找到的服务地址,eg:127.0.0.1:9999 - String serviceAddress = CuratorUtils.getChildrenNodes(serviceName).get(0); - log.info("成功找到服务地址:[{}]", serviceAddress); - String[] socketAddressArray = serviceAddress.split(":"); + List serviceUrlList = CuratorUtils.getChildrenNodes(serviceName); + // 负载均衡 + String targetServiceUrl = loadBalance.selectServiceAddress(serviceUrlList); + log.info("成功找到服务地址:[{}]", targetServiceUrl); + String[] socketAddressArray = targetServiceUrl.split(":"); String host = socketAddressArray[0]; int port = Integer.parseInt(socketAddressArray[1]); return new InetSocketAddress(host, port);