3 Star 9 Fork 1

os-lee/easy-paas

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
reverse_proxy.go 2.33 KB
一键复制 编辑 原始数据 按行查看 历史
lee 提交于 2024-07-16 13:08 . 获取代理结果
package middleware_http
import (
"bytes"
"encoding/json"
"fmt"
"gitee.com/os-lee/easy-paas/common"
"gitee.com/os-lee/easy-paas/common/e"
"gitee.com/os-lee/easy-paas/gateway/internal/dao"
"gitee.com/os-lee/easy-paas/gateway/internal/load_balancer"
"gitee.com/os-lee/easy-paas/gateway/internal/reverse_proxy"
"github.com/gin-gonic/gin"
"github.com/pkg/errors"
"net/http"
)
// InterceptingResponseWriter 是一个自定义的 ResponseWriter,用于捕获响应数据。
type InterceptingResponseWriter struct {
http.ResponseWriter // 原始的 ResponseWriter
body *bytes.Buffer // 缓冲区,用于保存响应数据
}
// Write 方法重写,将数据同时写入原始的 ResponseWriter 和缓冲区。
func (irw *InterceptingResponseWriter) Write(b []byte) (int, error) {
irw.body.Write(b)
return irw.ResponseWriter.Write(b)
}
// Flush 方法,用于支持流式传输,如果底层的 ResponseWriter 支持的话。
func (irw *InterceptingResponseWriter) Flush() {
if f, ok := irw.ResponseWriter.(http.Flusher); ok {
f.Flush()
}
}
// ReverseProxy 创建并返回一个gin.HandlerFunc,
// 该中间件用于根据服务名动态发现后端服务,并通过负载均衡策略反向代理请求到相应的后端服务。
func ReverseProxy() gin.HandlerFunc {
return func(c *gin.Context) {
serverInterface, ok := c.Get("service")
if !ok {
common.ResponseError(c, e.ErrGateway, errors.New("从上下文中获取服务失败"))
c.Abort()
return
}
serviceDetail := serverInterface.(*dao.ServiceDetail)
lb, err := load_balancer.Handler.Get(serviceDetail)
if err != nil {
common.ResponseError(c, e.ErrGateway,
errors.New(fmt.Sprintf("获取负载均衡器错误, 服务名: %s Err: %v", serviceDetail.Info.ServiceName, err)))
c.Abort()
return
}
proxy := reverse_proxy.NewLoadBalanceReverseProxy(c, lb)
// 创建一个InterceptingResponseWriter实例
interceptingWriter := &InterceptingResponseWriter{
ResponseWriter: c.Writer,
body: bytes.NewBuffer(nil),
}
// 执行代理请求
proxy.ServeHTTP(interceptingWriter, c.Request)
// 在代理请求之后,interceptingWriter.body 包含了响应数据
responseBody := interceptingWriter.body.String()
response, _ := json.Marshal(responseBody)
c.Set("response", string(response))
c.Abort()
return
}
}
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/os-lee/easy-paas.git
git@gitee.com:os-lee/easy-paas.git
os-lee
easy-paas
easy-paas
6cf1638f64c0

搜索帮助