微服务

拆分单体应用 —>解耦合

要求实现高内聚,低耦合

要求既要拆分,又要代码不要有太大的变动,让网络通信用起来像函数一样(远程过程调用RPC)

REST和RPC有什么联系和区别?

REST是一种接口规范,使用http协议,通用性好,一般性能更差,天生跨语言,

RPC是一种具体的技术,一般用私有的协议,通用性差,一般性能更好,要做一些特殊的设计

两种技术会结合使用

b5dd1502e25a3999e690f4f1cd249645.png

边缘节点用REST,为了通用性,内部用rpc,并且边缘节点除了实现转发,甚至可以作为函数的主调方,去调用一个函数,通常把这个边缘节点叫做API网关,比之前的nginx功能更多,而内部的方框就是被调函数,称为服务,这个边缘节点以及内部的服务组成了微服务体系。

好处:实现了高内聚,低耦合

目前流行的API网关 kong,其是基于nginx做的

除了这个还有apisix,也是基于nginx做的

比较有影响力的RPC框架:thrift,被google的GRPC取代,提供了protobuf 序列化方案, 百度提供了brpc,腾讯提供了tars/trpc

sougou的srpc,特点服务端使用workflow写的,序列化方案用的proobuf

grpc代理模式

让网络通信像函数调用,要使用代理模式

19182b6235d551ea7f08026b0824121b.png

通过client_stub可以调用函数,但是这个函数自己运行不了,得把函数参数交给服务端执行,这时候就被函数参数使用protobuf进行序列化,通过网络传输给服务端。

服务端这边也有一个服务端代理,进行反序列化,然后服务端执行函数,函数执行完返回值交给代理,代理进行序列化,通过网络传输给客户端,客户端代理反序列化得到函数返回值,交给主调方

RPC框架得使用

安装protobuf

1
2
3
4
5
6
7
8
tar xf protobuf...
cd protobuf
vim README.md
vim src/README.md#里面要求执行./configure
./configure
make
sudo make instal
sudo ldconfig

安装成功后会多两个文件

1
cd /usr/local/bin/protoc#编译器  编译:把一种语言翻译成另外一种语言
1
cd /usr/local/lib/libprotobuf.so

使用

创建一个proto文件(IDL(接口定义文件)文件)

1
touch signup.proto
1
2
3
4
5
6
7
8
9
10
11
12
syntax="proto3";//使用得是proto3而不是proto2
message ReqSingup{//定义结构体表示 函数的参数
string username = 1;//类型 字段得名字 = 字段的编号
string password = 2;
}
message RespSignup{//函数得返回值
int32 code = 1;//状态码
string information = 2;
}
service UserService{//定义了一个函数 在UserService命名空间里面,函数名是Signup
rpc Signup(ReqSignup) returns (RespSignup){}
}

将proto文件转换成c++代码

1
2
protoc #proto帮助手册
protoc --proto_path = . --cpp_out=.signup.proto

参数返回值都有了,现在缺一个函数,函数需要srpc

sprc得使用

需要前置依赖,先安装

1
2
sudo apt install libsnappy-dev
sudo apt install liblz4-dev

再安装srpc

安装成功多一个可执行程序srpc_generator用于生成具体得函数

1
srpc_generator protobuf signup.proto .

42fbd4090ca9f9a9a3737830337f4f85.png

b357ae79405e2f1eaab652d1bfcc42db.png

request是函数得参数

response是函数的返回值

ctx是用来获取Signup当前的序列

里面的逻辑跟workflow的process类似,写完逻辑编译

df301daf7eb55436e65d3ab3b018e2b9.png