zoukankan      html  css  js  c++  java
  • Golang + gRPC 实践

    安装

    安装protobuf

    go get -u github.com/golang/protobuf/proto
    
    go get -u github.com/golang/protobuf/protoc-gen-go
    

    命令执行会在GOPATH/bin目录下自动生成protoc-gen-go.exe可执行文件;

    另外还需要一个proto.exe可执行文件,可以从https://github.com/google/protobuf/releases自行下载,同样放到GOPATH/bin目录下;

    安装gRPC

    go get -u google.golang.org/grpc
    

    实例

    目录结构
    在这里插入图片描述

    编写.proto文件

    syntax = "proto3"; // proto版本
    package love; // 指定包名,默认go中包名也是这个
    
    option go_package = "love"; // 指定go包名
    
    // 定义Love服务
    service Love {
      // 定义Confession方法
      rpc Confession(Request) returns (Response) {}
    }
    
    // 请求
    message Request {
      string name = 1;
    }
    
    // 响应
    message Response {
      string result = 1;
    }
    

    编译生成.pb.go文件

    $ cd test/gRPC/proto/love
    
    # 编译love.proto
    $ protoc -I . --go_out=plugins=grpc:. ./love.proto
    

    实现服务端接口

    package main
    
    import (
       "context"
       "google.golang.org/grpc"
       "log"
       "net"
       "test/gRPC/proto/love"
    )
    
    // 定义Love服务
    type Love struct {
    }
    
    // 实现Love服务接口
    func (l *Love) Confession(ctx context.Context, request *love.Request) (*love.Response, error) {
       resp := &love.Response{}
       resp.Result = "I love you " + request.Name
       return resp, nil
    }
    
    func main() {
       // 监听8888端口
       listen, err := net.Listen("tcp", ":8888")
       if err != nil {
          log.Fatal(err)
       }
    
       // 实例化grpc server
       s := grpc.NewServer()
    
       // 注册Love服务
       love.RegisterLoveServer(s, new(Love))
    
       log.Println("Listen on 127.0.0.1:8888...")
       s.Serve(listen)
    }
    

    实现客户端调用

    package main
    
    import (
       "context"
       "google.golang.org/grpc"
       "log"
       "test/gRPC/proto/love"
    )
    
    func main() {
       // 连接grpc服务
       conn, err := grpc.Dial(":8888", grpc.WithInsecure())
       if err != nil {
          log.Fatal(err)
       }
       // 很关键
       defer conn.Close()
    
       // 初始化客户端
       c := love.NewLoveClient(conn)
    
       // 发起请求
       response, err := c.Confession(context.Background(), &love.Request{Name: "BaoBao"})
       if err != nil {
          log.Fatal(err)
       }
    
       log.Println(response.Result)
    }
    

    运行结果
    在这里插入图片描述
    在这里插入图片描述
    公众号:李田路口

  • 相关阅读:
    SVN版本库备份和恢复
    Jira的安装使用
    前端CSS的选择器整理搜集 s
    事务复制在不重新初始化的情况下添加新表
    没有共享存储和仲裁盘的SQL Server 2012HADR故障手动切换TSQL
    SQLSERVER聚集索引的整理(重建)的必要性测试
    sqlserver字符串与表格互相转换的函数和方法
    当一个DBA离职时,如何清除掉数据库里属于他的那些“东西”
    SQLSERVER复制订阅中的数据库版本选择
    1979年12月3日世界协调时间取代格林威治准时间
  • 原文地址:https://www.cnblogs.com/dubinyang/p/13945574.html
Copyright © 2011-2022 走看看