微服务即时通信系统---(三)框架学习
目录
brpc
RPC框架
核心概念
工作原理
介绍
安装
头文件包含和编译时指明库
类与接口介绍
日志输出类与接口
protobuf类与接口
Closure类
RpcController类
服务端类与接口
ServerOptions类
Server类
ClosureGuard类
HttpHeader类
Controller类
客户端类与接口
ChannelOptions类
Channel类
使用
同步调用
proto文件
server端
client端
Makefile
异步调用
client端
封装channel
封装思想(结合etcd服务发现模块的回调函数)
ServiceChannel类
ServiceChannelManager类
代码测试
main.proto
reg.cc
dis.cc
Makefile
测试结果
本章主要是学习和使用本项目中所需使用到的一些框架。
brpc
RPC框架
RPC(Remote Procedure Call,远程过程调用)框架,是一种用于实现分布式系统中跨网络调用远程服务的工具。
它允许程序像调用本地函数一样调用远程服务器上的函数,隐藏了底层网络通信的复杂性。
举例:想要实现一个a + b的函数,我们只需写好函数头,然后在函数内部调用远程服务器上的a+b函数,远程服务器计算完成之后返还结果。
核心概念
客户端(Client) | 发起远程调用的程序。 |
服务端(Server) | 提供远程服务的程序。 |
存根(Stub) | 客户端代理,负责将调用请求打包并发送给服务端。 |
骨架(Skeleton) | 服务端代理,负责接收请求并调用实际的服务实现。 |
工作原理
调用 | 客户端通过存根发起远程调用。 |
序列化 | 存根将调用信息序列化为网络传输格式。 |
传输 | 序列化后的数据通过网络发送到服务端。 |
反序列化 | 服务端的骨架接收并反序列化数据。 |
执行 | 骨架调用本地服务实现。 |
返回 | 服务端将结果序列化后返回给客户端。 |
反序列化 | 客户端存根接收并反序列化结果,返回给调用者。 |
介绍
brpc是用C++编写的工业级RPC框架,常用于搜索、存储、机器学习、广告、推荐等高性能系统。
特点:
能搭建在一个端口支持多协议的服务,或访问各种服务。 |
Server能同步或异步处理请求。 |
Client支持同步、异步、半同步,或使用组合channels简化复杂的分库或并发访问。 |
通过http界面调试服务,使用cpu、heap、contention profilers。 |
获得更好的延时和吞吐。 |
把你组织中使用的协议快速地加入brpc,或定制各类组件,包括命名服务,负载均衡。 |
安装
先安装依赖:
sudo apt-get install
git g++ make libssl-dev libprotobuf-dev libprotoc-dev protobuf-compiler libleveldb-dev
通过github上的brpc源码进行安装。
brpc的github地址:https://github.com/apache/brpc.git
通过命令安装:
# 克隆远端仓库
git clone https://github.com/apache/brpc.git# 进入工作目录
cd brpc/# 创建build
mkdir build && cd build# 使用cmake构建Makefile
cmake .. -DCMAKE_INSTALL_PREFIX=/usr && cmake --build . -j6# make安装
make && sudo make install
头文件包含和编译时指明库
#include <brpc/channel.h>
#include <brpc/server.h>
#include <butil/logging.h>
-lbrpc -lssl -lleveldb -lcrypto -lprotobuf -lgflags
类与接口介绍
日志输出类与接口
本项目采用spdlog进行日志输出,这里只是想关闭brpc自带的日志输出系统。
/usr/include/butil/logging.h:
namespace logging {// TODO(avi): do we want to do a unification of character types here?
#if defined(OS_WIN)
typedef wchar_t LogChar;
#else
typedef char LogChar;
#endif// Where to record logging output? A flat file and/or system debug log
// via OutputDebugString.
enum LoggingDestination {LOG_TO_NONE = 0,LOG_TO_FILE = 1 << 0,LOG_TO_SYSTEM_DEBUG_LOG = 1 << 1,LOG_TO_ALL = LOG_TO_FILE | LOG_TO_SYSTEM_DEBUG_LOG,// On Windows, use a file next to the exe; on POSIX platforms, where// it may not even be possible to locate the executable on disk, use// stderr.
#if defined(OS_WIN)LOG_DEFAULT = LOG_TO_FILE,
#elif defined(OS_POSIX)LOG_DEFAULT = LOG_TO_SYSTEM_DEBUG_LOG,
#endif
};struct BUTIL_EXPORT LoggingSettings {// The defaults values are://// logging_dest: LOG_DEFAULT// log_file: NULL// lock_log: LOCK_LOG_FILE// delete_old: APPEND_TO_OLD_LOG_FILELoggingSettings();LoggingDestination logging_dest;// The three settings below have an effect only when LOG_TO_FILE is// set in |logging_dest|.const LogChar* log_file;LogLockingState lock_log;OldFileDeletionState delete_old;
};// This function may be called a second time to re-direct logging (e.g after
// loging in to a user partition), however it should never be called more than
// twice.
inline bool InitLogging(const LoggingSettings& settings) {return BaseInitLoggingImpl(settings);
}
通过logging::LoggingDestination::LOG_TO_NONE + LoggingSettings::logging_dest + InitLogging来将日志的输出地设为0,即不输出。
#include <butil/logging.h>int main(int argc, char *argv[])
{logging::LoggingSettings settings;settings.logging_dest = logging::LoggingDestination::LOG_TO_NONE;logging::InitLogging(settings);return 0;
}
protobuf类与接口
Closure类
/usr/include/google/protobuf/stubs/callback.h:
namespace google {
namespace protobuf {class PROTOBUF_EXPORT Closure {public:Closure() {}virtual ~Closure();virtual void Run() = 0;
};// See Closure.
inline Closure* NewCallback(void (*function)()) {return new internal::FunctionClosure0(function, true);
}}
}
Closure
类用于定义异步操作完成后的回调逻辑。它是一个抽象类,用户需要继承并实现Run()
方法,该方法在 RPC 调用完成时被调用。
主要功能:
-
回调机制:
Closure
允许用户在 RPC 调用完成后执行自定义逻辑。 -
资源管理:通过
NewCallback()
函数创建Closure
对象,自动管理其生命周期。
即:Closure类中的Run方法,是在客户端完成RPC调用之后的回调函数。
RpcController类
/usr/include/google/protobuf/service.h:
namespace google {
namespace protobuf {
class PROTOBUF_EXPORT RpcController {// After a call has finished, returns true if the call failed. The possible// reasons for failure depend on the RPC implementation. Failed() must not// be called before a call has finished. If Failed() returns true, the// contents of the response message are undefined.virtual bool Failed() const = 0;// If Failed() is true, returns a human-readable description of the error.virtual std::string ErrorText() const = 0;
};
}
}
RpcController
类用于控制 RPC 调用的行为和状态,提供对调用过程的控制接口。
主要功能:
-
调用控制:支持取消、重置等操作。
-
状态查询:检查调用是否完成、是否失败等。
-
错误处理:获取错误信息和状态码。
常用方法:
-
Reset()
:重置控制器状态,用于复用。 -
Failed()
:检查调用是否失败。 -
ErrorText()
:获取错误信息。 -
SetFailed()
:手动标记调用为失败。 -
StartCancel()
:取消调用。
服务端类与接口
ServerOptions类
/usr/include/brpc/server.h:
namespace brpc{
struct ServerOptions {// connections without data transmission for so many seconds will be closed// Default: -1 (disabled)int idle_timeout_sec// Number of pthreads that server runs on. Notice that this is just a hint,// you can't assume that the server uses exactly so many pthreads because// pthread workers are shared by all servers and channels inside a// process. And there're no "io-thread" and "worker-thread" anymore,// brpc automatically schedules "io" and "worker" code for better// parallelism and less context switches.// If this option <= 0, number of pthread workers is not changed.// Default: #cpu-coresint num_threads;};// Represent server's ownership of services.
enum ServiceOwnership {SERVER_OWNS_SERVICE, // 添加服务失败时, 服务器自动删除服务对象SERVER_DOESNT_OWN_SERVICE // 添加服务失败时, 服务器不会删除服务对象
};
}
向 brpc 服务器添加服务,通常是指用户实现一个基于 Protobuf 定义的服务接口,并将其注册到 brpc 服务器中。这个过程确实需要用户重写服务函数,但不仅仅是简单的函数重写,而是需要遵循一定的规范和流程。
以下是向 brpc 服务器添加服务的详细步骤:
使用 Protobuf 定义服务接口。
实现服务接口中的虚函数(即重写服务函数)。
将服务实例注册到 brpc 服务器。
启动服务器并处理客户端请求。
Server类
namespace brpc{
class Server {// Start on IP_ANY:port.int Start(int port, const ServerOptions* opt);// Stop accepting new connections and requests from existing connections.// Returns 0 on success, -1 otherwi
相关文章:
微服务即时通信系统---(三)框架学习
目录 brpc RPC框架 核心概念 工作原理 介绍 安装 头文件包含和编译时指明库 类与接口介绍 日志输出类与接口 protobuf类与接口 Closure类 RpcController类 服务端类与接口 ServerOptions类 Server类 ClosureGuard类 HttpHeader类 Controller类 客户端类与…...

解决Spring Data JPA set值后自动更新到数据库问题
出现问题: 通过EntityManager查询出数据保存到对象中,但是向对象set值后就自动更新到数据库中去了。 Hibernate对象的三种状态 1、瞬时态:对象刚new出来,还未通过save方法保存到数据库,或通过游离态对象、持久化态对象…...

心理咨询小程序的未来发展
还在眼巴巴看着心理咨询行业的巨大蛋糕却无从下口?今天就来聊聊心理咨询小程序的无限潜力 据统计,全球超 10 亿人受精神心理问题困扰,国内心理健康问题也日益突出,心理咨询需求猛增。可传统心理咨询预约难,费用高&…...

STM32-智能台灯项目
一、项目需求 1. 红外传感器检测是否有人,有人的话实时检测距离,过近则报警;同时计时,超过固定时间则报警; 2. 按键 1 切换工作模式:智能模式、按键模式、远程模式; 3. 智能模式下,根…...
c# —— StringBuilder 类
StringBuilder 类是 C# 和其他一些基于 .NET Framework 的编程语言中的一个类,它位于 System.Text 命名空间下。StringBuilder 类表示一个可变的字符序列,它是为了提供一种比直接使用字符串连接操作更加高效的方式来构建或修改字符串。 与 C# 中的 stri…...

Linux 核心架构与组件(2025更新中)
一、Linux 核心架构与组件 内核架构 核心职责: 管理进程生命周期、内存分配、硬件驱动交互及文件系统操作。 模块化设计支持动态加载硬件驱动(如modprobe加载内核模块),提升灵活性和扩展性。 内存管理:…...

Unity打包APK报错 using a newer Android Gradle plugin to use compileSdk = 35
Unity打包APK报错 using a newer Android Gradle plugin to use compileSdk 35 三个报错信息如下 第一个 WARNING:We recommend using a newer Android Gradle plugin to use compileSdk 35This Android Gradle plugin (7.1.2) was tested up to compileSdk 32This warning…...

陀螺匠·企业助手v1.8 产品介绍
陀螺匠企业助手是一套采用Laravel 9框架结合Swoole高性能协程服务与Vue.js前端技术栈构建的新型智慧企业管理与运营系统。该系统深度融合了客户管理、项目管理、审批流程自动化以及低代码开发平台,旨在为企业提供一站式、数字化转型的全方位解决方案,助力…...

文件包含-session2
[题目信息]: 题目名称题目难度文件包含-session22 [题目考点]: 由于网站功能需求,会让前端用户选择要包含的文件,而开发人员又没有对要包含的文件进行安全考虑,就导致攻击者可以通过修改文件的位置来让后台执行任意…...
GitHub免密操作与跨服务器通行:SSH密钥一站式配置指南
作为开发者,与GitHub的安全交互和远程服务器的高效管理是日常工作的核心技能。本文将从零开始,教你如何配置GitHub的SSH密钥认证,并实现免密码远程登录Linux服务器。 一、为什么需要SSH密钥? 更安全的认证方式:相比传统密码,密钥认证几乎无法被暴力破解操作便捷性:免去每…...

PHP入门基础学习四(PHP基本语法)
运算符 运算符,专门用于告诉程序执行特定运算或逻辑操作的符号。根据运算符的作用,可以将PHP语言中常见的运算符分为9类 算数运算符: 是用来处理加减乘除运算的符号 也是最简单和最常用的运算符号 赋值运算符 1. 是一个二元运算符&#x…...
模型蒸馏:让人工智能更智能、更小、更高效的艺术
你有没有想过,我们如何才能让一个需要巨大计算能力的庞大人工智能模型变得更精简、更快速、更强大?答案在于模型蒸馏,这是一种允许知识从大型、计算成本高昂的人工智能系统转移到较小、更高效的系统的技术,而不会牺牲智能。 什么是模型蒸馏 模型蒸馏是一种技术,其…...

git 小乌龟安装包及中文包
git 工具小乌龟不需要输入命令就可以提交,挺方便的,安装完之后鼠标右击就可以看到 链接: https://pan.baidu.com/s/1jqrcrFjKf-bKGcHesxs-YQ 提取码: 8888 复制这段内容后打开百度网盘手机App,操作更方便哦...
MySQL 主从集群同步延迟问题分析与解决方案
MySQL 主从复制(Replication)是构建高可用架构的核心技术,但在实际应用中,主从同步延迟(Replication Lag)是常见且棘手的问题。延迟会导致从库数据不一致、读请求返回旧数据,甚至引发业务逻辑错…...
用HTML5+CSS+JavaScript实现新奇挂钟动画
用HTML5+CSS+JavaScript实现新奇挂钟动画 引言 在技术博客中,如何吸引粉丝并保持他们的关注?除了干货内容,独特的视觉效果也是关键。今天,我们将通过HTML5、CSS和JavaScript实现一个新奇挂钟动画,并将其嵌入到你的网站中。这个动画不仅能让你的网站脱颖而出,还能展示你的…...

医疗AI领域中GPU集群训练的关键技术与实践经验探究(下)
五、医疗 AI 中 GPU 集群架构设计 5.1 混合架构设计 5.1.1 参数服务器与 AllReduce 融合 在医疗 AI 的 GPU 集群训练中,混合架构设计将参数服务器(Parameter Server)与 AllReduce 相结合,能够充分发挥两者的优势,提升训练效率和模型性能。这种融合架构的设计核心在于根…...

解决双系统开机显示gnu grub version 2.06 Minimal BASH Like Line Editing is Supported
找了好多教程都没有用,终于解决了!!我是因为ubuntu分区的时候出问题了 问题描述: 双系统装好,隔天开机找不到引导项,黑屏显示下列 因为我用的D盘划分出来的部分空闲空间,而不是全部,…...
sysbench压测pgsql数据库 —— 筑梦之路
这里主要使用sysbench工具对Pgsql数据库进行基准测试。 1. 创建数据库和用户名 # 创建用户和数据库CREATE USER sysbench WITH PASSWORD 123456;CREATE DATABASE sysbench owner sysbench;# 给用户授权访问 vim pg_hba.confhost sysbench sysbench 127…...

数字IC后端培训教程| 芯片后端实战项目中base layer drc violation解析
今天分享一个咱们社区IC后端训练营学员遇到的一个经典DRC案例。这个DRC Violation的名字为PP.S.9(这里的PP就是Plus P)。这一层是属于管子的base layer。更多关于base layer的介绍,可以查看下面这份教程。 https://alidocs.dingtalk.com/api/doc/transit?spaceId5…...

Android之APP更新(通过接口更新)
文章目录 前言一、效果图二、实现步骤1.AndroidManifest权限申请2.activity实现3.有版本更新弹框UpdateappUtilDialog4.下载弹框DownloadAppUtils5.弹框背景图 总结 前言 对于做Android的朋友来说,APP更新功能再常见不过了,因为平台更新审核时间较长&am…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...

智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...

MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...