之前demo中客户端只能和一个服务端通信,实现的是一个服务端提供多个本地任务,客户端进行调用,如果服务端地址改变,Rpc框架就失效。因此需要一个远程服务注册中心,多个服务提供者将自己的服务注册到其中,客户端向服务注册中心申请调用。假设一个服务由多个提供者提供,其中一个失效,其余提供者也可以保障Rpc框架实现,同时还可以满足负载均衡。
这次优化使用的是Nacos服务注册中心,参考了博客
知识点
实现步骤
一、Nacos安装配置
-
首先是下载解压windows版下的Nacos,下载地址
-
解压以后打开bin目录下的startup.cmd文件,如果闪退,可能是jdk版本错误,更有可能是java配置环境变量的时候,因为存在多版本配置了多个名称。解决方案就是把jdk1.8对应的环境变量的名称改为JAVA_HOME,必须一致!解决方案参考
-
在Maven工程pom.xml中导入依赖
<dependency> <groupId>com.alibaba.nacos</groupId> <artifactId>nacos-client</artifactId> <version>1.4.0</version> </dependency>
二、远程服务注册类
-
之前demo中的服务注册,是对一个本地服务器,可能实现的多种服务进行注册,因此将类名修改为LocalServiceRegistry。我们现在需要的远程服务注册中心,针对多个服务端(提供者),因此先创建一个通用接口RemoteServiceRegistry
public interface RemoteServiceRegistry { // 根据服务名和提供服务的地址,注册服务 void register(String serviceName, InetSocketAddress inetSocketAddress); // 根据服务名在远程注册中心查询提供服务的地址 InetSocketAddress FindServiceAddr(String serviceName); }
主要存在两个方法:根据服务名(其实是具体服务继承的接口名)和服务提供者的通信地址(ip加端口)来向注册中心注册服务;根据服务名,在远程服务注册中心查询对应服务提供者的地址。
-
创建一个使用Nacos继承上述接口的实现类 NacosRemoteServiceRegistry
public class NacosRemoteServiceRegistry implements RemoteServiceRegistry { private static final Logger logger = LoggerFactory.getLogger(NacosRemoteServiceRegistry.class); // Nacos连接地址 private static final String SERVER_ADDR = "127.0.0.1:8848"; // Nacos实例对象 private static final NamingService namingService; // 初始化 static { try{ // 连接到Nacos远程服务注册中心 namingService = NamingFactory.createNamingService(