0
点赞
收藏
分享

微信扫一扫

【自己动手实现一个简单的RPC框架】2、[v1.1]改进:用map和set实现注册服务

c一段旅程c 2022-04-03 阅读 31
rpc

文章目录

0 查看代码有哪些改动

本次代码对应的SHA是0ccffe601ef0ed7e258442b77ce54a1c9f096952

1.RpcFrameworkSimpleServerMain
在这里插入图片描述
2.RpcErrorMessageEnum
在这里插入图片描述
3.增加了DefaultServiceRegistry类,应该是用来注册的
4.删掉了ClientMessageHandlerThread,增加了RpcRequestHandlerRunnable
5.增加RpcRequestHandler
6.修改了RpcServer 中的线程池和注册部分

1 看懂修改的代码

这次修改的都是服务端的代码

1.1 服务端 RpcFrameworkSimpleServerMain

在这里插入图片描述
第一句:实现了一个默认注册表类,来提供服务注册功能.这个注册表类是实现了

1.1.1 ServiceRegistry

该接口有两个方法:
1.注册服务
2.根据服务名获取服务

1.1.2 DefaultServiceRegistry

该类实现ServiceRegistry接口

1.注册服务
在这里插入图片描述

String serviceName = service.getClass().getCanonicalName();

所以这一句话的意思就是:service的包含路径的类名,即:github.javaguide.HelloServiceImpl
将实现类包含路径的类名存入set中;
在这里插入图片描述

Class[] interfaces = service.getClass().getInterfaces();

取出该实现类实现的所有接口,存入map中,key为包含路径的类名,value为服务。
【这么调试好笨笨啊,有啥更方便的方法吗?整一个测试类出来?】

2.根据服务名获取服务
输入接口名,从map中获取服务

所以要一个set干嘛?感觉一个map就够了呀?或许以后会知道

synchronized

为什么注册服务与获取服务需要用到同步锁呢?

1.1.3 RpcErrorMessageEnum

上面两个方法增加了两个枚举数据:

    SERVICE_CAN_NOT_BE_FOUND("没有找到指定的服务"),
    SERVICE_NOT_IMPLEMENT_ANY_INTERFACE("注册的服务没有实现任何接口");

1.1.4 RpcServer

在这里插入图片描述
第二句:注册helloService;
第三句:利用默认注册表创建一个RpcServer

把线程池参数都用private static final int修饰了,有什么深意?
static:对于所有该类的对象也就是该类的所有实例都是共有的
final:一旦被赋值就不可改变

1.1.5 RpcRequestHandler

调用服务并返回服务返回值,相当于是把调用服务进一步独立出来了

1.1.6 RpcRequestHandlerRunnable

调用RpcRequestHandler

1.2 总结

本次改进将注册中心的注册服务与开启Socket套接字连接分开了;用map和set实现注册服务
将调用方法独立成类

2 自己动手

1.RpcFrameworkSimpleServerMain
2.RpcErrorMessageEnum
3.增加了DefaultServiceRegistry类,应该是用来注册的
4.删掉了ClientMessageHandlerThread,增加了RpcRequestHandlerRunnable
5.增加RpcRequestHandler
6.修改了RpcServer 中的线程池和注册部分

在这里插入图片描述
运行成功!

3 总结

学到的知识:

  1. 将接口与实现类分离,降低耦合,便于维护代码
  2. 可以单独一个测试类测试每行代码输出是啥,是干啥的
  3. synchronized关键字,同步锁
  4. ConcurrentHashMap是HashMap的升级版,HashMap是线程不安全的,而ConcurrentHashMap是线程安全。而其他功能和实现原理和HashMap类似。
  5. 创建线程安全的ConcurrentHashSet:ConcurrentHashMap.newKeySet()

本次改进:
1.将注册中心的注册服务与开启Socket套接字连接分开了;用map和set实现注册服务
2.将调用方法独立成类

疑问:

  1. DefaultServiceRegistry里要一个set干嘛?感觉一个map就够了呀?
  2. 为什么注册服务与获取服务需要用到同步锁呢?
举报

相关推荐

0 条评论