一、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,在使用时需要指定