使用go的内置的基础路由服务

本文涉及的产品
可观测监控 Prometheus 版,每月50GB免费额度
容器镜像服务 ACR,镜像仓库100个 不限时长
MSE Nacos/ZooKeeper 企业版试用,1600元额度,限量50份
简介: 【6月更文挑战第19天】本文探索Go的HTTP服务:基础路由与多路复用。基础服务示例绑定到`:http`,返回非零错误。多路复用允许按URL模式匹配请求,长路径优先,注册时考虑主机名。错误路径重定向至根。代码示例见:https://github.com/hahamx/examples/tree/main/tcps/2_with_http_handler

简介

天下难事,必始于易。 慎始如终,则不败事。 --老子

本文介绍两个基本的路由绑定方式,基础路由服务和多路复用路由服务。它们都使用net/http包提供HTTP服务,ListenAndServe管理TCP连接。服务通过goroutines处理请求,启用HTTP/2需TLS配置为h2;。

1 基础http路由服务

内建的包 net/http 为http服务提供了很多功能,包括建立tcp连接和 sockets连接管理,这些都被ListenAndserve函数所包括。

然后调用与处理程序一起服务以处理传入连接的请求。接受的连接被配置为启用 TCP,并保持活动。

处理程序通常为 nil,在这种情况下使用 DefaultServeMux。 这在上一节有讲到。

ListenAndServe 总是返回一个非零错误

其主体服务程序形式为:

    type zooms struct{}

    func (h zooms) ServeHTTP(res http.ResponseWriter, req *http.Request) {
         ...
    }

    func httpServer() { 
        http.ListenAndServe(httpPort, zk) 
    }

如果Serve的地址 为空,则使用“:http”。 ListenAndServe 总是返回一个非零错误。关机或关闭后,返回的错误是 ErrServerClosed。

Serve 接受 Listener 上的传入连接,每个新的服务都将创建一个 goroutine。
goroutines 服务 读取请求和 然后调用 srv.Handler 来回复他们。

仅当监听器返回 *tls.Conn 时才启用 HTTP/2 支持连接,并且它们在 TLS 中的Config.NextProtos配置为“h2”.

当服务失败时总是返回一个非零错误并关闭 listener. Shutdown 或 Close 后,返回的错误是 ErrServerClosed。

访问猫头鹰

    http://127.0.0.1:3010/owls
        miao,miao...

访问大象

    http://127.0.0.1:3010/elephants
        ang,ang...

访问老虎

    http://127.0.0.1:3010/tiger
        aoo,aoo...

2 多路复用 http路由服务

http请求多路复用器,它为每一个进入的请求,在注册列表进行有针对的匹配使用模式匹配最接近的URL 路由,模式也调用处理器的处理程序。

模式使用最终的,根路径,如 /favicon.ico 或者 根路径子路由树 如 /images/ 注意最后跟了路径分割符长路径优先于短路径匹配。

如果长路径不存在,比如/ele/food/ 不存在, 将缩减直到根路径 / 。请看后面的例子。

如果两个路径都存在,比如 /ele/, /ele/food 此后的程序将使用长路由 /ele/food

需要注意的是,如果/ele/的某个子路由, 比如 /ele/foo 不存在,那么其子路由/ele/foo的任何调用都将 匹配到/ele/。

如果 路由 /ele 没有 路径分割符/, 那么/ele/foo 将直接匹配到 根路由 /

如果路由定义了 最终分隔符 /ele/ 但是调用是没有指定, 只是使用 /ele调用那么,

系统将返回一个 301重定向的提示,如果使用浏览器将被自动导向/ele/, 即 301,200 至少两次调用,

因为在编写路由 /ele/时, ServeMux 将/ele 和 /ele/ 都写入了注册器中。

    curl http://127.0.0.1:3020/ele
    <a href="/ele/">Moved Permanently</a>.

该注册模式可选以一个主机名开始,因此限制只能在该主机域名进行匹配。 主机特定匹配优先于 一般的模式匹配,

因此一个处理函数可能注册两个模式,而不需要接入 http://www.google.com/

    /codesearch
    codesearch.google.com 

ServeMux 将负责验证URL请求路径和主机的域名,剥离端口号并重定向包含的任何请求,或重复的元素如 //,直到获得干净的url

  http://127.0.0.1:3020\/ele\/
  http://127.0.0.1:3020//ele//

    scheme http
    host 127.0.0.1:3020
    filename //ele/

比如在本示例中,端口3020服务没有 大象 elephants,该路由算法将 匹配到 根路径 /

    curl http://127.0.0.1:3020/
    welcome Big Zoom!

错误调用路径将返回到根路由

    curl  http://127.0.0.1:3020/ele/food/
    welcome Big Zoom!

正确调用

    curl  http://127.0.0.1:3020/ele/food
    corn,apple,rice,grass...

其主体服务形式为:

    type zooms struct{}

    func (h zooms) ServeHTTP(res http.ResponseWriter, req *http.Request) {
        ...
    }

    //创建http多路复用服务
    func muxHttpServer() {
        var manager zooms 
        router := http.NewServeMux()
        router.Handle("/", manager)

        http.ListenAndServe(muxPort, router) 
    }

