微服务系列(二)GRPC的介绍与安装

1.GPRC简介

GRPC是Google公司基于Protobuf开发的跨语言的开源RPC框架。GRPC基于HTTP/2协议设计,可以基于一个HTTP/2链接提供多个服务,对于移动设备更加友好。目前提供 C、Java 和 Go 语言版本,分别是:grpc, grpc-java, grpc-go. 其中 C 版本支持 C, C++, Node.js, Python, Ruby, Objective-C, PHP 和 C# 支持.

在 gRPC里客户端应用可以像调用本地对象一样直接调用另一台不同的机器上服务端应用的方法,使得您能够更容易地创建分布式应用和服务。与许多 RPC系统类似, gRPC也是基于以下理念:

  • 定义一个服务,指定其能够被远程调用的方法(包含参数和返回类型)。

  • 在服务端实现这个接口,并运行一个 gRPC服务器来处理客户端调用。

在客户端拥有一个存根能够像服务端一样的方法。 gRPC客户端和服务端可以在多种环境中运行和交互 -从 google内部的服务器到你自己的笔记本,并且可以用任何 gRPC支持的语言 来编写。

所以,你可以很容易地用 Java创建一个 gRPC服务端,用 Go、 Python、Ruby来创建客户端。此外, Google最新 API将有 gRPC版本的接口,使你很容易地将 Google的功能集成到你的应用里。

参考资料

gRPC 官方文档中文版:http://doc.oschina.net/grpc?t=60133

gRPC官网:https://grpc.io

再详细了解使用GRPC之前先来了解一下上面定义中的一些关键词。

首先我们来看一下HTTP/2是什么内容?

其实本质上就是http2.0版本,http目前为止主要有四个版本,分别为http1.0、http1.1、http2.0、https。

http1.0是最原始的版本,不支持持久连接,效率也比较低

http1.1针对http1.0版本做了优化,可以连接一次,多次使用,效率比http1.0高

http2.0实现了多路复用,对http1.1再次进行了优化。http2.0也被称为下一代http协议,是在2013年8月进行首次测试,所以现在用的不是很广。

https其实是在http协议上多加了一层SSL协议,具体如下图:

所以本质上,http1.0、http1.1、http2.0都可以添加SSL协议。

2. grpc环境安装

  1. 官方推荐安装方法:

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

    但是由于墙原因,不能直接访问google官网,所以只能曲线救国了

  2. 通过github下载各种依赖库,然后配置。

    git clone https://github.com/grpc/grpc-go.git     $GOPATH/src/google.golang.org/grpc
    git clone https://github.com/golang/net.git $GOPATH/src/golang.org/x/net
    git clone https://github.com/golang/text.git $GOPATH/src/golang.org/x/text
    git clone https://github.com/google/go-genproto.git $GOPATH/src/google.golang.org/genproto cd $GOPATH/src/
    go install google.golang.org/grpc

    网络畅通可以用上述方法,但如果网速较慢,我们也可以选择离线安装方法。

  3. x.zipgoogle.golang.org.zip两个离线包来安装。

    #将x.zip 解压到 $GOPATH/src/golang.org/x 目录下
    $ unzip x.zip -d $GOPATH/src/golang.org/x
    #将google.golang.org.zip 解压到 $GOPATH/src/google.golang.org 目录下
    $ unzip google.golang.org.zip -d $GOPATH/src/google.golang.org
    #然后进入到$GOPATH/src/google.golang.org/grpc下面执行go install
    $ go install

    点击此处获取两个离线压缩包

3.GRPC使用

如果从Protobuf的角度看,GRPC只不过是一个针对service接口生成代码的生成器。接着我们来学习一下GRPC的用法。这里我们创建一个简单的proto文件,定义一个HelloService接口:

文件名称为person.proto

syntax = "proto3";
package pb; // 后期生成go的文件包名
option go_package = "../pb"; // go 1.14后需要指定导出的路径
// 消息体 -- 一个package中,不允许定义同名的消息体
message Teacher {
int32 age = 1;
string name = 2;
} // 定义服务
service SayName {
rpc SayHello(Teacher) returns (Teacher);
}

