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回答

牛儿吃草

2020-12-03

没有出现你说的问题,建议检查一下本地是不是端口被占用了。
lsof -i :2002

//img.mukewang.com/szimg/5fc8ebe5094f9da715640224.jpg

另外demo/proxy/websocket/server/main.go里面调整了一个同域检查方法,因为上游依赖github.com/gorilla/websocket类库做了升级,所以需要适配一下。

0
2
kucfire
我也是遇到一样的问题,现在还没解决
2020-12-17
共2条回复

慕斯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反向代理就成功了。

1
0

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))


1
1
kucfire
好像是直接用SliceRouterContext是因为没有把初始化,但是底层原因我找不出来
2020-12-17
共1条回复

慕少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() 进行初始化, 改下代码就行了。


搜索

复制

0
0

牛儿吃草

2020-11-14

同学麻烦贴一下完整代码

0
1
少年非正式
代码就是 demo 里面的源代码,没有改动。
2020-11-19
共1条回复

(打造简历金牌项目)Vue+Go 开发企业级微服务网关项目

简历中摒弃烂大街的培训机构项目,带你开发企业级微服务网关

1316 学习 · 352 问题

查看课程