其中 Handle 注册给定模式的处理程序。如果模式的处理程序已经存在,则抛出恐慌错误。

访问老虎

    http://127.0.0.1:3020/tiger
        aoo,aoo,aoo,aoo,...

访问猫头鹰

    http://127.0.0.1:3020/owl
        wu,wu,wu,wu,...

访问大象

    http://127.0.0.1:3020/ele/
        ang,ang,ang,ang,...  

喂食大象

    http://127.0.0.1:3020/ele/food
        corn,apple,rice,grass...

3 小结

感谢一起旅程的你。
本节完整代码:

    https://github.com/hahamx/examples/blob/main/tcps/2_with_http_handler/http_service.go

下一节我们继续旅程,使用http框架更快更好地做其他事情。

目录
相关文章
|
3月前
|
JSON 中间件 Go
Go 网络编程:HTTP服务与客户端开发
Go 语言的 `net/http` 包功能强大,可快速构建高并发 HTTP 服务。本文从创建简单 HTTP 服务入手,逐步讲解请求与响应对象、URL 参数处理、自定义路由、JSON 接口、静态文件服务、中间件编写及 HTTPS 配置等内容。通过示例代码展示如何使用 `http.HandleFunc`、`http.ServeMux`、`http.Client` 等工具实现常见功能,帮助开发者掌握构建高效 Web 应用的核心技能。
238 61
|
3月前
|
开发框架 JSON 中间件
Go语言Web开发框架实践:路由、中间件、参数校验
Gin框架以其极简风格、强大路由管理、灵活中间件机制及参数绑定校验系统著称。本文详解其核心功能:1) 路由管理,支持分组与路径参数;2) 中间件机制,实现全局与局部控制;3) 参数绑定,涵盖多种来源;4) 结构体绑定与字段校验,确保数据合法性;5) 自定义校验器扩展功能;6) 统一错误处理提升用户体验。Gin以清晰模块化、流程可控及自动化校验等优势,成为开发者的优选工具。
|
3月前
|
开发框架 JSON 中间件
Go语言Web开发框架实践:使用 Gin 快速构建 Web 服务
Gin 是一个高效、轻量级的 Go 语言 Web 框架,支持中间件机制,非常适合开发 RESTful API。本文从安装到进阶技巧全面解析 Gin 的使用:快速入门示例(Hello Gin)、定义 RESTful 用户服务(增删改查接口实现),以及推荐实践如参数校验、中间件和路由分组等。通过对比标准库 `net/http`,Gin 提供更简洁灵活的开发体验。此外,还推荐了 GORM、Viper、Zap 等配合使用的工具库,助力高效开发。
|
6月前
|
存储 JSON Go
PHP 日志系统的最佳搭档:一个 Go 写的远程日志收集服务
为了不再 SSH 上去翻日志,我写了个 Go 小脚本,用来接收远程日志。PHP 负责记录日志,Go 负责存储和展示,按天存储、支持 API 访问、可远程管理,终于能第一时间知道项目炸了。
113 10
|
缓存 弹性计算 API
用 Go 快速开发一个 RESTful API 服务
用 Go 快速开发一个 RESTful API 服务
|
10月前
|
Go UED
Go Web服务中如何优雅平滑重启?
在生产环境中,服务升级时如何确保不中断当前请求并应用新代码是一个挑战。本文介绍了如何使用 Go 语言的 `endless` 包实现服务的优雅重启,确保在不停止服务的情况下完成无缝升级。通过示例代码和测试步骤,详细展示了 `endless` 包的工作原理和实际应用。
212 3
|
10月前
|
JSON Go UED
Go Web服务中如何优雅关机?
在构建 Web 服务时,优雅关机是一个关键的技术点,它确保服务关闭时所有正在处理的请求都能顺利完成。本文通过一个简单的 Go 语言示例,展示了如何使用 Gin 框架实现优雅关机。通过捕获系统信号和使用 `http.Server` 的 `Shutdown` 方法,我们可以在服务关闭前等待所有请求处理完毕,从而提升用户体验,避免数据丢失或不一致。
150 1
|
Go API 开发者
深入探讨:使用Go语言构建高性能RESTful API服务
在本文中,我们将探索Go语言在构建高效、可靠的RESTful API服务中的独特优势。通过实际案例分析,我们将展示Go如何通过其并发模型、简洁的语法和内置的http包,成为现代后端服务开发的有力工具。
|
安全 Go Docker
Go服务Docker Pod不断重启排查和解决
该文章分享了Go服务在Docker Pod中不断重启的问题排查过程和解决方案,识别出并发写map导致fatal error的问题,并提供了使用sync.Map或concurrent-map库作为并发安全的替代方案。
194 4
|
XML JSON Go
Swoole与Go系列教程之WebSocket服务的应用
在 WebSocket 协议出现之前,Web 应用为了能过获取到实时的数据都是通过不断轮询服务端的接口。轮询的效率、延时很低,并且很耗费资源。
1134 2
Swoole与Go系列教程之WebSocket服务的应用