dotnet core高吞吐Http api服务组件FastHttpApi
简介
是dotNet core下基于Beetlex实现的一个高度精简化和高吞吐的HTTP API服务开源组件,它并没有完全实现HTTP SERVER的所有功能,而是只实现了在APP和WEB中提供数据服务最常用两个指令GET/SET,满足在应用实现JSON,PROTOBUF和MSGPACK等基于HTTP的数据交互功能,虽然是一个精简版本但针对SSL这方面的安全性还是支持。有牺牲就必然有收获,FastHttpApi作出这么大的精简必然在性能上有所收获取,经测试FastHttpApi在GET/POST这些数据交互的场景下性能和吞吐能力是Asp.net core集成的Kestrel的要优胜许多。
https://github.com/IKende/FastHttpApi
使用便利性
FastHttpApi虽然在HTTP方面作了大量的精简,但并没有为此增加了它使用的复杂度。FastHttpApi具备asp.net core webapi的便利性;应用人员只需要制定和webapi一样的方法即可,在使用过程中和写普通逻辑方法没有多大的区别。
定义一个控制器
控制器用来定义具体相应URL处理的方法,只需要在类上定义Controller属性即可把类中的Public方法提供给Http访问;方法参数来源于QueryString,当参数标记为BodyParameter的时候参数来源于Http Body.
[Controller]
public class ControllerTest
{
// /hello?name=
public string Hello(string name)
{
return DateTime.Now + " hello " + name;
}
// /add?a=&b=
public string Add(int a, int b)
{
return string.Format("{0}+{1}={2}", a, b, a + b);
}
// /post?name=
public object Post(string name, [BodyParameter] UserInfo data)
{
return data;
}
// /listcustomer?count
public IList<Customer> ListCustomer(int count)
{
return Customer.List(count);
}
// /listemployee?count
public IList<Employee> ListEmployee(int count)
{
return Employee.List(count);
}
// post /AddEmployee
public Employee AddEmployee([BodyParameter]Employee item)
{
return item;
}
}
Filter定义
Filter是Controller处理方法的拦载器,通Filter可以对所有方法进行统一拦载处理,如权限日志等。
[Controller]
[NotFoundFilter]
public class ControllerTest
{
// /hello?name=
[SkipFilter(typeof(NotFoundFilter))]
[CustomFilter]
public string Hello(string name)
{
return DateTime.Now + " hello " + name;
}
// /add?a=&b=
public string Add(int a, int b)
{
return string.Format("{0}+{1}={2}", a, b, a + b);
}
}
public class GlobalFilter : FilterAttribute
{
public override void Execute(ActionContext context)
{
Console.WriteLine(DateTime.Now + " globalFilter execting...");
context.Execute();
Console.WriteLine(DateTime.Now + " globalFilter executed");
}
} public class NotFoundFilter : FilterAttribute
{
public override void Execute(ActionContext context)
{
Console.WriteLine(DateTime.Now + " NotFoundFilter execting...");
context.Response.NotFound();
Console.WriteLine(DateTime.Now + " NotFoundFilter executed");
}
} public class CustomFilter : FilterAttribute
{
public override void Execute(ActionContext context)
{
Console.WriteLine(DateTime.Now + " CustomFilter execting...");
context.Execute();
Console.WriteLine(DateTime.Now + " CustomFilter executed");
}
}
启动服务
static void Main(string[] args)
{
mApiServer = new BeetleX.FastHttpApi.HttpApiServer();
mApiServer.Register(typeof(Program).Assembly);
mApiServer.ServerConfig.BodySerializer = new BeetleX.FastHttpApi.JsonBodySerializer();
mApiServer.Open();
Console.Read();
}
制定HTTP Body转换器
转换器是组件最常用的自定义功能,通过它可以实现不同种类的数据格式,如json,protobuf和msgpack等。以下是一个json转换器的实现
public class JsonBodySerializer : IBodySerializer
{
public JsonBodySerializer()
{
ContentType = "application/json";
}
public string ContentType { get; set; }
public object GetInnerError(Exception e, HttpResponse response, bool outputStackTrace)
{
return new ErrorResult { url = response.Request.Url, code = , error = e.Message, stackTrace = outputStackTrace? e.StackTrace:null };
}
public object GetNotSupport(HttpResponse response)
{
return new ErrorResult { url = response.Request.Url, code = , error = response.Request.Method + " method type not support" };
}
public object GetNotFoundData(HttpResponse response)
{
return new ErrorResult { url = response.Request.Url, code = };
}
public class ErrorResult
{
public string url { get; set; }
public int code { get; set; }
public string error { get; set; }
public string stackTrace { get; set; }
}
public virtual int Serialize(PipeStream stream, object data)
{
int length = stream.CacheLength;
string value = Newtonsoft.Json.JsonConvert.SerializeObject(data);
stream.Write(value);
return stream.CacheLength - length;
}
public virtual bool TryDeserialize(PipeStream stream, int length, Type type, out object data)
{
data = null;
if (stream.Length >= length)
{
string value = stream.ReadString(length);
if (type != null)
{
data = Newtonsoft.Json.JsonConvert.DeserializeObject(value,type);
}
else
{
data = Newtonsoft.Json.JsonConvert.DeserializeObject(value);
}
return true;
}
return false;
}
}
性能对比测试
由于dotnet core下面没有其他简化的http api组件,只能拿Kestrel asp.net core来作对比,虽然对asp.net core不公平,但这样的对比测也只是为了体现简化后的性能回报;测试服务器是阿里云的4核虚拟机,8G内存,测试工具是AB,测试功能主要是针对GET/POST的json数据处理。由于Kestrel asp.net core默认不支持AB的Keep-Alive选项,所以测试结果就并没有针对asp.net core的Keep-Alive测试
Kestrel asp.net core代码
// GET api/values/5
[HttpGet("{id}")]
public ActionResult Get(int id)
{
return new JsonResult(Employee.List(id));
}
// POST api/values
[HttpPost]
public ActionResult Post([FromBody] Employee value)
{
return new JsonResult(value);
}
FastHttpApi 代码
// /listemployee?count
public IList<Employee> ListEmployee(int count)
{
return Employee.List(count);
}
// post /AddEmployee
public Employee AddEmployee([BodyParameter]Employee item)
{
return item;
}
Kestrel asp.net core GET测试结果
FastHttpApi GET测试结果
FastHttpApi GET测试结果开启Keep-Alive
Kestrel asp.net core POST测试结果
FastHttpApi POST测试结果
FastHttpApi POST测试结果开启Keep-Alive
针对Kestrel的对比测试
对比一下两者在accept connection上的性能差异,开启了两个AB实例同时进行压测,结果是FastHttpApi在处理并发数快高于Kestrel快一倍的情况,CPU使用率只有Kestrel的一半。
Kestrel代码
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.Run(context =>
{
byte[] data = System.Text.Encoding.UTF8.GetBytes(DateTime.Now.ToString());
return context.Response.Body.WriteAsync(data, , data.Length);
});
}
FastHttpApi代码
// /hello?name=
public string Hello(string name)
{
return DateTime.Now + " hello " + name;
}
Kestrel测试结果
FastHttpApi测试结果
dotnet core高吞吐Http api服务组件FastHttpApi的更多相关文章
- .net core 高吞吐远程方法调用组件XRPC
XRPC的目标非常明确,就是给.net core平台实现一个百万级别的远程方法调用RPC通讯组件.它的设计理念和GRPC一样,基于连接复用的机制实现高吞的性能:XRPC采用了HTTP2复用的思想,在协 ...
- dotnet core各rpc组件的性能测试
一般rpc通讯组件都具有高性特性,因为大部分rpc都是基于二进制和连接复用的特点,相对于HTTP(2.0以下的版本)来说有着很大的性能优势,非常适合服务间通讯交互.本文针对了dotnet core平台 ...
- 手把手教你使用spring cloud+dotnet core搭建微服务架构:服务治理(-)
背景 公司去年开始使用dotnet core开发项目.公司的总体架构采用的是微服务,那时候由于对微服务的理解并不是太深,加上各种组件的不成熟,只是把项目的各个功能通过业务层面拆分,然后通过nginx代 ...
- spring cloud+dotnet core搭建微服务架构:服务发现(二)
前言 上篇文章实际上只讲了服务治理中的服务注册,服务与服务之间如何调用呢?传统的方式,服务A调用服务B,那么服务A访问的是服务B的负载均衡地址,通过负载均衡来指向到服务B的真实地址,上篇文章已经说了这 ...
- 每天响应数亿次请求,腾讯云如何提供高可用API服务?
每天响应数亿次请求,腾讯云如何提供高可用API服务? https://mp.weixin.qq.com/s/OPwlHcqkaTT_gcwHfr5Shw 李阳 云加社区 2020-09-16 导语 | ...
- spring cloud+dotnet core搭建微服务架构:Api网关(三)
前言 国庆假期,一直没有时间更新. 根据群里面的同学的提问,强烈推荐大家先熟悉下spring cloud.文章下面有纯洁大神的spring cloud系列. 上一章最后说了,因为服务是不对外暴露的,所 ...
- 使用 dotnet core 和 Azure PaaS服务进行devOps开发(Web API 实例)
作者:陈希章 发表于 2017年12月19日 引子 这一篇文章将用一个完整的实例,给大家介绍如何基于dotnet core(微软.NET的最新版本,支持跨平台,跨设备的应用开发,详情请参考 https ...
- devOps开发(Web API 实例)dotnet core 和 Azure PaaS服务
使用 dotnet core 和 Azure PaaS服务进行devOps开发(Web API 实例) 作者:陈希章 发表于 2017年12月19日 引子 这一篇文章将用一个完整的实例,给大家介绍如何 ...
- spring cloud+dotnet core搭建微服务架构:Api授权认证(六)
前言 这篇文章拖太久了,因为最近实在太忙了,加上这篇文章也非常长,所以花了不少时间,给大家说句抱歉.好,进入正题.目前的项目基本都是前后端分离了,前端分Web,Ios,Android...,后端也基本 ...
随机推荐
- 网络攻击技术:SQL Injection(sql注入)
网络攻击技术开篇——SQL Injection 1.1.1 摘要 日前,国内最大的程序员社区CSDN网站的用户数据库被黑客公开发布,600万用户的登录名及密码被公开泄露,随后又有多家网站的用户密码 ...
- setParameter不支持传统的按位置查询方式
setParameter不支持传统的按位置查询方式 String hql = "from Customer as c where c.cust_id = ?"; List<C ...
- JAVA基础复习与总结<六> 数组_容器_泛型
数组的常用方法 java.util.Arrays 类能方便地操作数组,它提供的所有方法都是静态的. 具有以下功能: 给数组赋值:通过 fill 方法. 对数组排序:通过 sort 方法,按升序. 比较 ...
- 网络克隆 主要是 PXE网卡启动 随笔
- 如何让Qt程序在运行时获取UAC权限
在pro文件中加入以下语句: QMAKE_LFLAGS += /MANIFESTUAC:\"level=\'requireAdministrator\' uiAccess=\'false\' ...
- springmvc ajax tomcat简单配置实现跨域访问
发现一种改动最小也能实现跨域请求的方法 服务端 服务端修改web.xml配置文件, 增加过滤器 (不用导入任何jar包, 用的tomcat自带jar) <!-- 支持跨域请求 --> &l ...
- CTF最简单的Web题
http://www.shiyanbar.com/ctf/1810 天网管理系统天网你敢来挑战嘛格式:ctf{ }解题链接: http://ctf5.shiyanbar.com/10/web1 查看源 ...
- Go smtp发送邮件,带附件
package main import ( "net/smtp" "bytes" "time" "io/ioutil" ...
- kettle web化
kettle web化 通过Java API调用kettle核心代码,并基于Spring Boot提供简易的Web管理界面. 背景 在工作中,通过kettle这款ETL产品进行数据处理时,是通过kit ...
- 机器学习(七)EM算法、GMM
一.GMM算法 EM算法实在是难以介绍清楚,因此我们用EM算法的一个特例GMM算法作为引入. 1.GMM算法问题描述 GMM模型称为混合高斯分布,顾名思义,它是由几组分别符合不同参数的高斯分布的数据混 ...