C++框架学习一:朴实无华的高性能RPC框架推荐

news2024/11/18 13:57:40

一个高性能的RPC框架:

介绍:

框架特性

  1. 操作系统:Linux
  2. 编程语言:C++14
  3. 完全独立:不依赖任何第三方库
  4. 高性能:微秒级响应
  5. 高并发:单机百万连接
  6. IO多路复用:epoll
  7. 连接池
  8. 线程池
  9. 用法简单

服务端:
文件:server.cpp

#include <iostream>
using namespace std;

#include "Server.h"
using namespace yazi::rpc;

string hello(const string & name)
{
    return "hello, " + name;
}

int main()
{
    Server * server = Singleton<Server>::instance();
    server->listen("127.0.0.1", 8080);
    server->bind("hello", hello);
    server->start();
    
    return 0;
}

客户端:

#include <iostream>
using namespace std;

#include "Client.h"
using namespace yazi::rpc;

int main()
{
    Client client;
    client.connect("127.0.0.1", 8080);

    auto reply = client.call<string>("hello", "kitty");
    std::cout << reply << std::endl;
    
    return 0;
}

更多示例:
示例一:

int sum(int a, int b)
{
    return a + b;
}

示例二:

#include <string>
#include <algorithm>
using namespace std;

class Request : public Serializable
{
public:
    Request() {}
    Request(const string & name) : m_name(name) {}
    ~Request() {}
    const string & name() const
    {
        return m_name;
    }
    SERIALIZE(m_name)
private:
    string m_name;
};

class Response : public Serializable
{
public:
    Response() {}
    Response(const string & name) : m_name(name) {}
    ~Response() {}
    const string & name() const
    {
        return m_name;
    }
    SERIALIZE(m_name)
private:
    string m_name;
};

Response upper(const Request & req)
{
    string name = req.name();
    transform(name.begin(), name.end(), name.begin(), ::toupper);
    return Response(name);
}

架构设计:
整体架构:
在这里插入图片描述

  • IO多路复用模块:epoll
  • 任务分发模块:task dispatcher
  • 线程池:thread pool
  • 任务执行模块:work task

代码结构:
在这里插入图片描述
关键用法:

1、高性能、高并发的网络框架
2、客户端可变参数序列化
3、服务端解包到不定参数列表
需要用到c++14的特性

封装:rpc/FunctionHandler.h
关键代码:

template<typename R, typename F, typename Tuple>
typename std::enable_if<!std::is_same<R, void>::value, R>::type
FunctionHandler::call_impl(F func, Tuple args)
{
    return invoke<R>(func, args);
}

template<typename R, typename F, typename Tuple>
auto FunctionHandler::invoke(F && func, Tuple && t)
{
    constexpr auto size = std::tuple_size<typename std::decay<Tuple>::type>::value;
    return invoke_impl<R>(std::forward<F>(func), std::forward<Tuple>(t), std::make_index_sequence<size>{});
}

template<typename R, typename F, typename Tuple, std::size_t... Index>
auto FunctionHandler::invoke_impl(F && func, Tuple && t, std::index_sequence<Index...>)
{
    return func(std::get<Index>(std::forward<Tuple>(t))...);
}

template<typename Tuple, std::size_t... I>
Tuple FunctionHandler::get_args(DataStream & ds, std::index_sequence<I...>)
{
    Tuple t;
    initializer_list<int>{((get_arg<Tuple, I>(ds, t)), 0)...};
    return t;
}

template<typename Tuple, std::size_t Id>
void FunctionHandler::get_arg(DataStream & ds, Tuple & t)
{
    ds >> std::get<Id>(t);
}

注意:gcc 5及以上版本才支持 c++14。。。

开源地址:

https://github.com/yespon/yazi

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

快速入门nginx

目录 1.nginx前言 2.什么是nginx 3.Nginx作用&#xff1f; 1.正向代理 2.反向代理 3.轮询 4.加权轮询 4.Nginx的安装 1.windows下安装 2.linux下安装 5.Nginx常用命令 1.nginx前言 我们公司项目刚刚上线的时候&#xff0c;并发量小&#xff0c;用户使用的少&#…

