GO分布式微服务-GRPC

本文详细介绍了如何使用golang实现GRPC微服务,包括GRPC和protobuf的概念、protobuf的基本用法、GRPC的安装及实践。通过示例展示了服务端和客户端的创建,以及GRPC的流模式(服务端流、客户端流、双向流)。还涉及了GRPC的证书认证、双向证书认证、token认证、截取器和验证器的使用,以及如何通过grpc gateway实现HTTPS接口。
摘要由CSDN通过智能技术生成

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服务方法
}

生成之后的文件预览,此图是为了说明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

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

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

执行之后,在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  
	//返回服务端名字
}

客户端的服务已经实现了,现在我们要用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服务
}

此时服务端的目录结构为

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

在RPC篇中,我们的客户端实现是将服务端中的common.go复制到客户端,然后在实现接口约束调用服务端的方法,在此我们也是一样的,但是比起我们之前,这里更简便了一些,我们只需要讲服务端生成的prod.pd.go文件复制到客户端即可,所有的客户端约束实现,他都已经帮我们做了。
接下来我们进行实操,建立client项目,再

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值