加载中...
avatar

Grpc系列学习(一)

##Grpc系列学习(一)

刚开始学习Go的时候就想认识Go有没有类似与SpringCloud的分布式框架,也是那个时候得知了Grpc.说来惭愧,对Grpc的认识也仅仅停留在:我知道有这么个东西,但是我不会用.因为准备写一系列博客,来开始重新拾起这个分布式框架.

hadoop:应该是鸽的差不多了,主要是学着学着突然没兴趣继续往下了解了,正巧这两天有写Go的手感.

话说哪个啥实验班还要专门开课程,好想翘

Start:

Grac官网上的定义是:A high-performance, open source universal RPC framework.

我们简单理解成一个高性能分布式RPC框架,当然我的技术博客不会出现太多与代码无关的东西.所以不再详细介绍RPC是啥玩意.

gRPC is a modern open source high performance RPC framework that can run in any environment. It can efficiently connect services in and across data centers with pluggable support for load balancing, tracing, health checking and authentication. It is also applicable in last mile of distributed computing to connect devices, mobile applications and browsers to backend services.

上段内容来自官网 ,Grpc是跨语言的.官网上同给出了其他语言的示例学习真的太多语言了

做个比较

(真的不是来黑grpc的)

Protobuf

Protocol Buffers 是一种与语言、平台无关,可扩展的序列化结构化数据的方法,常用于通信协议,数据存储等等。相较于 JSON、XML,它更小、更快、更简单,因此也更受开发人员的青眯

语法我略了,因为我自己也不太会

这个是grpc必须的定义文件.

Get the example code

The example code is part of the grpc-go repo.

Download the repo as a zip file and unzip it, or clone the repo:

1
$ git clone https://github.com/grpc/grpc-go

亲测 git clone速度较慢.建议直接点链接下载.

这里已经把全部源码clone下来了,照着官方文档跑个Hello Grpc.

server端:

1
go run greeter_server/main.go

client端:

1
go run greeter_client/main.go

这里分别启动了server端和client端的服务,client端发出Hello world

server接收.

记得开两个控制台

Congratulations! You’ve just run a client-server application with gRPC.

接下来我们自己使用Grpc以及protoc来编写一个server和client用来互相通信.

1
go get -u google.golang.org/grpc

protoc windows怎么下载自己查一下,我下太久了…

总之运行以下命令能看到正常输出就行.

protoc plugin可以用goland marketplace下载.

proto文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
syntax = "proto3";

package proto;

service SearchService {
rpc Search(SearchRequest) returns (SearchResponse) {}
}

message SearchRequest {
string request = 1;
}

message SearchResponse {
string response = 1;
}

生成:

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

我们定义的 proto 文件是涉及了 RPC 服务的,而默认是不会生成 RPC 代码的,因此需要给出 plugins 参数传递给 protoc-gen-go,告诉它,请支持 RPC(这里指定了 gRPC)

–go_out=.:设置 Go 代码输出的目录

该指令会加载 protoc-gen-go 插件达到生成 Go 代码的目的,生成的文件以 .pb.go 为文件后缀

: (冒号)

冒号充当分隔符的作用,后跟所需要的参数集。如果这处不涉及 RPC,命令可简化为:

执行命令后可以得到 .pb.go文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
type SearchRequest struct {
Request string `protobuf:"bytes,1,opt,name=request" json:"request,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}

func (m *SearchRequest) Reset() { *m = SearchRequest{} }
func (m *SearchRequest) String() string { return proto.CompactTextString(m) }
func (*SearchRequest) ProtoMessage() {}
func (*SearchRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_search_8b45f79ee13ff6a3, []int{0}
}

func (m *SearchRequest) GetRequest() string {
if m != nil {
return m.Request
}
return ""
}

server:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package main

import (
"context"
"log"
"net"

"google.golang.org/grpc"

pb "github.com/EDDYCJY/go-grpc-example/proto"
)

type SearchService struct{}

func (s *SearchService) Search(ctx context.Context, r *pb.SearchRequest) (*pb.SearchResponse, error) {
return &pb.SearchResponse{Response: r.GetRequest() + " Server"}, nil
}

const PORT = "9001"

func main() {
server := grpc.NewServer()
pb.RegisterSearchServiceServer(server, &SearchService{})

lis, err := net.Listen("tcp", ":"+PORT)
if err != nil {
log.Fatalf("net.Listen err: %v", err)
}

server.Serve(lis)
}
  • 创建 gRPC Server 对象,你可以理解为它是 Server 端的抽象对象
  • 将 SearchService(其包含需要被调用的服务端接口)注册到 gRPC Server 的内部注册中心。这样可以在接受到请求时,通过内部的服务发现,发现该服务端接口并转接进行逻辑处理
  • 创建 Listen,监听 TCP 端口
  • gRPC Server 开始 lis.Accept,直到 Stop 或 GracefulStop

client:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package main

import (
"context"
"log"

"google.golang.org/grpc"

pb "github.com/EDDYCJY/go-grpc-example/proto"
)

const PORT = "9001"

func main() {
conn, err := grpc.Dial(":"+PORT, grpc.WithInsecure())
if err != nil {
log.Fatalf("grpc.Dial err: %v", err)
}
defer conn.Close()

client := pb.NewSearchServiceClient(conn)
resp, err := client.Search(context.Background(), &pb.SearchRequest{
Request: "gRPC",
})
if err != nil {
log.Fatalf("client.Search err: %v", err)
}

log.Printf("resp: %s", resp.GetResponse())
}
  • 创建与给定目标(服务端)的连接交互
  • 创建 SearchService 的客户端对象
  • 发送 RPC 请求,等待同步响应,得到回调后返回响应结果
  • 输出响应结果

启动:

1
2
go run server.go
go run client.go

输出:resp: gRPC Server

即可完成一次简单的通信!

@copyright ————baijianruoliorz@Github——————————–

文章作者: liqiqiorz
文章链接: https://yangxiangrui.site/posts/57842/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Blog-YXR
打赏
  • 微信
    微信
  • 支付寶
    支付寶

评论