golang-gin-mgo高并发服务器搭建教程

gin-mgo服务器搭建

该服务器实现简单接收请求并将请求参数封装存储在mongodb数据库中,本文将讲述gin-mgo的使用方法。

项目完整代码地址: https://github.com/wayne-yhp/golang-gin-mgo

gin web框架使用介绍

首先获取gin框架依赖

go get gopkg.in/gin-gonic/gin.v1

func main() {
  server = gin.Default()
  app.server.GET("/do", IndexRouter)//创造一个GET请求的路由地址,并指定处理函数为IndexRouter函数
  app.server.Run(":8080")
}
func IndexRouter(c *gin.Context) {
  if c.Request.Form == nil {   //获取所有请求参数名和值的预处理
    c.Request.ParseMultipartForm(32 << 20)
  }
  params = c.Request.Form   //获取所有参数列表
  fmt.Println(params)     //打印输出参数
  c.String(http.StatusOK,"hello gin")//返回给页面hello gin字符串
  //c.HTML(http.StatusOK, "index.html", nil)   //页面跳转
}

mgo 持久层框架使用介绍

前提条件mongodb环境已经搭建好了,首先安装mgo框架依赖

go get labix.org/v2/mgo

type User struct{
  username string
  pwd string
}
func main() {
  mgo_session, err = mgo.Dial("127.0.0.1") //获取连接对象session
  if err != nil {
    panic(err)
  }
  defer session.Close()    //方法执行完后关闭连接
  mgo_db = oper.mgo_session.DB("test")  //获取数据库对象,数据库名为test
  //如果没有mongodb没有开启权限认证,则跳过这一步
  mgo_db.Login("test1", "test1")  //用户认证,用户名账户和密码都是test1
  mgo_c = oper.mgo_db.C("coll")  //获取数据库某个集合对象
  //插入操作
  mgo_c.insert(&User{
    username: "xxx",
    pwd: "xxx",
  })
}

提高服务器高并发性能讲解(针对文章开头地址中的项目)

该项目主要实现接收请求,解析封装参数,插入数据库的简单操作,这里只涉及插入操作,故不涉及数据缓存的知识,整个服务处于单机下,故不涉及分布式服务架构,集群的知识。

注意以下

1、开启一个协程独自监听访问数量,进行插入操作

2、实现批量插入

3、实现定时插入

4、加锁解决并发资源竞争

开启一个协程独自监听访问数量,进行插入操作

如果将插入操作放在主线程,那么接收http请求和逻辑处理,数据库插入操作都必须要顺序执行,大大降低了插入效率,因此要开启一个协程,独自监听访问数量,进行数据库插入。

实现批量插入

假想一下如果每次有人访问你的数据库你就进行一次插入操作,那么你的数据库将会是一个什么样的情况?我们都知道数据库操作相对服务器其他操作是一件相对很耗时的事情,所以每次访问就操作一次数据库,会大大降低服务器性能,更别说有几千上万的人同时访问你的服务器了。

实现定时插入

在实现了批量插入的基础上,如果没有达到一定的访问量,那么就不会执行插入操作,刚好在两个访问请求中间隔了很长时间,那么前面的请求就会等待很久才会更新到数据库中,为了防止这种情况,我们必须要设定一个时间,定时插入。

加锁解决并发资源竞争

在并发量几千上万的情况下,可能一秒可以执行很多次数据库的插入操作,这个时候很有可能上一个插入还没执行完,第二个就已经执行了,这时候可能出现数据冗余,服务器瘫痪等问题,因此要给批量插入操作加上一个读写锁。

具体实现细节可以去上述地址中查看。

补充:Golang号称高并发,但高并发时性能不高

1.管道chan吞吐极限10,000,000,单次Put,Get耗时大约100ns/op,无论是采用单Go程,还是多Go程并发(并发数:100, 10000, 100000),耗时均没有变化,Go内核这对chan进行优化。

解决之道:

在系统设计时,避免使用管道chan传递主业务数据,避免将业务流程处理流程分割到对个Go程中执行,这样做减少chan传输耗时,和Go程调度耗时,性能会有很大的提升。

案例分析:nsq和nats都是实时消息队列,nsq在客户端端和服务端大量使用chan转发消息,导致性能不佳,只有100,000/s;而nats服务端在分发消息流程中,没有使用chan,只在客户端接收时使用chan,性能可达到1,000,000/s。

2.互斥锁Mutex在单Go程时Lock,Unlock耗时大约20ns/op,但是采用多Go程时,性能急剧下降,并发越大耗时越长,在Go1.5并发数达到1024耗时900ns/op,Go1.6优化到300ns/op,究其原因,是构建在CPU的原子操作之上,抢占过于频繁将导致,消耗大量CPU时钟,进而CPU多核无法并行。

解决之道:

采用分区,将需要互斥保护的数据,分成多个固定分区(建议是2的整数倍,如256),访问时先定位分区(不互斥),这样就可降低多个Go程竞争1个数据分区的概率。

案例分析:Golang的Go程调度模块,在管理大量的Go程,使用的就是数据分区。

