1. 什么是rpc,为什么有了http还要rpc
我们常说的http,应该是说的http1,http只是应用层的一个协议
Rpc是一种调用方式,全称叫远程过程调用,对应本地调用,rpc是一种调用方式,不是一种协议
更具体的来说,rpc使用的数据传输协议,不是像http1一样一种业界通用的协议,而是在TCP、UDP、http2基础上自定义的一种协议
Rpc传输数据的过程本质和http1其实是一样的,都是一套网络框架,不同之处在于:
第一个就是协议层:数据都是基于TCP连接来传输的,一样都有消息头和消息体,两者的区别在于消息头,http的优点是可以自定义很多字段,十分灵活,但是对于功能单一的微服务之间来说,请求头中事实上很多字段都是冗余的,例如各种浏览器行为的请求头;同时,虽然都是基于TCP连接,但是Rpc基于http2,有多路复用的优势,不像http1建立一个tcp连接,如果不是升级成websocket,甚至是一种半双工的状态,rpc速度更快;
第二个编解码层:也就是网络传输之前,需要将结构化数据和二进制数据互相转化,也就是序列化和反序列化的过程,http使用的是json,优点是直观灵活,缺点是没有类型空间大。
总之:rpc适用于在微服务架构下,职责单一的服务之间做数据传输,相比于http1,有数据包更小,序列化更快,传输效率更高的优势。
但是rpc要求服务之间接口有强依赖,因为像本地调用一样来调用的方式,决定了桩文件需要统一,当接口需要更新调整时,服务双方都要进行更新; 同时服务之间加密认证也要维护,例如TLS方式的认证,当客户端域名增加时,需要升级证书私钥,否则服务端不能识别。
2. grpc框架
2.1 安装grpc的使用环境
也就是proto buf的序列化协议编译器,该协议是谷歌的协议,其他协议请自行下载对应的编译器。
进入github,搜索protobuf
下载win64的zip包
解压
配置环境变量
运行命令 protoc 看是否配置成功
2.2 安装go语言的grpc核心库
go get google.golang.org/grp
生成别的语言请自行查看需要安装的库
有了核心库之后
就可以直接安装go语言的两个关键应用
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
这两个安装完成之后,
Gopath目录的bin下就出现了这两个exe文件
2.3 写约束文件
编写一个XXX.proto文件
简单例子:
然后cd到该文件的目录下,想生成什么语言的文件,就用什么语言对应的命令,这里用go举例:
protoc --go_out=. XXX.proto
protoc --go-grpc_out=. XXX.proto
2.4 写业务逻辑
可以直接在grpc文件中写业务逻辑,也可以继承该grpc文件,重写方法来实现业务逻辑。
最好重写,否则一旦更新并重新生成,很麻烦。
2.5 服务端编写
创建grpc server对象S
将S注册到grpc Server的内部注册中心
创建listen,监听TCP连接
2.6 客户端编写
创建指定服务器的TCP连接
创建客户端对象Conn
发送RPC请求,接收响应
3. grpc认证安全传输
这里的认证不是用户的身份认证,而是指多个server和多个client之间,如何识别对方是谁,并且可以安全的进行数据的传输
SSL/TLS认证方式
基于TOKEN的认证方式
不采用任何措施的连接,这是不安全的连接
自定义的身份认证。
3.1 SSL/TLS认证方式
客户端和服务端之间的调用,我们可以通过加入证书的方式,实现调用的安全性
TLS建立于TCP协议之上的协议,是应用层的协议,前身是SSL,作用是将应用层的报文进行加密之后再交给TCP进行传输
首先通过openssl生成证书和私钥
下载openssl的安装包(用第三方的,不用自己编译)
下载地址: https://slproweb.com/products/Win32OpenSSL.html
配置环境变量
查看是否安装成功
生成私钥: Openssl genrsa -out server.key 2048
生成证书:openssl req -new -x509 -key server.key -out server.crt -days 36500
国家名字那些先全部回车留空
Crt文件是根据key文件生成的
然后再生成csr
Openssl req -new -key server.key -out server.csr
将openssl的安装目录中的openssl.cfg文件复制到同级目录下
然后解开
copy_extensions = copy
再解开
req_extensions = v3_req # The extensions to add to a certificate request
再添加代码
DNS.1 = example.com
可以写多个,这个相当于访问域名是否会同意
到此准备工作完成
接着生成自己的私钥
Openssl genpkey -algorithm RSA -out test.key
再生成我们自己的证书
Openssl req -new -nodes -key test.key -out test.csr -days 3650 -subj "/C=cn/O=mycomp/CN=myname" -config ./openssl.cfg -extensions v3_req
最后生成san证书 pem
Openssl x509 -req -days 365 -in test.csr -out test.pem -CA server.crt -CAkey server.key -CAcreateserial -extfile ./openssl.cfg -extensions v3_req
目前一共有了7個文件,但是我们要用到的就是两个,一个test.key,也就是私钥文件,一个是test.pem证书文件
其他的文件都用于认证和签发
然后就是使用我们自己生成的文件来认证服务了
首先是服务端
然后这时服务端就不是谁都可以访问了
3.2 基于TOKEN的认证方式
同样是在credentials包下
有两个需要我们的客户端自己实现的接口
首先就是客户端要传递Token信息给服务端
然后就是服务端要能够处理客户端发来的token信息
总之,grpc将各种认证方式浓缩到一个统一的credentials上,可以单独使用一种凭证,也可以一起使用,这也是grpc的精妙之处
事实上,服务端对token的验证使用拦截器来统一处理的
代码的改造就是这样