“这是我参与「第三届青训营 -后端场」笔记创作活动的的第3篇笔记
本地调用
main函数调用calculate函数,计算参数a和参数b相乘后的值z,其中过程会涉及到函数指针、寄存器或者压栈弹栈的过程。
func main(){
var a = 2
var b = 3
result := calculate(a,b)
fmt.Println(result)
return
}
func calculate(x,y int){
z := x*y
return z
}
远程调用
用户在网上商城APP上付款,则需要调用服务器的支付服务。在这个过程就是远程调用。
在这个过程用函数指针是不行的,因为两个进程的地址空间是完全不一样的,所以函数会有自己的一个id,如支付服务id为a,退款服务id为b,充值服务id为c等。远程调用的客户端传递不像本地调用,这里需要客户端把参数先转换成一个字节流,传递给服务端,服务端解析字节流。
RPC的好处
1.单一职责,有利于分工协作和运维开发。
2.可扩展性强,如底层基础服务可以复用,节省资源。
3.故障隔离,服务的整体可靠性更高。
RPC带来的问题
1.服务矿机,怎么办?
2.调用过程网络异常,如何保证消息可靠性?
3.请求量突增无法及时处理,怎么办?
RPC框架设计
编解码层
协议层
网络通信层
RPC的关键指标
稳定性
熔断:解决服务雪崩的问题。一个服务A调用服务B时,服务B的业务逻辑又调用服务C,而这时服务C响应超时了,由于服务B依赖服务C,C超时直接导致服务B的业务逻辑一直等待,而这时服务A频繁地调用服务B,服务B就可能会因为堆积大量的请求而导致服务宕机。
易用性
扩展性
观测性
高性能
RPC的案例
字节跳动高性能RPC框架kitex