在go语言服务中封装路由和示例

本文涉及的产品
Serverless 应用引擎 SAE,800核*时 1600GiB*时
云原生网关 MSE Higress,422元/月
应用实时监控服务ARMS - 应用监控,每月50GB免费额度
简介: 【6月更文挑战第23天】本文介绍golang后端按协议处理、中间件(一次性与每次请求执行)划分、以及服务架构Controller、Logic/Service、DAO/Repository和Routers划分。代码仓库在GitHub上提供。使用框架简化了交互和处理。后续章节深入探讨服务构建。

简介

本文介绍服务封装涉及的HTTPServer,处理超时和路由。

本文示例展示了一个简单的服务,包括健康检查(pong)和资源操作。主、欢迎及查询列表接口演示了服务响应。

Toroid托瑞德符号.png

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
目录
相关文章
|
22小时前
|
存储 Go
go语言字符串变小写
go语言字符串变小写
|
22小时前
|
NoSQL Go API
go语言操作Redis
go语言操作Redis
|
22小时前
|
Unix Go
go语言获取当前时间戳
go语言获取当前时间戳
|
22小时前
|
Go
go语言李mapstructure啥意思
go语言李mapstructure啥意思
|
23小时前
|
Go
8-12|go语言之输入
8-12|go语言之输入
|
1天前
|
安全 Go 数据处理
探索Go语言的并发之美:Goroutines与Channels
在Go语言的世界里,"并发"不仅仅是一个概念,它是一种生活的方式。本文将带你领略Go语言中Goroutines和Channels的魔力,它们是如何让并发编程变得既简单又高效。我们将通过一个简单的示例,展示如何使用这些工具来构建一个高性能的网络服务。
|
1天前
|
关系型数据库 Go 数据处理
高效数据迁移:使用Go语言优化ETL流程
在本文中,我们将探索Go语言在处理大规模数据迁移任务中的独特优势,以及如何通过Go语言的并发特性来优化数据提取、转换和加载(ETL)流程。不同于其他摘要,本文不仅展示了Go语言在ETL过程中的应用,还提供了实用的代码示例和性能对比分析。
|
1天前
|
Go 定位技术 索引
Go 语言Map(集合) | 19
Go 语言Map(集合) | 19
|
1天前
|
Go
go语言注释,标识符 | 17
go语言注释,标识符 | 17