go-grpc 基本使用

摘要:
现在让我们来看看RPC的优点。gRPCvs.RestfulAPIgRPC和RestfulAPI都为服务器/客户端模型通信提供了一组通信机制,并且都使用http作为底层传输协议。)Protobuf是什么官方文件https://developers.google.com/protocol-buffersProtobuf它实际上是一组类似于Json或XML的数据传输格式和规范,用于不同应用程序或进程之间的通信。⏴ -- 主要的go//入口文件L--pbservices//从中间文件L生成的go文件--Probe.pb.go客户端实现packagemainimportfunmain(){//启用安全证书//cred,err:=凭据。NewClientTLSFromFile//ifer!

gRPC是什么?

gRPC是什么可以用官网的一句话来概括

A high-performance, open-source universal RPC framework

所谓RPC(remote procedure call 远程过程调用)框架实际是提供了一套机制,使得应用程序之间可以进行通信,而且也遵从server/client模型。使用的时候客户端调用server端提供的接口就像是调用本地的函数一样。如下图所示就是一个典型的RPC结构图。

RPC通信

gRPC有什么好处以及在什么场景下需要用gRPC
既然是server/client模型,那么我们直接用restful api不是也可以满足吗,为什么还需要RPC呢?下面我们就来看看RPC到底有哪些优势

gRPC vs. Restful API

gRPC和restful API都提供了一套通信机制,用于server/client模型通信,而且它们都使用http作为底层的传输协议(严格地说, gRPC使用的http2.0,而restful api则不一定)。不过gRPC还是有些特有的优势,如下:

gRPC可以通过protobuf来定义接口,从而可以有更加严格的接口约束条件。

另外,通过protobuf可以将数据序列化为二进制编码,这会大幅减少需要传输的数据量,从而大幅提高性能。
gRPC可以方便地支持流式通信(理论上通过http2.0就可以使用streaming模式, 但是通常web服务的restful api似乎很少这么用,通常的流式数据应用如视频流,一般都会使用专门的协议如HLS,RTMP等,这些就不是我们通常web服务了,而是有专门的服务器应用。)

Protobuf是什么

官方文档: https://developers.google.com/protocol-buffers

Protobuf实际是一套类似Json或者XML的数据传输格式和规范,用于不同应用或进程之间进行通信时使用。通信时所传递的信息是通过Protobuf定义的message数据结构进行打包,然后编译成二进制的码流再进行传输或者存储。

Protobuf的优点

相比较而言,Protobuf有如下优点:

  • 足够简单
  • 序列化后体积很小:消息大小只需要XML的1/10 ~ 1/3
  • 解析速度快:解析速度比XML快20 ~ 100倍
  • 多语言支持
  • 更好的兼容性,Protobuf设计的一个原则就是要能够很好的支持向下或向上兼容

安装Protobuf

  1. 官网下载二进制文件
    https://github.com/protocolbuffers/protobuf/releases

根据自己的系统版本下载指定的稳定版本文件

我这边是 MAC 就下载 protoc-3.11.4-osx-x86_64.zip文件

  1. 添加可执行文件到环境变量

  2. 为了基础protobuf文件,使用protoc工具编译出go相关文件,需要安装一个插件

$ go get github.com/golang/protobuf/protoc-gen-go

GRPC示例

安装grpc

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

GRPC服务端

目录结构

.
├── main.go // 入口文件
├── pbfile  // protobuf 中间文件
│   └── Prob.proto
├── pbservices  // 根据中间文件生成的go文件
│   └── Prob.pb.go
└── services    // 根据生成的go文件的实现
    └── Prob.go

protobuf 中间文件

// proto 文件版本
syntax = "proto3";
// 生成文件的包名
package services;

// 请求结构体
message ProbRequest {
    int32 Pid = 1;
}

// 响应结构体
message ProbResponse {
    float Price = 1;
}

// 定义rpc接口
service ProbService {
    rpc GetProductPrice (ProbRequest) returns (ProbResponse)
}

使用中间文件生成go文件

$ cd pbfile/
$ protoc --go_out=plugins=grpc:../pbservices Prob.proto

实现生成的go文件的接口

// services/Prob.go
package services

import (
	"context"
	"pbservices"
)

type ProbService struct {
}

func (this *ProbService) GetProductPrice(context.Context, request *pbservices.ProbRequest) (*pbservices.ProbResponse, error) {
	return &pbservices.ProbResponse{Price: 10}, nil
}

