图片引用网络。
反向代理具体含义这里就不在进行讲述了,想看详细信息,可自行百度查看。
我们这里直接上代码进行描述。
package main
import (
_ "fmt"
"io"
_ "log"
"net/http"
"net/http/httputil"
"net/url"
_ "strings"
)
func main() {
/*localHost := "127.0.0.1:8080"
targetHost := "127.0.0.1:8802"
httpsServer(localHost, targetHost)
var err error = nil*/
http.HandleFunc("/", ServeHTTP)
// 注释代码也可以在main中直接写,当然封装到方法中显得更加清晰
/*
http.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
if req.RequestURI == "/favicon.ico" {
io.WriteString(w, "Request path Error")
return
}
fmt.Println(req.RequestURI)
fmt.Fprintf(w, req.RequestURI)
})
*/
http.ListenAndServe(":8085", nil)
}
func ServeHTTP(w http.ResponseWriter, r *http.Request) {
if r.RequestURI == "/favicon.ico" {
io.WriteString(w, "Request path Error")
return
}
remote, err := url.Parse("http://" + "127.0.0.1:80")
if err != nil {
panic(err)
}
proxy := httputil.NewSingleHostReverseProxy(remote)
proxy.ServeHTTP(w, r)
}
上述就是一个简单的代理功能实现,主要是通过httputil.NewSingleHostReverseProxy(targetUrl)
这个是httputil自带的方法,可以直接引用,但是如果我们想要做一个比较完整的反向代理功能那该怎么办呢?
需求:前端请求到后台,根据固定服务进行转发服务下的固定接口
分析:
如果已经知道是哪个具体的服务下的固定接口,那么我们可以比较简单的处理这种业务,比如我这里直接将这个接口完整请求路径作为代理转发后续path,那么只要前端请求的路径中包含这个固定path,当后端解析到有这个path,那么直接进入到这个代理转发功能上,代理功能根据请求地址后需要转发的服务域名(或者ip、端口)进行转发到这个服务上,然后根据path接口路径进行访问请求。这里需要注意:在进行访问服务下接口路径的时候,因为是转发到这个服务上,所以我们需要确定我们转发时将对应服务需要的鉴权认证信息携带过去(这里需要你明白具体服务是根据什么进行验权(token、cookie、或者直接用户信息在header中等等)),带上验证信息一起转发到服务中,这样,进行服务下接口访问的时候才能通过验权进行接口路径查询。
简单点说就是:比如这个path=/api/v1/user/ 这个路径就是user服务下的某个接口路径,我们统一路径,让前端给我们传递请求时候是:http://localhost:8080//api/v1/almsvr/ 这个路径到我们后台的时候,通过解析是否有/api/v1/almsvr/字