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

目录

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_FILE
    LoggingSettings();

    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-cores
    int 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/975859.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Transformer LLaMA

一、Transformer Transformer&#xff1a;一种基于自注意力机制的神经网络结构&#xff0c;通过并行计算和多层特征抽取&#xff0c;有效解决了长序列依赖问题&#xff0c;实现了在自然语言处理等领域的突破。 Transformer 架构摆脱了RNNs&#xff0c;完全依靠 Attention的优…

mysql的源码包安装

安装方式一&#xff1a;&#xff08;编译好的直接安装&#xff09; 1.添加一块10G的硬盘&#xff0c;给root逻辑卷扩容 &#xff08;下面安装方式二有&#xff0c;一模一样的装就行&#xff0c;我就不写了&#xff0c;再写的话篇幅就太长了&#xff09; 2.下载编译好的源码包…

内网网络安全的解决之道

本文简要分析了企业内部网络所面临的主要分析&#xff0c;阐述了安全管理人员针对不同威胁的主要技术应对措施。进一步介绍了业界各种技术措施的现状&#xff0c;并提出了未来可能的发展趋势。 内网网络安全问题的提出 网络安全对于绝大多数人而言指的都是互联网安全&#xff…

【Redis原理】底层数据结构 五种数据类型

文章目录 动态字符串SDS(simple dynamic string )SDS结构定义SDS动态扩容 IntSetIntSet 结构定义IntSet的升级 DictDict结构定义Dict的扩容Dict的收缩Dict 的rehash ZipListZipListEntryencoding 编码字符串整数 ZipList的连锁更新问题 QuickListQuickList源码 SkipListRedisOb…

Orange 单体架构 - 快速启动

1 后端服务 1.1 基础设施 组件说明版本MySQLMySQL数据库服务5.7/8JavaJava17redis-stackRedis向量数据库最新版本Node安装Node22.11.0 1.2 orange-dependencies-parent 项目Maven依赖版本管理 1.2.1 项目克隆 GitHub git clone https://github.com/hengzq/orange-depende…

在线骑行|基于SpringBoot的在线骑行网站设计与实现(源码+数据库+文档)

在线骑行网站系统 目录 基于SpringBoot的在线骑行设计与实现 一、前言 二、系统设计 三、系统功能设计 5.1用户信息管理 5.2 路线攻略管理 5.3路线类型管理 5.4新闻赛事管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取…

内外网文件传输 安全、可控、便捷的跨网数据传输方案

一、背景与痛点 在内外网隔离的企业网络环境中&#xff0c;员工与外部协作伙伴&#xff08;如钉钉用户&#xff09;的文件传输面临以下挑战&#xff1a; 安全性风险&#xff1a;内外网直连可能导致病毒传播、数据泄露。 操作繁琐&#xff1a;传统方式需频繁切换网络环境&…

Unity学习笔记-Unity了解,安装,简单配置(一)

Unity 是什么&#xff1f; Unity 是一款广受欢迎的跨平台游戏开发引擎&#xff0c;由 Unity Technologies 公司开发并推出。它以强大的功能和易用性&#xff0c;在游戏开发领域占据着举足轻重的地位&#xff0c;甚至可以说&#xff0c;它改变了游戏开发的格局。凭借其出色的跨…

骁勇善战的量化利器:多因子模型【量化理论】

我叫补三补四&#xff0c;很高兴见到大家&#xff0c;欢迎一起学习交流和进步 今天来讲一讲alpha策略制定后的测试问题 风险模型雏形 股票因子受多种因素影响&#xff0c;其价格由多种因素决定&#xff0c;所谓的多因子策略就是要发掘诸如此类的因子&#xff0c;以一种合理的方…

【DeepSeek】本地部署,保姆级教程

deepseek网站链接传送门&#xff1a;DeepSeek 在这里主要介绍DeepSeek的两种部署方法&#xff0c;一种是调用API&#xff0c;一种是本地部署。 一、API调用 1.进入网址Cherry Studio - 全能的AI助手选择立即下载 2.安装时位置建议放在其他盘&#xff0c;不要放c盘 3.进入软件后…