创建rpc服务文件

package main

import (
	"pbservices"
	"services"
	"google.golang.org/grpc"
	"log"
	"net"
)

func main() {
	// 服务端启用安全证书
	//cred, err := credentials.NewServerTLSFromFile("./keys/server.crt", "./keys/server.key")
	//if err != nil {
	//	log.Fatal(err)
	//}

	// 创建服务
	//rpcserver := grpc.NewServer(grpc.Creds(cred))
	rpcserver := grpc.NewServer()

	// 注册
	pbservices.RegisterProbServicesServer(rpcserver, &services.ProbService{})

	// 启动监听
	lis, err := net.Listen("tcp", ":8081")
	if err != nil {
		log.Fatal(err)
	}
	err = rpcserver.Serve(lis)
	if err != nil {
		log.Fatal(err)
	}
}

GRPC客户端

目录结构

.
├── main.go     // 入口文件
└── pbservices  // 根据中间文件生成的go文件
    └── Prob.pb.go

客户端实现

package main

import (
	"context"
	"fmt"
	"pbservices"
	"google.golang.org/grpc"
	"log"
)

func main() {
	// 启用安全证书
	//cred, err := credentials.NewClientTLSFromFile("./keys/server.crt", "mazhichao.com")
	//if err != nil {
	//	log.Fatal(err)
	//}

	//conn, err := grpc.Dial(":8081", grpc.WithTransportCredentials(cred))
	// grpc.WithInsecure() 忽略安全
	conn, err := grpc.Dial(":8081", grpc.WithInsecure())
	if err != nil {
		log.Fatal(err)
	}
	defer conn.Close()

	client := pbservices.NewProbServicesClient(conn)
	req := &pbservices.ProbRequest{Pid: 1}
	response, err := client.GetProductPrice(context.Background(), req)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(response.Price)
}

免责声明:文章转载自《go-grpc 基本使用》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇firefox打开链接自动跳转至新页面设置高通adsp架构下sensor下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【Golang】Go语言之log的使用

一、了解一些概念 Golang的log包短小精悍,可以非常轻松的实现日志打印转存功能。不用多说,log支持并发操作(即协程安全-相对于JAVA中的线程安全而言),其结构定义如下: type Logger struct { mu sync.Mutex // ensures atomic writes; protects the following...

《ArcGIS Runtime SDK for Android开发笔记》——(15)、要素绘制Drawtools3.0工具DEMO

1、前言 移动GIS项目开发中点线面的要素绘制及编辑是最常用的操作,在ArcGIS Runtime SDK for iOS 自带AGSSketchLayer类可以帮助用户快速实现要素的绘制,图形编辑。但是在ArcGIS Runtime SDK for Android的版本中并没有提供类似的功能,实现过程相对较复杂。(10.2.8及以下版本需要用户自定义扩展...

linux下的文件审计功能(audit inotify)

为了满足这样的需求:记录文件变化、记录用户对文件的读写,甚至记录系统调用,文件变化通知。本文介绍audit和inotify.什么是auditThe Linux Audit Subsystem is a system to Collect information regarding events occurring on the system(s)Kern...

删除或重命名文件夹和文件的方法

删除或重命名文件夹和文件的办法 一、Linux、CentOS下重命名文件和文件夹mv:move 用移动文件命令就可以了,因为linux系统没有专门的重命名命令。基本格式:移动文件:mv 文件名 移动目的地文件名重命名文件:mv 文件名 修改后的文件名示例:mv oldfilename newfilename (oldfilename为旧文件名,newfil...

【一】、.net core 3.1 创建windows服务并集成Serilog的步骤记录

1、新建项目   选择“Worker Service”,如下图: 2、添加nuget引用   Microsoft.Extensions.Hosting.WindowsServices   Serilog.Extensions.Hosting   Serilog.Sinks.Console   Serilog.Sinks.File 3、修改Program的...

Oracle之物化视图

来源于:http://www.cnblogs.com/Ronger/archive/2012/03/28/2420962.html 近期根据项目业务需要对oracle的物化视图有所接触,在网上搜寻关于这方面的资料,便于提高,整理内容如下: 物化视图是一种特殊的物理表,“物化”(Materialized)视图是相对普通视图而言的。普通视图是虚拟表,应用的局限...