阅读更多

0顶
0踩

开源软件

原创新闻 Cinatra:高性能现代C++ Web框架

2015-08-03 14:39 by 副主编 mengyidan1988 评论(0) 有6366人浏览
Cinatra是由C++开源社区purecpp发起的一个开源项目,是一个现代C++写的Web框架,旨在给用户提供一个易用、灵活和高性能的Web框架,让用户能完全专注于核心逻辑而无需关注http细节。它的灵感来源于Sinatra,但又有自己的特色。目前正式发布第一个版本Cinatra0.9.0。开发者包括:江南、网事如风、SIGSEGV、海盗、福尔摩斯喵。
Cinatra的设计非常简单,只有几个组件,下面是Cinatra的逻辑视图。



Cinatra逻辑视图

用户仅用Cinatra即可,其它的事情框架已经帮用户做好了,用户只用关注核心逻辑即可,这些核心逻辑都在handler中处理,而这些handler完全由用户自定义和扩展。

参考示例:
#include<cinatra/cinatra.hpp>
usingnamespace cinatra;
int main()
{
  SimpleApp app;
  app.route("/", [](Request&  req , Response& res)
  {
    res.end("Hello Cinatra");
  });
  app.listen("http").run();
  return 0;
}

运行起来之后,在浏览器中输入:127.0.0.1就可以看到返回的” Hello Cinatra”, 用起来是不是很简单,Cinatra框架帮你把很多事情都做好了,你只需要关注你的核心业务逻辑即可。让我们继续看一个稍微复杂一点的例子。
#include <cinatra/cinatra.hpp>
using namespace cinatra;
int main()
{
	SimpleApp app;
	app.route("/hello", [](Request&  req , Response& res)
	{
res.end("Hello " + req.query().get_val("name"));	
     });
	app.route("/hello/:name/:age", [](Request& req, Response& res, const std::string& a, int b)
{
		res.end("Name: " + a + " Age: " + boost::lexical_cast<std::string>(b));
});

	app.listen("http").run();
	
	return 0;
}


浏览器中输入:127.0.0.1/hello?name=test&age=12,页面将输出” Hello test”。  为了让用户用起来更方便,我们还支持下面这种url请求方式:127.0.0.1/hello/test/12,这个url将会被路由到"/hello/:name/:age"对应的handler:[](Request& req, Response& res, const std::string& a, intb);

Router不仅仅支持Lambda表达式还支持类的成员函数,如果你想把handler放到类对象中,你可以这样做。
struct MyStruct
{
	void hello(Request& req, Response& res)
	{
		res.end("Hello " + req.session().get<std::string>("uid") + "!");
	}
};
MyStruct t;
// 访问/hello
app.route("/hello", &MyStruct::hello, &t);

Cinatra不仅仅使用简单,还很灵活,它支持AOP,我们可以很方便的将非核心逻辑和核心逻辑分离,比如下面的例子。
structCheckLoginAspect
{
 void before(Request& req, Response& res)
  {
    //如果session没有uid且访问的不是login和test_post页面
    if (!req.session().exists("uid")&&req.path()!="/login.html"&&
      req.path() != "/test_post"&&req.path().compare(0, 7, "/public"))
    {
      // 跳转到登陆页面
      res.redirect("/login.html");
    }
  }
  void after(Request&  req , Response&  res)
  {
  }

};

#include<cinatra/cinatra.hpp>
usingnamespace cinatra;
int main()
{
  Cinatra<CheckLoginAspect> app;
  app.route("/", [](Request&  req , Response& res)
  {
    res.end("Hello Cinatra");
  });
app.listen("http").run();
  return 0;
}

在上面的例子中增加了一个检查是否登录的切面,如果用户没登录将会重定向到登录页面。此外,还可以自由组合多个切面,Cinatra可以很方便地扩展任意多个切面。你可以这样扩展切面。
structCheckLoginAspect
{
  void before(Request& req, Response& res)
  {
    //如果session没有uid且访问的不是login和test_post页面
    if (!req.session().exists("uid")&&req.path()!="/login.html"&&
      req.path() != "/test_post"&&req.path().compare(0, 7, "/public"))
    {
      // 跳转到登陆页面
      res.redirect("/login.html");
    }
  }
  void after(Request&  req , Response&  res)
  {
 }
};
structLogAspect

