brpc
0.简介
链接中介绍了rpc的相关概念。
brpc可以被用作C++网络库
1.编译安装
按照官方链接安装即可,但是此链接中的如下命令要进行修改:
原命令:
sudo apt-get install -y cmake libgtest-dev && cd /usr/src/gtest && sudo cmake . && sudo make && sudo mv libgtest* /usr/lib/ && cd -
改为:
sudo apt-get install -y cmake libgtest-dev && cd /usr/src/gtest && sudo cmake . && sudo make && cd lib && sudo mv libgtest* /usr/lib/
【注】我是在完全干净的ubuntu20.04(刚刚安装的ubuntu)上进行编译,如果你安照官方链接进行编译出现问题,那只能说你现在的系统下面的软件太多,有库的版本等问题,从而导致编译失败。
按照官方文档编译和安装完成以后,在brpc项目下面会出现一个output的文件夹,此文件夹中就是我使用brpc所需要的头文件和库文件,还有一个我暂时不知道干嘛用的可执行文件protoc-gen-mcpack。
最后我们可以使用样例代码进行学习。
2.学习
2.1 bvar
bvar,一个多线程环境下的高性能计数器类库。
官方文档看不太懂的原因:给的例子都不是可以直接运行的东西。所以如果从零基础开始,可能有些吃力。
不知道如何编写编译代码,如何写相应的测试程序等。
而且很多内容像是机翻译
接下来,先看客户端和服务器,或者先看example里面的CmakeLists.txt等文件吧。
开始学习
通过echo_server带你入门brpc!就是前面讲过的。。。。。
https://wangzhike.github.io/2020/08/29/introduct_to_brpc_tmp/
开始学习2
先从客户端开始学习吧, 因为有示例代码,可以先大致看一下示例代码,并把不懂的记录下来,然后去看看相关文档里怎么解释。
Init函数分为连接一台服务器和连接服务集群。
开始学习3
https://genggao110.github.io/2019/10/29/RPC工作原理/
一个基本的RPC框架里面应该至少包含以下4个组件:
客户端(Client): 服务调用方(服务消费者)
客户端存根(Client Stub): 存放服务器端地址信息,将客户端的请求参数数据信息打包成网络信息,再通过网络传输发送给服务器端。
服务器端存根(Server Stub): 接收客户端发送过来的请求信息并进行解包,然后再调用本地服务进行处理。
服务端(Server): 服务的真正提供者。
命名服务器就是用来找到所要调用功能在哪个服务器的吗??
服务注册中心
可选:Redis、Zookeeper、Consul 、Etcd。一般使用ZooKeeper提供服务注册与发现功能,解决单点故障以及分布式部署的问题(注册中心)。
当服务提供者启动的时候,需要将自己提供的服务注册到指定的注册中心,以便服务消费者能够通过服务注册中心进行查找;
服务的提供者需要定期向服务注册中心发送心跳检测,服务注册中心如果一段时间未收到来自服务提供者的心跳后,认为该服务提供者已经停止服务,则将该服务从注册中心上去掉。
微服务也可以解决,跨语言编程的问题
gRPC在跨语言上的解决方案,好像主要是使用java在做。。。
bRPC培训材料:https://brpc.apache.org/zh/docs/c++-base/brpc-training-materials/
命名服务用于集群中,从命名服务中可以获取,集群服务器的地址和端口。
集群就是很多服务器,每个服务器都提供相同的功能。
线程安全就是代表可以同时被多个线程访问,而不出现不可预知的行为。
example/echo_c++/client.cpp
代码解析:example/echo_c++/client.cpp
首先要知道代码中使用到了Google 提供的一个命令行参数处理的开源库gflags。参考gflags
客户端的实现流程:
- 定义proto文件:proto文件中定义了EchoRequest和EchoResponse两种类型的数据,并且定义了EchoService服务器,EchoService中定义了Echo函数。EchoRequest、EchoResponse和EchoService都会被转换成同名的C++类,其中类EchoService还生成了EchoService_Stub子类。
- 配置IP、端口等参数:IP、端口等参数用ChannelOptions来“装”。使用ChannelOption初始化Channel,并配置远程服务的ip和端口。Channel就是相当于一个客户端。
- 初始化EchoService_Stub:一般不直接使用Channel,而是使用Channel初始化stub,这样stub中就配置了IP、端口等参数。
- 给EchoService_Stub传入参数:将写好EchoRequest和EchoResponse类型的对象、Controller作为stub的Echo函数的参数。
【brcp官方文档——serve-httph2中说不支持大文件传输,但是支持http chunked,是什么意思??】
答:http chunked用于将服务器的文件发送给客户端(浏览器),而不是将客户端(浏览器)的文件发送给服务器。
brpc支持http协议的意思是:brpc写的client和server之间的通信可以使用http协议,如果你要开发一个web server,是不可以直接使用brpc。可能需要看看brpc低层如何解析http协议。
【我看知乎上不是有说将brpc当成网络库吗,这个网络库是什么意思?怎么当成网络库】
答:brpc官方文档中其实是有写brpc的底层如何实现的。如果要使用brpc提供底层实现的网络库,可以看官方文档进行学习。
js也是编程语言,所以grpc-web指的就是grpc的js版本。
vue和node就是用js写的。