请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

websocket 反向代理有问题的

  • 前提

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

https://img1.sycdn.imooc.com//szimg/5fc8ebe5094f9da715640224.jpg

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

0 回复 有任何疑惑可以回复我~
  • 提问者 少年非正式 #1
    非常感谢!
    回复 有任何疑惑可以回复我~ 2020-12-11 21:10:46
  • kucfire #2
    我也是遇到一样的问题,现在还没解决
    回复 有任何疑惑可以回复我~ 2020-12-17 01:57:06
慕斯1088534 2021-03-09 11:25:35

我遇到的问题是这样的:

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 回复 有任何疑惑可以回复我~
kucfire 2020-12-17 11:50:23

解决了,老哥,想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 回复 有任何疑惑可以回复我~
  • kucfire #1
    好像是直接用SliceRouterContext是因为没有把初始化,但是底层原因我找不出来
    回复 有任何疑惑可以回复我~ 2020-12-17 11:54:12
慕少2319358 2022-06-25 14:16:52

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 回复 有任何疑惑可以回复我~
牛儿吃草 2020-11-14 11:40:32

同学麻烦贴一下完整代码

0 回复 有任何疑惑可以回复我~
  • 提问者 少年非正式 #1
    代码就是 demo 里面的源代码,没有改动。
    回复 有任何疑惑可以回复我~ 2020-11-19 14:46:27
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信