对proto文件进行编译:

protoc --go_out=plugins=grpc:./ person.proto

编译后生成person.pb.go文件

GRPC插件会为服务端和客户端生成不同的接口:

//客户端接口
type SayNameClient interface {
SayHello(ctx context.Context, in *Teacher, opts ...grpc.CallOption) (*Teacher, error)
}
//服务器接口
type SayNameServer interface {
SayHello(context.Context, *Teacher) (*Teacher, error)
}

我们接着可以基于他们给的服务端接口重新实现SayHello服务:

// 定义一个结构体 不一定非得是Teacher
type Children struct { } // 接口去绑定类方法
func (c *Children) SayHello(ctx context.Context,t *pb.Teacher) (*pb.Teacher, error) {
t.Name += "is teaching"
return t,nil
}

GRPC的启动流程和RPC的启动流程类似,代码如下:

func main(){
// 1. 初始一个grpc对象
grpcServer := grpc.NewServer() // 2.注册服务
pb.RegisterSayNameServer(grpcServer,new(Children)) // 3.设置监听并建立连接,指定IP port
listener ,err := net.Listen("tcp","127.0.0.1:8080")
if err!=nil{
fmt.Printf("监听失败:%v",err)
return
}
defer listener.Close() fmt.Println("正在监听127.0.0.1:8080 ...") // 4.启动服务 ... Serve()
grpcServer.Serve(listener)
}

然后我们就可以通过客户端来连接GRPC服务了:

func main(){
// 1.连接grpc服务
grpcConn,err := grpc.Dial("127.0.0.1:8080",grpc.WithInsecure()) // 第二个参数以一个安全的形式进行编译
if err!=nil{
fmt.Printf("连接拨号失败:%v",err)
return
}
defer grpcConn.Close() // 2.初始化grpc客户端
grpcClient := pb.NewSayNameClient(grpcConn) // 传入Dail函数的返回值 // 创建并初始化Teacher对象
var teacher pb.Teacher
teacher.Name = "小宝"
teacher.Age = 24 // 3.调用远程服务
t,err := grpcClient.SayHello(context.TODO(),&teacher) /*context.TODO()表示空对象,可以简单理解我们不清楚要使用哪个上下文、或者还没有可用的上下文时的占位符*/
if err!=nil{
fmt.Printf("调用远程服务失败:%v",err)
return
} fmt.Println(t)
}

微服务系列(二)GRPC的介绍与安装的更多相关文章

  1. go微服务系列(四) - gRPC入门

    1. 前言 2. gRPC与Protobuf简介 3. 安装 4. 中间文件演示 4.1 编写中间文件 4.2 运行protoc命令编译成go中间文件 5. 创建gRPC服务端 5.1 新建Produ ...

  2. go微服务系列(二) - 服务注册/服务发现

    目录 1. 服务注册 1.1 代码演示 1.2 在go run的时候传入服务注册的参数 2. 服务发现均衡负载 2.1 均衡负载算法 2.2 服务发现均衡负载的演示 1. 服务注册 1.1 代码演示 ...

  3. 【微服务】之二:从零开始,轻松搞定SpringCloud微服务系列--注册中心(一)

    微服务体系,有效解决项目庞大.互相依赖的问题.目前SpringCloud体系有强大的一整套针对微服务的解决方案.本文中,重点对微服务体系中的服务发现注册中心进行详细说明.本篇中的注册中心,采用Netf ...

  4. 微服务系列(二):使用 API 网关构建微服务

    编者的话|本文来自 Nginx 官方博客,是微服务系列文章的第二篇,本文将探讨:微服务架构是如何影响客户端到服务端的通信,并提出一种使用 API 网关的方法. 作者介绍:Chris Richardso ...

  5. 【转】「Chris Richardson 微服务系列」微服务架构的优势与不足

    Posted on 2016年5月4日 编者的话|本文来自 Nginx 官方博客,是微服务系列文章的第一篇,主要探讨了传统的单体式应用的不足,以及微服务架构的优势与挑战. 作者介绍:Chris Ric ...

  6. spring cloud微服务实践二

    在上一篇,我们已经搭建了spring cloud微服务中的注册中心.但只有一个注册中心还远远不够. 接下来我们就来尝试提供服务. 注:这一个系列的开发环境版本为 java1.8, spring boo ...

  7. 带你十天轻松搞定 Go 微服务系列(一)

    本文开始,我们会出一个系列文章跟大家详细展示一个 go-zero 微服务示例,整个系列分十篇文章,目录结构如下: 环境搭建(本文) 服务拆分 用户服务 产品服务 订单服务 支付服务 RPC 服务 Au ...

  8. 从零开始,轻松搞定SpringCloud微服务系列

    本系列博文目录 [微服务]之一:从零开始,轻松搞定SpringCloud微服务系列–开山篇(spring boot 小demo) [微服务]之二:从零开始,轻松搞定SpringCloud微服务系列–注 ...

  9. 微服务系列实践 .NET CORE

    从事这个行业转眼已经6年了,从当初刚毕业的在北京朝八晚十,从二环到五环,仍每天精力充沛的小愤青:再到深圳一点一滴的辛勤在软件行业的耕种,从当初单体应用架构到现在微服务架构的经历,回想起来自己的收获倒是 ...