使用和制作动、静态库

文章目录什么是库&#xff1f;静态库打包方式使用方式生成并执行可执行程序粗暴方式优化方式动态库不一样的.o文件打包方式使用方式生成可执行程序运行可执行程序无法运行时的解决方案动静态库与动静态链接什么是库&#xff1f; 从一开始的helloworld&#xff0c;到现在熟练使…

SpringBoot项目中日志控制,配置logback(logback.xml的配置及介绍)

SpringBoot项目中日志控制&#xff0c;配置logback&#xff08;logback.xml的配置及介绍&#xff09;前言一、大致介绍logback依赖jar包logback的默认配置创建logback.xml配置文件仰天大笑出门去&#xff0c;我辈岂是蓬蒿人前言 SpringBoot项目中对日志的处理手动控制&#xf…

从 JavaScript 中的数组中删除空对象

从数组中删除空对象&#xff1a; 使用 Array.filter() 方法遍历数组。将每个对象传递给 Object.keys() 方法并检查键的长度是否不等于 0。filter 方法将返回一个不包含空对象的新数组。 const arr [{}, {id: 1}, {}, {id: 2}, {}];const results arr.filter(element > {…

scrum看板视图切换时间线视图做项目管理

企业需要开发一个项目&#xff0c;可以制作时间线进行管理&#xff0c;以便参与者和管理者了解项目的时间进度。项目进行到哪一步&#xff0c;参与者有哪些&#xff0c;责任人是谁&#xff0c;这些都可以通过时间线进行展示。「时间线视图」是一种比甘特图更轻量、更实用的工具…

Chapter6:机器人SLAM与自主导航

ROS1{\rm ROS1}ROS1的基础及应用&#xff0c;基于古月的课&#xff0c;各位可以去看&#xff0c;基于hawkbot{\rm hawkbot}hawkbot机器人进行实际操作。 ROS{\rm ROS}ROS版本&#xff1a;ROS1{\rm ROS1}ROS1的Melodic{\rm Melodic}Melodic&#xff1b;实际机器人&#xff1a;Ha…

【Spring Cloud Alibaba】001-单体架构与微服务架构

【Spring Cloud Alibaba】001-单体架构与微服务 文章目录【Spring Cloud Alibaba】001-单体架构与微服务一、单体架构1、单体应用与单体架构2、单体应用架构图3、单体架构优缺点优点缺点二、微服务1、微服务的“定义”2、微服务的特性3、微服务架构图4、微服务的优缺点优点缺点…

Python自动批量修改文件名称的方法大全

前言本文介绍基于Python语言&#xff0c;按照一定命名规则批量修改多个文件的文件名的方法。已知现有一个文件夹&#xff0c;其中包括班级所有同学上交的作业文件&#xff0c;每人一份&#xff1b;所有作业文件命名格式统一&#xff0c;都是地信1701_姓名_学习心得格式。现需要…

论文解读:(TransA)TransA: An Adaptive Approach for Knowledge Graph Embedding

简介 先前的知识表示方法&#xff1a;TransE、TransH、TransR、TransD、TranSparse等。的损失函数仅单纯的考虑hrh rhr和ttt在某个语义空间的欧氏距离&#xff0c;认为只要欧式距离最小&#xff0c;就认为h和th和th和t的关系为r。显然这种度量指标过于简单&#xff0c;虽然先…

榜上有名丨创新微MinewSemi荣登“物联之星”投资价值榜和创新产品榜

春风送暖&#xff0c;喜讯连连&#xff01;2023年2月7日&#xff0c;“2022物联之星”中国物联网产业年度榜单评选结果正式公布。经过层层评选&#xff0c;深圳创新微技术有限公司有幸在本届物联之星大奖中&#xff0c;荣获2022“物联之星”年度榜单之中国物联网企业投资价值50…

信号完整性设计规则之单根信号失真最小化

本文内容从《信号完整性与电源完整性分析》整理而来&#xff0c;加入了自己的理解&#xff0c;如有错误&#xff0c;欢迎批评指正。 1. 通常采用所能容许的最长上升边。 上升边越短&#xff0c;带宽越大&#xff0c;信号完整性问题越严重。 2. 使用可控阻抗走线。 可控阻抗…

