grpc编程(新)

一、tcp过程和网络编程的关系

首先,服务端调用listen()函数,之后在客户端发送第一次握手后,创建tcb,并放入半连接队列中,之后由tcb完成后面的连接,握手是被动完成的。在连接完成后把tcb从半连接队列放到全连接队列,然后服务端调用accept()从全连接队列获取fd,并等待消息。

accept()会把tcb从全连接队列取下,并且给连接分配一个fd。

二、微服务概念

把一个总的程序按照负载均衡和详细工作,分为多个集群,并且有各自的数据库,但是这样会有很多端口号和冗余代码,所以通过网关把端口号统一,并且放值统一的代码,也可以把公共功能提取出来做一个单独的集群供其他使用。

程序之间或者服务器之间相互连接用RPC(远程过程调用)。设计的网络很多,所以引入服务治理

provider提供自己的服务和ip给discover,consumer从discover获取地址,然后调用provider的服务

三、GRPC

需要使用protocol buffers传输数据

RPC涉及传输层和应用层,使用HTTP2.0

分为4中方式,包括一元prc,客户端流rpc,服务端流rpc,双流rpc

表示1v1,nv1,1vn,nvn

一元:等待下面的服务端结果返回后才会进行下面的

服务端流:把范围发送出去,然后while不断的在客户端收取返回值,相当于客户端一次发送,服务端多次返回。服务端通过write发送

客户端流        差不多

HTTP1.1和2.0区别,header对应Hearers frame,payload对应data frame。

GRPC把元数据放在HTTP2的header,把请求的参数序列化后放在data中

grpc分为同步和异步

同步需要阻塞到服务端返回结果。异步发送调用服务到服务端后会要求服务端主动返回结果。

异步要求使用http2.0. 实现了异步通信,且实现了可持续连接。1.1是并发通信,按序接受和发送。1.0只能单线。

操作

编写proto

需要指出plugin使用grpc

 protoc ./grpc_test.proto --plugin=grpc --cpp_out=./protoc --version
 

四、protobuf

接下来操作在ubuntu进行。

sudo apt update
sudo apt install autoconf automake libtool curl make g++ unzip

# 下载源码
wget https://github.com/protocolbuffers/protobuf/releases/download/v3.17.3/protobuf-all-3.17.3.tar.gz

# 解压源码
tar -zxvf protobuf-all-3.17.3.tar.gz

# 进入解压后的目录
cd protobuf-3.17.3

# 运行autogen.sh脚本生成configure文件
./autogen.sh

# 运行configure脚本
./configure

# 编译源码
make

# 运行测试(可选)
make check

# 安装
sudo make install

# 更新共享库缓存
sudo ldconfig

生成proto对应的c++代码

. user.proto为自己写的文件,其中1和2,3不是数字而是列的类别,out是.表示当前路径,空格后是文件名

protoc --cpp_out=. user.proto
c和protol对应关系

syntax = "proto3";

package service;
message User {
    int32 id = 1;
    bytes name=2;
    int age=3;
}

main自己建立

proto和cpp文件类型对应,如果string没有中文可以用string,否则需要用bytes,最好全用bytes

可以在h文件中找到操纵变量的api

创建一个类用来序列化

protobuf api,User会继承protobuf的类,从而可以使用这些api

反序列化api。两种api,上面的是c++风格,下面的是c风格。解析出来的数据通过get()获得

创建嵌套消息体

两个addr是因为proto中有两个

定义动态数组,在关键字前加repeated

新的h文件

枚举类型        注意需要显示的指出每个值,并且需要从0开始,不用连续。用;分割。这里是值,不是类号

在proto文件中使用其他proto文件

把address分出来

-I表示相对路径,后面跟文件名

 protoc -I ./protu_test/ user.proto address.proto --cpp_out=./

编译出了两个。如果两个proto有相同名的message,需要使用namespace

或者用proto的包,指定包名

cc文件会生成namespace,在使用时需要指定

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值