文章目录
- 0 查看代码有哪些改动
- 1 看懂修改的代码
- 1.1 服务端 `RpcFrameworkSimpleServerMain`
- 1.1.1 `ServiceRegistry`
- 1.1.2 `DefaultServiceRegistry`
- 1.1.3 `RpcErrorMessageEnum`
- 1.1.4 `RpcServer`
- 1.1.5 `RpcRequestHandler`
- 1.1.6 `RpcRequestHandlerRunnable`
- 1.2 总结
- 2 自己动手
- 3 总结
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 总结
学到的知识:
- 将接口与实现类分离,降低耦合,便于维护代码
- 可以单独一个测试类测试每行代码输出是啥,是干啥的
- synchronized关键字,同步锁
- ConcurrentHashMap是HashMap的升级版,HashMap是线程不安全的,而ConcurrentHashMap是线程安全。而其他功能和实现原理和HashMap类似。
- 创建线程安全的ConcurrentHashSet:ConcurrentHashMap.newKeySet()
本次改进:
1.将注册中心的注册服务与开启Socket套接字连接分开了;用map和set实现注册服务
2.将调用方法独立成类
疑问:
DefaultServiceRegistry
里要一个set干嘛?感觉一个map就够了呀?- 为什么注册服务与获取服务需要用到同步锁呢?