grpc实战二:环境搭建及简单demo

Grpc实战二:环境搭建及简单demo

2.1 grpc环境安装

2.1.1 golang环境安装

接下来的所有的教程以及代码都是golang代码进行演示,所以我们需要安装golang环境: 下载地址:golang 官网

安装完在你的命令行工具输入

go version

就可以看到对应的下载版本

grpc实战二:环境搭建及简单demo

然后就可以了。

2.1.2 protoc 安装

在 gRPC 开发中,我们常常需要与 Protobuf 进行打交道,而在编写了.proto 文件后,我们会需要到一个编译器,就是protoc。这个工具呢可以在GitHub上直接下载

https://github.com/protocolbuffers/protobuf/releases

大家可以在这个网站自行下载安装(因为之前这里安装完了,也不想重装了,可能记得不太清了,你们直接试一试就好了,等下次重装再丰富这里) 一般操作是把protoc编译文件所在的目录配到环境变量里就好了 安装完后:

运行

protoc --version

就可以看见版本信息了

grpc实战二:环境搭建及简单demo

2.1.2 安装相关依赖包

安装 golang 的proto工具包

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

安装 goalng 的proto编译支持

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

安装 gRPC 包

go get -u google.golang.org/grpc

这样子就基本上结束对于环境的安装了

2.2 grpc简单demo

2.2.1 protocol buffer 语法

在gRPC中主要以protocol buffer来定义api以及服务,所以我们需要先了解一下protocol buffer的语法。protocol buffer主要使用中有两个版本:proto2和proto3,这里呢,推荐大家使用proto3进行日常开发。

可参考谷歌对于protocol buffer proto3版本的的文档 Language Guide (proto3) 或者千念飞羽大大翻译的Protobuf3语言指南

接下来是一个官网简单protocol buffer demo:

// Copyright 2015 gRPC authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

//指定proto3语法
syntax = "proto3";

//输出到当前目录
option go_package = "./";
//包名
package helloworld;

// hello服务(可定义多个服务,每个服务可定义多个方法)
service Greeter {
  // hello服务的入口
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

// 定义发送请求信息.
message HelloRequest {
  // 定义发送的参数
  // 参数类型 参数名 标识号(不可重复)
  string name = 1;
}

// 定义响应信息
message HelloReply {
  string message = 1;
}

2.2.2 编译proto文件

在编译文件前,我们先搭建一个最简单的项目目录

grpc实战二:环境搭建及简单demo

greeter_client:gRPC客户端代码

helloworld:存放公共pb文件以及编译文件

greeter_server:gRPC服务端代码

通过下面的命令就可以直接生成对应语言的代码,具体代码可见:

protoc --go_out=plugins=grpc:. *.proto

2.2.3 编写服务端代码

// Package main implements a server for Greeter service.
package main

import (
	"context"
	"flag"
	"fmt"
	"log"
	"net"

	"google.golang.org/grpc"
	pb "helloworld/helloworld"
)

//定义port
var (
	port = flag.Int("port", 50051, "The server port")
)

// server用于实现helloworld.GreeterServer.
type server struct {
	pb.UnimplementedGreeterServer
}

// SayHello 实现 helloworld.GreeterServer
func (s *server) 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() {
	flag.Parse()
	// 监听本地端口
	lis, err := net.Listen("tcp", fmt.Sprintf("localhost:%d", *port))
	if err != nil {
		log.Fatalf("failed to listen: %v", err)
	}
	// 新建gRPC服务器实例
	s := grpc.NewServer()
	// 在gRPC服务器注册我们的服务
	pb.RegisterGreeterServer(s, &server{})
	log.Printf("server listening at %v", lis.Addr())
	//用服务器 Serve() 方法以及我们的端口信息区实现阻塞等待,直到进程被杀死或者 Stop() 被调用
	if err := s.Serve(lis); err != nil {
		log.Fatalf("failed to serve: %v", err)
	}
}

运行客户端可见:

grpc实战二:环境搭建及简单demo

2.2.4 编写客户端代码

package main

import (
	"context"
	"flag"
	"log"
	"time"

	"google.golang.org/grpc"
	pb "helloworld/helloworld"
)

const (
	defaultName = "world"
)

var (
	addr = flag.String("addr", "localhost:50051", "the address to connect to")
	name = flag.String("name", defaultName, "Name to greet")
)

func main() {
	flag.Parse()
	// 连接服务器
	conn, err := grpc.Dial(*addr, grpc.WithInsecure())
	if err != nil {
		log.Fatalf("did not connect: %v", err)
	}
	defer conn.Close()
	// 建立gRPC连接
	c := pb.NewGreeterClient(conn)

	// Contact the server and print out its response.
	ctx, cancel := context.WithTimeout(context.Background(), time.Second)
	defer cancel()
	
	// 调用我们的服务(SayHello方法)
    // 同时传入了一个 context.Context ,在有需要时可以让我们改变RPC的行为,比如超时/取消一个正在运行的RPC
	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())
}

运行后可见:

grpc实战二:环境搭建及简单demo

同时服务端也有如下显示

grpc实战二:环境搭建及简单demo

2.3 BloomRPC开源client

熟悉Restful开发流程的同学都知道,server端写完后,需要一个客户端工具对接口进行测试,BloomRPC就是一个很好的grpc GUI工具,类似于Postman

使用方式参考:

https://juejin.cn/post/6944670144392069134

BloomRPC测试上面的demo

1、导入定义好的proto,如下

grpc实战二:环境搭建及简单demo

2、点击绿色的run按钮

grpc实战二:环境搭建及简单demo

总结

这样就搭建好了一个简单的服务和客户端,使他们可以简单的交互

上一篇:API 如何选择 REST,GraphQL还是gRPC


下一篇:Kubernetes 中的 gRPC 负载均衡