grpc,grpc协议
gRPC负载均衡(自定义负载均衡策略--etcd 实现)
在工作学习中使用gRPC的地方比较多,通常我们都使用的是自带的负载均衡算法,但是在某些场景下我们需要对服务的版本进行控制
比如 [app V2 只能去链接 user V3],在这样的情况下就只能选自定义负载均衡策略
实现基于版本(version)的grpc负载均衡器,了解过程后可自己实现更多的负载均衡功能
源码 register.go
在etcd里面我们可以看到如下信息
APP v1版本服务在节点的key /hwholiday/srv/app/app-beb3cb56-eb61-11eb-858d-2cf05dc7c711
APP v2版本服务在节点的key /hwholiday/srv/app/app-beb3cb56-eb61-11eb-858d-2cf05dc7c711
源码 discovery.go
实现 grpc内的 resolver.Builder 接口(Builder 创建一个解析器,用于监视名称解析更新)
源码 version_balancer.go
测试源码
详情介绍地址
源码地址:
通过学习我们可以实现基于version的负载策略,这里只是提供一种思路怎么去实现可能我的这个例子不太适合这个,但是提供了一种思路,欢迎一起讨论
GRPC 浅析
IDL(proto buffer) + RPC
netty:异步/事件驱动的 网络应用程序服务器框架(高性能)
Http2:流式、双向
protobuf:序列化(节省网络带宽)
IDL定义示例:
Starting from a service definition in a .proto file, gRPC provides protocol buffer compiler plugins that generate client- and server-side code.
Http:如果没有API文档就不知道细节,
GRPC:IDL就相当于API文档,可以同时
开发顺序:
Http:先服务端后客户端
GRPC:可以同时
跨语言:都支持多语言
性能:GRPC远差于Thrift,因为用了Http2,各大server目前支持不完善
易用性:GRPC尚未完全提供连接池、服务自动发现、进程内负载均衡等高级特性,需要开发人员额外的封装;
多语言
Http2特性:如stream
易用性:GRPC尚未完全提供连接池、服务自动发现、进程内负载均衡等高级特性,需要开发人员额外的封装
gRPC在C++中的简单使用流程
参考:
????????????
1.gRPC默认使用protocal buffers
2.第一步是在.proto中定义service:service serviceName? {rpc function(){}}
? ? ? ? 有四种类型的方法:
? ? ? ? 1)简单的rpc,就像普通的函数调用一样
? ? ? ? 2)服务端流式rpc:在响应类型前加stream
????????3)客户端流式rpc:在请求类型前加stream
? ? ? ? 4)双向流失rpc:在请求和响应前加stream
3.从 .proto 的服务定义中生成 gRPC 客户端和服务器端的接口:make xx.grpc.pb.cc xx.pb.cc
4.创建服务器:
? ? ? ? 1)实现service定义的生成的服务接口:做服务的实际的“工作”。
????????2)运行一个 gRPC 服务器,监听来自客户端的请求并返回服务的响应。
5.创建客户端:
? ? ? ? 1)创建一个存根
? ? ? ? 2)调用服务的方法
gRPC 4种rpc定义方法与3种stub介绍
有关gRPC官方介绍( )如下:
gRPC是一个能在不同语言不同平台中进行高效通信的服务。gRPC默认使用Protocol Buffers数据格式:
Protocol Buffers以.proto作为拓展名,是一系列以name-value键值对的形式存储的数据格式。
Protocol Buffers从开源到现在已经经过很长时间,目前已经到了proto3版本,有着更加简化的语法,更加有用的特性,能够支持更多的语言。你可以从 proto3 language guide 和? reference documentation 看到更多有用的东西。另外.proto的文件格式能够从 formal specification 获取到更详细的讲解。
每个参数带有一个唯一的标识符,这些标识符被用来在message的二进制中被识别出来。不是代表每个数据的数值。
有了gRPC,我们可以在.proto文件中定义我们的服务,并用gRPC支持的任何语言生成客户端和服务器,它可以在从大型数据中心内的服务器到您自己的平板电脑的各种环境中运行,不同语言和环境之间的所有复杂通信都由gRPC为您处理。我们还获得了使用协议缓冲区的所有优点,包括高效的序列化、简单的IDL和容易的接口更新。
声明定义proto使用3版本,如果不生命默认2版本号。
在proto文件中定义java_package,指定了我们要用于生成的Java类的包。如果.proto文件中没有显式的java_package选项,那么默认情况下将使用proto包(使用“package”关键字指定)。
使用service定义服务。然后在service中使用rpc方法定义,gRPC允许使用4种不同的定义方式,定义方法。
区别在客户端调用Grpc中Stub发送请求方法时:
可以使用message定义所有的request and response types,在service中使用到的数据格式。