Grpc实战二:环境搭建及简单demo
2.1 grpc环境安装
2.1.1 golang环境安装
接下来的所有的教程以及代码都是golang代码进行演示,所以我们需要安装golang环境: 下载地址:golang 官网
安装完在你的命令行工具输入
go version
就可以看到对应的下载版本
然后就可以了。
2.1.2 protoc 安装
在 gRPC 开发中,我们常常需要与 Protobuf 进行打交道,而在编写了.proto 文件后,我们会需要到一个编译器,就是protoc。这个工具呢可以在GitHub上直接下载
https://github.com/protocolbuffers/protobuf/releases
大家可以在这个网站自行下载安装(因为之前这里安装完了,也不想重装了,可能记得不太清了,你们直接试一试就好了,等下次重装再丰富这里) 一般操作是把protoc编译文件所在的目录配到环境变量里就好了 安装完后:
运行
protoc --version
就可以看见版本信息了
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文件
在编译文件前,我们先搭建一个最简单的项目目录
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)
}
}
运行客户端可见:
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())
}
运行后可见:
同时服务端也有如下显示
2.3 BloomRPC开源client
熟悉Restful开发流程的同学都知道,server端写完后,需要一个客户端工具对接口进行测试,BloomRPC就是一个很好的grpc GUI工具,类似于Postman
使用方式参考:
https://juejin.cn/post/6944670144392069134
BloomRPC测试上面的demo
1、导入定义好的proto,如下
2、点击绿色的run按钮
总结
这样就搭建好了一个简单的服务和客户端,使他们可以简单的交互