• 益军
    2019-12-10
    您好哈,提个疑问:
    服务端业务方法不应该在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线程。

    
     1
  • 任鹏斌
    2019-10-13
    代码拿下来刚消化了一部分,慢慢消化,希望能做一些扩展,一转眼课程要结束了,老师辛苦!
    
     1
  • 南山
    2019-10-12
    抓耳挠腮了两天,还没开始动手,不知道怎么下手~

    作者回复: 先把课后思考题完成了

    
     1
  • 东方奇骥
    2020-01-21
    这里注册中心信息是保存在本地文件中,如果保存在数据库,就要用数据库锁,或者zookeeper、redis的分布式锁。感谢老师,工作三年了,没写过框架,这个专栏收获不小!实战篇就超值了。
    
    
  • 亚洲舞王.尼古拉斯赵...
    2019-11-11
    看过了这四节rpc的课程之后,再去看了看中KafkaClient及实现的源码,和本篇讲述思想都是相似的,玥哥厉害!还是思想重要,同时觉得期末测试中的状态转换图也是中间件的基本中的基本,重要中的重要的点,KafkaClient这个接口中很多方法都是基于状态字段来给予的返回。(为什么提起状态转换图我就想到了线程的状态转换~~☺️
    
    
  • 张小勋
    2019-11-08
    老师 你好~ 本人是net的 最近刚下了 git 的代码 去看了下~有些写法java和net 还是有区别的 问几个问题 希望老师能够作答一下
    首先:helloServiceapi 项目中 建了一个接口 这个接口在服务端去实现 客户端也用到了~ 问下这个接口 在正常的使用中 都是服务端定义好 去给客户端 去使用的么
    第二点:就是在服务端 服务端启动的时候 这个demo 中 是自己去实例化了HelloServiceImpl对象 如果在生产环境中 是不是启动的时候 通过反射 去实例化 那些特定的对外提供的服务 HelloService这样的接口 是不是也要做下标识 是这个思路么
    最后 给自己立下个flag 这个月 自己会去 用netcore+netty+zookeeper 去实现一个RPC 多谢老师
    展开

    作者回复: 准确的说,应该是实现定义好接口,服务端和客户端都需要使用这个接口;

    
    
  • z.l
    2019-11-01
    请教下老师,如果要实现一个可供生产环境大规模集群使用的注册中心,JDBC协议是不是就不太合适了?这种情况下一个注册中心要满足哪些要求呢?个人盲猜:可多台部署、基于tcp协议最好也是netty实现、彼此之间要保证数据一致性(好像也不用强一致),不知道理解对不对

    作者回复: 大致的要求就是:

    可用性:不能因为某个节点故障导致注册中心不可以;
    数据一致性:能保证顺序一致性一般就可以满足需求了。
    性能:server节点状态变更后,能尽快更新。

    另外,大规模集群情况下,需要考虑业务系统上下线时,注册中心的性能问题。比如:一个几千个节点的微服务上线,会重启几千个Server节点,这时候注册中心需要更新大量的数据。

    
    
  • zero
    2019-10-30
    如果服务端挂掉了,怎么通知NameService呢?

    作者回复: 这个问题在我们的demo中并没有解决。实际在生产环境中,有些注册中心会定期检查服务端的状态,但是即使这样也不能保证注册中心中维护的状态和服务端实际的状态实时同步。

    解决这个问题,更多的是依靠rpc框架客户端的自动重试策略,比如,请求某个服务端实例超时后,立即换一个实例自动重试。

    
    
  • Gred
    2019-10-28
    来交作业啦【https://github.com/Gred01/simple-rpc-framework/tree/nameservice】,其实本应该在周五就写好了,现在写的demo支持mysql和oracle,初始化sql在rpc-netty底下init-sql.md。

    作者回复: 交作业的都是好同学,👍!

    一个建议:使用PreparedStatement,不要用字符出拼SQL,会有SQL注入漏洞。

     1
    
  • kim118000
    2019-10-15
    Method method = serviceProvider.getClass().getMethod(rpcRequest.getMethodName(), String.class);
    每次请求都用反射获取method,有没有性能损耗,是不是存起来,请问老师这部分生产级别怎么处理的?

    作者回复: JVM对反射的优化已经很好了,这部分的性能损耗并不是很大,所以一般不用特别的优化。

    
    
  • leslie
    2019-10-12
    动手要欠账了:大致明白了RPC整个过程需要什么了,啃几遍梳理一下-看看各个是怎么实现的啃明白再去思考Go怎么实现。。。
     1
    
我们在线,来聊聊吧