API-First,Kubernetes上微服务的一种方法

对那些曾经使用更传统方式构建应用的开发者来说,转向容器化微服务不是一个容易的转变。当开发者设计分布式应用时,微服务应用也正是分布式的,其中有许多新的概念和细节需要他们去考虑和熟悉。将容器和Kubernetes搅合在一起,为何许多开发者要费力去适应这个新世界也就很明显了。开发者想要关注业务逻辑的开发,并非处理微服务所在的执行环境的必要代码。API一直是连接服务的高效方式,对于Kubernetes(K8s)上的微服务也依然如此。在这篇文章中,我们将阐述为什么API-First(译者注:指API先行,首先考虑API)这种在Kubernetes上构建微服务的方法可以使您从中受益。在我们深入研究之前,让我们快速回顾一下API-First的含义,以及K8s服务常引用的一个概念。

API-First是什么意思?

之前DZone的这篇文章描述了API为先意味着:你首先开始设计和实现一个能被其他微服务使用的API,然后再真正开始实现实际的微服务。除了API设计本身之外,你通常还会为API提供模拟和文档。这些随后将用于促进与其他团队的讨论,他们可能成为你们团队正在计划构建的微服务的消费者。换句话说,该方法在你投入太多精力编写实际的微服务之前,允许你检验你的API设计。但是,API-First的方式不仅仅在开发阶段有用。一旦微服务构建完毕,其他希望使用该微服务的团队将受益于文档和模拟的能力。好消息是有很多支持API-First方法的工具。支持API-First方法的最常用规范是OpenAPIAPI蓝图。然后,您可以使用SwaggerApiary等工具来设计您的API,生成模拟,文档甚至客户端库。

所有这些对于需要独立性和松散耦合的应用程序(如微服务应用程序)特别有用,因为它帮助团队在使用其他团队构建的服务时提高工作效率。但是,这种方法如何转化为依赖于诸如Kubernetes之类的协调器来处理每个微服务的部署和执行的现代微服务体系结构?在解释这种方法之前,有必要回顾一下什么是K8s服务。

什么是K8S服务?

如前所述,许多开发人员对他们需要学习的所有新概念感到有点不知所措。对于刚接触K8s的开发人员来说,K8s服务的概念非常令人迷惑,因为它在技术上并不涉及微服务的代码本身。以下是K8s服务的一个例子:

apiVersion: v1
kind: Service
metadata:
 name: githubstats
 labels:
 app: githubstats
spec:
 ports:
 - port: 9000
 name: http
 selector:
 app: githubstats

正如您所看到的,K8s服务与您开发的微服务无关。实际上,它只是一个端口号,提供有关如何访问Pod内的微服务的信息。

在底层,K8s服务会创建一个持久IP地址和DNS条目,以便始终可以访问目标微服务。

K8s使用标签选择器来知道该服务需要指向哪个Pod,在这个示例应用程序中:githubstats。您开发的微服务通常打包在容器映像中并部署到K8。下面的示例显示了容器映像repo / githubstats:0.0.1作为具有标签app:githubstats的部署的一部分。

apiVersion: apps/v1beta2 # for versions before 1.8.0 use
apps/v1beta1
kind: Deployment
metadata:
 name: githubstats
spec:
 replicas: 3
 selector:
 matchLabels:
 app: githubstats
 template:
 metadata:
 labels:
 app: githubstats
 spec:
 containers:
 - name: githubstats
 image: repo/githubstats:0.0.1
 ports:
 - containerPort: 9000

使用K8s服务的真正优势在于它们提供了一个稳定的端点来访问微服务本身,而不关心调度程序将其放入群集中的哪个位置。要理解这点并费劲,因为只看K8s服务,开发者无法获取他们需要的信息去消费该微服务。假设上一个示例中显示的githubstats微服务由团队A开发。现在另一个团队B正在构建一个微服务,将其称为UI服务,该服务需要使用githubstats微服务。团队B获取的唯一信息是githubstats微服务名称和端点信息。微服务本身的信息是完全没有的,比如可以调用什么方法。

为什么在K8S上您应该使用API-First的方法

正如在开始时提到的,API-First方法的一大优点是您总是从API设计开始,创建模拟服务,文档和客户端库。从K8s的角度来看,API-First方法允许您从更高层次和大多数开发人员进行讨论,以便他们不需要马上了解K8s的内部工作。为了使这种方法在K8s上有用,你需要以某种方式将API与K8s服务绑定。本文的其余部分将重点介绍如何处理此问题。

API-First工作流程

设计

该流程的第一步涉及创建API的“正式”描述。有各种格式和工具可以使用。例如Oracle的Apiary。Apiary网站提供了一个环境,在那里开发团队可以设计和记录API,如图1所示。

图1 - Apiary 用户界面。

