阅读更多

0顶
0踩

开源软件

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

2015-08-03 14:39 by 副主编 mengyidan1988 评论(0) 有6336人浏览
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性能优化 SQL优化方法技巧

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

  • 面试官问你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 性能优化以及面试

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

  • MySql优化面试题

    sql优化 1、外连接比子查询效率高 2、union all 要比 union 效率高 3、用 PreparedStatement 一般来说比 Statement 性能高:一个 sql 发给服务器去执行,涉及步骤:语法检查、语义分析,编译,缓存 4、加索引,但每个表不要加多了 ,对where/ order by 的前几个字段加,必要时加组合索引 5、主键推荐数字类型 6、不要过多的使用sql中的函数 譬如avg()、sum()、substring() 等等 7、应尽量避免在 where 子句中

  • mysql优化

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

  • mysql简单优化的一些总结

    mysql对cpu的利用特点: 5.1之前,多核支持较弱;5.1可利用4个核;5.5可利用24核;5.6可利用64个核;每个连接对应一个线程,每个并发query只能使用一个核 mysql对内存的利用特点: 有全局内存和会话内存,建议将会话内存设置较小; 内存管理简单、有效(如在高并发环境下,可以增加物理内存以减少物理IO,提高并发性能); query cache建议关闭或设置很小

  • 总结面经中常考的MYSQL面试问题(一)

    1. 如何设计一个高并发的系统 ① 数据库的优化,包括合理的事务隔离级别、SQL语句优化、索引的优化 ② 使用缓存,尽量减少数据库 IO ③ 分布式数据库、分布式缓存 ④ 服务器的负载均衡 2. 锁的优化策略 ① 读写分离 ② 分段加锁 ③ 减少锁持有的时间 ④ 多个线程尽量以相同的顺序去获取资源 等等,这些都不是绝对原则,都要根据情况,比如不能将锁的粒度过于细化,不然可能会出...

  • MySQL优化原理

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

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

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

  • 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的简单优化_3个简单优化MySQL的小方法

    1.没有两个数据库或者应用程序是完全相同的。这里假设我们要调整的数据库是为一个“典型”的 Web 网站服务的,优先考虑的是快速查询、良好的用户体验以及处理大量的流量。2.在你对服务器进行优化之前,请做好数据库备份!本文主要给大家带来了优化 MySQL 3 个简单的小调整,需要的朋友参考下,希望能帮助到大家。1、 使用 InnoDB 存储引擎如果你还在使用 MyISAM 存储引擎,那么是时候转换到 ...

  • 【金三银四】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...

Global site tag (gtag.js) - Google Analytics