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

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

  • 相关阅读:
    阿里云安骑士和云盾不能检测连接服务器问题
    UDP反射DDoS攻击原理和防范
    linux查看端口是否开放
    记一次阿里云服务器被用作DDOS攻击肉鸡
    记一次阿里云负载测试
    mysql定时任务event——清理过期数据
    ansible(一)
    基于python实现的三方组件----Celery
    MongoDB
    flask相关使用
  • 原文地址:https://www.cnblogs.com/dubinyang/p/13945574.html
Copyright © 2011-2022 走看看