brpc 学习(一)M1 MacOS构建方法
tags: brpc
categories: brpc
写在前面
实习阶段初次接触到 RPC 这样一种协议, 以及 brpc 这样一个很棒的框架, 但是当时没时间认真深入学习, 就是围绕使用 demo 开发, 还是有点不知其所以然的, 最近抽空来学习一下 brpc, 首要的一点就是在开发机上构建项目, 并且能够跑起来, 下面来看看如何在 m1 芯片的 MacOS 上跑起来 brpc, 并且成功运行 demo 程序: echo 服务器
环境:
MacOS M1 arm64clang 14(xcode) cmake
zsh
源码下载
$ git clone https://github.com/apache/brpc.git
$ git branch -a
$ git checkout -b release-1.6 remotes/origin/release-1.6
$ git branchmaster
* release-1.6
依赖安装
需要用到 brew, 关于 brew 的安装方法, 之前博客已经给出了, 这里主要说一下安装这些包时候所踩的坑.
brpc/docs/cn/getting_started.md at master · apache/brpc;
brew install openssl git gnu-getopt coreutils gflags protobuf@21 leveldb googletest gperftools
brew link protobuf@21
注意这里面的protobuf@21 非常重要, 因为 brpc 不支持 protobuf24(目前最新版), 只能用 21 来编译, 否则会出现很多错误!!!
注意这里因为其他库例如 grpc 和gflags 等默认采用最新版 所以 protobuf 的最新版也会安装, 只需要对 protobuf@21强制执行 link即可, 就是带上--overwrite 选项, 可以用--dry-run 查看哪些文件需要被重写.
针对gun-getopt 库, 如果提示未找到, 可以使用:
echo 'export PATH="/opt/homebrew/opt/gnu-getopt/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc
构建
执行配置生成:
sh config_brpc.sh --headers=/opt/homebrew/include --libs=/opt/homebrew/lib --cc=clang --cxx=clang++
这一步会生成一个config.mk 文件, 文件头部如下:
# Generated by config_brpc.sh, don't modify manually
SYSTEM=Darwin
HDRS=/opt/homebrew/include/ /usr/local/opt/openssl/include/
LIBS=/opt/homebrew/lib /usr/local/opt/openssl/lib/
PROTOC=/opt/homebrew/bin/protoc
PROTOBUF_HDR=/opt/homebrew/include/
此时需要改一下默认的 OpenSSL 位置, 否则报错:
ssl ld error...
# ssl 相关的库找不到了
解决方案:
/usr/local/opt/openssl -> /opt/homebrew/Cellar/openssl@3/3.1.2
注意这里的版本, 需要先用
brew info openssl看一下版本.
- 这里文档中提到可以用
ln -s的方式创建软链接, 但是我这里创建之后还是不行, 就采用直接改配置的方式执行 了
改完之后如下:
# Generated by config_brpc.sh, don't modify manually
SYSTEM=Darwin
HDRS=/opt/homebrew/include/ /opt/homebrew/Cellar/openssl@3/3.1.2/include/
LIBS=/opt/homebrew/lib /opt/homebrew/Cellar/openssl@3/3.1.2/lib/
PROTOC=/opt/homebrew/bin/protoc
PROTOBUF_HDR=/opt/homebrew/include/
最后就直接执行make -j8 , 耐心等待即可, 编译过程还是很快的, 我这两年多的 m1mba 还是很能打的.
编译完成, 结果如下:
==> tree output -L 2
output
├── bin
│ └── protoc-gen-mcpack
├── include
│ ├── brpc
│ ├── bthread
│ ├── butil
│ ├── bvar
│ ├── idl_options.pb.h
│ ├── idl_options.proto
│ ├── json2pb
│ └── mcpack2pb
└── lib├── libbrpc.a└── libbrpc.dylib9 directories, 5 files
然后来到 example 目录下的echo_c++ 中:
make -j8
然后可以执行:
==> ./echo_server
I0919 18:23:45 259 src/brpc/server.cpp:1127] Server[example::EchoServiceImpl] is serving on port=8000.
I0919 18:23:45 259 src/brpc/server.cpp:1130] Check out http://xxx:8000 in web browser.
I0919 18:23:48 2819 server.cpp:54] Received request[log_id=0] from 127.0.0.1:55478 to 127.0.0.1:8000: hello world (attached=)
I0919 18:23:49 3075 server.cpp:54] Received request[log_id=1] from 127.0.0.1:55478 to 127.0.0.1:8000: hello world (attached=)
以及:
==> ./echo_client
I0919 18:23:48 259 client.cpp:78] Received response from 0.0.0.0:8000 to 127.0.0.1:55478: hello world (attached=) latency=1502us
I0919 18:23:49 259 client.cpp:78] Received response from 0.0.0.0:8000 to 127.0.0.1:55478: hello world (attached=) latency=951us
^CI0919 18:23:49 259 client.cpp:89] EchoClient is going to quit
完结撒花~
补充: 通过 cmake 实现构建
光用 make 确实可以构建了, 但是不能生成 command_flags.json, 用不了 clangd 啊…
折腾一下 cmake 吧, 应该不是很复杂
前置条件, 主要针对OpenSSL 这个库, 需要改动的是 brpc 项目目录下的CMakeLists.txt文件, 搜索openssl, 找到这一行:
if(CMAKE_SYSTEM_NAME STREQUAL "Darwin")set(OPENSSL_ROOT_DIR# "/usr/local/opt/openssl" # Homebrew installed OpenSSL"/opt/homebrew/Cellar/openssl@3/3.1.2/" # add this line, specific version use `brew info openssl` to get)
endif()
然后还有一个很关键的点, 这里参考了:
macos - cmake - osx/mac - openssl brew - Stack Overflow;
将cmake 的编译选项加上-DOPENSSL_ROOT_DIR=/opt/homebrew/Cellar/openssl@3/3.1.2 , 这样就可以了.
$ mkdir build && cd build
$ cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=1 -DOPENSSL_ROOT_DIR=/opt/homebrew/Cellar/openssl@3/3.1.2 ..
$ make -j8
接着撒花~
相关文章:
brpc 学习(一)M1 MacOS构建方法
tags: brpc categories: brpc 写在前面 实习阶段初次接触到 RPC 这样一种协议, 以及 brpc 这样一个很棒的框架, 但是当时没时间认真深入学习, 就是围绕使用 demo 开发, 还是有点不知其所以然的, 最近抽空来学习一下 brpc, 首要的一点就是在开发机上构建项目, 并且能够跑起来,…...
Python 与 Qt c++ 程序共享内存,传递图片
python 代码 这里Python 使用 shared_memory QT 使用 QSharedMemory 简单协议: 前面4个字节是 图片with,height,0,0 后面是图片数据 import sys import struct def is_little_endian():x0x12345678y struct.pack(I,x)return y[0]0x78print(f"is_little_end…...
【2023年中国研究生数学建模竞赛华为杯】E题 出血性脑卒中临床智能诊疗建模 问题分析、数学模型及代码实现
【2023年中国研究生数学建模竞赛华为杯】E题 出血性脑卒中临床智能诊疗建模 1 题目 1.1 背景介绍 出血性脑卒中指非外伤性脑实质内血管破裂引起的脑出血,占全部脑卒中发病率的10-15%。其病因复杂,通常因脑动脉瘤破裂、脑动脉异常等因素,导致…...
2024字节跳动校招面试真题汇总及其解答(五)
17.TCP的拥塞控制 TCP 的拥塞控制是指在 TCP 连接中,发送端和接收端通过协作来控制网络中数据包的流量,避免网络拥塞。TCP 的拥塞控制是 TCP 协议的重要组成部分,它可以确保 TCP 连接的稳定性和可靠性。 TCP 的拥塞控制主要有以下几个目的: 防止网络拥塞:当网络中的数据…...
如何撤销某个已经git add的文件以及如何撤销所有git add提交的文件?
如果你想撤销已经添加(git add)到暂存区的单个文件,可以使用 git reset 命令。以下是具体的命令格式: git reset <file>在这里,<file> 是你想要从暂存区中移除的文件名。比如,如果你想要撤销已…...
JVM高级性能调试
标准的JVM是配置为了高吞吐量,吞吐量是为了科学计算和后台运行使用,而互联网商业应用,更多是为追求更短的响应时间,更低的延迟Latency(说白了就是更快速度),当用户打开网页没有快速响应…...
APK的反编译,签名,对齐
APK的反编译,签名,对齐 – WhiteNights Site 2023年9月22日 标签:Android, 应用开发 记录下相关的命令行参数。 APK的打包与解包 java -jar apktool.jar 首先,需要一个jar包,以我在用的为例:apktool_2.8.…...
Django(20):信号机制
目录 信号的工作机制信号的应用场景两个简单例子Django常用内置信号如何放置信号监听函数代码自定义信号第一步:自定义信号第二步:触发信号第三步:将监听函数与信号相关联 信号的工作机制 Django 框架包含了一个信号机制,它允许若…...
31.链表练习题(2)(王道2023数据结构2.3.7节16-25题)
【前面使用的所有链表的定义在第29节】 试题16:两个整数序列A,B存在两个单链表中,设计算法判断B是否是A的连续子序列。 bool Pattern(LinkList L1,LinkList L2){ //此函数实现比较L1的子串中是否有L2LNode *p, *q; //工作在L1,p记录L1子串…...
排序算法之归并排序
一、归并排序的形象理解 原题链接 示例代码 void merge_sort(int q[], int l, int r) {if (l > r) return;int mid l r >> 1;merge_sort(q, l, mid), merge_sort(q, mid 1, r);int k 0, i l, j mid 1;while (i < mid && j < r) //第一处if (q[i]…...
macOS 下 Termius 中文显示为乱码
👨🏻💻 热爱摄影的程序员 👨🏻🎨 喜欢编码的设计师 🧕🏻 擅长设计的剪辑师 🧑🏻🏫 一位高冷无情的编码爱好者 大家好,我是 DevO…...
Apifox接口测试工具详细解析
最近发现一款接口测试工具--apifox,我我们很难将它描述为一款接口管理工具 或 接口自测试工具。 官方给了一个简单的公式,更能说明apifox可以做什么。 Apifox Postman Swagger Mock JMeter Apifox的特点: 接口文档定义: Api…...
Python 实现 PDF 文件转换为图片 / PaddleOCR
文章用于学习记录 文章目录 前言一、PDF 文件转换为图片二、OCR 图片文字识别提取三、服务器端下载运行 PaddleOCR四、下载权重文件总结 前言 文字识别(Optical Character Recognition,简称OCR)是指将图片、扫描件或PDF、OFD文档中的打印字符…...
【Java基础夯实】变量声明选择包装类还是基本类型有哪些讲究?
🧑💻作者名称:DaenCode 🎤作者简介:CSDN实力新星,后端开发两年经验,曾担任甲方技术代表,业余独自创办智源恩创网络科技工作室。会点点Java相关技术栈、帆软报表、低代码平台快速开…...
获取唯一的短邀请码
/*** 获取唯一的邀请码** return the string*/private String generateUserUniqueShareCode() {Set<String> arr getSetArr();String code;do {code generateCode(arr);} while (isCodeUserExists(code));return code;}/*** Gets set arr.** return the set arr*/NotNu…...
大词表语言模型在续写任务上的一个问题及对策
©PaperWeekly 原创 作者 | 苏剑林 单位 | 科学空间 研究方向 | NLP、神经网络 对于 LLM 来说,通过增大 Tokenizer 的词表来提高压缩率,从而缩短序列长度、降低解码成本,是大家都喜闻乐见的事情。毕竟增大词表只需要增大 Embedding 层和…...
Spark SQL【电商购买数据分析】
Spark 数据分析 (Scala) import org.apache.spark.rdd.RDD import org.apache.spark.sql.{DataFrame, SparkSession} import org.apache.spark.{SparkConf, SparkContext}import java.io.{File, PrintWriter}object Taobao {case class Info(userId: Lo…...
Google拟放弃博通自行研发AI芯片 | 百能云芯
谷歌计划自行研发人工智能(AI)芯片,考虑将博通(Broadcom)从其供应商名单中剔除,但谷歌强调双方的合作关系不会受到影响。 根据美国网络媒体《The Information》的报道,谷歌高层正在讨论可能在20…...
一百八十二、大数据离线数仓——离线数仓从Kafka采集、最终把结果数据同步到ClickHouse的完整数仓流程(待续)
一、目的 经过6个月的奋斗,项目的离线数仓部分终于可以上线了,因此整理一下离线数仓的整个流程,既是大家提供一个案例经验,也是对自己近半年的工作进行一个总结。 二、项目背景 项目行业属于交通行业,因此数据具有很…...
掌动智能:卓越性能的API接口测试工具
在现代软件开发中,API接口测试是保证应用程序稳定性和功能完整性的关键步骤之一。然而,随着应用程序复杂性的增加,传统的手动测试方法已经无法满足快速迭代和高质量需求的挑战。为了解决这一问题,掌动智能推出了一款卓越性能的API…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...
RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...
dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
微服务通信安全:深入解析mTLS的原理与实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、引言:微服务时代的通信安全挑战 随着云原生和微服务架构的普及,服务间的通信安全成为系统设计的核心议题。传统的单体架构中&…...
xmind转换为markdown
文章目录 解锁思维导图新姿势:将XMind转为结构化Markdown 一、认识Xmind结构二、核心转换流程详解1.解压XMind文件(ZIP处理)2.解析JSON数据结构3:递归转换树形结构4:Markdown层级生成逻辑 三、完整代码 解锁思维导图新…...
