温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

GO版gRPC开发方法是什么

发布时间:2021-12-13 14:47:38 来源:亿速云 阅读:107 作者:iii 栏目:云计算

本篇内容主要讲解“GO版gRPC开发方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“GO版gRPC开发方法是什么”吧!

环境相关

  • 接下来的开发都是在$GOPATH目录下进行的,我这里的真实目录是/home/golang/gopath

  • /home/golang/gopath/src目录下新建helloworld目录,作为接下来的实战用到的目录;

  • 在完成本篇的所有开发后,最终$GOPATH/src/helloworld目录下的内容如下:

[golang@centos7 src]$ tree helloworld/
helloworld/
├── client
│   └── client.go
├── helloworld.pb.go
├── helloworld.proto
└── server
    └── server.go

2 directories, 4 files

编写proto文件

  • proto文件用来描述远程服务相关的信息,如方法签名、数据结构等,本篇的proto文件名为helloworld.proto,位置是$GOPATH/src/helloworld,内容如下:

// 协议类型syntax = "proto3";// 包名package helloworld;// 定义的服务名service Greeter {
   
   
   
  // 具体的远程服务方法
  rpc SayHello (HelloRequest) returns (HelloReply) {
   
   
   }}// SayHello方法的入参,只有一个字符串字段message HelloRequest {
   
   
   
  string name = 1;}// SayHello方法的返回值,只有一个字符串字段message HelloReply {
   
   
   
  string message = 1;}

根据proto生成go源码

  1. helloworld.proto所在的目录,执行以下命令:

protoc --go_out=plugins=grpc:. helloworld.proto
  1. 如果helloworld.proto没有语法错误,会在当前目录生成文件helloworld.pb.go,这里面是工具protoc-gen-go自动生成的代码,里面生成的代码在开发服务端和客户端时都会用到;

  2. 下面是helloworld.pb.go的代码片段,作用是服务注册,入参是GreeterServer是个接口,由此可以推测:在服务端,由具体的业务代码来实现GreeterServer接口,并且调用RegisterGreeterServer方法注册,这样客户端远程调用的服务就可以实现业务功能了:

func RegisterGreeterServer(s *grpc.Server, srv GreeterServer) {
   
   
   
	s.RegisterService(&_Greeter_serviceDesc, srv)}type GreeterServer interface {
   
   
   // 具体的远程服务方法SayHello(context.Context, *HelloRequest) (*HelloReply, error)}
  1. 借助GoLand的Structure面板,可以进一步观察helloworld.pb.go:
    GO版gRPC开发方法是什么

编写服务端代码server.go并启动

  1. $GOPATH/src/helloworld目录下新建文件夹server,在此文件夹下新建server.go,内容如下,已经添加详细注释:

package mainimport ("context""log""net""google.golang.org/grpc"
	pb "helloworld")const (
	port = ":50051")// 定义结构体,在调用注册api的时候作为入参,
// 该结构体会带上SayHello方法,里面是业务代码
// 这样远程调用时就执行了业务代码了type server struct {
   
   
   
	// pb.go中自动生成的,是个空结构体
	pb.UnimplementedGreeterServer}// 业务代码在此写,客户端远程调用SayHello时,
// 会执行这里的代码
func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
   
   
   
	// 打印请求参数
	log.Printf("Received: %v", in.GetName())
	// 实例化结构体HelloReply,作为返回值	return &pb.HelloReply{
   
   
   Message: "Hello " + in.GetName()}, nil}func main() {
   
   
   
	// 要监听的协议和端口
	lis, err := net.Listen("tcp", port)if err != nil {
   
   
   
		log.Fatalf("failed to listen: %v", err)}

	// 实例化gRPC server结构体
	s := grpc.NewServer()

	// 服务注册
	pb.RegisterGreeterServer(s, &server{
   
   
   })

	log.Println("开始监听,等待远程调用...")if err := s.Serve(lis); err != nil {
   
   
   
		log.Fatalf("failed to serve: %v", err)}}
  1. 在server.go所在目录执行go run server.go,控制台提示如下:

[golang@centos7 server]$ go run server.go 
2020/12/13 08:20:32 开始监听,等待远程调用...
  1. 此时gRPC的服务端已经启动,可以响应远程调用,接下来开发客户端代码;

编写客户端代码client.go并启动

  1. 再打开一个控制台;

  2. $GOPATH/src/helloworld目录下新建文件夹client,在此文件夹下新建client.go,内容如下,已经添加详细注释:

package mainimport ("context""log""os""time""google.golang.org/grpc"
	pb "helloworld")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)}// main方法执行完毕后关闭远程连接defer conn.Close()// 实例化数据结构
	c := pb.NewGreeterClient(conn)// 远程调用的请求参数,如果没有从命令行传入,就用默认值
	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())}
  1. 在client.go所在目录执行go run client.go,会立即向服务端发起远程调用,控制台提示如下,可见得到了服务端的返回信息Hello world

[golang@centos7 client]$ go run client.go
2020/12/13 08:38:05 Greeting: Hello world
  1. 再去服务端的控制台看一下,通过日志发现业务代码被执行,收到了远程请求的参数:

[golang@centos7 server]$ go run server.go 
2020/12/13 08:20:32 开始监听,等待远程调用...
2020/12/13 08:38:05 Received: world
  1. 回到客户端控制台,在命令行带参数试试,输入go run client.go abc,收到服务端响应如下:

[golang@centos7 client]$ go run client.go abc
2020/12/13 08:56:36 Greeting: Hello abc
  1. 再去服务端的控制台看一下,成功收到了abc

[golang@centos7 server]$ go run server.go 
2020/12/13 08:20:32 开始监听,等待远程调用...
2020/12/13 08:38:05 Received: world
2020/12/13 08:56:36 Received: abc

到此,相信大家对“GO版gRPC开发方法是什么”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI