远程调用RPC
需要考虑的问题: 客户端和服务端什么时候建立连接, 服务端如何处理请求, 数据传输采用什么协议, 数据的序列化和反序列化
客户端和服务端如何建立网络连接
- http, http基于传输层tcp协议, 一次http请求就会建立一个tcp连接
- socket, socket基于tcp/ip协议进行封装, 一次连接需要一对套接字, socket通信分为四个步骤: 服务器监听 客户端请求 连接确认 数据传输
- 服务器监听, 服务器绑定某个端口, 然后listen这个端口, 等待请求
- 客户端请求:
- 服务端连接确认: 当服务端监听到客户端请求后, 调用accept响应请求并建立连接
- 数据传输: c端send, s端receive, 处理结束后s端send, 客户端receive
由于网络是不可靠的, 连接建立后, 可能会中断, 需要做存活处理和断连重试, 即轮询查看是否连通, 连接断开的话进行重连
服务器如何处理请求
- 同步阻塞(BIO): 客户端每发送一个请求, 就创建一个线程去处理, 当到达线程瓶颈, 就不会再处理了,用于请求量较小的
- 同步非阻塞(NIO):客户端每发送一次请求,并不是创建一个新线程去处理,而是通过IO多路复用,将多个IO的阻塞服用到同一个阻塞上,系统在单线程情况下可以处理多个客户端请求,适用于连接数多并且消耗比较少的业务
- 异步非阻塞(AIO):客户端发出请求后立刻返回,然后轮询处理状态,等到完成后,在发出完成信号,适用于连接数比较多,并且消耗比较大的
可以利用socket连接,建立连接,服务器端选择上述三种方式的一种。可以使用开源的通讯框架,如netty和MINA
io模型
阻塞i/o:老李去火车站买票,排队三天买到一张退票(耗费:三天吃喝睡,其他事没干)
非阻塞i/o:老李买票,每隔12小时去车站问有没有退票,3天后买到(耗费:往返6次,路上6小时,其他时间可以做很多事)
i/p多路复用:(有个第三方的中间件)
select/poll 老李买票,委托黄牛,每隔6小时打电话问黄牛,三天后老李打电话时得到有票的消息,去火车站交钱领票(往返车站两次,路上2小时,打电话17次,黄牛加价100)
epoll:委托黄牛,黄牛买到票后通知老李,三天后老李去领票(往返车站2次,路上2小时,黄牛加价100,无需打电话)
信号驱动:老李买票,给售票员留电话,有票后售票员通知其去取(往返车站2次,给你个信号,然后再去拉取)
异步i/o::老李买票,给售票员留电话,有票后售票员邮寄给老李(往返车站两次,服务器主动推送)
数据传输协议
- 开放协议:http协议等
- 私有协议:Dubbo协议等
数据的序列化和反序列化
- 文本类:xml和json
- 二进制类:PB/Thrift
需要考虑的问题\
- 支持数据结构的丰富度
- 跨语言
- 性能:序列化的压缩比以及序列化的速度,例如P8的压缩比更高,速度更快,但是json的可读性高
网友评论