SRPC初步使用和说明

80个GitHub上c/c++学习项目推荐——拎几个出来写进简历 ①语言:c++②来源:GitHub 目前star:4.8k③项目地址:https://github.com/yuesong-feng/30dayMakeCppServer④类型:免费。 阅读详情

SRPC初步使用和说明

一. RPC介绍和SRPC说明

RPC是一种概念,表示远程过程调用,就是指能够让用户在本地调用远程的方法,调用透明,我们不需要知道调用的方法部署在什么地方。

SRPC目前是搜狗业务线上使用的企业级RPC系统,是一种RPC框架,具有以下的相关优势:

  • 底层基于Sogou C++ Workflow,兼具:
    • 高性能、低延迟、轻量级
    • 低开发和接入门槛
    • 完美兼容workflow的串并联任务流
    • 对于已有protobuf/thrift描述文件的项目,可以做到一键迁移
    • 支持Linux / MacOS / Windows等多操作系统
  • 支持多种IDL格式,包括:
    • Protobuf
    • Thrift
  • 支持多种数据布局,使用上完全透明,包括:
    • Protobuf serialize
    • Thrift Binary serialize
    • json serialize
  • 支持多种压缩,使用上完全透明,包括:
    • gzip
    • zlib
    • snappy
    • lz4
  • 支持多种通信协议,使用上完全透明,包括:
    • tcp
    • http
    • sctp
    • ssl
    • https
  • 用户可以通过http+json实现跨语言:
    • 如果自己是server提供方,用任何语言的http server接受post请求,解析若干http header即可
    • 如果自己是client调用方,用任何语言的http client发送post请求,添加若干http header即可
  • 内置了可以与其他RPC框架的server/client无缝互通的client/server,包括:
    • SRPC
    • BRPC
    • TRPC (目前唯一的TRPC协议开源实现)
    • Thrift Framed Binary
    • Thrift Http Binary
  • 兼容workflow的使用方式:
    • 提供创建任务的接口来创建一个rpc任务
    • 可以把rpc任务放到任务流图中,回调函数里也可以拿到当前的任务流
    • workflow所支持的其他功能,包括upstream、计算调度、异步文件IO等
  • AOP模块化插件管理:
    • 可对接OpenTelemetry(tracing链路数据上报)
    • 轻松上报其他云原生系统
  • 支持srpc协议的Envoy-filter,满足Kubernetes用户的使用需求

二. 从零开始源码编译安装SRPC

SRPC依赖于Protobuf数据交换协议、Snappy数据压缩库、lz4和workflow等依赖,因此编译SRPC需要在系统中安装上述依赖库。下面进行各个库的安装教程。

2.1. 安装Protobuf
# 克隆源码
git clone https://gitee.com/zhycheng/protobuf.git
# 编译
cd protobuf
git submodule update --init --recursive
chmod +x autogen.sh 
./autogen.sh
chmod +x configure
./configure
make -j32
make install
ldconfig
# 验证是否安装成功
protoc --version
2.2. 安装workflow
# 克隆源码
git clone https://github.com/sogou/workflow.git
# 编译
cd workflow
mkdir build
cd build
cmake ..
make -j32
make install

2.3. 安装lz4
# 克隆源码
git clone https://github.com/lz4/lz4.git
# 编译
cd lz4
mkdir build
cd build
cmake ..
make -j32
make install