大多数时候,这些工具是在整个工作流程的“设计时间”(design time)被用到,此时开发者正创建附带额外文档的API。考虑到微服务应用程序高度动态的本质,有必要将API-First方法也引入到“运行时”(runtime),该阶段API将会被实际使用到。

捆绑

为此,您需要创建一个“绑定”关系,使得K8s服务不仅仅像现在这样只是一个主机名和TCP端口。通过将API绑定到K8s服务,开发人员可以立即获得有关服务的重要信息,而无需通过额外的步骤去寻找API文档,并基于定义在API中的规范编写代码来处理请求/响应。这个绑定信息可以保存在一个简单的数据库中,并提供一个用户界面,如图2所示。

图2 - 显示哪些API绑定到K8S服务的简单用户界面。

消耗

API-First方法的最后一部分是如何使用该服务。理想情况下,开发人员希望避免必须要做的:实现响应的解析/编组,以及添加可处理HTTP调用的代码。更有效的方法是为服务提供一个客户端库,至少支持最常用的语言。在一些更先进的组织中,客户端库可以作为CI(Continuous Integration)过程的一部分生成。有一些工具,如swagger-codgen可根据规范生成客户端,并使其成为CI过程的一部分,甚至可以将客户端生成包含在你自定义的绑定UI中。在微服务架构中达到真正的API-First方法所缺少的,是包含使生成的代码可以在运行时发现服务在哪里的逻辑。在已有的最佳实践中,当服务被部署时,流程中服务发现阶段的若干部分是被硬编码的。拥有在需要某服务时(当服务正在调用远程服务时)就能判断其在何处运行的能力,使得API-First方法成为比已有的最佳实践更好的解决方案。

结论

本文阐述了如何将API-First方法与K8s结合起来。如果您愿意为“绑定”和代码生成体验付出一点努力,您可以使API-First方法成为现有环境中一部分。其优点不仅在于开发人员可以专注于编写代码,而只有少数人需要了解K8s的内部工作方式,也在于您可以提供对于成功的微服务项目必备的部分管理需求,比如适宜的文档和正确的API版本。

这篇文章在新的DZone微服务指南中有介绍。获取更具洞察力的文章,行业统计数据,以及更多内容的免费拷贝!

本文的版权归 zqfan 所有,如需转载请联系作者。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏CSDN技术头条

携程开源Redis多数据中心解决方案XPipe

Redis在携程内部得到了广泛的使用,根据客户端数据统计,整个携程全部Redis的读写请求在每秒200W,其中写请求约每秒10W,很多业务甚至会将Redis当成...

3929
来自专栏IT笔记

讯飞语音JavaWeb语音合成解决方案

在线语音合成 将文字信息转化为声音信息,给应用配上“嘴巴”。我们提供了众多极具特色的发音人(音库)供您选择。其合成音在音色、自然度等方面的表现均接近甚至超过了人...

44114
来自专栏Spark学习技巧

HBase高可用集群运维实践

随着越来越多的业务选择HBase作为存储引擎,对HBase的可用性要求也越来越高,对于HBase的运维也提出了新的挑战。目前运维集群超过30+,而且接入的业务类...

3935
来自专栏Python研发

用pycharm提交代码,冲突之后文件丢失找回方法

1: 更新代码时, 监测到本地代码改变,需要和合并,重启之后才可以, 选择No同时,代码会被冲掉,新增加的文件也会被冲掉, 但是pycharm有一个文件历史记忆...

664
来自专栏北京马哥教育

手把手教你无代码基础实现Linux运维管理平台

老早之前就想做一个运维管理平台的项目了,但是一直没沉下来去做,上半年的时候毕设选择了这个课题,想着逼自己一把,不管做出来的怎么样,先把它搞起来..... dj...

2975
来自专栏我是攻城师

如何使用Jekyll+GitHub Pages搭建个人博客站点

4007
来自专栏王清培的专栏

RabbitMQ 高可用集群搭建及电商平台使用经验总结

面向EDA(事件驱动架构)的方式来设计你的消息 AMQP routing key的设计 RabbitMQ cluster搭建 Mirror queue poli...

58910
来自专栏架构师之路

小小的IP,大大的耦合,你痛过吗?

什么是耦合? 耦合,是架构中,本来不相干的代码、模块、服务、系统因为某些原因联系在一起,各自独立性差,影响则相互影响,变动则相互变动的一种架构状态。 感官上,...

4496
来自专栏EAWorld

任务和调度:理解批量处理的关键设计

一、背景 1.1.什么是批量处理 1.2.批量处理拥有广泛的使用场景 1.3.批量处理需要良好的架构设计 二、批量处理中的关键设计 2.1从SpringBat...

5089
来自专栏蓝鸟资源分享网

什么是服务器,服务器与普通电脑有什么区别?

许多人错误地认为服务器与典型的台式计算机没有区别。尽管计算机具有与服务器相似的处理器速度,内存和存储容量,只要满足任何最低硬件要求的计算机都可以运行服务器操作系...

2643

扫码关注云+社区