ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

grpc实战(1)简单实现helloworld

2022-05-03 17:35:28  阅读:299  来源: 互联网

标签:实战 log err grpc helloworld pb go


1、创建项目grpc_demo文件架构,项目架构如下:

 

 2、在helloworld文件夹下创建hello_world.proto文件,内容如下:

//声明proto的版本 只有 proto3 才支持 gRPC
syntax = "proto3";
// 将编译后文件输出在 github.com/lixd/grpc-go-example/helloworld/helloworld 目录
option go_package = "github.com/lixd/grpc-go-example/helloworld/helloworld";
// 指定当前proto文件属于helloworld包
package helloworld;

// 定义一个名叫 greeting 的服务
service Greeter {
  // 该服务包含一个 SayHello 方法 HelloRequest、HelloReply分别为该方法的输入与输出
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}
// 具体的参数定义
message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}

3、在helloworld目录下运行如下命令:

protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative  ./hello_world.proto

  此时,helloworld文件下会出现后缀为pb.go和_grpc.pb.go的两个文件。

4、编写server代码:

具体步骤如下:

  • 1)定义一个结构体,必须包含pb.UnimplementedGreeterServer 对象;
  • 2)实现 .proto文件中定义的API;
  • 3)将服务描述及其具体实现注册到 gRPC 中;
  • 4)在server目录下分别运行命令go mod init server、go mod tidy;
  • 5)启动服务。
package main

import (
	"context"
	"log"
	"net"

	pb "github.com/lixd/grpc-go-example/helloworld/helloworld"
	"google.golang.org/grpc"
)

const (
	port = ":50051"
)

// greeterServer 定义一个结构体用于实现 .proto文件中定义的方法
// 新版本 gRPC 要求必须嵌入 pb.UnimplementedGreeterServer 结构体
type greeterServer struct {
	pb.UnimplementedGreeterServer
}

// SayHello 简单实现一下.proto文件中定义的 SayHello 方法
func (g *greeterServer) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
	log.Printf("Received: %v", in.GetName())
	return &pb.HelloReply{Message: "Hello " + in.GetName()}, nil
}

func main() {
	listen, err := net.Listen("tcp", port)
	if err != nil {
		log.Fatalf("failed to listen: %v", err)
	}
	s := grpc.NewServer()
	// 将服务描述(server)及其具体实现(greeterServer)注册到 gRPC 中去.
	// 内部使用的是一个 map 结构存储,类似 HTTP server。
	pb.RegisterGreeterServer(s, &greeterServer{})
	log.Println("Serving gRPC on 0.0.0.0" + port)
	if err := s.Serve(listen); err != nil {
		log.Fatalf("failed to serve: %v", err)
	}
}

5、编写client代码:

具体步骤如下:

  • 1)首先使用 grpc.Dial() 与 gRPC 服务器建立连接;
  • 2)使用pb.NewGreeterClient(conn)获取客户端;
  • 3)通过客户端调用ServiceAPI方法client.SayHello
  • 4)在client目录下分别运行命令go mod init client、go mod tidy;
  • 5)运行客户端。
package main

import (
	"context"
	"log"
	"os"
	"time"

	pb "github.com/lixd/grpc-go-example/helloworld/helloworld"
	"google.golang.org/grpc"
)

const (
	address     = "localhost:50051"
	defaultName = "world"
)

func main() {
	conn, err := grpc.Dial(address, grpc.WithInsecure(), grpc.WithBlock())
	if err != nil {
		log.Fatalf("did not connect: %v", err)
	}
	defer conn.Close()
	c := pb.NewGreeterClient(conn)

	// 通过命令行参数指定 name
	name := defaultName
	if len(os.Args) > 1 {
		name = os.Args[1]
	}
	ctx, cancel := context.WithTimeout(context.Background(), time.Second)
	defer cancel()
	r, err := c.SayHello(ctx, &pb.HelloRequest{Name: name})
	if err != nil {
		log.Fatalf("could not greet: %v", err)
	}
	log.Printf("Greeting: %s", r.GetMessage())
}

  

参考:(29条消息) 史上最细gRPC(Go)入门教程(二)---gRPC初体验--hello world_指月小筑的博客-CSDN博客

标签:实战,log,err,grpc,helloworld,pb,go
来源: https://www.cnblogs.com/mango1997/p/16218781.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有