RPC的概念
背景知识
- RPC的基本概念,核心功能
常见的RPC框架
Duboo基本功能
- 远程通讯
- 基于接口方法的透明远程过程调用
- 负载均衡
- 服务注册中心
RPC过程
client 调用远程方法-> request序列化 -> 协议编码 -> 网络传输-> 服务端 -> 反序列化request -> 调用本地方法得到response -> 序列化 ->编码->……
版本迭代过程
目录
从0开始的RPC的迭代过程:
- version0版本:以不到百行的代码完成一个RPC例子
- version1版本:完善通用消息格式(request,response),客户端的动态代理完成对request消息格式的封装
- version2版本:支持服务端暴露多个服务接口, 服务端程序抽象化,规范化
- version3版本:使用高性能网络框架netty的实现网络通信,以及客户端代码的重构
- version4版本:自定义消息格式,支持多种序列化方式(java原生, json…)
- version5版本: 服务器注册与发现的实现,zookeeper作为注册中心
- version6版本: 负载均衡的策略的实现
6.MyRPC版本6
我们的RPC总体框架已经有了,接下来就是一些修修补补已经扩展功能的模块了
背景知识
- 负载均衡
本节问题
- 如果一个服务有多个提供者支持,如何分散服务提供者的压力
升级过程
- 负载均衡接口
/**
* 给服务器地址列表,根据不同的负载均衡策略选择一个
*/
public interface LoadBalance {
String balance(List<String> addressList);
}
- 两种实现方式
/**
* 随机负载均衡
*/
public class RandomLoadBalance implements LoadBalance{
@Override
public String balance(List<String> addressList) {
Random random = new Random();
int choose = random.nextInt(addressList.size());
System.out.println("负载均衡选择了" + choose + "服务器");
return addressList.get(choose);
}
}
/**
* 轮询负载均衡
*/
public class RoundLoadBalance implements LoadBalance{
private int choose = -1;
@Override
public String balance(List<String> addressList) {
choose++;
choose = choose%addressList.size();
return addressList.get(choose);
}
}
在服务发现方法中使用负载均衡
List<String> strings = client.getChildren().forPath("/" + serviceName);
结果
我们开启两台服务提供者
可以看出负载均衡策略已经成功
总结
这一版本中,我们实现负载均衡的两种策略:随机与轮询。
在这一版本下,一个完整功能的RPC已经出现,当然还有许多性能上与代码质量上的工作需要完成。