硬件_IMX6ULL的LCD控制器

硬件_IMX6ULL的LCD控制器 文章目录硬件_IMX6ULL的LCD控制器一、 LCD控制器模块介绍1.1 硬件框图1.2 数据传输与处理1.3 时序控制二、 LCD控制器寄存器简介2.1 LCDIF_CTRL寄存器2.2 LCDIF_CTRL1寄存器2.3 LCDIF_TRANSFER_COUNT寄存器2.4 LCDIF_VDCTRL0寄存器2.5 LCDIF_VDCTRL1寄…

基础篇—一文掌握css的边框属性

CSS 边框属性 CSS边框属性允许你指定一个元素边框的样式和颜色。 1、边框样式 边框样式属性指定要显示什么样的边界。 border-style属性用来定义边框的样式 2、边框宽度 您可以通过 border-width 属性为边框指定宽度。 为边框指定宽度有两种方法:可以指定长度值,比如 2px…

检查nmos管是否损坏

NCEP85T14 功率mos管为例 以NMOS举例&#xff0c;只用万用表二极管档测量MOS管的好坏-电子发烧友网 NMOS的D极和S极之间有一个寄生二极管&#xff0c;方向为S到D&#xff0c;利用二极管单向导电性以及MOS管导通时寄生二极管截止的特性&#xff0c;可以快速测量MOS好坏。 1、测…

搭建Hexo博客-第2章-Hexo基本用法

搭建Hexo博客-第2章-Hexo基本用法 搭建Hexo博客-第2章-Hexo基本用法 搭建Hexo博客-第2章-Hexo基本用法 大家好&#xff0c;在上一篇文章中&#xff0c;我们学习了 Git 、GitHub 和 Coding 的基本用法&#xff0c;在这一节中&#xff0c;我将介绍 Hexo 的基本用法。阅读完这篇…

举个栗子~Tableau 技巧(251):统一多个工作表的坐标轴范围

在工作汇报场景&#xff0c;有一个很常见、很多数据粉反馈的需求&#xff1a;同一看板上的两个图表&#xff0c;因为轴范围不一致&#xff08;如下图&#xff09;&#xff0c;很难直观比较。有什么办法可以统一它们的坐标轴范围呢&#xff1f; 类似需求&#xff0c;不论两个还是…

SpringCloud学习笔记 - @SentinelResource的fallbackblockHandler配置详解 - sentinel

1. sentinel服务负载均衡测试 sentinel默认开启了负载均衡的轮询模式&#xff0c;为了测试sentinel服务负载均衡的效果&#xff0c;需要先创建两个服务提供者和一个服务消费者。 1.1. 分别创建两个服务提供者-支付服务9003、9004 1. 添加pom依赖&#xff1a; 提供者只需要将…

ElementUI中为什么使用this.$refs.form.validate验证成功却直接跳过

ElementUI中为什么使用this.$refs.form.validate验证成功却直接跳过 问题背景 在写一个Vue练手项目时&#xff0c;我使用rulse对表单中用户输入的数据进行校验&#xff0c;但莫名奇妙就发现&#xff1a;当我点击提交表单时&#xff0c;表单中的数据都验证成功了&#xff0c;但是…

SpringBoot分页实现

简介 分页功能是一个简单但必需的功能&#xff0c;在 SpringBoot 中分页实现非常的简单&#xff0c;有多种实现方式&#xff1b;主要和项目集成的持久层框架有关&#xff1b;这里主要介绍集成 MyBatis 和 SpringDataJpa 的分页实现 Mybatis - 使用 PageHelper 分页 首先在 p…

mybatis源码中一级和二级缓存分析

mybatis中,一级缓存的作用域为一个会话内; 二级缓存的作用域为全局的,可在多个会话中使用 1、一级缓存 [此处不讨论开启二级缓存的代码逻辑] 一级缓存的作用域在同一个事物中起作用。真正执行sql的是在 Executor&#xff1b;类图如下&#xff1b; 1.1、生成 Executor对象的…