当前位置:   article > 正文

GO分布式微服务-GRPC_golang grpc 多服务通信

golang grpc 多服务通信

grpc是什么?

grpc 是可以在任何环境中运行的现代开源高性能rpc 框架。它可以通过可插拔的支持来有效地连接数据中心内和跨数据中心的服务,以实现负载平衡,跟踪,运行状况检查和身份验证。grpc基于 HTTP/2 标准设计,带来诸如双向流、流控、头部压缩、单 TCP 连接上的多复用请求等特。这些特性使得其在移动设备上表现更好,更省电和节省空间占用。grpc使用protobuf来定义接口,从而实现更高更安全的接口约束。

protobuf 是什么?

protobuf 是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。

Protocol Buffers 是一种灵活,高效,自动化机制的结构数据序列化方法-可类比 XML,但是比 XML 更小(3 ~ 10倍)、更快(20 ~ 100倍)、更为简单。

protobuf 的基础用法

传送门: protobuf 的基础用法.

了解了protobuf的基础用法之后我们也来构建一个示例
在项目中新建一个servers/prod.proto文件,写入以下代码

syntax = "proto3"; //声明其为proto3的语法。
package servers; //声明报名
option go_package = "servers/hello"; //go package 的生成位置
//这里会生成 servers/hello/prod.pd.go 文件,go文件的包为hello.

message Hello{
    string Value = 1; //存储用户名称
}

service HelloServer{
    rpc Print (Hello) returns (Hello); //GRPC服务方法
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

生成之后的文件预览,此图是为了说明option go_package 的作用。
在这里插入图片描述
我们写好代码之后,需要生成go文件了,此时我们需要用到一个grpc插件。

grpc安装

  //grpc运行时接口编解码支持库
  go get -u github.com/golang/protobuf/proto
  //从 Proto文件(gRPC接口描述文件) 生成 go文件 的编译器插件
  go get -u github.com/golang/protobuf/protoc-gen-go
  • 1
  • 2
  • 3
  • 4

安装完成之后,我们在项目中打开命令行,执行命令

protoc --go_out=plugins=grpc:./ servers/prod.proto
//proto --go_out=plugins=grpc: 输出目录 proto目录
  • 1
  • 2

执行之后,在servers/hello 文件下就会生成prod.pd.go 文件。

基础grpc实践

我们在之前讲过,protobuf 是为了更好的作为一个接口约束。其实这个就和我们之前RPC篇所做的接口规范是同样的道理,rpc篇中的common.go 就和我们现在生成的prod.pd.go 文件有着同样的思想,所以同样的我们针对于定义的接口要去实现他的具体方法。

由于grpc生成之后的文件会引用很多Google的包,我们直接go get会因为网络原因无法下载,可以使用 go mod init 进行包管理即可。

服务端

这里我们就创建一个 servers/hello/server.go文件来进行具体的方法实现。
1:查看方法原型,我们在prod.pd.go中直接搜索Print. 找到**Server的接口,里面约束了方法的规范,我们直接复制方法到server.go中进行实现。
在这里插入图片描述
server.go 实现示例如下

package hello

import (
	"context"
	"fmt"
)

type HelloStruct struct {
}

func (this *HelloStruct) Print(ctx context.Context, from *Hello) (*Hello, error) {
	fmt.Println(from.Value + ":hello world") //当服务端调用时打印 客户端名字+helloworld
	return &Hello{ 
		Value: "server",
	}, nil  
	//返回服务端名字
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

客户端的服务已经实现了,现在我们要用grpc的方法启动服务了。
创建main.go文件实现启动服务端,具体代码如下:

package main

import (
	"log"
	"net"
	"server/servers/hello"
	"google.golang.org/grpc"
)

func main() {
	grpcServer := grpc.NewServer()                                      //新建服务
	hello.RegisterHelloServerServer(grpcServer, new(hello.HelloStruct)) //注册服务
	listen, err := net.Listen("tcp", ":1234")                           //启动网络监听
	if err != nil {
		log.Fatal("listen tcp :1234 fail:", err)
		return
	}
	grpcServer.Serve(listen) //为网络监听提供grpc服务
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

此时服务端的目录结构为

server  服务端项目录
|—servers 	 grpc服务目录
|—|—prod.proto 	protobuf文件
|—|—hello  	hello 服务包 
|—|—|—prod.pd.go 	生成的规范条件,由grpc生成
|—|—|—server.go 	 服务接口方法的实现,用户自己实现。
|—main.go 	启动grpc服务入口文件
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
客户端

在RPC篇中,我们的客户端实现是将服务端中的common.go复制到客户端,然后在实现接口约束调用服务端的方法,在此我们也是一样的,但是比起我们之前,这里更简便了一些,我们只需要讲服务端生成的prod.pd.go文件复制到客户端即可,所有的客户端约束实现,他

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/273900
推荐阅读
相关标签
  

闽ICP备14008679号