随机推荐

  1. 0802_转载-nn模块中的网络层介绍

    0802_转载-nn 模块中的网络层介绍 目录 一.写在前面 二.卷积运算与卷积层 2.1 1d 2d 3d 卷积示意 2.2 nn.Conv2d 2.3 转置卷积 三.池化层 四.线性层 五.激活函 ...

  2. aws eks ebs StorageClass PersistentVolume PersistentVolumeClaim

    aws EBS 提供存储资源 Amazon EBS CSI 驱动程序的安装,请参考https://docs.aws.amazon.com/zh_cn/eks/latest/userguide/ebs- ...

  3. NumPy之:数据类型对象dtype

    目录 简介 dtype的定义 可转换为dtype的对象 dtype对象 None 数组标量类型 通用类型 内置Python类型 带有.dtype属性的对象 一个字符的string对象 数组类型的Str ...

  4. Mysql下可能存在注入的点。

    总结下mysql下可能存在注入的点,适用于mssql和oracle,先写语句,以后再写语句可能出现在哪些场景下: 针对查询: select * from x where id=* select * f ...

  5. 拿到蚂蚁金服的offer是一种什么体验?3年Java程序员分享面经

    前言:我是一名三年的Java程序员,之前一直是在外包公司工作的.在这个月五号的时候,通过我的学长做内推,有了去蚂蚁金服面试的机会.我是在12号接到的电话面试的,因为蚂蚁金服需要7天的简历评估的.还有就 ...

  6. 5. Linux常用命令

    clear命令: 作用:清屏 快捷键:Ctrl + L pwd命令: 作用:用于显示当前的工作路径位置(当前工作文件夹) 示例: $ pwd /home/tarena Linux/Unix下的路径: ...

  7. CVE-2012-3569:VMware OVF Tool 格式化字符串漏洞调试分析

    0x01 简介 VMware OVF Tool 是一个命令行实用程序,允许您从许多 VMware 产品导入和导出 OVF 包.在 2.1.0 - 2.1.3 之间的版本中存在格式化字符串漏洞,通过修改 ...

  8. Windows核心编程笔记之错误处理

    0x01 GetLastError() 函数用于获取上一个操作的错误代码 #include <Windows.h> #include <iostream> using name ...

  9. 在 GitHub 学习,成长为自己想要的样子|HelloGitHub 访谈

    万事开头难,我们经过长期的策划和筹备,终于推出了 HelloGitHub 采访系列「开源项目作者的访谈」.这是一个采访个人开源项目作者的栏目,内容侧重于开源项目作者与开源的故事. 我们深知想要做好一个 ...

  10. Python内置函数(Built-in Function)

    直接查看编码以及示例: 1 """ 2 内置函数 Built-in Function 3 """ 4 5 # abs() 取绝对值 6 pr ...