RPC-BDY(4)-nacos注册中心
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使用
- 运行(linux)
sh startup.sh -m standalone
- 引入依赖
<dependency><groupId>com.alibaba.nacos</groupId><artifactId>nacos-client</artifactId><version>1.3.0</version></dependency>
- 实现注册类
通过 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注册中心相关推荐
- Nacos 注册中心主要贡献者详解注册中心的设计原理
服务发现是一个古老的话题,当应用开始脱离单机运行和访问时,服务发现就诞生了. 目前的网络架构是每个主机都有一个独立的 IP 地址,那么服务发现基本上都是通过某种方式获取到服务所部署的 IP 地址.DN ...
- Spring Cloud 系列之 Alibaba Nacos 注册中心(一)
前言 从本章节开始,我们学习 Spring Cloud Alibaba 相关微服务组件. Spring Cloud Alibaba 介绍 Spring Cloud Alibaba 致力于提供微服务开发 ...
- Spring Cloud Alibaba系列使用(二)----Nacos注册中心
1|1Spring Cloud Alibaba 介绍 Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案.此项目包含开发分布式应用微服务的必需组件,方便开发者通过 Spri ...
- Dubbo 稳定性案例:Nacos 注册中心可用性问题复盘
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | kiritomoe 来源 | 公众号「Kiri ...
- Nacos注册中心的部署与用法详细介绍
一.什么是注册中心: 我们知道微服务彼此间独立部署.具有清晰的边界,服务间通过远程调用来构建复杂的业务功能.而服务册中心在微服务项目中扮演着非常重要的角色,那么注册中心又是什么,使用服务注册中心可以解 ...
- 手动造轮子——为Ocelot集成Nacos注册中心
前言 近期在看博客的时候或者在群里看聊天的时候,发现很多都提到了Ocelot网关的问题.我之前也研究过一点,网关本身是一种通用的解决方案,主要的工作就是拦截请求统一处理,比如认证.授权.熔断.限流.注 ...
- 微服务系列之ZooKeeper注册中心和Nacos注册中心Nacos和Zookeeper对比
一.ZooKeeper注册中心 Zookeeper 是 Apache Hadoop 的子项目,是一个树型的目录服务,支持变更推送,适合作为 Dubbo 服务的注册中心,工业强度较高,可用于生产环境,推 ...
- Nacos注册中心和服务消费方式
哈喽朋友们本次小無分享Nacos注册中心和服务消费方式 前言:本期文章操作性不多,多在于详细的理论说明 还各位看官耐心看完 一,服务治理介绍 目录 一,服务治理介绍 二,nacos简介 nacos实战 ...
- 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 测 ...
最新文章
- 关于python3与python2同时存在情况下导入pyqt失败解决记录
- 构建区块链数字货币交易平台服务器的选择
- 关于header(Cache-control: private)
- 04-windows下Orcale的启动
- 关于C语言中一些常用函数的说明
- new关键字执行过程
- C语言会场安排问题贪心算法,贪心算法解决会场安排问题多处最优服务次序问题(含源代码).doc...
- 解决了跨域POST的问题
- 「手把手带你学算法」本周小结!(贪心算法系列三)
- C#无法将顶级控件添加到控件 新的子窗体无法添加到主窗体
- 【图像融合】基于matlab对比度和结构提取多模态解剖图像融合【含Matlab源码 1539期】
- TraceView的使用
- 《SEM长尾搜索营销策略解密》一一2.12 宝洁里的长尾与创新
- 面经——嵌入式常见面试题总结100题(下)
- 基于K210的人脸识别门禁
- Roaring64Bitmap实践
- 全世界上有380万人死于新冠肺炎,但还不到每年死于吸烟人数的一半
- word脚注:文字与分隔符间的空格删除
- 第七届计算机科学夏令营,2020年中国科学技术大学第七届计算机科学暑期夏令营报名通知...
- parzen窗方法和k近邻方法估计概率密度
热门文章
- 以计算机网络为话题的英语作文,以Internet为话题的英语作文
- 数仓开发5大SQL分析函数
- 首席架构师推荐:史上最全微服务架构简史详解!
- 雷达副瓣对消的matlab程序,动目标显示与脉冲多普勒雷达(MATLAB程式设计)
- 云栖专辑 | 阿里开发者们的第8个感悟:在信息大爆炸的时代,保持专注度显得尤为可贵... 1
- java写的麻将小游戏
- 菜鸟要飞分享的视频教程
- VTK进行IGES文件的读取及显示
- Linux/macOS 安装 Kaldi
- 2020年全国各省、各个地级市、各县的10米分辨率的土地利用数据的制作方法与获取