dotweb——go语言的一个微型web框架(二)启动dotweb

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介:

以上的代码截图表示启动一个dotweb服务,在浏览器里输入127.0.0.1:8080,将会得到一个“index”的页面。

app := dotweb.New()

dotweb.New()函数表示创建一个新的dotweb对象,这个对象是dotwebapp。我们把dotweb称之为web框架,实际上这只是一种叫法。dotweb它是一个application,如果您说它是个web服务器那么这种说法也是对的。dotweb.New()返回的dotweb对象通常我们叫做app,它负责日志、缓存、热加载、加载httpserver等等工作。它是一个容器、一个宿主,httpserver就是在它的环境里运行。

app.SetLogPath(file.GetCurrentDirectory())

dotweb内部实现了日志输出,你只需要制定一个日志路径就可以使用。这里只是指定了日志存放路径,至于如何输出日志这在后续的文章中会说明,请放心它的使用非常简单。

app.SetCache(cache.NewRuntimeCache())//使用本地内存当作缓存
app.SetCache(cache.NewRedisCache("redis标准连接字符串"))//使用redis作为缓存

dotweb对缓存有两种支持,一种是本地内存,一种是redis。在New()的时候,dotweb默认是不创建缓存对象的,如果你需要可以自己用SetCache()函数设置。在两种缓存策略中,你只能选择一种来使用。如果你设置了两种,dotweb将使用最后一个SetCache()。你可能对dotweb原生支持redis缓存表示欣喜,在你深入了解后会发现dotweb不只是cache支持redis。这正是出于对现代系统需要分布式部署的考虑。

app.Cache()

你可以通过Cache()函数获取缓存对象,在后续文章中我会介绍操作Cache对象的方法,如果你已经迫不及待想使用它,你可以阅读源码,它非常简单很容易就可以理解。

复制代码
复制代码
app.RegisterModule(&dotweb.HttpModule{
        OnBeginRequest: func(ctx *dotweb.HttpContext) {
            fmt.Println(ctx.Url())
        },
OnEndRequest: func(ctx*dotweb.HttpContext) { fmt.Println("离开",ctx.Url(),"页面") }, }) app.RegisterModule(&dotweb.HttpModule{ OnBeginRequest: func(ctx *dotweb.HttpContext) { if strings.Split(ctx.Url(),"/")[1] == "subject"{ fmt.Println(ctx.Session().Get("user")) if ctx.Session().Get("user") == nil { ctx.WriteString("请先登录.") ctx.End() } } },
OnEndRequest: func(ctx*dotweb.HttpContext) { }, })
复制代码
复制代码

Module在dotweb中被称为中间件,RegisterModule函数接受一个HttpModule类型的参数,HttpModule有两个参数为*dotweb.HttpContext函数定义—OnBeginRequest和OnEndRequest,它们分别表示在UserHandler执行前执行和在UserHandler执行后执行。dotweb接受多个Module,它会按照注册顺序来执行,在一些权限验证和日志处理中它非常有用。上述代码第一个Module打印了请求的路由,第二个Module表示在subject的子路由下需要用户登录。有人表示希望能把Module绑定到UserHandler上以方便开发,这条建议我们认为很有用,我们会在以后的版本中增强Module的功能。

 

app.SetEnabledListDir(true)

SetEnabledListDir用来设置是否允许目录浏览,默认是false。如果你的服务器上没有任何静态资源给客户端访问,那么就可以不用配置。关闭目录浏览通常在数据接口服务器上非常有用。

app.SetEnabledDebug(true)

SetEnabledDebug用来设置是否启动调试模式,在调试模式下如果出现异常dotweb将返回相关的错误信息,方便追查问题。这在开发和测试环境中非常有用,默认值是false,所以在生产环境中你可以不用配置该值。

app.SetEnabledSession(true)

SetEnavledSession用来设置是否启用session,你可能会感到疑惑为什么dotweb默认不启用session呢?因为维持session会带来性能损耗,在某些项目中不需要session,如果启用可能会带来不必要的性能损失。如果你需要你只需设置一下就好,就像示例一样让它为true。

app.SetSessionConfig(session.NewDefaultRuntimeConfig())//使用本地内存
app.SetSessionConfig(session.NewDefaultRedisConfig("redis标准连接字符串"))//使用redis

dotweb的session也是有两种存储策略,一种是本地的内存,一种是redis。这点和缓存

app.SetEnabledGzip(true)

SetEnabledGzip用来设置是否启用Gzip压缩,当然默认还是false。事实上Gzip不一定会带来性能的提升,因为对Response的缓冲区进行压缩会造成一些性能损耗,所以对于是否启用Gzip压缩你需要考虑到项目的实际情况。

 

app.SetExceptionHandle(func(ctx *dotweb.HttpContext,errinfo interface{}){
        //ctx表示请求上下文,errinfo表示错误信息
        fmt.Println(ctx.Url(),"请求出现异常,错误信息:",errinfo)
    })

虽然dotweb提供了默认的异常处理模块,但是大部分情况下它不是你想要的那种方式。所以你可以根据自己的需要添加自己的异常处理模块,如果你添加了自己的异常处理模块,那么默认异常处理模块将会失效。

app.StartPProfServer(8081)

PProf服务是用来监控dotweb运行状态的,它目前提供了一些简单的查询。不过我们有计划在今后版本增强这部分功能,我们欢迎大家的建议。需要注意的是PProf服务端口不能和dotweb主服务端口冲突。

最重要的一步:

app.StartServer(8080)

StartServer表示启动dotweb服务,它会根据配置初始化相关资源并且装载httpserver。启动之后,你就可以在浏览器里访问了。

当然dotweb也有读取配置文件启动的方法,在一些场景下它非常有用,我会在后续的文章中介绍如何使用配置文件启动dotweb。当然,如果你已经迫不及待也可以去阅读源码,项目地址:https://github.com/devfeel/dotweb,再次声明:我们欢迎你对提出建议或者直接进行源码贡献,你可以通过github项目地址找到我们的QQ群。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
7天前
|
Go
go语言中的数据类型
go语言中的数据类型
10 0
|
12天前
|
Go 开发者
掌握Go语言:Go语言结构体,精准封装数据,高效管理实体对象(22)
掌握Go语言:Go语言结构体,精准封装数据,高效管理实体对象(22)
|
12天前
|
安全 Go
掌握Go语言:Go语言通道,并发编程的利器与应用实例(20)
掌握Go语言:Go语言通道,并发编程的利器与应用实例(20)
|
12天前
|
存储 缓存 安全
掌握Go语言:Go语言中的字典魔法,高效数据检索与应用实例解析(18)
掌握Go语言:Go语言中的字典魔法,高效数据检索与应用实例解析(18)
|
12天前
|
Go
使用Go语言发邮件
使用Go语言发邮件
16 2
|
24天前
|
缓存 安全 Java
Go语言小细节
Go语言小细节
36 0
|
30天前
|
存储 安全 Go
|
12天前
|
存储 安全 Go
掌握Go语言:Go语言类型转换,无缝处理数据类型、接口和自定义类型的转换细节解析(29)
掌握Go语言:Go语言类型转换,无缝处理数据类型、接口和自定义类型的转换细节解析(29)
|
6天前
|
存储 Java 编译器
go语言基础语法
go语言基础语法
|
12天前
|
存储 缓存 安全
掌握Go语言:Go语言Map,高效键值对集合的应用与注意事项详解(26)
掌握Go语言:Go语言Map,高效键值对集合的应用与注意事项详解(26)