微服务gRPC学习笔记(一)| 青训营笔记

120 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 8 天

我们的青训营项目是使用了微服务架构,所以我这段时间学习了一下微服务的相关技术栈。

说实话,微服务对于一个没有真正项目经验的人来说还是太难了一点,我以前只学过和写过SpringBoot的项目,连SpringCloud都没有写过,上来就是Go语言的微服务项目,对我来说有点困难了,但是有困难咱们就迎难而上,技术人不惧艰难!

网关

和普通的Web项目不一样,普通的单体Web项目首先是Controller层,然后是service层,最后是mapper层,也就是MVC三层架构,但是微服务不一样,接口层,也就是controller层在微服务里被抽象成了网关。 也就是Gateway,网关控制着接口的导向,这个当这个nginx反向代理接口访问到我们的服务时候,首先面对的是我们的网关服务,其他的单体服务都被抽象成了微服务,所以我们通过这种方式来控制接口的流转,当其他的接口到达我们的网关,我们的网关通过rpc框架调用其他微服务的数据来达成我们最终的目标。

RPC

  • RPC(Remote Procedure Call)远程过程调用,简单的理解是一个节点请求另一个节点提供的服务
  • 本地过程调用:如果需要将本地student对象的age+1,可以实现一个addAge()方法,将student对象传入,对年龄进行更新之后返回即可,本地方法调用的函数体通过函数指针来指定。
  • 远程过程调用:上述操作的过程中,如果addAge()这个方法在服务端,执行函数的函数体在远程机器上,如何告诉机器需要调用这个方法呢?
  1. 首先客户端需要告诉服务器,需要调用的函数,这里函数和进程ID存在一个映射,客户端远程调用时,需要查一下函数,找到对应的ID,然后执行函数的代码。
  2. 客户端需要把本地参数传给远程函数,本地调用的过程中,直接压栈即可,但是在远程调用过程中不再同一个内存里,无法直接传递函数的参数,因此需要客户端把参数转换成字节流,传给服务端,然后服务端将字节流转换成自身能读取的格式,是一个序列化和反序列化的过程。
  3. 数据准备好了之后,如何进行传输?网络传输层需要把调用的ID和序列化后的参数传给服务端,然后把计算好的结果序列化传给客户端,因此TCP层即可完成上述过程,gRPC中采用的是HTTP2协议。

image.png