当前位置: 首页 > news >正文

微服务即时通信系统---(三)框架学习

目录

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 服务器添加服务的详细步骤:

  1. 使用 Protobuf 定义服务接口。

  2. 实现服务接口中的虚函数(即重写服务函数)。

  3. 将服务实例注册到 brpc 服务器。

  4. 启动服务器并处理客户端请求。

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值后自动更新到数据库问题

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

心理咨询小程序的未来发展

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

STM32-智能台灯项目

一、项目需求 1. 红外传感器检测是否有人&#xff0c;有人的话实时检测距离&#xff0c;过近则报警&#xff1b;同时计时&#xff0c;超过固定时间则报警&#xff1b; 2. 按键 1 切换工作模式&#xff1a;智能模式、按键模式、远程模式&#xff1b; 3. 智能模式下&#xff0c;根…...

c# —— StringBuilder 类

StringBuilder 类是 C# 和其他一些基于 .NET Framework 的编程语言中的一个类&#xff0c;它位于 System.Text 命名空间下。StringBuilder 类表示一个可变的字符序列&#xff0c;它是为了提供一种比直接使用字符串连接操作更加高效的方式来构建或修改字符串。 与 C# 中的 stri…...

Linux 核心架构与组件(2025更新中)

‌一、Linux 核心架构与组件‌ ‌内核架构‌ ‌核心职责‌&#xff1a; 管理进程生命周期、内存分配、硬件驱动交互及文件系统操作。 模块化设计支持动态加载硬件驱动&#xff08;如modprobe加载内核模块&#xff09;&#xff0c;提升灵活性和扩展性。 ‌内存管理‌&#xff1a…...

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前端技术栈构建的新型智慧企业管理与运营系统。该系统深度融合了客户管理、项目管理、审批流程自动化以及低代码开发平台&#xff0c;旨在为企业提供一站式、数字化转型的全方位解决方案&#xff0c;助力…...

文件包含-session2

[题目信息]&#xff1a; 题目名称题目难度文件包含-session22 [题目考点]&#xff1a; 由于网站功能需求&#xff0c;会让前端用户选择要包含的文件&#xff0c;而开发人员又没有对要包含的文件进行安全考虑&#xff0c;就导致攻击者可以通过修改文件的位置来让后台执行任意…...

GitHub免密操作与跨服务器通行:SSH密钥一站式配置指南

作为开发者,与GitHub的安全交互和远程服务器的高效管理是日常工作的核心技能。本文将从零开始,教你如何配置GitHub的SSH密钥认证,并实现免密码远程登录Linux服务器。 一、为什么需要SSH密钥? 更安全的认证方式:相比传统密码,密钥认证几乎无法被暴力破解操作便捷性:免去每…...

PHP入门基础学习四(PHP基本语法)

运算符 运算符&#xff0c;专门用于告诉程序执行特定运算或逻辑操作的符号。根据运算符的作用&#xff0c;可以将PHP语言中常见的运算符分为9类 算数运算符&#xff1a; 是用来处理加减乘除运算的符号 也是最简单和最常用的运算符号 赋值运算符 1. 是一个二元运算符&#x…...

模型蒸馏:让人工智能更智能、更小、更高效的艺术

你有没有想过,我们如何才能让一个需要巨大计算能力的庞大人工智能模型变得更精简、更快速、更强大?答案在于模型蒸馏,这是一种允许知识从大型、计算成本高昂的人工智能系统转移到较小、更高效的系统的技术,而不会牺牲智能。 什么是模型蒸馏 模型蒸馏是一种技术,其…...

git 小乌龟安装包及中文包

git 工具小乌龟不需要输入命令就可以提交&#xff0c;挺方便的&#xff0c;安装完之后鼠标右击就可以看到 链接: https://pan.baidu.com/s/1jqrcrFjKf-bKGcHesxs-YQ 提取码: 8888 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦...

MySQL 主从集群同步延迟问题分析与解决方案

MySQL 主从复制&#xff08;Replication&#xff09;是构建高可用架构的核心技术&#xff0c;但在实际应用中&#xff0c;主从同步延迟&#xff08;Replication Lag&#xff09;是常见且棘手的问题。延迟会导致从库数据不一致、读请求返回旧数据&#xff0c;甚至引发业务逻辑错…...

用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

找了好多教程都没有用&#xff0c;终于解决了&#xff01;&#xff01;我是因为ubuntu分区的时候出问题了 问题描述&#xff1a; 双系统装好&#xff0c;隔天开机找不到引导项&#xff0c;黑屏显示下列 因为我用的D盘划分出来的部分空闲空间&#xff0c;而不是全部&#xff0c…...

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的介绍&#xff0c;可以查看下面这份教程。 https://alidocs.dingtalk.com/api/doc/transit?spaceId5…...

Android之APP更新(通过接口更新)

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

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系&#xff0c;以下是深入解析&#xff1a; 门铃FIFO溢出的本质 在RapidIO系统中&#xff0c;门铃消息FIFO是硬件控制器内部的缓冲区&#xff0c;用于临时存储接收到的门铃消息&#xff08;Doorbell Message&#xff09;。…...

rnn判断string中第一次出现a的下标

# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

Redis:现代应用开发的高效内存数据存储利器

一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发&#xff0c;其初衷是为了满足他自己的一个项目需求&#xff0c;即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源&#xff0c;Redis凭借其简单易用、…...

Rust 开发环境搭建

环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行&#xff1a; rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu ​ 2、Hello World fn main() { println…...

关于easyexcel动态下拉选问题处理

前些日子突然碰到一个问题&#xff0c;说是客户的导入文件模版想支持部分导入内容的下拉选&#xff0c;于是我就找了easyexcel官网寻找解决方案&#xff0c;并没有找到合适的方案&#xff0c;没办法只能自己动手并分享出来&#xff0c;针对Java生成Excel下拉菜单时因选项过多导…...

AxureRP-Pro-Beta-Setup_114413.exe (6.0.0.2887)

Name&#xff1a;3ddown Serial&#xff1a;FiCGEezgdGoYILo8U/2MFyCWj0jZoJc/sziRRj2/ENvtEq7w1RH97k5MWctqVHA 注册用户名&#xff1a;Axure 序列号&#xff1a;8t3Yk/zu4cX601/seX6wBZgYRVj/lkC2PICCdO4sFKCCLx8mcCnccoylVb40lP...