34 | 动手实现一个简单的RPC框架(四):服务端
该思维导图由 AI 生成,仅供参考
注册中心是如何实现的?
- 深入了解
- 翻译
- 解释
- 总结
该篇文章介绍了如何实现一个简单的RPC框架的服务端部分。首先讲解了注册中心的实现,包括客户端和服务端两部分,以及元数据的保存和查询。作者提到了注册中心的设计模式采用了面向接口编程,可以通过增加SPI插件的方式实现跨服务器调用的注册中心。接着详细介绍了注册中心的接口设计和实现方法,以及注册中心的可扩展性和动态选择不同实现的机制。在具体实现中,作者展示了一个本地文件注册中心的简单实现,同时强调了对共享资源的并发读写需要加锁的重要性。整体来说,本文通过讲解注册中心的设计和实现,展示了RPC框架服务端的关键部分,为读者提供了深入理解RPC框架的基础知识和实现思路。 文章还介绍了RPC框架的服务端实现原理,包括服务端的业务代码把服务的实现类注册到RPC框架中以及接收客户端桩发出的请求,调用服务的实现类并返回结果。通过代码示例展示了服务端如何处理客户端发送的RPC请求,包括根据请求类型分发到对应的处理类或方法,并使用命令注册机制简化路由分发过程。此外,还介绍了RPC框架服务端处理客户端请求的核心部分,包括注册RPC服务和处理客户端RPC请求的实现。 总的来说,本文内容涵盖了RPC框架服务端的关键实现部分,包括注册中心设计、服务端实现原理和核心业务逻辑。读者可以通过本文了解RPC框架的基本原理和实现方法,为进一步深入学习和应用RPC框架提供了基础知识和思路。
《消息队列高手课》,新⼈⾸单¥59
全部留言(14)
- 最新
- 精选
- 益军您好哈,提个疑问: 服务端业务方法不应该在channelRead0中执行,会导致netty ioEvent线程阻塞,应该异步提交到业务线程池执行 workers.execute(() -> { Command response = handler.handle(request); if (null != response) { channelHandlerContext.writeAndFlush(response).addListener((ChannelFutureListener) channelFuture -> { if (!channelFuture.isSuccess()) { logger.warn("Write response failed!", channelFuture.cause()); channelHandlerContext.channel().close(); } }); } else { logger.warn("Response is null!"); } }); Command response = handler.handle(request);
作者回复: 在实际生产过程中,很多情况是需要这样处理的。避免阻塞IO线程。
2019-12-1012 - Gred来交作业啦【https://github.com/Gred01/simple-rpc-framework/tree/nameservice】,其实本应该在周五就写好了,现在写的demo支持mysql和oracle,初始化sql在rpc-netty底下init-sql.md。
作者回复: 交作业的都是好同学,👍! 一个建议:使用PreparedStatement,不要用字符出拼SQL,会有SQL注入漏洞。
2019-10-2827 - z.l请教下老师,如果要实现一个可供生产环境大规模集群使用的注册中心,JDBC协议是不是就不太合适了?这种情况下一个注册中心要满足哪些要求呢?个人盲猜:可多台部署、基于tcp协议最好也是netty实现、彼此之间要保证数据一致性(好像也不用强一致),不知道理解对不对
作者回复: 大致的要求就是: 可用性:不能因为某个节点故障导致注册中心不可以; 数据一致性:能保证顺序一致性一般就可以满足需求了。 性能:server节点状态变更后,能尽快更新。 另外,大规模集群情况下,需要考虑业务系统上下线时,注册中心的性能问题。比如:一个几千个节点的微服务上线,会重启几千个Server节点,这时候注册中心需要更新大量的数据。
2019-11-012 - zero如果服务端挂掉了,怎么通知NameService呢?
作者回复: 这个问题在我们的demo中并没有解决。实际在生产环境中,有些注册中心会定期检查服务端的状态,但是即使这样也不能保证注册中心中维护的状态和服务端实际的状态实时同步。 解决这个问题,更多的是依靠rpc框架客户端的自动重试策略,比如,请求某个服务端实例超时后,立即换一个实例自动重试。
2019-10-302 - 南山抓耳挠腮了两天,还没开始动手,不知道怎么下手~
作者回复: 先把课后思考题完成了
2019-10-1222 - 张小勋老师 你好~ 本人是net的 最近刚下了 git 的代码 去看了下~有些写法java和net 还是有区别的 问几个问题 希望老师能够作答一下 首先:helloServiceapi 项目中 建了一个接口 这个接口在服务端去实现 客户端也用到了~ 问下这个接口 在正常的使用中 都是服务端定义好 去给客户端 去使用的么 第二点:就是在服务端 服务端启动的时候 这个demo 中 是自己去实例化了HelloServiceImpl对象 如果在生产环境中 是不是启动的时候 通过反射 去实例化 那些特定的对外提供的服务 HelloService这样的接口 是不是也要做下标识 是这个思路么 最后 给自己立下个flag 这个月 自己会去 用netcore+netty+zookeeper 去实现一个RPC 多谢老师
作者回复: 准确的说,应该是实现定义好接口,服务端和客户端都需要使用这个接口;
2019-11-08 - kim118000Method method = serviceProvider.getClass().getMethod(rpcRequest.getMethodName(), String.class); 每次请求都用反射获取method,有没有性能损耗,是不是存起来,请问老师这部分生产级别怎么处理的?
作者回复: JVM对反射的优化已经很好了,这部分的性能损耗并不是很大,所以一般不用特别的优化。
2019-10-153 - 东方奇骥这里注册中心信息是保存在本地文件中,如果保存在数据库,就要用数据库锁,或者zookeeper、redis的分布式锁。感谢老师,工作三年了,没写过框架,这个专栏收获不小!实战篇就超值了。2020-01-2115
- 亚洲舞王.尼古拉斯赵四看过了这四节rpc的课程之后,再去看了看中KafkaClient及实现的源码,和本篇讲述思想都是相似的,玥哥厉害!还是思想重要,同时觉得期末测试中的状态转换图也是中间件的基本中的基本,重要中的重要的点,KafkaClient这个接口中很多方法都是基于状态字段来给予的返回。(为什么提起状态转换图我就想到了线程的状态转换~~☺️2019-11-113
- 任鹏斌代码拿下来刚消化了一部分,慢慢消化,希望能做一些扩展,一转眼课程要结束了,老师辛苦!2019-10-133