websocket 反向代理有问题的
来源:8-3 websocket代理如此简单

少年非正式
2020-11-10
- 前提
websocket server 已经打开且正常通过测试。
Starting websocket server at localhost:2003
recv: Hello world!
read: websocket: close 1001 (going away)
websocker proxy 启动正常。
Starting httpserver at 127.0.0.1:2002
- 问题
访问 localhost:2002
127.0.0.1:2002
以及 ip地址 + 2002
均失败,无法打开网页。
报错如下:
http: panic serving 127.0.0.1:51747: cannot create context from nil parent
web socket proxy 源代码:
package main
import (
"github.com/e421083458/gateway_demo/proxy/load_balance"
"github.com/e421083458/gateway_demo/proxy/middleware"
proxy2 "github.com/e421083458/gateway_demo/proxy/proxy"
"log"
"net/http"
)
var (
addr = "127.0.0.1:2002"
)
func main() {
rb := load_balance.LoadBanlanceFactory(load_balance.LbWeightRoundRobin)
rb.Add("http://127.0.0.1:2003", "50")
proxy := proxy2.NewLoadBalanceReverseProxy(&middleware.SliceRouterContext{}, rb)
log.Println("Starting httpserver at " + addr)
log.Fatal(http.ListenAndServe(addr, proxy))
}
5回答
-
没有出现你说的问题,建议检查一下本地是不是端口被占用了。
lsof -i :2002
另外demo/proxy/websocket/server/main.go里面调整了一个同域检查方法,因为上游依赖github.com/gorilla/websocket类库做了升级,所以需要适配一下。022020-12-17 -
慕斯1088534
2021-03-09
我遇到的问题是这样的:
var upgrader = websocket.Upgrader{} 如果使用默认配置会出现错误信息如下:
upgrade:websocket: request origin not allowed by Upgrader.CheckOrigin
改成:var upgrader = websocket.Upgrader{
ReadBufferSize: 1024,
WriteBufferSize: 1024,
// 解决跨域问题
CheckOrigin: func(r *http.Request) bool {
return true
},
}
这样修改后问题就解决了。 websocket反向代理就成功了。10 -
kucfire
2020-12-17
解决了,老哥,想middleware那一章一样包装一下
coreFunc := func(c *middleware.SliceRouterContext) http.Handler { rb := factory.LoadBalanceFactory(factory.LbWeightRoundRobin) rb.Add("http://127.0.0.1:2003", "50") return NewLoadBalanceReverseProxy(c, rb) // proxy := NewMultipleHostsReverseProxy(rb) } // 初始化方法数组路由器 sliceRouter := middleware.NewSliceRouter() // sliceRouter.Group("/").Use(middleware.RateLimiter()) routerHandler := middleware.NewSliceRouterHandler(coreFunc, sliceRouter) log.Println("Start http server at:" + addr) log.Fatal(http.ListenAndServe(addr, routerHandler))
112020-12-17 -
慕少2319358
2022-06-25
proxy 里的 main 方法 改成下面这样就可以了
func main() {
rb := load_balance.LoadBanlanceFactory(load_balance.LbWeightRoundRobin)
rb.Add("http://127.0.0.1:2003", "50")
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
routerContext := &middleware.SliceRouterContext{
Rw: w,
Req: r,
Ctx: r.Context(),
}
proxy2.NewLoadBalanceReverseProxy(routerContext, rb).ServeHTTP(w, r)
})
log.Println("Starting httpserver at " + addr)
log.Fatal(http.ListenAndServe(addr, nil))
}
proxy2.NewLoadBalanceReverseProxy(&middleware.SliceRouterContext{}, rb) 这个方法
里面有用 c.Set("status_code", resp.StatusCode)
最后使用 context.WithValue(c.Ctx, key, val) 。&middleware.SliceRouterContext{} 这里默认是 nil的,
所以会报错: cannot create context from nil parent !
缺了一步,把 Ctx: r.Context() 进行初始化, 改下代码就行了。
搜索
复制
00 -
牛儿吃草
2020-11-14
同学麻烦贴一下完整代码
012020-11-19
相似问题