gin关于路由的问题

1. 运行环境

go version go1.18 windows/amd64

2. 问题描述?

我想用gin做一个api转发功能,比如我想把下路由转发到后端相应服务上

GET http://127.0.0.1:8080/a/database/{id}/documents

上述路由转发至:http://servA/database/{id}/documents

POST http:://127.0.0.1:8080/b/user

上述路由转发至:servB/user

由于项目有400多个接口地址,如果再用gin每个声明一遍工作量很大。

3. 您期望得到的结果?

我的目的是做一个路由,匹配所有path, 这样前端很少工作量情况下修改baseUrl就能完成接口请求工作

最佳答案

匹配所有path这么简单粗暴用http.ListenAndServe就行了, 标准库里面也有代理工具

2周前 评论
neo88948 (楼主) 2周前
讨论数量: 12
巴啦啦

做一个路由,匹配所有 path。这想法挺好的,就这么去做吧

2周前 评论

大概写了写没测试。但是我觉得是这个意思。其实就是拿go实现一个复杂的自定义nginx,严格来说是一个对外服务的网关,现成产品可以看看Konghq.com、apisix。

package main

import (
    "github.com/gin-gonic/gin"
    "net/http/httputil"
    "net/url"
    "strings"
)

func main() {
    engine := gin.New()

    engine.Any("/", func(context *gin.Context) {
        requestPath := context.Request.URL.Path

        if strings.HasPrefix(requestPath, "/a") {
            targetUrl, _ := url.Parse("http://services-a.com/"+strings.TrimPrefix(requestPath, "/a/"))
            proxy := httputil.NewSingleHostReverseProxy(targetUrl)
            proxy.ServeHTTP(context.Writer, context.Request)
        } else if strings.HasPrefix(requestPath, "/b") {

        }

        context.AbortWithStatus(404)

    })
}
2周前 评论
neo88948 (楼主) 2周前

匹配所有path这么简单粗暴用http.ListenAndServe就行了, 标准库里面也有代理工具

2周前 评论
neo88948 (楼主) 2周前

用gin.NoRoute方法,可以匹配没未命中规则的路由

2周前 评论
neo88948 (楼主) 2周前

Nginx 也能实现所有需求但我们就是不用他对吧。

1周前 评论
neo88948 (楼主) 1周前
cevin 1周前
qufo (作者) 2天前
qufo (作者) 2天前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!