3.select异步操作在单管道时耗时120ns/op,但是随着管道数增加,性能线性下降,每增加1个管道增加100ns/op,究其原因,slelect时当chan数超过1后,Go内部是创建一个Go程,有它每1ms轮训的方式检查每个chan是否可用,而不是采用事件触发。

解决之道:

在select中避免使用过多的管道chan分支,或者把无法用到的chan置为nil;解决select超时,避免使用单独的超时管道,应与数据返回管道共享。

案例分析:nsq和nats都是实时消息队列,由于nsq大量使用chan,这就必然导致大量使用select对多chan操作,结果是性能不高。

4.Go调度性能低下,当出现1,000,000Go程时,Go的调度器的性能急剧下降。

解决之道:

避免动态创建Go程,服务端收到数据并处理的流程中,避免使用chan传递业务数据,这样会引起Go程调度。

案例分析:nsq和nats都是实时消息队列,由于nsq大量使用chan,这就必然导致在服务过程中,引起Go调度,结果是性能不高。

5.defer性能不高,每次defer耗时100ns,,在一个func内连续出现多次,性能消耗是100ns*n,累计出来浪费的cpu资源很大的。

解决之道:

除了需要异常捕获时,必须使用defer;其它资源回收类defer,可以判断失败后,使用goto跳转到资源回收的代码区。

6.内存管理器性能低下,申请16字节的内存,单次消耗30ns,64字节单次消耗70ns,随着申请内存尺寸的增长,耗时会迅速增长。加上GC的性能在1.4, 1.5是都不高,直到1.6, 1.7才得到改善。

解决之道:

建议使用pool,单次Put,Get的耗时大约在28ns,在并发情况下可达到18ns,比起每次创建,会节省很多的CPU时钟。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。

(0)

