今天接到任务是做请求转发,公司有几个已经写好的微服务,现在需要一个统一的登录接口验证权限,登录也是单独的微服务。现在要统一访问登录的服务,做权限验证,通过后,将请求转发给对应的微服务。
想了很长时间,只要问题在于怎么得到对应的微服务的url。一开始怎么也想不出来,其实还是知识不够。
gin的路由是可以有通配符 *
存在的,但要这样写*url
,如下面的代码所示,*url
会匹配 /test2/
后面的所有内容。
xxxx :=r.Group("/api",)
{
xxxx.GET("/test1", controller.Geturl)
xxxx.GET("/test2/*url", func(c *gin.Context) {
ur :=c.Param("url")
fmt.Println(ur)
target := "http://localhost:7777" //最终要访问的服务
remote, err := url.Parse(target)
if err != nil {
fmt.Println(err)
}
proxy := httputil.NewSingleHostReverseProxy(remote)
c.Request.URL.Path = "/"+ur //请求API
proxy.ServeHTTP(c.Writer, c.Request)
})
}
这样其实也就实现了反向代理。