RPC-BDY(4)

-2022.7.19


文章目录

  • RPC-BDY(4)
  • 前言
  • 一、nacos
  • 二、nacos使用
  • 三、服务注册发现
  • 四、测试
  • 总结

前言

这一节的主要内容是将注册中心更改为nacos
原因:原有的框架服务端的地址固定,对于一个客户端,它只会去寻找那么一个服务提供者,如果这个提供者挂了或者换了地址,那就没有办法了。
实现nacos后,如果拿来的这个挂了,还可以重新请求,并且在这种情况下可以很方便地实现负载均衡。


一、nacos

1.简介:

Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速 实现动态服务发现、服务配置、服务元数据及流量管理。

2.实现:

在RPC框架中,通过核心组件namingService来实现nacos的连接注册和获取

连接

 //通过 NamingFactory 创建 NamingService 连接 NacosnamingService = NamingFactory.createNamingService(SERVER_ADDR);

注册

 namingService.registerInstance(serviceName, inetSocketAddress.getHostName(), inetSocketAddress.getPort());

获取

 List<Instance> instances =  namingService.getAllInstances(serviceName);//这里为什么要get0//通过 getAllInstance 获取到某个服务的所有提供者列表后,需要选择一个,这里就涉及了负载均衡策略,这里我们先选择第 0 个,后面某节会详细讲解负载均衡。Instance instance = instances.get(0);return new InetSocketAddress(instance.getIp(), instance.getPort());

二、nacos使用

  1. 运行(linux)
sh startup.sh -m standalone
  1. 引入依赖
        <dependency><groupId>com.alibaba.nacos</groupId><artifactId>nacos-client</artifactId><version>1.3.0</version></dependency>
  1. 实现注册类

通过 NamingFactory 创建 NamingService 连接 Nacos并实现注册和发现

  • ServiceRegistry注册接口
public interface ServiceRegistry {void register(String serviceName, InetSocketAddress inetSocketAddress);InetSocketAddress lookupService(String serviceName);
}
  • NacosServiceRegistry注册实现类
/*** Nacos服务注册中心* @author bdy*/
public class NacosServiceRegistry implements ServiceRegistry{private static final Logger logger = LoggerFactory.getLogger(NacosServiceRegistry.class);private static final String SERVER_ADDR = "127.0.0.1:8848";private static final NamingService namingService;static {try {//通过 NamingFactory 创建 NamingService 连接 NacosnamingService = NamingFactory.createNamingService(SERVER_ADDR);} catch (NacosException e) {logger.error("连接到Nacos时有错误发生: ", e);throw new RpcException(RpcError.FAILED_TO_CONNECT_TO_SERVICE_REGISTRY);}}@Overridepublic void register(String serviceName, InetSocketAddress inetSocketAddress) {try {namingService.registerInstance(serviceName, inetSocketAddress.getHostName(), inetSocketAddress.getPort());} catch (NacosException e) {logger.error("注册服务时有错误发生:", e);throw new RpcException(RpcError.REGISTER_SERVICE_FAILED);}}@Overridepublic InetSocketAddress lookupService(String serviceName) {try {//获得提供某个服务的所有提供者的列表List<Instance> instances =  namingService.getAllInstances(serviceName);//这里为什么要get0//通过 getAllInstance 获取到某个服务的所有提供者列表后,需要选择一个,这里就涉及了负载均衡策略,这里我们先选择第 0 个,后面某节会详细讲解负载均衡。Instance instance = instances.get(0);return new InetSocketAddress(instance.getIp(), instance.getPort());} catch (NacosException e) {logger.error("获取服务时有错误发生:", e);}return null;}
}

三、服务注册发现

1.RpcServer新增 publishService方法,用于向 Nacos 注册服务

<T> void publishService(Object service, Class<T> serviceClass);

2.NettyServer 的实现

将服务保存在本地的注册表,同时注册到 Nacos 上

    @Overridepublic <T> void publishService(Object service, Class<T> serviceClass) {serviceProvider.addService(service);serviceRegistry.register(serviceClass.getCanonicalName(), new InetSocketAddress(host, port));start();}

3.NettyClient修改

在sendrequest方法中首先从 ServiceRegistry 中获取到服务的地址和端口,再构造

   InetSocketAddress inetSocketAddress = serviceRegistry.lookupService(rpcRequest.getInterfaceName());Channel channel = ChannelProvider.get(inetSocketAddress);

四、测试

1.NettyTestClient

/*** 测试用Netty消费者* @author bdy*/
public class NettyTestClient {public static void main(String[] args) {RpcClient client = new NettyClient();
//        client.setSerializer(new ProtobufSerializer());RpcClientProxy rpcClientProxy = new RpcClientProxy(client);HelloService helloService = rpcClientProxy.getProxy(HelloService.class);HelloObject object = new HelloObject(12, "This is a message");String res = helloService.hello(object);System.out.println(res);}
}

2.NettyTestServer

/*** 测试用Netty服务提供者(服务端)* @author bdy*/
public class NettyTestServer {public static void main(String[] args) {HelloService helloService = new HelloServiceImpl();NettyServer server = new NettyServer("127.0.0.1", 9999);
//        server.setSerializer(new ProtobufSerializer());server.publishService(helloService, HelloService.class);}
}

总结

1.实现nacos注册中心

2.关于netty的编码解码器实现:
因为要传输的是自定义实体类,所以需要有编码解码器

