gf框架之基本介绍 - 哈喽世界!

智数玄铁引
• 阅读 5696

文章来源:http://gf.johng.cn/494366

gf框架提供了非常强大的Web Server模块,由ghttp包支持,API文档地址: godoc.org/github.com/johng-cn/gf/g/net/ghttp

哈喽世界!

老规矩,我们先来一个Hello World:

package main

import "gitee.com/johng/gf/g/net/ghttp"

func main() {
    s := ghttp.GetServer()
    s.BindHandler("/", func(r *ghttp.Request){
        r.Response.Write("哈喽世界!")
    })
    s.Run()
}

这便是一个最简单的Web Server,它不支持静态文件处理,只有一个功能,访问http://127.0.0.1/的时候,它会返回“哈喽世界!”。

任何时候,您都可以通过ghttp.GetServer()方法获得一个默认的Web Server对象,该方法采用单例模式设计,也就是说,多次调用该方法,返回的是同一个Web Server对象。

通过Run()方法执行Web Server的监听运行,在没有任何额外设置的情况下,它默认监听80端口。

关于其中的服务注册,我们将会在后续章节中介绍,我们继续来看看如何创建一个支持静态文件的Web Server。

Web Server

创建并运行一个支持静态文件的Web Server:

package main

import "gitee.com/johng/gf/g/net/ghttp"

func main() {
    s := ghttp.GetServer()
    s.SetIndexFolder(true)
    s.SetServerRoot("/home/www/")
    s.Run()
}

创建了Web Server对象之后,我们可以使用Set*方法来设置Web Server的属性,我们这里的示例中涉及到了两个属性设置方法:

  1. SetIndexFolder用来设置是否允许列出Web Server主目录的文件列表(默认为false);
  2. SetServerRoot用来设置Web Server的主目录(默认为空,在某些时候,Web Server仅提供接口服务,因此Web Server的主目录为非必需参数);

Web Server默认情况下是没有任何主目录的设置,只有设置了主目录,才支持对应主目录下的静态文件的访问。更多属性设置请参考 ghttp API文档

多服务器支持

ghttp支持多Web Server运行,下面我们来看一个例子:

package main

import (
    "gitee.com/johng/gf/g/net/ghttp"
)

func main() {
    s1 := ghttp.GetServer("s1")
    s1.SetPort(8080)
    s1.SetIndexFolder(true)
    s1.SetServerRoot("/home/www/static1")
    go s1.Run()

    s2 := ghttp.GetServer("s2")
    s2.SetPort(8081)
    s2.SetIndexFolder(true)
    s2.SetServerRoot("/home/www/static2")
    go s2.Run()

    select{}
}

如果需要再同一个进程中支持多个Web Server,那么需要将每个Web Server使用goroutine进行异步执行监听,并且通过 select{} 语句(当然您也可以采用其他方式)保持主进程存活。

此外,可以看到我们在支持多个Web Server的语句中,给ghttp.GetServer传递了不同的参数,该参数为Web Server的名称,之前我们提到ghttp的GetServer方法采用了单例设计模式,该参数用于标识不同的Web Server,因此需要保证唯一性。

如果需要获取同一个Web Server,那么传入同一个名称即可。例如在多个goroutine中,或者不同的模块中,都可以通过ghttp.GetServer获取到同一个Web Server对象。

域名&多域名支持

同一个Web Server支持多域名绑定,并且不同的域名可以绑定不同的服务。

我们来看一个简单的例子:

package main

import "gitee.com/johng/gf/g/net/ghttp"

func Hello1(r *ghttp.Request) {
    r.Response.Write("127.0.0.1: Hello1!")
}

func Hello2(r *ghttp.Request) {
    r.Response.Write("localhost: Hello2!")
}

func main() {
    s := ghttp.GetServer()
    s.Domain("127.0.0.1").BindHandler("/", Hello1)
    s.Domain("localhost").BindHandler("/", Hello2)
    s.Run()
}

我们访问http://127.0.0.1/http://localhost/可以看输出不同的内容。

此外,Domain方法支持多个域名参数,使用英文“,”号分隔,例如:

s.Domain("localhost1,localhost2,localhost3").BindHandler("/", Hello2)

这条语句的表示将Hello2方法注册到指定的3个域名中(localhost1~3),对其他域名不可见。

需要注意的是:Domain方法的参数必须是准确的域名,不支持泛域名形式,例如:*.johng.cn或者.johng.cn是不支持的,api.johng.cn或者johng.cn才被认为是正确的域名参数。

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
4年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Wesley13 Wesley13
4年前
VBox 启动虚拟机失败
在Vbox(5.0.8版本)启动Ubuntu的虚拟机时,遇到错误信息:NtCreateFile(\\Device\\VBoxDrvStub)failed:0xc000000034STATUS\_OBJECT\_NAME\_NOT\_FOUND(0retries) (rc101)Makesurethekern
Wesley13 Wesley13
4年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Stella981 Stella981
4年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Wesley13 Wesley13
4年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
4年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Easter79 Easter79
4年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Wesley13 Wesley13
4年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
Wesley13 Wesley13
4年前
MBR笔记
<bochs:100000000000e\WGUI\Simclientsize(0,0)!stretchedsize(640,480)!<bochs:2b0x7c00<bochs:3c00000003740i\BIOS\$Revision:1.166$$Date:2006/08/1117