gRPC详解
gRPC详解
戈亓1、什么是微服务
1.1 单体架构
致命缺点:
- 一旦某个服务宕机,会引起整个应用不可用,隔离性差
- 只能整体引用进行伸缩,浪费资源,可伸缩性差
- 代码耦合在一起,可维护性差
1.2 微服务架构
问题:
- 代码冗余
- 服务和服务之间存在调用关系
1.2.1 代码冗余问题
- 由于为了保持对外提供服务的一致性,引入了网关的概念,由网关根据不同的请求,将其转发到不同的服务(路由功能),由于入口的一致性,可以在网关上实现公共的一些功能
- 可以将公共的功能抽取出来,形成一个新的服务,比如统一认证中心。
1.2.2 服务之间的调用
服务拆分之后,服务和服务之间发生的是进程和进程之间的调用,服务器和服务器之间的调用。
那么就需要发起网络调用,网络调用我们立马想起的就是http,但是在微服务架构中,http虽然便捷,但是性能较低,这时候就需要引入RPC(远程过程调用),通过自定义协议发起TCP调用,来加快传输效率。
每个服务器由于可能分布在成千上百台机器上,服务和服务之间的调用,会出席那一些问题,比如,如何知道应该调用哪台服务器上的服务,调用方可能休要维护被调用的方的地址,这个地址可能很多,增加了额外的负担,这时候就需要引入服务治理。
服务治理中有一个重要的概念,服务发现
。服务发现中有一个重要的概念叫做注册中心
。
每个服务启动的时候,会将自身的服务和ip注册到注册中心,其他服务调用的时候,只需要将注册中心申请地址即可。
当然,服务和服务之间调用会发生一些问题,为了避免产生连锁的雪崩反应,引人了服务容错,为了追踪一个调用所经过的服务,引入了链路追踪,等等这些就构建了一个微服务的生态。
2.gRPC
上面我们讲到,服务和服务之间调用需要使用RPC,
gRPC
是一款语言中立、平台中立、开源的远程过程调用系统,gRPC
客户端和服务端可以在多种环境中运行和交互,例如用java
写一个服务端,可以用go
语言写客户端调用
数据在进行网络传输的时候,需要进行序列化,序列化协议有很多种,比如xml, json,protobuf等
gRPC默认使用protocol buffers
,这是google开源的一套成熟的结构数据序列化机制。
在学习gRPC之前,需要先了解protocol buffers
序列化:将数据结构或对象转换成二进制串的过程。
反序列化:将在序列化过程中所产生的二进制串转换成数据结构或对象的过程。
3.protobuf
运行protoc命令编译成go中间文件
1 | # 编译user.proto之后输出到service文件夹 |
3.1proto文件介绍
3.1.1 message介绍
message:protobuf
中定义一个消息类型使用过关键字message
字段指定的。消息就是需要传输的数据格式的定义。
message关键字类似于C++中的clasa,Java中的class,go中的struct
例如
1 | message User { |
3.3.2字段规则
required
:消息体中必填字段,不设置回导致编解码异常。
optional
:消息体中可选字段。
repeated
:消息体中可重复字段,重复的值的顺序会被保留。在go中重复的会被定义为切片。
1 | message User { |