                          pipeline.addLast(new ObjectDecoder(1024*1024, ClassResolvers.cacheDisabled((this.getClass().getClassLoader()))));pipeline.addLast(new ObjectEncoder());

3.在NettyClient中可以不需要添加编解码器
原因:
在NettyClient中的bootstrap无用,主要是在ChannelProvider中实现bootstrap

RPC-BDY(4)-nacos注册中心相关推荐

  1. Nacos 注册中心主要贡献者详解注册中心的设计原理

    服务发现是一个古老的话题,当应用开始脱离单机运行和访问时,服务发现就诞生了. 目前的网络架构是每个主机都有一个独立的 IP 地址,那么服务发现基本上都是通过某种方式获取到服务所部署的 IP 地址.DN ...

  2. Spring Cloud 系列之 Alibaba Nacos 注册中心(一)

    前言 从本章节开始,我们学习 Spring Cloud Alibaba 相关微服务组件. Spring Cloud Alibaba 介绍 Spring Cloud Alibaba 致力于提供微服务开发 ...

  3. Spring Cloud Alibaba系列使用(二)----Nacos注册中心

    1|1Spring Cloud Alibaba 介绍 Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案.此项目包含开发分布式应用微服务的必需组件,方便开发者通过 Spri ...

  4. Dubbo 稳定性案例:Nacos 注册中心可用性问题复盘

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | kiritomoe 来源 | 公众号「Kiri ...

  5. Nacos注册中心的部署与用法详细介绍

    一.什么是注册中心: 我们知道微服务彼此间独立部署.具有清晰的边界,服务间通过远程调用来构建复杂的业务功能.而服务册中心在微服务项目中扮演着非常重要的角色,那么注册中心又是什么,使用服务注册中心可以解 ...

  6. 手动造轮子——为Ocelot集成Nacos注册中心

    前言 近期在看博客的时候或者在群里看聊天的时候,发现很多都提到了Ocelot网关的问题.我之前也研究过一点,网关本身是一种通用的解决方案,主要的工作就是拦截请求统一处理,比如认证.授权.熔断.限流.注 ...

  7. 微服务系列之ZooKeeper注册中心和Nacos注册中心Nacos和Zookeeper对比

    一.ZooKeeper注册中心 Zookeeper 是 Apache Hadoop 的子项目,是一个树型的目录服务,支持变更推送,适合作为 Dubbo 服务的注册中心,工业强度较高,可用于生产环境,推 ...

  8. Nacos注册中心和服务消费方式

    哈喽朋友们本次小無分享Nacos注册中心和服务消费方式 前言:本期文章操作性不多,多在于详细的理论说明 还各位看官耐心看完 一,服务治理介绍 目录 一,服务治理介绍 二,nacos简介 nacos实战 ...

  9. Nacos注册中心8-Server端(处理注册请求)

    0. 环境 nacos版本:1.4.1 Spring Cloud : 2020.0.2 Spring Boot :2.4.4 Spring Cloud alibaba: 2.2.5.RELEASE 测 ...

最新文章

  1. 关于python3与python2同时存在情况下导入pyqt失败解决记录
  2. 构建区块链数字货币交易平台服务器的选择
  3. 关于header(Cache-control: private)
  4. 04-windows下Orcale的启动
  5. 关于C语言中一些常用函数的说明
  6. new关键字执行过程
  7. C语言会场安排问题贪心算法,贪心算法解决会场安排问题多处最优服务次序问题(含源代码).doc...
  8. 解决了跨域POST的问题
  9. 「手把手带你学算法」本周小结!(贪心算法系列三)
  10. C#无法将顶级控件添加到控件 新的子窗体无法添加到主窗体
  11. 【图像融合】基于matlab对比度和结构提取多模态解剖图像融合【含Matlab源码 1539期】
  12. TraceView的使用
  13. 《SEM长尾搜索营销策略解密》一一2.12 宝洁里的长尾与创新
  14. 面经——嵌入式常见面试题总结100题(下)
  15. 基于K210的人脸识别门禁
  16. Roaring64Bitmap实践
  17. 全世界上有380万人死于新冠肺炎,但还不到每年死于吸烟人数的一半
  18. word脚注:文字与分隔符间的空格删除
  19. 第七届计算机科学夏令营,2020年中国科学技术大学第七届计算机科学暑期夏令营报名通知...
  20. parzen窗方法和k近邻方法估计概率密度

热门文章

  1. 以计算机网络为话题的英语作文,以Internet为话题的英语作文
  2. 数仓开发5大SQL分析函数
  3. 首席架构师推荐:史上最全微服务架构简史详解!
  4. 雷达副瓣对消的matlab程序,动目标显示与脉冲多普勒雷达(MATLAB程式设计)
  5. 云栖专辑 | 阿里开发者们的第8个感悟:在信息大爆炸的时代,保持专注度显得尤为可贵... 1
  6. java写的麻将小游戏
  7. 菜鸟要飞分享的视频教程
  8. VTK进行IGES文件的读取及显示
  9. Linux/macOS 安装 Kaldi
  10. 2020年全国各省、各个地级市、各县的10米分辨率的土地利用数据的制作方法与获取