2.4. 安装snappy
# 克隆项目
git clone https://github.com/google/snappy.git
cd snappy
# 这里为了不进行test测试等操作以及规避编译中的bug
# 问题1:如果不关闭test测试,那么将会出现很多的需要适配第三方库的googletest等库
# 问题2:如果不编译动态库,那么后续SRPC使用的时候无法正确链接编译程序
# 问题3:如果编译lz4的动态库,那么将会出现"AdvanceToNextTagX86Optimized函数的inline错误"
# 为了解决问题3,在snappy.cc文本中这里把AdvanceToNextTagX86Optimized的前缀声明SNAPPY_ATTRIBUTE_ALWAYS_INLINE注释掉
sed -i "s/SNAPPY_ATTRIBUTE_ALWAYS_INLINE\nAdvanceToNextTagX86Optimized/AdvanceToNextTagX86Optimized/g" snappy.cc
# 进行编译
mkdir build
cd build
cmake -DSNAPPY_BUILD_BENCHMARKS=OFF -DSNAPPY_BUILD_TESTS=OFF -DBUILD_SHARED_LIBS=ON ..
make -j32
make install

2.5. 安装SRPC
# 克隆项目
git clone  https://github.com/sogou/srpc.git
cd srpc
mkdir build
cd build
cmake ..
make -j32
make install
# 验证样例是否可以编译
cd ../tutorial
make -j32


三. 实践简单示例

3.1. protobuf数据结构定义

下述内容存放在protofile/example.proto中

syntax = "proto3";//这里proto2和proto3都可以,srpc都支持

message EchoRequest {
    string message = 1;
    string name = 2;
};

message EchoResponse {
    string message = 1;
};

service Example {
    rpc Echo(EchoRequest) returns (EchoResponse);
};
3.2. 服务程序和客户端程序代码如下
//服务端程序src/server.cc
#include <stdio.h>
#include <signal.h>
#include "example.srpc.h"

using namespace srpc;

class ExampleServiceImpl : public Example::Service
{
public:
    void Echo(EchoRequest *request, EchoResponse *response, RPCContext *ctx) override
    {
        response->set_message("Hi, " + request->name());
        printf("get_req:\n%s\nset_resp:\n%s\n",
                request->DebugString().c_str(), response->DebugString().c_str());
    }
};

void sig_handler(int signo) { }

int main()
{
    signal(SIGINT, sig_handler);
    signal(SIGTERM, sig_handler);

    SRPCServer server_tcp;
    SRPCHttpServer server_http;

    ExampleServiceImpl impl;
    server_tcp.add_service(&impl);
    server_http.add_service(&impl);

    server_tcp.start(1412);
    server_http.start(8811);
    getchar(); // press "Enter" to end.
    server_http.stop();
    server_tcp.stop();

    return 0;
}

//客户端程序src/client.cc
#include <stdio.h>
#include "example.srpc.h"

using namespace srpc;

int main()
{
    Example::SRPCClient client("127.0.0.1", 1412);
    EchoRequest req;
    req.set_message("Hello, srpc!");
    req.set_name("workflow");

    client.Echo(&req, [](EchoResponse *response, RPCContext *ctx) {
        if (ctx->success())
            printf("%s\n", response->DebugString().c_str());
        else
            printf("status[%d] error[%d] errmsg:%s\n",
                    ctx->get_status_code(), ctx->get_error(), ctx->get_errmsg());
    });

    getchar(); // press "Enter" to end.
    return 0;
}

3.3. 编译命令

实际工程可以查看示例工程

