go startGrpcGataway() 运行

go startGrpcGataway() 运行

go startGrpcGataway() 运行代码  浏览器访问 http://localhost:8080/trip/1231

浏览器报错 ERR_CONNECTION_REFUSED


去除 go 关键词 之后浏览器 访问 http://localhost:8080/trip/1231 正常返回结果


正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

5回答
becky_wang 2021-07-11 00:58:11

你这个代码抄混了  你贴的这个main函数里不应该是客户端的  应该是开启trip的grpc服务以及开启gateway的服务

  • 提问者 jiugemei #1

    没有混的,这里我理解的是老师的一个技巧,想起两个服务的

    2021-07-11 01:06:35
becky_wang 2021-07-11 00:53:13

你的这个main函数既做了服务端也做了客户端  不知道你这样设计的意思是啥

vastyang 2021-07-06 01:56:04

同学,我起初遇到跟你一样的问题了,后来我检查发现代码没有重新运行,囧~

ccmouse 2021-06-27 09:48:18

我又仔细看了下,去除 go 关键词能返回正常结果?去除的话应该卡在startGrpcGateway处,后面的GRPC服务开不出来,应该能获得结果,但也不会是正常的。贴一下完整代码吧。

  • 提问者 jiugemei #1

    老师我这里可以说有两个问题 :

        ​1去除go 关键词 运行程序 http 服务可以启动 正常返回json 数据但是 (tcp 和 http 不能并行执行)

        ​2 加入go 关键词 运行程序 tcp服务正常返回结果 运行服务 http 浏览器报 ERR_CONNECTION_REFUSED

        ​(感觉不是防火墙的问题,因为去处go 关键词  运行服务http 也能正常执行)  

        ​有go 关键词的代码 http.ListenAndServe  ​后面也打印过 数据 (程序没有走到)

    我是直接抄的课程代码 对比好几次,现在的问题是
        可以运行,没有报错, 但是浏览器访问不了,我开始也以为是防火墙等问题,然后去掉了 go关键字后运行,浏览器是可以访问的,卡在startGrpcGateway处

    func main() {

        ​//go http.ListenAndServe(":8080", nil)

        ​startGrpcGataway()

        ​

        ​//客户端启用一个链接端口

        ​client, err := grpc.Dial("localhost:8082", grpc.WithInsecure())

        ​if err != nil {

        ​log.Fatalf("监听端口错误:%s", err)

        ​}

        ​

        ​//启用trip的监听服务

        ​tripClient := trippb.NewTripServerClient(client)

        ​

        ​//s实现trip方法

        ​respon, err := tripClient.GetTrips(context.Background(), &trippb.GetTripRequest{Id: "abd1231"})

        ​if err != nil {

        ​

        ​log.Fatalf("向服务端发送请求错误:%s", err)

        ​}


    fmt.Println(respon)

    }


    func startGrpcGataway() {

        ​fmt.Println(1231321)

        ​c := context.Background()

        ​c, cancel := context.WithCancel(c)

        ​defer cancel()

        ​

        ​Mux := runtime.NewServeMux(

        ​runtime.WithMarshalerOption(

        ​runtime.MIMEWildcard, &runtime.JSONPb{

        ​protojson.MarshalOptions{

        ​UseEnumNumbers: true,

        ​UseProtoNames:  true,

        ​},

        ​protojson.UnmarshalOptions{},

        ​},

        ​))

        ​

        ​err := trippb.RegisterTripServerHandlerFromEndpoint(

        ​c,

        ​Mux,

        ​":8082",

        ​[]grpc.DialOption{grpc.WithInsecure()},

        ​)

        ​

        ​if err != nil {

        ​log.Fatalf("注册服务链接:%v", err)

        ​}

        ​fmt.Println(3333)

        ​//启用客户端http监听服务

        ​err = http.ListenAndServe(":8080", Mux)

        ​// fmt.Println(4444)

        ​if err != nil {

        ​log.Fatalf("监听客户端服务:%v", err)

        ​}

    }




    2021-06-27 13:19:44
  • ccmouse 回复 提问者 jiugemei #2

    加了go以后,你的main函数就会往下走,发了一个tcp并打印结果以后就退出了。main函数一旦退出,所有的goroutine都会被杀掉,你的程序也就退出了。所以之后再使用浏览器就无法访问。

    反之,去掉go以后,程序会起一个grpc gateway服务器,并且进行监听,逻辑会卡在startGrpcGataway里面。这也是我们希望的,服务器一旦起来我们希望他一直在运行,来服务客户端。所以卡在这里的话,后面的这个tcp请求就没法发送了。

    一个修改方法是使用了go startGrpcGateway后,main函数的最后加上sleep,给一个比较长的时间,那样我们的http服务还是可以被访问。


    总的来说,这段代码一方面起了grpc gateway服务器,一方面发送了一条grpc请求,他们没有必要做在一个可执行的程序里。可以参考一下我的代码: https://git.imooc.com/class-108/coolcar/src/week7_%e6%8e%a5%e5%85%a5%e5%be%ae%e6%9c%8d%e5%8a%a1GRPC/server/main.go#L25 main函数用go起了grpc gateway服务器,并且在main里起了grpc服务器,在s.Serve处也会卡住,不断等待grpc请求的到来来进行服务。这样我们的两个服务器都不会退出。


    2021-06-30 19:21:23
ccmouse 2021-06-27 09:44:52

看一下加了go以后,main函数还在不在,服务器是不是已经退出了或者是哪里panic了。另外在http.ListenAndServe处打印一些文字,看看有没有真的运行到。


另一方面注意一下防火墙会不会把端口屏蔽了,注意一下弹框或者右下角提示。

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师