golang grpc 双向

使用grpc双向模式,可以实现客户端随时发送消息给服务端,服务端也可以随时发送消息到客户端,不再是一问一答的模式。

grpc_stream/hellowoldstream/helloworldstream.proto

syntax = "proto3";
package pb;

message HelloRequest {
  string username = 1;
}

message HelloResponse {
  string message = 1;
}

// +
message ClientStream {
    bytes stream = 1;
}
message ServerStream {
    bytes stream = 1;
}
service HelloService {
  rpc SayHello(HelloRequest) returns (HelloResponse){}

  rpc Chat(stream ClientStream) returns (stream ServerStream){}
}

protoc --go_out=plugins=grpc:. helloworldstream.proto 生成 helloworldstream.pb.go

grpc_stream/server_stream.go

package main

import (
    "context"
    "fmt"
    "io"
    "net"
    "strconv"
    "time"

    pb "github.com/mypractise/grpc/grpc_stream/helloworldstream"
    "google.golang.org/grpc"
)

type HelloService struct {
}

func (hs *HelloService) SayHello(ctx context.Context, req *pb.HelloRequest) (*pb.HelloResponse, error) {
    return &pb.HelloResponse{Message: fmt.Sprintf("你好,%s", req.Username)}, nil
}

// ++++++++++++++++++++++++++++++++
func (hs *HelloService) Chat(conn pb.HelloService_ChatServer) error {
    go func() {
        var i int = 100
        for {
            time.Sleep(2 * time.Second)
            conn.Send(&pb.ServerStream{Stream: []byte("server send i:" + strconv.Itoa(i))})
            i++
        }
    }()

    for {
        time.Sleep(2 * time.Second)
        stream, err := conn.Recv()
        if err == io.EOF {
            return nil
        }
        if err != nil {
            return err
        }
        fmt.Println("server recv:", string(stream.Stream))
        // fmt.Println("receive from client:", stream.Stream)

    }

    return nil
}

// ++++++++++++++++++++

func main() {
    lis, err := net.Listen("tcp", ":6001")
    if err != nil {
        fmt.Println(err.Error())
        return
    }
    s := grpc.NewServer()
    pb.RegisterHelloServiceServer(s, &HelloService{})
    go func() {
        s.Serve(lis)
    }()
    fmt.Println(s.GetServiceInfo())
    select {}
}

func newBytes(a ...byte) []byte {
    return a
}

grpc_stream/client_stream.go

package main

import (
    "context"
    "fmt"
    "io"
    "strconv"

    "time"

    pb "github.com/mypractise/grpc/grpc_stream/helloworldstream"
    "google.golang.org/grpc"
)

func main() {
    conn, e := grpc.Dial("localhost:6001", grpc.WithInsecure())
    if e != nil {
        fmt.Println(e.Error())
        return
    }
    defer conn.Close()
    c := pb.NewHelloServiceClient(conn)
    // // say hello
    // r, e := c.SayHello(context.Background(), &pb.HelloRequest{Username: "ft"})
    // if e != nil {
    //     fmt.Println(e.Error())
    //     return
    // }
    // fmt.Println(r.Message)

    // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    // chat
    chatClilent, e := c.Chat(context.Background())
    if e != nil {
        fmt.Println(e.Error())
        return
    }
    go func() {
        for {
            time.Sleep(3 * time.Second)
            stream, e := chatClilent.Recv()
            if e == io.EOF {
                fmt.Println("EOF")
                return
            }
            if e != nil {
                fmt.Println("-----err:", e)
                return
            }
            fmt.Println("client recv:", string(stream.Stream))
        }
    }()

    go func() {
        i := 0
        for {
            time.Sleep(3 * time.Second)
            chatClilent.Send(&pb.ClientStream{Stream: []byte("client send i:" + strconv.Itoa(i))})
            i++
        }
    }()
    select {
    case <-time.After(20 * time.Second):
    }
}

func newBytes(a ...byte) []byte {
    return a
}

原文地址:https://www.cnblogs.com/chaselogs/p/11776250.html

时间: 2024-08-30 12:30:10

golang grpc 双向的相关文章

golang grpc UnaryServerInterceptor用法