#代码生成
cd protofile
protoc example.proto --cpp_out=./ --proto_path=./
cd ..
srpc_generator protobuf protofile/example.proto ./
mv protofile/*.cc src
mv protofile/*.h include
mv *.cc src/
mv *.h include/

# 示例编译
# g++ -o server src/server.cc src/example.pb.cc -std=c++11 -lsrpc -I include
# g++ -o client src/client.cc src/example.pb.cc -std=c++11 -lsrpc -I include
if [ ! -d "./deploy" ]; then
	mkdir deploy
fi
if [ ! -d "./build" ]; then
	mkdir build
fi
# 客户端应用
cd build
rm -rf *
cmake ..
make -j32
cd ..
cp build/release/test deploy/client

cd build
rm -rf *
cmake -DBuild_Client=OFF ..
make -j32
cd ..
cp build/release/test deploy/server

四. 实例演示结果

步骤三顺利结束后,我们将会在deploy中发现client和server可执行程序。

演示的时候我们需要用到三个演示终端,三个终端分别执行下述命令

  • 终端1:

cd deploy
./server

# 该终端显示结果如下所示
get_req:
message: "Hello, srpc!"
name: "workflow"

set_resp:
message: "Hi, workflow"

get_req:
message: "from curl"
name: "CURL"

set_resp:
message: "Hi, CURL"

  • 终端2:

cd deploy
./client

# 该终端显示结果如下所示
message: "Hi, workflow"
  • 终端3:

curl 127.0.0.1:8811/Example/Echo -H 'Content-Type: application/json' -d '{message:"from curl",name:"CURL"}'

# 该终端显示结果如下所示
{"message":"Hi, CURL"}

至此,关于SRPC这种RPC框架,就可以完成了初步入门

搜狗的srpc开源项目 切换到版本,有submodule,需要依赖protobuf和snappy,find_program,find_package修改如下find_program(PROTOC “protoc” PATHS D:\Opensource\protobufsource\build\cmake\Debug) //查找exe依赖workflowopenssl static版本编译错误,需要set(OPENSSL_USE_STATIC_LIBS,TRUE)workflow需要切换到windows分支。 阅读详情

相关推荐

srpc:基于C ++工作流的RPC

SRPC 介绍 这是搜狗自研的RPC系统,主要功能和特点: 这是一个基于的项目,兼具: 高效 低开发和接入门情报 完美兼容workflow的串并联任务流 对于现有的pb / thrift描述文件的项目,可以做到一键迁移 支持多种IDL格式,包括: 原虫 节约 支持多种数据布局,使用上完全透明,包括: Protobuffer序列化 节俭二进制序列化 json序列化 支持多种压缩,使用上完全透明,包括: gzip zlib 活泼的 lz4 支持多种通信协议,使用上完全透明,包括: tcp http sctp ssl https 用户可以通过http + json实现跨语言: 如果自己是服务器提供方,用任何语言的http服务器接受post请求,解析多个http标头即可 如果自己是client调用方,用任何语言的http client发送post请求,添加一些http head

SRPC快速入门 - Sogou基于Workflow的自研RPC框架

RPC(Remote Procedure Call),远程过程调用,它把网络交互类比为client调用server上的函数。RPC 的主要功能目标是让构建分布式计算(应用)更容易,在提供强大的远程调用能力时不损失本地调用的语义简洁性。为实现该目标,RPC 框架需提供一种透明调用机制,让使用者不必显式的区分本地调用和远程调用。

新法的博客 2557

从贝叶斯网络到结构因果模型:因果推理在可解释AI中的实践

在机器学习和数据分析领域,理解变量间的因果关系而不仅仅是统计关联,是构建可信赖、可解释系统的关键。概率图模型,特别是贝叶斯网络,通过有向无环图和条件概率表,能够高效地编码和推理变量间的条件依赖关系,广泛应用于医疗诊断、风险评估等场景。然而,贝叶斯网络主要刻画的是“是什么”的关联,难以回答“如果…会怎样”的因果问题。为了进行因果推断,需要引入结构因果模型和do-演算,它们通过定义结构方程和模拟干预操作,能够区分混杂效应,估计处理变量对结果变量的净因果影响。这一套方法论对于可解释人工智能至关重要,它能生成反事实

weixin_42168902的博客 379

SRPC 框架服务端源码解析

SRPC是个轻量级、高性能、代码量很少开源的C++ RPC框架,目前在公司每天超百亿线上请求,兼具学习+使用的特点,非常适合初学者进行学习;

weixin_44835655的博客 1633

引入 CloudWeGo 后飞书管理后台平台化改造的演进史

飞书管理后台是飞书套件专为企业管理员提供的信息管理平台,它通过引入 Kitex 泛化调用对飞书管理后台进行平台化改造,成为了企业统一数字化管理平台。本文将从三个方面为大家讲解 Kitex 泛化调用在飞书管理后台平台化改造过程中的落地实践。...

weixin_44186218的博客 1762

GPMC开发笔记(TI开发者推荐笔记)

因为gpmc(General-Purpose Memory Controller)是TI特有的驱动,gpmc的资料比较少,本人开发gpmc驱动算是摸了很多石头过河的。所以想通过这遍文章可以给也做GPMC驱动开发的后来者有一点参考价值。文章如有瑕疵也请各位批评改正。 1.GPMC介绍 gpmc主要用于与nandflash,norflash,fpga进行通信。在这里主要介绍gpmc16位数据和地址线不复用nor模式下的通信。 注意:在这种模式下gpmc_a[0]引脚是没法使用的 1.1GPMC信号线

weixin_44316996的博客 7498

最完整SRPC安装指南:从源码编译到系统部署的开发者之路

你是否曾在Linux、Windows和MacOS间切换时,为不同环境下的SRPC安装步骤感到抓狂?是否在源码编译时因依赖版本不兼容而卡壳?是否面对CMake和Bazel两种构建工具不知如何选择?本文将为你提供一站式解决方案,从环境准备到系统部署,从源码编译到包管理安装,让你10分钟内掌握SRPC的全平台安装技巧。**读完本文你将获得**: - 3种主流操作系统的安装方案 - 2种构建工具的详细对比

gitblog_00399的博客 485

手把手教你设计反激开关电源:从整流滤波到PCB布局的实战避坑指南

本文是一份反激开关电源的实战设计指南,重点解析了从整流滤波电路到PCB布局的关键细节与常见陷阱。文章深入探讨了输入保护元件协同设计、EMI滤波器优化、整流桥与滤波电容选型,并详细阐述了如何通过优化PCB布局来确保安规、最小化功率回路面积以控制噪声,旨在帮助工程师和爱好者规避设计误区,提升电源的可靠性与性能。

yhn45678901的博客 691

API网关健康监测机制与SRPC实践解析

在分布式系统中,健康监测是保障服务高可用的核心技术,其核心原理是通过持续检测服务实例状态实现故障自动隔离。常见的实现方式包括主动探测、心跳上报和服务注册中心同步三种模式,分别适用于不同规模的集群场景。作为服务通信框架,SRPC通过内置健康检查回调机制,可与API网关形成高效的状态同步体系。现代云原生架构中,健康监测已发展为结合网络层、应用层和业务指标的多维度评估系统,并常与Prometheus等监控工具集成。合理的探测窗口设置和分级检查策略能显著提升检测效率,而eBPF和AI技术的引入正推动健康监测向智能化

weixin_30512965的博客 141

【车载以太网】【AVB/TSN】IEEE802.1Qav队列及转发协议

目录 一、概述 二、优先级排队算法 三、基于信用的流量整形算法 一、概述 IEEE 802.1Qav 队列及转发协议(Qav)针对不同数据流选择不同的传输选择算法来保障对时间敏感的 AV 数据流的实时传输。为了避免传统的异步以太网数据流量与 AVB 流量之间对网络资源的竞争,AVB 交换机内使用优先级排队算法和基于信用的流量整形算法实现数据流的调度。 二、优先级排队算法 优先级排队算法主要用于传统以太网数据流(BE, Best Effort)的调度传输,BE 流通过基于优先级...

专注汽车软件开发、AutoSAR、车载以太网、SOA、EE架构。 4687

Linux下驱动开发_块设备驱动开发(硬件上采用SD卡+SPI协议)

这一篇文章将采用SD卡作为存储硬件,利用SPI协议与SD卡通信,完成块设备驱动开发测试。 SD卡可以更加形象的表示块设备开发过程,明白硬件如何交互,完成数据读写。

2603

ZBUS简介及使用说明

zbus核心是一个独立实现的小巧极速的消息队列(MQ),支持持久化与内存队列, 支持单播、广播、组播等多种消息通信模式;在MQ之上 zbus完备地支持了RPC服务,RPC支持独立伺服,基于总线两种模式;同时zbus支持代理服务,基于MQ的HttpProxy实现了类Nginx的HTTP代理服务(支持DMZ网络结构),TcpProxy则支持透明的TCP协议代理,可以代理任何基于TCP的协议,比如代理M...

jiangbb8686的博客 5895

【回答问题】ChatGPT上线了!如何安装python-ipopt?python-ipopt有哪些用法?

python-ipopt是一种基于Python语言的求解非线性最优化问题的软件包。它使用了Interior Point Optimizer(IPOPT)算法来求解最优化问题。这段代码使用python-ipopt求解了一个无约束的非线性最小化问题,其目标函数为(x[0] - 1) ** 2 + (x[1] - 2) ** 2,求解结果为x_opt。求解线性规划问题、二次规划问题、二次范数最小化问题等类型的最优化问题。对于给定的最优化问题,可以设置不同的求解参数来控制求解的精度和效率。

源代码杀手的博客 2144

Mathesar API完全参考手册:REST和RPC接口的详细说明

Mathesar是一个直观的电子表格式界面,让各种技术水平的用户能够直接查看、编辑、查询和协作Postgres数据。作为100%开源的自主托管解决方案,它提供了完整的API接口体系,包括REST API和RPC接口,帮助开发者高效管理数据库操作。本指南将详细介绍Mathesar的API功能和使用方法。 ## 🚀 Mathesar API概览 Mathesar提供了两套API接口:传统的RES

gitblog_01044的博客 967

【Java开发者必看】LangChain4j实战指南:使用AIService轻松集成聊天记忆Chat Memory到SpringBoot应用,通过封装多轮复杂对话,使聊天记忆的实现变得简单

聊天记忆是指在与用户的多轮对话过程中,能够记住之前的交互内容,从而提供更加连贯和个性化的回复。LangChain4j支持通过ChatMemoryProvider接口实现聊天记忆功能。

Spring Boot-Common On With You 448

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

HelloGitHub 第 56 期全解析:31 个入门级开源项目与代码实战导读

> 本文以仓库内 [content/HelloGitHub56.md](https://link.gitcode.com/i/4771357bb08b286d69af21677f631929) 为骨架,完整梳理《HelloGitHub》第 56 期收录的 31 个入门级开源项目,覆盖 C、C++、Go、Java、JavaScript、Python、人工智能等多个领域,并附上 spdlog、srpc

gitblog_00534的博客 193

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Box2-lib 开源项目使用教程

Box2-lib 开源项目使用教程 1. 项目的目录结构及介绍 Box2-lib 项目的目录结构如下: box2-lib/ ├── src/ ├── .gitignore ├── .travis.yml ├── LICENSE ├── README.md ├── composer.json ├── phpunit.xml.dist src/: 包含项目的主要源代码文件。 .gitignore:...

gitblog_01162的博客 297

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【在Linux世界中追寻伟大的One Piece】System V共享内存

共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据。

枫叶丹4的博客 2739

python import realvnc_pymetasploit3:一个Python编写的Metasploit自动化库

Pymetasploit3是一个Python编写的成熟的Metasploit自动化库。它可以通过msfrpcd或msfconsole中的msgrpc插件与Metasploit进行交互。原始库:pymetasploit该项目是Python2 pymetasploit库的更新和改进版本。安装mkdir your-projectcd your-projectpipenv install --three ...

weixin_39569051的博客 714

ZLL本地局域网通信过程

Interface_srpcserver -----以灯的状态操作位例 网关与客户端通过Socket API通信,Socket API在socket_server.c中实现,socket_server.c中不只实现了网关与客户端的通信,还对客户端进行了简单的管理,如建立客户端列表[c1],因...

weixin_30687051的博客 232

ap计算机科学2019题,2019年AP宏观经济学真题解析【第一题】

2019年AP宏观经济学真题解析【第一题】【分析】这个题继2016年考察了菲利普斯曲线之后,又再一次考察了这个知识点。历年较常考的总需求和总供给曲线也有涉及。同样涉及的还有财政政策和外汇市场。题目条件中给出了X国经济的失业率和通胀率数据。自然失业率为5%,实际失业率为7%,通胀率为5%。从实际失业率高于自然失业率这个条件中,我们可得知X国当前处于recession经济衰退时期。【考点】Short ...

weixin_30979383的博客 834

浅谈分布式存储中的网络通信

浅谈分布式存储中的网络通信 优快云云计算 2020-06-30 16:20:55 631 收藏 3 版权 作者 | 火尉子 责编 | Carol 封图 | 优快云 下载自视觉中国 在各行各业数字化转型深入的当下,数据呈爆炸式增长。面对海量数据的存储需求,分布式存储显然在架构上有着天然优势,但在这波数据洪流之中也面临着性能上的全新挑战。 由于分布式存储的工作原理是将各个存储节点使用网络互联的方式构建为集群,向外部提供更加可靠的高性能服务,因此可以说分布式存储本质上是一种网络存储,其性能在..

cxu123321的博客 594

【软件架构】分布式架构简介

1、分布式架构简介2、适用场景3、工作原理4、使用的技术和工具5、优点6、缺点7、举例8、更多实例应用电商平台金融服务物联网(IoT)9、技术和工具的进一步说明10、总结11、服务间的调用gRPCThrift使用场景举例使用Feign的场景使用SRPC的场景选择考虑分布式架构指的是一种软件架构模式,其中应用程序的不同部分分布在多个网络计算机上,这些计算机之间协同工作,就好像是一个单一的环境。这种架构旨在处理大规模数据、提高计算能力和提升系统的可用性与可靠性。

weixin_46453070的博客 2663

第一个Qt工程分析

第一个Qt工程分析 创建好第一个Qt工程后,我们看下Qt工程的基本组成,和它的特点 一. Qt工程的组成 根据我们刚才创建工程对模板的配置,可以得到下图左侧的工程目录文件 1-Qtest:和工程同名的目录文件,表示整个工程,箭头下面看到的是整个工程的目录结构,在系统中以文件夹的形式存在 1-Qtest.pro:和工程同名的工程文件,.pro文件在Qt工程中意义重大,用来配置和管理工程的,通过这个.pro工程文件,qmake可以生成各种系统下的Makefile,其中的一些语法和Makefile

Andrea-地面宇航员 664

搜狗 C++ Workflow 全面指南:企业级异步并行网络框架的安装、任务流与编程范式

本文以 [README_cn.md](https://link.gitcode.com/i/0015fc86e59a9bb95d80cc51c930ac71) 为主体脉络,系统讲解 Sogou C++ Workflow 的项目定位、快速上手、安装方式、核心编程范式(程序 = 协议 + 算法 + 任务流)以及任务隐藏与内存回收机制,并结合仓库源码([WFHttpServer.h](https://l

gitblog_01168的博客 1072

OpenHuman audio_toolkit 音频播客工具包深度解析:从文本合成到「稍后收听」音频邮件

OpenHuman 是一个本地优先的开源个人 AI(支持 macOS / Windows / Linux),其 `audio_toolkit` 模块(源码位于 [src/openhuman/voice/audio_toolkit](https://link.gitcode.com/i/ee7c454d423b53abe7258bc397c8c17b))实现了「文本 → 播客式音频」的完整链路:通过

gitblog_00726的博客 258
上一篇: Halide示例学习三
下一篇: halide调度过程可视化工具
慷仔
博客等级 码龄9年 88粉丝 46原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值