相比于Java的HTTPServer开发基本上都是使用Spring或者Springboot框架,总是要配置各种配置类,各种 handle 对象.Golang的Server开发显得非常简单,就是因为特别简单,或者说没有形成特别统一的规范或者框架,我发现了很多实现方式,HTTP协议基于还是 net/http 和 fasthttp ,但是 handle 语法就多种多样了.
在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仓库里.使用语法跟第三种方式有点类似,比较有条理,有利于阅读.
前段时间在golang-China读到这个贴:
个人觉得golang十分适合进行网游服务器端开发,写下这篇文章最后提醒一下大家.
从网游的角度看:
要成功的运营一款网游,很大程度上依赖于粉丝自发形成的社区.只有粉丝自发形成一个稳定的生态系统,游戏才能持续下去,避免鬼城的出现.而这就需要多次大量导入用户,在同时在线用户量达到某个临界点的时候,才有可能完成.所以呢,多人同时在线十分有必要.
网游的IO主要分两个方面,一个是网络IO,一个是磁盘IO.网络IO方面,可以分成美术资源的IO和游戏逻辑指令的IO,这里主要分析游戏逻辑的IO.游戏逻辑的IO跟CPU占用的情况相似,每次请求的字节数很小,但由于多人同时在线,所以呢并发数相当高.另外,地图信息的广播也会带来比较频繁的网络通信.磁盘IO方面,主要是游戏数据的保存.采用不同的数据库,会有比较大的区别.以前的项目里,就经历了从MySQL转向MongoDB这种内存数据库的过程,磁盘IO不再是瓶颈.总体来说,还是用内存做一级缓冲,避免大量小数据块读写的方案.
针对网游的这些特点,golang的语言特性十分适合开发游戏服务器端.
首先,go语言提供goroutine机制作为原生的并发机制.每个goroutine所需的内存很少,实际应用中可以启动大量的goroutine对并发连接进行响应.goroutine与gevent中的greenlet很相像,遇到IO阻塞的时候,调度器就会自动切换到另一个goroutine执行,保证CPU不会因为IO而发生等待.而goroutine与gevent相比,没有了python底层的GIL限制,就不需要利用多进程来榨取多核机器的性能了.通过设置最大线程数,可以控制go所启动的线程,每个线程执行一个goroutine,让CPU满负载运行.
同时,go语言为goroutine提供了独到的通信机制channel.channel发生读写的时候,也会挂起当前操作channel的goroutine,是一种同步阻塞通信.这样既达到了通信的目的,又实现同步,用CSP模型的观点看,并发模型就是通过一组进程和进程间的事件触发解决任务的.虽然说,主流的编程语言之间,只要是图灵完备的,他们就都能实现相同的功能.但go语言提供的这种协程间通信机制,十分优雅地揭示了协程通信的本质,避免了以往锁的显式使用带给程序员的心理负担,确是一大优势.进行网游开发的程序员,可以将游戏逻辑按照单线程阻塞式的写,不需要额外考虑线程调度的问题,以及线程间数据依赖的问题.因为,线程间的channel通信,已经表达了线程间的数据依赖关系了,而go的调度器会给予妥善的处理.
另外,go语言提供的gc机制,以及对指针的保护式使用,可以大大减轻程序员的开发压力,提高开发效率.
展望未来,我期待go语言社区能够提供更多的goroutine间的隔离机制.个人十分推崇erlang社区的脆崩哲学,推动应用发生预期外行为时,尽早崩溃,再fork出新进程处理新的请求.对于协程机制,需要由程序员保证执行的函数不会发生死循环,导致线程卡死.如果能够定制goroutine所执行函数的最大CPU执行时间,及所能使用的最大内存空间,对于提升系统的鲁棒性,大有裨益.
go语言适用的领域有:
Go语言主要用作服务器端开发,其定位是用来开发"大型软件"的,适合于很多程序员一起开发大型软件,并且开发周期长,支持云计算的网络服务.
Go语言能够让程序员快速开发,并且在软件不断的增长过程中,它能让程序员更容易地进行维护和修改.它融合了传统编译型语言的高效性和脚本语言的易用性和富于表达性.
Go语言在云计算、大数据、微服务、高并发领域应用应用非常广泛.BAT大厂正在把Go作为新项目开发的首选语言.
Go语言能干什么?
①.、服务端开发:以前你使用C或者C++做的那些事情,用Go来做很合适,例如日志处理、文件系统、监控系统等;
以上就是土嘎嘎小编大虾米为大家整理的相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!