{
  void before(cinatra::Request& req, cinatra::Response& res)
  {
    std::cout << "log before" << std::endl;
  }
  void after(cinatra::Request& /* req */, cinatra::Response& /* res */)
  {
    std::cout << "log after" << std::endl;
  }
};
#include<cinatra/cinatra.hpp>
usingnamespace cinatra;
int main()
{
  Cinatra<CheckLoginAspect, LogAspect> app; //扩展了一个记录日志的切面
  app.route("/", [](Request&  req , Response& res)
  {
    res.end("Hello Cinatra");
  });
app.listen("http").run();
  return 0;
}

目前支持http1.0和1.1,支持session和cookie,后续计划:
  • https
  • html模板
  • websocket
  • cinatra打造purecpp社区

更多参考示例,请移步社区Github
  • 大小: 120.3 KB
0
0
评论 共 0 条 请登录后发表评论

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • mysql 性能优化以及面试

    mysql的性能优化,以及mysql的innodb引擎基础面试问题,mysql中级面试

  • 面试官问你MySQL优化,这么说完,面试官听完都哭了QAQ_面试官mysql怎么优化

    最全的Linux教程,Linux从入门到精通。

  • mysql性能调优面试题

    第一方面:30种mysql优化sql语句查询的方法 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by涉及的列上建立索引。   2.应尽量避免在 where 子句中使用 !=或&lt;&gt; 操作符,否则将引擎放弃使用索引而进行全表扫描。   3.应尽量避免在 where 子句中对字段进行 null 值 判断,否则将导致引擎放弃使用索引而进行全表扫描,如:   select id from t where num is null   可以在nu...

  • 为什么索引能提高查询速度?

    先从 MySQL 的基本存储结构说起 MySQL的基本存储结构是页(记录都存在页里边): 各个数据页可以组成一个双向链表 每个数据页中的记录又可以组成一个单向链表 每个数据页都会为存储在它里边儿的记录生成一个页目录,在通过主键查找某条记录的时候可以在页目录中使用二分法快速定位到对应的槽,然后再遍历该槽对应分组中的记录即可快速找到指定的记录 以其他列(非主键)作为搜索条件:只能从最小记录开始依次遍历单链表中的每条记录。 所以说,如果我们写select * from user where indexname =

  • MySQL优化面试准备

    想了很久要不要发一篇关于MySql优化的文章最后还是决定把它写出来。以输出倒逼自己复习与输入。以下内容大都参考了《高性能MySQL》一书也好把一些的章节做一个总结。全文的聊到的三个主要能容是: MySql的特点与存储引擎 MySql高性能索引 MaySql的数据类型优化与查询性能优化 MySql的特点与存储引擎 MySql的总体架构图 用户执行Mysql的流程图: 上层的一些服务...

  • 常见mysql优化 面试题

    优化哪些方面 1.表设计上        范式,存储引擎,字段类型 2.功能上        索引,缓存,分区 3.sql语句上        合理sql,经验 4.架构上        主从复制,负载均衡,读写分离   存储引擎 存储引擎是真正存储数据的地方 Mysql 5.5 1 不支持事务 2 表级锁 3 数据和索引是分开存储 4  insert ,selec...

  • Mysql的简单优化

    定义字段 表结构的拆分,如核心字段都用int,char,enum等定长结构 1:字段类型优先级 整型 > date,time > enum,char>varchar > blob 列的特点分析: 整型: 定长,没有国家/地区之分,没有字符集的差异 time定长,运算快,节省空间. 考虑时区,写sql时不方便 where > ‘2005-10-12’; enum: 能起来约束值的目的,

  • MySQL性能优化 SQL优化方法技巧

    MySQL性能优化 SQL优化方法技巧

  • 面试被问mysql性能优化,你知道别人都是怎么回答的吗,看完这篇保你成功!!!

    InnoDB多版本 InnoDB是一个 多版本存储引擎:它保留有关已更改行的旧版本的信息,以支持诸如并发和回滚之类的事务功能 。该信息以称为回滚段的数据结构存储在表空间中 (在Oracle中类似的数据结构之后)。InnoDB 使用回滚段中的信息来执行事务回滚中所需的撤消操作。它还使用该信息来构建行的早期版本,以实现 一致的读取。 在内部,InnoDB向数据库中存储的每一行添加三个字段。6个字节的D...

  • mysql优化

    2019独角兽企业重金招聘Python工程师标准&gt;&gt;&gt; ...

  • 最全 MySQL 优化方法,从此优化不再难

    作者:Wayne 链接:https://zhuanlan.zhihu.com/p/59818056 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 说起MySQL的查询优化,相信大家收藏了一堆奇技淫巧:不能使用SELECT *、不使用NULL字段、合理创建索引、为字段选择合适的数据类型..... 你是否真的理解这些优化技巧?是否理解其背后的工作原理?在实际场景下性能真有提升吗?我想未必。因而理解这些优化建议背后的原理就尤为重要,希望本文能让你重新审视这些优化建议,并在.

  • MySQL的常见问题

    1、MySQL 中有哪几种锁? 1、表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。 2、行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。 3、页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。 2、MySQL 中有哪些不同的表格? 共有 5 种类型的表格: 1、MyISAM 2、Heap 3、Merge 4、INNODB 5、ISAM 3、MySQL 中 InnoDB 支持的四种事务隔离级

  • 面试之必问---MySQL性能优化的21个最佳实践

    1. 为查询缓存优化你的查询   大多数的MySQL服务器都开启了查询缓存。这是提高性最有效的方法之一,而且这是被MySQL的数据库引擎处理的。当有很多相同的查询被执行了多次的时候,这些查询结果会被放到一个缓存中,这样,后续的相同的查询就不用操作表而直接访问缓存结果了。   这里最主要的问题是,对于程序员来说,这个事情是很容易被忽略的。因为,我们某些查询语句会让MySQL不使用缓存。请看下面的示例...

  • MySQL优化原理

    说起MySQL的查询优化,相信大家收藏了一堆奇淫技巧:不能使用SELECT *、不使用NULL字段、合理创建索引、为字段选择合适的数据类型..... 你是否真的理解这些优化技巧?是否理解其背后的工作原理?在实际场景下性能真有提升吗?我想未必。因而理解这些优化建议背后的原理就尤为重要,希望本文能让你重新审视这些优化建议,并在实际业务场景下合理的运用。 MySQL逻辑架构 如果能在头脑中构建一

  • mysql的简单优化_今天给大家介绍下mysql简单优化

    SELECT[ALL | DISTINCT | DISTINCTROW ][HIGH_PRIORITY][STRAIGHT_JOIN][SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT][SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]select_expr, ...[INTO OUTFILE ...

  • MySQL优化技术——20条建议

      MySQL优化   数据库操作往往是当今大多数Web应用程序的主要瓶颈。不仅是DBA(数据库管理员)不得不担心这些性能问题。作为程序员,我们需要通过正确地构造表、编写优化的查询和更好的代码来完成我们的工作。在本文中,我将列出一些针对程序员的MySQL优化技术。   1.优化查询缓存的查询 大多数MySQL服务器都启用了查询缓存。这是提高性能的最有效方法之一,由数据库引擎悄悄地处...

  • 【金三银四】MySQL优化面试题(2021最新版)

    【金三银四】Java中间件面试题(2021最新版) MySQL调优+索引+数据结构面试题(2021最新版) 【金三银四】Java微服务面试题(2021最新版) 【金三银四】Java并发编程面试题(2021最新版) 【金三银四】Java基础知识面试题(2021最新版) 【金三银四】Redis面试题(2021最新版) 【金三银四】Spring Boot面试题(2021最新版) 【金三银四】spring mvc面试题(2021最新版) 【金三银四】spring cloud面试题(202...

  • MySQL 最全优化指南

    MySQL 最全优化指南   当MySQL单表记录数过大时,增删改查性能都会急剧下降,所以我们本文会提供一些优化参考,大家可以参考以下步骤来优化:   一、单表优化 除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑、部署、运维的各种复杂度。一般以整型值为主的表在千万级以下,字符串为主的表在五百万以下是没有太大问题的,而事实上很多时候MySQL单表的性能依然有不少优...

  • mysql的简单优化_mysql 的简单优化

    合理的建立索引的建议:(1) 越小的数据类型通常更好:越小的数据类型通常在磁盘、内存和CPU缓存中都需要更少的空间,处理起来更快。(2) 简单的数据类型更好:整型数据比起字符,处理开销更小,因为字符串的比较更复杂。在MySQL中,应该用内置的日期和时间数据类型,而不是用字符串来存储时间;以及用整型数据类型存储IP地址。(3) 尽量避免NULL:应该指定列为NOT NULL,除非你想存储NUL...

  • Mysql的一些简单优化

    概述 表的设计要合理化,符合三范式(3FN) 添加适当的索引 分表技术(水平分割、垂直分割) 存储过程(数据库三层结构) mysql配置的优化(最大并法术。缓存大小myini) mysql硬件升级 定时清除不需要的数据。定时警醒碎片整理 优化一: 表的设计满足三范式: 1. 一范式: 原子性-》表的列不能再分割。 关系型数据库自动那个满足1NF. 2. 二范式:表中的记录是唯一的。就是满足

Global site tag (gtag.js) - Google Analytics