grpc入门

grpc是google公司开发的远程调用协议rpc. 官网https://www.grpc.io/

必备条件

  • 生成工具

    • protoc
      • apt 安装
  • 插件

    • go语言插件(go install 安装)
      • protoc-gen-go
      • protoc-gen-go-grpc

步骤

  • 定义proto文件

    syntax = "proto3";
    
    option go_package = "pb/";
    
    package pb;
    
    service HelloService {
        rpc Hello(HelloRequest) returns (HelloReplay) {}
    }
    
    message HelloRequest {
        string name = 1;
    }
    
    message HelloReplay {
        string message = 1;
    }
    
  • 服务端

    • main.go
    package main
    
    import (
    	"hello/pb"
    	"net"
    
    	"google.golang.org/grpc"
    )
    
    func main() {
    	lis, err := net.Listen("tcp4", ":9000")
    	if err != nil {
    		panic(err)
    	}
    
    	s := grpc.NewServer()
    
    	pb.RegisterHelloServiceServer(s, &server{})
    	err = s.Serve(lis)
    	if err != nil {
    		panic(err)
    	}
    }
    
    
    • server.go
    package main
    
    import (
    	"context"
    	"hello/pb"
    )
    
    type server struct {
    	pb.UnimplementedHelloServiceServer
    }
    
    func (s *server) Hello(ctx context.Context, in *pb.HelloRequest) (out *pb.HelloReplay, err error) {
    	out = &pb.HelloReplay{
    		Message: "Hello," + in.GetName(),
    	}
    	return
    }
    
    
  • 客户端

    • main.go
    package main
    
    import (
    	"context"
    	"log"
    	"time"
    
    	"google.golang.org/grpc"
    
    	"hello/pb"
    )
    
    func main() {
    	conn, err := grpc.Dial("127.0.0.1:9000", grpc.WithInsecure())
    	if err != nil {
    		panic(err)
    	}
    
    	defer conn.Close()
    	c := pb.NewHelloServiceClient(conn)
    
    	ctx, cancel := context.WithTimeout(context.Background(), time.Second)
    	defer cancel()
    	r, err := c.Hello(ctx, &pb.HelloRequest{Name: "桥三"})
    	if err != nil {
    		panic(err)
    	}
    	log.Printf("还: %s", r.GetMessage())
    }
    
    
posted @   jiftle  阅读(93)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
历史上的今天:
2019-06-14 UML入门
2019-06-14 时间管理GTD
2019-06-14 Linux下打开超大文件的方法
2017-06-14 Java 调用 C/C++ 之 JNA 系列实战篇 —— 输出char * (六)
2017-06-14 eclipse快捷键
2017-06-14 maven仓库镜像配置
点击右上角即可分享
微信分享提示