有的时候,当进行grpc调用的时候,并不希望客户端与服务端建立连接后直接就进入对应的方法体内.比如需要验证签名来确认客户端的身份,再执行相应的方法.这个时候就可以哟拿到Interceptor. golang grpc的拦截器(Interceptor)为UnaryServerInterceptor,为一个指向函数的指针. UnaryServerInterceptor在服务端对于一次RPC调用进行拦截.UnaryServerInterceptor是一个函数指针,当客户端进行grpc调用的时候,首先并

Golang gRPC 示例

1.安装gRPC runtime go get google.golang.org/grpc 为了自动生成Golang的gRPC代码,需要安装protocal buffers compiler以及对应的GoLang插件 2.protocal buffer安装 从https://github.com/google/protobuf/releases下载安装包,例如:protobuf-cpp-3.0.0-beta-3.zip,解压后 ./configure make && make insta

golang grpc demo

grpm安装: git clone https://github.com/grpc/grpc-go.git $GOPATH/src/google.golang.org/grpc proto,protoc-gen-go安装: go get -u github.com/golang/protobuf/{proto,protoc-gen-go} 原文地址:https://www.cnblogs.com/wangjq19920210/p/11572283.html

Golang gRPC中间件:拦截器链接,验证,日志记录,重试等

gRPC Go Middleware: interceptors, helpers, utilities. Middleware gRPC Go recently acquired support for Interceptors, i.e. middleware that is executed either on the gRPC Server before the request is passed onto the user's application logic, or on the

PHP与Golang如何通信?

最近遇到的一个场景:php项目中需要使用一个第三方的功能(结巴分词),而github上面恰好有一个用Golang写好的类库.那么问题就来了,要如何实现不同语言之间的通信呢? 常规的方案: 用Golang写一个http/TCP服务,php通过http/TCP与Golang通信 将Golang经过较多封装,做为php扩展. PHP通过系统命令,调取Golang的可执行文件 存在的问题: http请求,网络I/O将会消耗大量时间 需要封装大量代码 PHP每调取一次Golang程序,就需要一次初始化,时

(译)xDS REST and gRPC protocol

xDS REST and gRPC protocol 原文地址:xDS REST and gRPC protocol. envoy可通过文件系统.一个或多个管理服务器来发现各种动态资源.这些服务发现和他们相对应的API统称为xDS.通过定阅方式获取资源,如监控指定的文件路径.gRPC流或轮询REST-JSON URL.后两种使用DiscoveryRequest来发送请求消息.所有的资源包含在DiscoveryResponse响应消息中.下面,我们将讨论每种订阅类型. 文件订阅 动态配置最简单的方

Dapr Pub/Sub 集成 RabbitMQ 、Golang、Java、DotNet Core

前置条件: <Dapr运用> <Dapr 运用之 Java gRPC 调用篇> <Dapr 运用之集成 Asp.Net Core Grpc 调用篇> 搭建 RabbitMQ Docker 搭建 RabbitMQ 服务 docker run -d --hostname my-rabbit --name some-rabbit -p 5672:5672 -p 15672:15672 rabbitmq:3-management 创建 rabbiqmq.yaml apiVers

Go开发中的十大常见陷阱[译]

原文: The Top 10 Most Common Mistakes I've Seen in Go Projects 作者: Teiva Harsanyi 译者: Simon Ma 我在Go开发中遇到的十大常见错误.顺序无关紧要. 未知的枚举值 让我们看一个简单的例子: type Status uint32 const ( StatusOpen Status = iota StatusClosed StatusUnknown ) 在这里,我们使用iota创建了一个枚举,其结果如下: Stat

上周热点回顾(9.23-9.29)

热点随笔: · .NET Conf 2019 大会上发布.NET Core 3.0 (张善友)  · 程序员写 2000 行 if else?领导:这个锅我不背 (小柒2012)  · 多事之秋-最近在阿里云上遇到的问题:负载均衡失灵.服务器 CPU 100%.被 DDoS 攻击 (博客园团队)  · 程序员过关斩将--要想获取我的用户信息,就得按照规矩来 (架构师修行之路)  · ASP.NET Core 3.0 使用gRPC (晓晨Master)  · [翻译] ASP.NET Core 3