一. rpc基本学习

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的验证使用拦截器来统一处理的

代码的改造就是这样

相关推荐
lwprain11 分钟前
安装支持ssl的harbor 2.1.4 docker 19.03.8 docker-compose 1.24.0
网络协议·ssl·harbor
软件技术员12 分钟前
Let‘s Encrypt SSL证书:acmessl.cn申请免费3个月证书
服务器·网络协议·ssl
zmd-zk1 小时前
flink学习(2)——wordcount案例
大数据·开发语言·学习·flink
Chef_Chen1 小时前
从0开始学习机器学习--Day33--机器学习阶段总结
人工智能·学习·机器学习
hopetomorrow2 小时前
学习路之压力测试--jmeter安装教程
学习·jmeter·压力测试
hopetomorrow2 小时前
学习路之PHP--使用GROUP BY 发生错误 SELECT list is not in GROUP BY clause .......... 解决
开发语言·学习·php
/**书香门第*/2 小时前
Cocos creator 3.8 支持的动画 7
学习·游戏·游戏引擎·游戏程序·cocos2d
美式小田2 小时前
单片机学习笔记 9. 8×8LED点阵屏
笔记·单片机·嵌入式硬件·学习
猫爪笔记3 小时前
前端:HTML (学习笔记)【2】
前端·笔记·学习·html
C++忠实粉丝3 小时前
计算机网络socket编程(3)_UDP网络编程实现简单聊天室
linux·网络·c++·网络协议·计算机网络·udp