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就行了, 标准库里面也有代理工具

1年前 评论
neo88948 (楼主) 1年前
讨论数量: 12

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

1年前 评论
neo88948 (楼主) 1年前
巴啦啦

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

1年前 评论

大概写了写没测试。但是我觉得是这个意思。其实就是拿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)

    })
}
1年前 评论
neo88948 (楼主) 1年前

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

1年前 评论
neo88948 (楼主) 1年前

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

1年前 评论
neo88948 (楼主) 1年前
cevin 1年前
qufo (作者) 1年前
qufo (作者) 1年前

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