简介
本文介绍服务封装涉及的HTTPServer,处理超时和路由。
本文示例展示了一个简单的服务,包括健康检查(pong)和资源操作。主、欢迎及查询列表接口演示了服务响应。
1 中间件划分方法:
协议处理 https的请求交互处理层,可支持多种协议 thrift,gRPC,http/https 中间件开发
中间件有两个类型:
第一部分
在初始化中间件时执行一次。这就是你设置所有全局对象、逻辑等的地方。每个应用程序生命周期发生一次的所有事情。
第二部分
对每个请求执行的。例如,您只需将“全局”数据库对象注入上下文中的数据库中间件。一旦它在上下文中,您可以从其他中间件和您的处理程序函数中检索它。
2 服务器中业务处理方式
Controller,
与上述类似,服务入口,负责处理路由,参数校验,请求转发。
Logic/Service,
逻辑(服务)层,一般是业务逻辑的入口,可以认为从这里开始,所有的请求参数一定是合法的。业务逻辑和业务流程也都在这一层中。常见的设计中会将该层称为 Business Rules。
DAO/Repository,
这一层主要负责和数据、存储打交道。将下层存储以更简单的函数、接口形式暴露给 Logic 层来使用。负责数据的持久化工作。
Routers
内置服务路由,用于健康检查的ping 和 内置记录器 Recovery将 recover任何panic,如果有panic 将写入500
func (that *ServerGroup) Routers() {
that.Use(gin.Logger())
that.Use(gin.Recovery())
that.GET("/", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"message": "pong",
})
})
}
3 服务中使用默认的路由封装和寻址
这些服务通过使用定义良好的API 相互通信。即使是单个业务操作也可能导致 所有服务直接多个点对点调用。一个常见通信模式是使用充当协调器的集中式服务。
它确认所有传入的请求并将操作委托给相应服务。 它还管理整个业务交易的工作流程,每个服务只是完成一个操作,并不了解整个流程。
创建服务 HTTPServer,并处理可能的超时,绑定路由到服务引擎
func NewHttpServer(handler http.Handler) *http.Server {
return &http.Server{
Addr: Ports,
Handler: handler,
ReadTimeout: 500 * time.Second,
WriteTimeout: 100 * time.Second,
MaxHeaderBytes: 1000 << 20,
}
}
启动服务
func Start() {
var Servers = NewHttpServer(NewRouter())
log.Fatalf(Servers.ListenAndServe().Error())
}
func main() {
Start()
}
4 使用该服务
主界面
http://127.0.0.1:3040/
message "pong"
欢迎界面
http://127.0.0.1:3040/resource
"message": "success",
"data": "welcome!",
"code": 200,
查询列表
http://127.0.0.1:3040/resource/list
{"code":200,
"data":[
{"id":"en00029","name":"infinsh war III","path":"video.asdaliyun.com/oss/usubda","times":"180min"},
{"id":"en00028","name":"infinsh war II","path":"video.asdaliyun.com/oss/usubde","times":"170min"}],
"message":"success"}
具体信息
http://127.0.0.1:3040/resource/en00029
{"code":200,
"data":
{"id":"en00029","name":"infinsh war III","path":"video.asdaliyun.com/oss/usubda","times":"180min"},
"message":"success"}
5 小结
使用框架的方式将帮助我们处理很多事情,比如序列号返回,传入参数绑定,它更有利于CS架构的交互。这将在下一节中得到体现。
我们从下一节正式开始完整的服务旅程。
本节代码地址
https://github.com/hahamx/examples/blob/main/tcps/2_with_http_handler/http_gin.go