相关推荐

  • golang文件服务器的两种方式(可以访问任何目录)

    一.方法1: 主要用到的方法是http包的FileServer,参数很简单,就是要路由的文件夹的路径. package main import ( "fmt" "net/http" ) func main() { http.Handle("/", http.FileServer(http.Dir("./"))) e := http.ListenAndServe(":8080", nil) fmt.Print

  • golang HTTP 服务器 处理 日志/Stream流的操作

    目前,我开发 HTTP 服务, 用的是 beego框架, 方便了很多. 但是, 有时候,还是会遇到一些 特殊的场景. 比如: 过滤日志. 这应该是一种典型的stream,同时数据量也适中, 不会有人,为了这个, 就用一些很重的框架. 可以这样直观的描述这个 逻辑 其他组件 产生 log || \ / 我的组件,业务处理 || \ / 用户, http client 这种情景下, 有几个特殊点: 1. 难以用 string,或者 byte 数组 收集数据 2. 数据Source 端,不断的有数据产

  • golang搭建静态web服务器的实现方法

    我胡汉三又回来啦.好久没发文了,为保持平台上的活跃度,我今天就分享下个刚学到的知识,使用golang搭建静态web服务器,亲测可用,附代码! 使用过golang语言的程序猿都应该知道,在使用golang开发的时候,我们是不需要诸如iis,apache,nginx,kangle等服务器支持的. 为什么呢? 原因是,golang的net/http包中已经提供了HTTP的客户端与服务端实现方案. 网上言论都说golang不适合做web开发,相对php.java..net.nodejs等各类后端语言来说

  • golang项目如何上线部署到Linu服务器(方法详解)

    Go作为Google2009年推出的语言,其被设计成一门应用于搭载 Web 服务器,存储集群或类似用途的巨型中央服务器的系统编程语言. 对于高性能分布式系统领域而言,Go 语言无疑比大多数其它语言有着更高的开发效率.它提供了海量并行的支持,这对于游戏服务端的开发而言是再好不过了. 到现在Go的开发已经是完全开放的,并且拥有一个活跃的社区. 下面看下golang项目如何上线部署到Linu服务器上. windows服务器 先本地编译 go build main.go 编译后会在同级目录生成可执行文件

  • golang高并发的深入理解

    前言 GO语言在WEB开发领域中的使用越来越广泛,Hired 发布的<2019 软件工程师状态>报告中指出,具有 Go 经验的候选人是迄今为止最具吸引力的.平均每位求职者会收到9 份面试邀请. 想学习go,最基础的就要理解go是怎么做到高并发的. 那么什么是高并发? 高并发(High Concurrency)是互联网分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计保证系统能够同时并行处理很多请求. 严格意义上说,单核的CPU是没法做到并行的,只有多核的CPU才能做到严格意义上的并行

  • 如何利用Golang写出高并发代码详解

    前言 之前一直对Golang如何处理高并发http请求的一头雾水,这几天也查了很多相关博客,似懂非懂,不知道具体代码怎么写 下午偶然在开发者头条APP上看到一篇国外技术人员的一篇文章用Golang处理每分钟百万级请求,看完文章中的代码,自己写了一遍代码,下面自己写下自己的体会 核心要点 将请求放入队列,通过一定数量(例如CPU核心数)goroutine组成一个worker池(pool),workder池中的worker读取队列执行任务 实例代码 以下代码笔者根据自己的理解进行了简化,主要是表达出

  • golang-gin-mgo高并发服务器搭建教程

    gin-mgo服务器搭建 该服务器实现简单接收请求并将请求参数封装存储在mongodb数据库中,本文将讲述gin-mgo的使用方法. 项目完整代码地址: https://github.com/wayne-yhp/golang-gin-mgo gin web框架使用介绍 首先获取gin框架依赖 go get gopkg.in/gin-gonic/gin.v1 func main() { server = gin.Default() app.server.GET("/do", IndexR

  • Tomcat服务器搭建教程

    分享Tomcat服务器搭建教程,具体如下 第一步:Tomcat 的下载 官方下载网址为:http://tomcat.apache.org/下载界面如下:选则Download下你要安装的版本进行下载. 第二步:安装Tomcat 1:环境设置 下载的是windows安装版,直接点击即可安装,但在安装前必须要进行环境设置–>设置Tomcat运行时依赖的JDK/JRE. JDK设置方法:选择我的电脑->属性->高级系统设置->环境变量->用户变量下选择"新建" 如

  • win2003下FTP服务器搭建教程

    本文为大家分享了win2003下FTP服务器搭建教程,供大家参考,具体内容如下 搭建FTP服务器 首先打开windows2003的控制面板,管理工具--添加删除windows程序. 或运行  appwiz.cpl即可 进入添加删除windows程序界面,找到删除windows组件 在windows组件里面,找到[应用程序服务器] 应用程序服务器里面,点击详情.进入找到IIS信息管理器 依次点击[IIS信息管理器]详情,里面有个 FTP服务,打钩 然后返回,点击下一步,接着系统就开始安装ftp服务

  • windows10 家庭版下FTP服务器搭建教程

    本文为大家分享了windows10 家庭版下FTP服务器搭建教程,供大家参考,具体内容如下 #如果已经搭建有了FTP服务器,因为到不同的地方IP地址发生了改变直接翻到最后 1.在电脑开始处搜索控制面板并打开 2.打开控制面板后按下图操作 3 在打开的界面把下面图里红色的方框里的选项勾上,然后点击确定 4 接着在电脑的开始处搜索IIS然后打开 5 点击网站,选择添加FTP站点,然后输入ftp站点的名称,并选择共享的文件路径,可以是某个文件夹,也可以是整个磁盘 6 这里需要填写IP地址 参考第7步

  • 微信小程序访问node.js接口服务器搭建教程

    前言 最近在做微信的应用号小程序开发,小程序的后台数据接口需要https安全请求,所以需要我的nodejs服务器能够提供https的支持,现在就将整个https服务器的搭建过程说一下. 搭建教程如下: 首先,我试了一下以前的过期的证书,在开发者工具里模拟的时候可以正常访问接口,在手机里测试时候微信小程序的wx.request是会报SSL握手失败的错误(request error : request: fail ssl hand shake error),所以只能重新申请一个证书,这里推荐使用阿里

  • 图文详解本地Windows 7/8上IIS服务器搭建教程

    本教程为大家分享了IIS服务器搭建的详细步骤,供大家参考,具体内容如下 1.打开"控制面板",选择"程序和功能"(查看方式小图标), 2.进入界面后,点击"启动或关闭Windows功能". 然后勾选图中的两个选框(全选),注意一定要显示为 勾 ,不能是黑色填充!点击确定,开始下载安装....大约两三分钟后,就可以自动完成结束. 3.然后进入控制面板中的"管理工具"里面,选中   Internet 信息服务(IIS)管理器, 此

  • Windows 7下FTP服务器搭建教程

    本文为大家分享了Windows 7下FTP服务器搭建的具体步骤,供大家参考,具体内容如下 系统:Windows 7 1. 首先开启ftp功能:控制面板->程序->程序和功能->打开或关闭Windows功能,将FTP功能勾选 2. 添加ftp站点: 2.1 控制面板->系统和安全->管理工具->双击Internet信息服务(IIS)管理器 2.2 选择网站,右键,选择添加FTP站点 2.3 输入站点名称和工作路径,点击下一步 2.4 ip地址输入本机地址,端口默认为21,

  • SVN服务器搭建图文教程

    SVN服务器搭建教程,供大家参考,具体内容如下 一.首先准备三个软件: 1.VisualSVN-Server-3.6.3-x64.msi(svn服务端) 2.TortoiseSVN-1.9.6.27867-x64-svn-1.9.6.msi(svn客户端) 3.LanguagePack_1.9.6.27867-x64-zh_CN.msi(TortoiseSVN 的汉化包) 软件下载地址:http://subversion.apache.org/packages.html 打开网页拉到最后,看到以

  • CentOS下RabbitMq高可用集群环境搭建教程

    CentOS下RabbitMq高可用集群环境搭建教程分享给大家. 准备工作 1.准备两台或多台安装有rabbitmq-server服务的服务器 我这里准备了两台,分别如下: 192.168.40.130 rabbitmq01 192.168.40.131 rabbitmq02 2.确保防火墙是关闭的3,官网参考资料 http://www.rabbitmq.com/clustering.html hosts映射 修改每台服务上的hosts文件(路径:/etc/hosts),设置成如下: 192.1

随机推荐