gRPC应用实战:(二)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,可搭配注释食用:

//指定proto3语法
syntax = "proto3";
//包名
package helloworld;

//一个为Hello的服务(可定义多个服务,每个服务可定义多个方法)
service Hello {
    //一个SayHello的方法
    rpc SayHello (HelloRequest) returns (HelloResp) {}
}
// 定义发送请求信息
message HelloRequest {
     // 定义发送的参数
    // 参数类型 参数名 标识号(不可重复)
    string name = 1;
}
// 定义响应信息
message HelloResp {
    string message = 1;
}

2.2.2 编译proto文件

在编译文件前,我们先搭建一个最简单的项目目录,用来具体演示相关操作:

client:gRPC客户端代码
pb:存放公共pb文件以及编译文件
server:gRPC服务端代码

接下来可以编译编写好的代码

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

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

2.2.3 编写服务端代码

接下来便可以编写服务端代码(结合注释食用即可)

import (
    "context"
    pb "github.com/CodeFish-xiao/blogs/gRPCAction/code/grpc-2/pb"
    "google.golang.org/grpc"
    "log"
    "net"
)
// HelloService 定义我们的服务
type HelloService struct {
    
}

// SayHello 实现SayHello方法
func (s *HelloService) SayHello(ctx context.Context, req *pb.HelloRequest) (*pb.HelloResp, error)  {
    log.Println(req.Name)
    return &pb.HelloResp{Message: "hello ,I'm codefish "},nil
}
const (
    // Address 监听地址
    Address string = ":8000"
    // Network 网络通信协议
    Network string = "tcp"
)
func main() {
    // 监听本地端口
    listener, err := net.Listen(Network, Address)
    if err != nil {
        log.Panic("net.Listen err: %v", err)
    }
    log.Println(Address + " net.Listing...")
    // 新建gRPC服务器实例
    grpcServer := grpc.NewServer()
    // 在gRPC服务器注册我们的服务
    pb.RegisterHelloServer(grpcServer,&HelloService{})
    //用服务器 Serve() 方法以及我们的端口信息区实现阻塞等待,直到进程被杀死或者 Stop() 被调用
    err = grpcServer.Serve(listener)
    if err != nil {
        log.Panic("grpcServer.Serve err: %v", err)
    }
}

运行客户端可见:

这就是运行成功了

2.2.4 编写客户端代码

接下来编写客户端代码:结合注释食用:

import (
    "context"
    pb "github.com/CodeFish-xiao/blogs/gRPCAction/code/grpc-2/pb"
    "google.golang.org/grpc"
    "log"
)

const (
    // ServerAddress 连接地址
    ServerAddress string = ":8000"
)

func main() {
    // 连接服务器
    conn, err := grpc.Dial(ServerAddress, grpc.WithInsecure())
    if err != nil {
        log.Fatalf("net.Connect err: %v", err)
    }
    defer conn.Close()

    // 建立gRPC连接
    grpcClient := pb.NewHelloClient(conn)
    // 创建发送结构体
    req := pb.HelloRequest{
        Name: "grpc",
    }
    // 调用我们的服务(SayHello方法)
    // 同时传入了一个 context.Context ,在有需要时可以让我们改变RPC的行为,比如超时/取消一个正在运行的RPC
    res, err := grpcClient.SayHello(context.Background(), &req)
    if err != nil {
        log.Fatalf("Call SayHelloerr: %v", err)
    }
    // 打印返回值
    log.Println(res)
}

运行后可见:

并且在server的控制台可以看到打印的参数:

总结

这样子便可以搭建一个简单的gRPC服务了,可以让客户端和服务端进行简单的业务交互了,当然这才刚刚开始。。。

本章代码可见codefish的github

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,752评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,100评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,244评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,099评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,210评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,307评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,346评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,133评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,546评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,849评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,019评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,702评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,331评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,030评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,260评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,871评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,898评论 2 351

推荐阅读更多精彩内容