国产编辑器EverEdit - 文本编辑器的关键特性:文件变更实时监视,多头编辑不掉坑

1 监视文件变更 1.1 应用场景 某些时候&#xff0c;用户会使用多个编辑器打开同一个文件&#xff0c;如果在A编辑器修改保存&#xff0c;但是B编辑器没有重新打开&#xff0c;直接在B编辑器修改再保存&#xff0c;则可能造成在A编辑器中修改的内容丢失&#xff0c;因此&#x…

【Linux】【网络】不同子网下的客户端和服务器通信

【Linux】【网络】不同子网下的客户端和服务器通信 前两天在进行socket()网络编程并进行测试时&#xff0c;发现在不同wifi下两个电脑无法进行连接&#xff0c;大概去查找了如何解决 看到可以使用 frp 这个快速反向代理实现。 frp 可让您将位于 NAT 或防火墙后面的本地服务器…

基于Python+django+mysql旅游数据爬虫采集可视化分析推荐系统

2024旅游推荐系统爬虫可视化&#xff08;协同过滤算法&#xff09; 基于Pythondjangomysql旅游数据爬虫采集可视化分析推荐系统 有文档说明 部署文档 视频讲解 ✅️基于用户的协同过滤推荐算法 卖价就是标价~ 项目技术栈 Python语言、Django框架、MySQL数据库、requests网络爬虫…

基于 go-wrk 在 Windows 环境下对 Go Web 应用进行 HTTP 压力测试

基于 go-wrk 在 Windows 环境下对 Go Web 应用进行 HTTP 压力测试 这部分内容参考并搬运自 q1mi 老师的技术博客&#xff0c;原文的链接为&#xff1a;https://liwenzhou.com/posts/Go/benchmark-tools/。 压测相关术语 响应时间&#xff08;RT&#xff09;&#xff1a;指系…

CSS 媒体查询:从入门到精通,打造跨设备完美体验

在当今移动互联网时代&#xff0c;用户访问网站的设备早已不再局限于桌面电脑&#xff0c;手机、平板等各种屏幕尺寸的设备层出不穷。为了确保用户在不同设备上都能获得良好的浏览体验&#xff0c;响应式网页设计应运而生。而 CSS 媒体查询&#xff0c;正是实现响应式设计的核心…

如何在 macOS 上配置 MySQL 环境变量

如何在 macOS 上配置 MySQL 环境变量 步骤 1: 查找 MySQL 安装路径 打开终端&#xff0c;使用以下命令查找 mysql 的可执行文件路径&#xff1a; which mysql如果该命令没有返回结果&#xff0c;可以使用 find 命令&#xff1a; sudo find / -name "mysql" 2>/de…

Gin从入门到精通 (五)数据绑定与验证

数据绑定与验证 数据绑定是指将请求数据&#xff08;如 JSON、表单、URL 参数等&#xff09;绑定到 Go 语言中的结构体。Gin 提供了便捷的方法将请求中的数据映射到预定义的结构体字段上&#xff0c;使得开发者可以像访问结构体字段一样访问请求数据。 数据验证是对绑定到结构…

计算机毕业设计SpringBoot+Vue.jst网上超市系统(源码+LW文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

【论文解读】《Training Large Language Models to Reason in a Continuous Latent Space》

论文链接 1. 背景与动机 语言空间与推理的矛盾 目前大多数大语言模型&#xff08;LLMs&#xff09;在解决复杂问题时采用链式思维&#xff08;Chain-of-Thought, CoT&#xff09;方法&#xff0c;即利用自然语言逐步推导出答案。然而&#xff0c;论文指出&#xff1a; 自然语言…

DevEco Studio常用快捷键以及如何跟AndroidStudio的保持同步

DevEco Studio快捷键 DevEco Studio是华为推出的用于开发HarmonyOS应用的集成开发环境&#xff0c;它提供了丰富的快捷键以提高开发效率&#xff0c;以下为你详细介绍不同操作场景下的常用快捷键&#xff1a; 通用操作快捷键 操作描述Windows/Linux 快捷键Mac 快捷键打开设置窗…