服务器通信REST、gRPC,Swagger/OpenAPI,Consul
服务间的通信方式是在采用微服务架构时需要做出一个最基本的决策。默认的选项是通过 HTTP 发送 JSON,也就是所谓的 REST API。我们也是从 REST 开始的,但最近我们决定改用 gRPC。
gRPC是谷歌开发的一个远程调用框架,现在已开源。尽管它已经出现了多年,但网上关于人们为什么要用它或者为什么不用它的信息并不多。于是,我决定写这篇文章分享一下我们为什么要使用 gRPC。
gPRC 的一个很明显的优势是它使用了二进制编码,所以它比 JSON/HTTP 更快。虽然说速度越快越好,但我们也要考虑另外两个因素:清晰的接口规范和对流式传输的支持。
Swagger/OpenAPI
当然,如果使用的是 JSON/HTTP,Swagger或者OpenAPI也提供了类似的东西。下面的例子与上述的 gRPC API 相当。
流式传输
今年早些时候,我开始为我们的搜索服务设计一个新的 API。在我使用 JSON/HTTP 设计了第一版 API 之后,我的一个同事告诉我说,在某些情况下,我们需要流式传输搜索结果,也就是在有第一批结果时就开始传输。而我之前设计的 API 只返回一个单独的 JSON 数组,在服务器端收集到所有结果之前是不会向客户端发送任何数据的。
我们的 API 要求客户端轮询搜索结果,先是发送一个 POST 请求发起搜索,然后再不断发送 GET 请求获取搜索结果。响应消息中包含了一个用于表示搜索是否已完成的字段。这种方式虽然没有什么问题,但还不够优雅,而且要求服务器端将中间结果保存在数据存储(如 Redis)中。
注意事项
gRPC 也有一些不足之处,不过它们都与相关的开发工具有关,并不是 gRPC 本身的问题。
如果我们使用 JSON/HTTP 开发 API,就可以使用 curl、httpie 或者 Postman 进行简单的手动测试。gRPC 也有一个类似的工具叫作grpcurl,不过它使用起来并不是很方便,你要么需要在服务器端添加gRPC 服务器反射插件,要么需要在每个命令后面附上.proto 文件。
另一个是 Kubernetes 负载均衡器问题,负载均衡器可以支持 HTTP,但对 gPRC 支持得并不好。gPRC 要求应用层的负载均衡,而不是在 TCP 连接层。为了解决这个问题,我们参考了这篇文章搭建了 Linkerd。
Consul 是 HashiCorp 出品的开源服务发现工具。
Consul 提供了诸如服务发现,健康检查,KV 数据库等功能,方便你使用它构建自己的服务集群。
基础概念
Agent: agent 就是实际运行的 consul 服务,启动时可选以 server 或者 client 模式运行,每个集群至少有 1 个 server,由于使用了 Raft 算法,所以对于每个集群你应该把它的 server 数设置成 3 或 5 个。
Server: 核心的 consul 服务,存储了所有服务注册的信息,响应查询操作,跨数据中心通信等。
Client: 用来在集群中每个机器上运行,进行服务注册 / 健康检查的进程。
Cluster: 集群,由多台共同提供服务的机器组成的集合称为集群,agent 在集群的每个成员上都要运行。
DataCenter: 数据中心。consul 支持跨数据中心组成集群。
Node: 安装了 agent,接入集群的机器称为 node。
Service: 你的服务,即服务注册和服务发现之类操作的对象。通过提供 config 文件或者调用 consul 的 HTTP API 来定义一个服务。
服务器通信REST、gRPC,Swagger/OpenAPI,Consul的更多相关文章
- 服务器通信REST、gRPC,Swagger/OpenAPI
服务间的通信方式是在采用微服务架构时需要做出一个最基本的决策.默认的选项是通过 HTTP 发送 JSON,也就是所谓的 REST API.我们也是从 REST 开始的,但最近我们决定改用 gRPC. ...
- Docker跨服务器通信Overlay解决方案(下) Consul集群
承接上文 本文基于上篇文章,详细的场景说明与分析在前篇随笔中业已记录,有兴趣可以移步 Docker跨服务器通信Overlay解决方案(上) Consul单实例 本文主旨 本文为Docker使用Cons ...
- 关于.Net 7.0 RC gRPC JSON 转码为 Swagger/OpenAPI文档的注意事项
大家好,我是失业在家,正在找工作的博主Jerry,找工作之余,看到.Net 7.0 RC2发布了,就想测试下.Net 7.0 RC2 gRPC JSON 转码为 Swagger/OpenAPI文档的特 ...
- Google Play Store —与google服务器通信时出现问题
机子:MX4 前几天刷完机后出现登录Google Play Store “与google服务器通信时出现问题”,今天试了好几种方法,来总结一下 1.修改最新Hosts文件 2.SmartHosts ...
- Android操作HTTP实现与服务器通信(转)
Android操作HTTP实现与服务器通信 本示例以Servlet为例,演示Android与Servlet的通信. 众所周知,Android与服务器通信通常采用HTTP通信方式和Socket通信方 ...
- vuejs与服务器通信
vuejs与服务器通信 与服务器通信 Vue 实例的原始数据 $data 能直接用 JSON.stringify() 序列化.社区贡献了一个插件 vue-resource,提供一种容易的方式与 RES ...
- 通信服务器群集——跨服务器通信Demo(源码)
对于一些基于TCP Socket的大型C/S应用来说,能进行跨服务器通信可能是一个绕不开的功能性需求.出现这种需求的场景类似于下面描述的这种情况. 假设,我们一台TCP应用服务器能同时承载10000人 ...
- 无法在Web服务器上启动调试,与Web服务器通信时出现身份验证错误
问题描述: 我使用的是修改hosts,模拟真实网址来进行调试的.具体是这样的:我修改hosts文件,把某个域名,如www.163.com映射为127.0.0.1,然后在IIS信息管理器中,创建一个网站 ...
- 客户端(android,ios)与服务器通信
android,ios客户端与服务器通信为了便于理解,直接用PHP作为服务器端语言 其实就是一个 http请求响应的过程序,先从 B/S模式说起浏览器发起http请求,服务器响应请求,并把数据返回给浏 ...
随机推荐
- Linux讲解之定时任务
https://www.php.cn/linux-369884.html Linux讲解之定时任务 原创2018-05-14 10:11:3101319 本文目录: 12.1 配置定时任务 1 ...
- touch -d 同时修改atime与mtime
1.touch命令 touch命令用于创建空白文件或设置文件的时间,格式为"touch [选项] [文件]". 在创建空白的文本文件方面,这个touch命令相当简捷,简捷到没有必要 ...
- Linux_配置辅助DNS服务(基础)
[RHEL8]-DNSserver1:[RHEL7]-DNSserver2:[Centos7]-DNSclient !!!测试环境我们首关闭防火墙和selinux(DNSserver1.DNSserv ...
- 分布式存储ceph---部署ceph(2)
一.部署准备 准备5台机器(linux系统为centos7.6版本),当然也可以至少3台机器并充当部署节点和客户端,可以与ceph节点共用: 1台部署节点(配一块硬盘,运行ceph-depoly) 3 ...
- IDEA 自定义文件头注释
什么是 IDEA 自定义文件头注释 IDEA 自定义文件头注释指的是创建 Java 类文件时,IDEA 可以自动设置文件头的注释信息,如下: 如何设置 IDEA 自定义文件头注释 打开 File-&g ...
- 推荐:C#命名规范12条
编码规范对于程序员而言尤为重要,有以下几个原因: 1.一个项目的生命周期中,80%的花费在于维护; 2.几乎没有任何一个项目,在其整个生命周期中,均由最初的开发人员来维护; 3.命名规范可以改善项目的 ...
- 大数据开发-Flink-窗口全解析
Flink窗口背景 Flink认为Batch是Streaming的一个特例,因此Flink底层引擎是一个流式引擎,在上面实现了流处理和批处理.而Window就是从Streaming到Batch的桥梁. ...
- Cisco Catalyst 9800-CL Wireless Controller for Cloud
面向云的思科 Catalyst 9800-CL 无线控制器,专为基于意图的网络全新打造. 版本: C9800-CL-universalk9.17.04.01 (29-Nov-2020) C9800-C ...
- Your branch and 'origin/master' have diverged, and have 1 and 1 different commits each, respectively
On branch master Your branch and 'origin/master' have diverged, and have 1 and 1 different commits e ...
- 同一个Controller里的同一个Service实例,在当前的Controller里的不同方法中状态不一致
直接上代码如下: @Controller@RequestMapping("/views/information")public class PubContentController ...