Go语言HTTPServer开发的六种实现

Python012

Go语言HTTPServer开发的六种实现,第1张

学完了 net/http 和 fasthttp 两个HTTP协议接口的客户端实现,接下来就要开始Server的开发,不学不知道一学吓一跳,居然这两个库还支持Server的开发,太方便了。

相比于Java的HTTPServer开发基本上都是使用Spring或者Springboot框架,总是要配置各种配置类,各种 handle 对象。Golang的Server开发显得非常简单,就是因为特别简单,或者说没有形成特别统一的规范或者框架,我发现了很多实现方式,HTTP协议基于还是 net/http 和 fasthttp ,但是 handle 语法就多种多样了。

先复习一下: Golang语言HTTP客户端实践 、 Golang fasthttp实践 。

在Golang语言方面,实现某个功能的库可能会比较多,有机会还是要多跟同行交流,指不定就发现了更好用的库。下面我分享我学到的六种Server开发的实现Demo。

基于 net/http 实现,这是一种比较基础的,对于接口和 handle 映射关系处理并不优雅,不推荐使用。

第二种也是基于 net/http ,这种编写语法可以很好地解决第一种的问题,handle和path有了类似配置的语法,可读性提高了很多。

第三个基于 net/http 和 github.com/labstack/echo ,后者主要提供了 Echo 对象用来处理各类配置包括接口和handle映射,功能很丰富,可读性最佳。

第四种依然基于 net/http 实现,引入了 github.com/gin-gonic/gin 的路由,看起来接口和 handle 映射关系比较明晰了。

第五种基于 fasthttp 开发,使用都是 fasthttp 提供的API,可读性尚可,handle配置倒是更像Java了。

第六种依然基于 fasthttp ,用到了 github.com/buaazp/fasthttprouter ,有点奇怪两个居然不在一个GitHub仓库里。使用语法跟第三种方式有点类似,比较有条理,有利于阅读。

个人认为:

1、上手快

只要你有其会其他语言,学习go很快。

2、go语言非常适合写服务端

因为它开源,所以很容易找到你想要的框架,开发效率非常高。

3、跨平台

你的一个程序可以随意部署。

不受操作系统限制,windwos、linux、macos都能支持。

不受处理器限制,x86、arm也都可以,你要知道国产可替代的U就是arm。

4、部署简单

编译成一个文件就可以发布了,不需要环境支撑。

以上是最基本的理由,当然这些对于.net core来说也一样,但是对比一下发布的文件大小你就知道该选择谁了。

我们已经上线了好几个.net core的项目,基本上都是docker+.net core 2/3。说实话,

.net core的GC非常的优秀,基本上不需要像做Java时候,还要做很多的优化。因此没有多少人研究很正常。换句话,如果一个GC还要做很多优化,这肯定不是好的一个GC。当然平时编程的时候,常用的非托管的对象处理等等还是要必须掌握的。

这和国内的开发环境有很大关系。

一方面,这里有个路径依赖的问题,这个问题在国内尤为突出。这几年,国内其他语言的开发者多一些,生态好一些,转换则意味着成本。

另一方面,浮躁之风过盛,拿来主义盛行。这里举两个例子来说明。一个是国产操作系统的内核问题。为什么要使用linux内核而不是重新写一个呢?给出的理由无非是linux生态好,稳定,没有必要进行重复制作。真的没必要吗?那国外为什么流行要用rust重新写几个,而且开源呢?“没必要”是假,“不想”才是真,毕竟基础建设周期长,成本高,没有拿来主义好呀。另一个例子是最近matlab在国内停止授权的事情。在这件事情上,很多人都觉得问题不大,问题不大的原因在于还有一个开源的scilab可以拿来用。

举这两个例子,也许不太妥切,但是,管中窥豹,略见一斑,也足以说明时下的浮躁氛围了。

既然这里说到net core底层问题,今年新出的《.NET Core底层入门》,也许值得一读。这是国内的研究者写的,从中可以看出国内在这方面的进展,也说不定。总而言之,虽然net core已经开源了几年,但是在国内,开发者的成长和生态的建设,还需要更长的时间。

因为不需要,java就像半成品,无论是语法 编译器 等等,要是没有spring系列,估计那些996早就变成了007了。

微软的产品化能力是有目共睹的,.net比起JAVA体系,更加完善,包括产品本身和后期的维护都比JAVA好,所以商业化项目最好还是用. net平台。

这似乎挺正常的,如同它购买了GitHub后,众开源项目就纷纷迁移GH。开源社区普遍不信任微软,其意定非在开源本身。.Net 开源估计也是市场占有率在降,没人真心愿意用它。

.net core,哪里还需要什么GC优化?那是jvm天生缺陷导致的问题。.net 5再性能上更进一步,只要你的程序不是写得稀烂,根本不用操心底层运行时的性能会出问题。

不能用jvm的眼光看.net,java界已经进入固步自封的状态,版本更新那么快,实质性的东西并没有什么突破。而很多公司坚守在java1.6上不放手,实在顽固。

优化肯定是需要的,再好的程序都是有优化空间的。只是现在dotnet平台上目前缺少大型的应用。正常的业务场景下,难以达到框架性能的瓶颈。

dotnet 虽然开源了,但是开源太晚。要是早几年,在Android兴起之前,在大数据兴起之前,现在还会是这般场景吗。眼看着国内的大企业一波波地转向了Java和其他语言,作为一名dotnet程序员心里是大大的不甘心。

dotnet 在语言层面相比 Java 有太多优势,Java 新版新增的一些语言特性也都是照抄的 dotnet。但即便是这样,依然是叫好不叫座。

开源太晚,错过了几波行业发展红利。以至于现在,大数据领域缺 Hadoop,搜索领域缺 Elasticsearch ,移动端虽有xamarin,但依然是鸡肋般的存在。要是有这些杀手级应用在,dotnet 生态肯定会繁荣起来,向着更强的方向优化。

还能说什么呢,只能期望即将到来的dotnet 5 能一统现在混乱的局面,发挥好自己的特长,繁荣dotnet的生态环境。

首先.net的原装GC一直都不错。流畅到可以支持3D 游戏 开发。所以不怎么需要调优。要知道文章多不用不一定是好事,95%的技术文章其实只不过是要解决一个BUG而已。其次C#的语法和运行时设计也好,对GC的压力小很多。比如范性支持基本类型,这样List 之类的结构,是整体分配和释放的。而某蛙就需要每个元素拆箱装箱。慢死,对GC来说也要算更多的引用链。此外C#还支持matrx4x4之类的SIMD数据类型。也是提高运行速度和减少GC的好东西

这些东西已经优化的非常好了,程序员不需要关注这些,让程序员更多的精力放在业务实现上。

相对java来说.netcore的语言更加优雅,高级和完善,所以,不需要关注相对比较底层的东西。

很简单:没有关键业务跑在 net core 上。

曾经,jd 业务用 .net,但几年后就全换成 Java 了。这足以说明问题了。

像 zhihu 这种小厂,开始用 python,业务量大了之后就转 golang ,而不是转 net core 。足以说明问题了。

有人说,netcore 如何如何好,根本不用自己优化……。实际上根本没达到极限,不到优化的时候。