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…...

(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...

从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...

Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...