gRPC详解

1、什么是微服务

1.1 单体架构

致命缺点:

  • 一旦某个服务宕机,会引起整个应用不可用,隔离性差
  • 只能整体引用进行伸缩,浪费资源,可伸缩性差
  • 代码耦合在一起,可维护性差

1.2 微服务架构

问题:

  • 代码冗余
  • 服务和服务之间存在调用关系

1.2.1 代码冗余问题

  1. 由于为了保持对外提供服务的一致性,引入了网关的概念,由网关根据不同的请求,将其转发到不同的服务(路由功能),由于入口的一致性,可以在网关上实现公共的一些功能
  2. 可以将公共的功能抽取出来,形成一个新的服务,比如统一认证中心。

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
2
# 编译user.proto之后输出到service文件夹
protoc --go_out=../service user.proto

3.1proto文件介绍

3.1.1 message介绍

message:protobuf中定义一个消息类型使用过关键字message字段指定的。消息就是需要传输的数据格式的定义。

message关键字类似于C++中的clasa,Java中的class,go中的struct

例如

1
2
3
4
message User {
string username = 1;
int32 age = 2
}

3.3.2字段规则

required:消息体中必填字段,不设置回导致编解码异常。

optional:消息体中可选字段。

repeated:消息体中可重复字段,重复的值的顺序会被保留。在go中重复的会被定义为切片。

1
2
3
4
5
6
message User {
string username = 1;
int32 age = 2;
optional string password = 3;
repeated string address = 4;
}