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...,后端也基本 ...
随机推荐
- C语言第零次作业
Q1.你对网络专业或者计算机专业了解是怎样? 说实话不了解网络专业,在甚至在填志愿之前我都不曾听说过.但经过一番的查阅资料.现在,首先我了解到我们主要学习计算机.通信以及网络方面的基础理论.设计原理, ...
- [转]webpack中require和import的区别
webpack中可以写commonjs格式的require同步语法,可以写AMD格式的require回调语法,还有一个require.ensure,以及webpack自己定义的require.incl ...
- echarts中的区域缩放组件dataZoom,主动触发选区缩放点击事件
options设置 toolbox: { // 工具栏 feature: { dataZoom : { // 选时间缩放功能 show : true, // show为true时,才能触发takeGl ...
- RSP小组——团队冲刺博客一——(领航)
RSP小组--团队冲刺博客一--领航 冲刺日期:2018年12月10日 团队目标 经过团队讨论,我们最新确定的α版本所需实现内容如下: 1.实现游戏代码的实现 2.在Android Studio上实现 ...
- 在VB中动态执行VBS代码,可操控窗体控件
通过执行一段VBS代码来操控窗体内的控件也可以使用AddObject方法添加自己的类,那么在动态VBS代码中也一样可以使用在增加程序扩展性或是有脚本化需求的时候,这个方法还是不错的. Option E ...
- 2.SSM整合_多表_一对一或多对一的增删改查
一对一和多对一配置一样,这里就放到一起. 1.配置文件跟上一章一样,这里就不多写了,主要是Mapper映射文件 多 接口 public interface NewsMapper { public vo ...
- 读取Excel文件存储在实体类中
1.Maven文件 <!--读取Excel的架包--> <dependency> <groupId>org.apache.poi</groupId> & ...
- [Lyft Level 5 Challenge 2018 - Elimination Round][Codeforces 1033D. Divisors]
题目链接:1033D - Divisors 题目大意:给定\(n\)个数\(a_i\),每个数的约数个数为3到5个,求\(\prod_{i=1}^{n}a_i\)的约数个数.其中\(1 \leq n ...
- K8S 安装 Wordpress
基本概念 Helm 可以理解为 Kubernetes 的包管理工具,可以方便地发现.共享和使用为Kubernetes构建的应用,它包含几个基本概念 Helm是目前Kubernetes服务编排领域的唯一 ...
- 二分- Count on Canton
题目: 代码: 是一个蛇形数列,把题目上的那组数倒过来看成一个正三角形. 第一行有1个数,1-2行有三个数,1-4行有6个数,1-4行有10个数,1-5行有15个数..... 现在要求第n个数是多少, ...