在Golang中,可以使用net/http等包实现网关。代码示例:
go
// 定义后端服务
services := map[string]string{
"service1": "http://localhost:8000",
"service2": "http://localhost:8001",
}
// 网关handler
func gateway(w http.ResponseWriter, r *http.Request) {
// 从请求路径提取服务名
service := r.URL.Path[1:]
// 检查服务是否存在
endpoint, ok := services[service]
if !ok {
http.NotFound(w, r)
return
}
// 构造代理请求
proxy_req, err := http.NewRequest(r.Method, endpoint+r.URL.Path, r.Body)
if err != nil {
http.Error(w, err.Error(), http.StatusBadGateway)
return
}
proxy_req.Header = r.Header
// 请求后端服务
proxy_client := http.Client{}
proxy_resp, err := proxy_client.Do(proxy_req)
if err != nil {
http.Error(w, err.Error(), http.StatusBadGateway)
return
}
// 返回响应
w.WriteHeader(proxy_resp.StatusCode)
io.Copy(w, proxy_resp.Body)
}
func main() {
// 启动HTTP服务器
mux := http.NewServeMux()
mux.HandleFunc("/", gateway)
http.ListenAndServe(":8000", mux)
}
网关会监听8000端口,接收请求后从路径提取需要访问的后端服务名,检查其是否存在,如果存在则代理请求到相应后端服务,并返回响应,实现网关功能。
// 客户端请求网关
resp, err := http.Get("http://localhost:8000/service1/foo")
客户端请求网关,网关再请求后端service1服务,将响应返回给客户端。