Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >基于Karma构建微服务

基于Karma构建微服务

作者头像
Techeek
发布于 2018-07-09 08:04:10
发布于 2018-07-09 08:04:10
1K0
举报
文章被收录于专栏:云计算云计算

基于Karma构建微服务

“微服务”和“微服务架构”在开发社者区中是一个热门话题,但实际中的微服务例子仍然很少。通过简要介绍一下我们在Karma上构建的后端API可会对现在的情况有所帮助。这不是“如何去做”的例子,而更像是“为什么要做”或“这样做的原因”的一个例子,希望这个例子能让您对微服务适用范围和使用方法有所了解。

我们为什么选择微服务

当开始构建Karma时,我们决定将项目分成两个部分:后端API和前端应用程序。后端负责处理来自商店的订单,账目,用户管理,设备管理等等,而前端为访问此API的用户提供接口。我们注意到,如果后端API是一个集成整合的,那么由于系统太过复杂而不能很好地工作。

例如,我们有用户,设备和商店。正如您可以想象的,用户从商店购买设备。这听起来很简单,但是当它是一个应用程序时,与用户相关的代码很容易出现在商店和设备API中,很快商店API就由于设备API的快速更新而落后了(比如分配设备给用户)。很难跟踪什么是什么,什么涉及什么,什么改变了什么。

我们可以将整体功能分割成库,然后将它们合并为一个API,但是我们发现了这种方法的三个主要问题:

  1. 缩放问题。当你想扩展时,你必须一次扩展整个API。例如,Karma中,我们需要设备和用户API比商店API快得多。
  2. 版本。通过库方法,单一依赖能允许整个应用程序其余部分不升级。例如,从Rails 3升级到Rails 4是一件困难的事情。因为我们所有的代码都分布在多个项目中,所以我们不需要一次更新所有内容。我们可以让旧的API运行,并在适当时升级它们。
  3. 多种语言和框架。目前我们是Ruby语言开发的,但我们希望能够在新技术和语言出现时进行实验。我们目前正在使用Go和Clojure,由于我们暴露了REST API,所以通信不是问题——最终都是HTTP协议。

微服务的极大地推动了程序员的生产力:我们不必将整件事记在脑袋中!只需要集中关注我们要做的事,不用担心破坏了其他部分。

如何开始

我们采用微服务技术。后端使用一个大的应用程序,并在适当的时候分成几个。这对我们来说非常有效,我们也因此能够不断学习。

通过继续开发应用程序,我们对要解决的问题有了更多的了解,很重要的一点是我们需要应用程序各个方面之间设置界限。每当我们遇到看起来应该是单独的东西时,我们就把它变成一种服务。

起初,这些作品相对较大,但与其他微服务发展的故事一样,我们发现这些作品越变越小。

例如,我们在大型应用程序中开始使用“store”,该应用程序完成与store相关的所有操作。我们发现shipping可以从中分离出来。然后我们认识到跟踪shipment与shipping不同。该store现在由三个API组成:第一个API处理订单,第二个将订单发送到处理中心,第三个由FedEx发送包裹。我们的下一步是将订单处理分割。我们一直在学习构建这些东西的最佳方式,微服务为我们提供了灵活性。

最终,一个微服务只承担一部分功能 —— 甚至会将一部分依赖包装在一起,避免和其他服务的依赖关系。一到两个星期就能构建或重建微服务,而对系统其他部分的更改不需要重写。我们有两年前写过的一个叫做“Collector”的服务,除了偶尔的依赖关系更新之外,基本没有改变过。

我们的架构

我们的微服务可以通过两种方式进行通信:HTTP请求和消息队列

刚开始的时候我们在后端使用HTTP和Sinatra。服务通过URL请求将消息传递给另一个。目前这个方式非常有用,但当交互的服务变多时,它就变得很复杂。

例如,一个订单输入,它需要被shipped。这很简单,但如果我们想要在收到订单后再做更多事情呢?商店可能需要与发票或邮件程序API进行交互,这会将关于变得很难处理。

所以我们开始将部分任务分解成基于事件的系统。我们使用Amazon SNS(简单通知服务 Simple Notification Service)发布事件,并使用Amazon SQS(简单队列服务 Simple Queue Service)存储事件。SNS接受一个服务传递给它的消息,并通过SQS将它发布到适当的队列中。然后,微服务可以将作业从队列中取出,处理它们,并在成功时删除它们。如果一个进程失败了,那么这个消息会返回到队列中,这样进程的另一个实例就可以对其进行工作。

当部署一个新的微服务时,它包含一个配置文件,该文件描述了想要侦听的消息类型以及要发布的消息类型。我们有一个名为Fare的内部工具,它读取配置并设置适当的SQS和SNS队列。

架构图
架构图

平台架构的简化图

现在,当订单进入时,会发布一个事件,表示:“已下订单(包括订单的详细信息)。”发货应用程序监听消息系统,一旦订单发生,查看详细信息,并说, “好的,我需要向这个人发送两个信箱。”任何其他对订单发生有兴趣的服务都可以在他们自己的队列中完成他们需要的任何事情,而store API也不需要担心。

当我们需要对消息立即响应时,我们仍然使用HTTP请求,例如登录或覆盖地图。这取决于服务是请求信息还是返回信息。如果是请求信息,它可能需要立即作出回应,如果它返回信息将不需要应答 。

面临的挑战

微服务最大的挑战就是测试(testing)。使用常规的Web应用程序,端到端测试非常简单:只需单击网站上的某个位置,即可查看数据库中的更改。但在我们的案例中,行动和最终结果离测试目标很远,很难看到确切的原因和结果。一个问题可能会从一个链中冒出来,但是链中哪里出了问题?这是我们还没有解决的问题。

相反,我们专注于使每个组件尽可能完善,并且看看将它们组合一起时会发生什么。我们试图让每个微服务都履行合同。“当我这样做时,我得到了这个回报。”我们拿这些合同(contracts),并手动确保他们履行。然而,合同是隐含的,并不明确,所以我们还没有想出一个自动化的方法来测试它。

这样做的结果是,我们必须假设一切都会在某个时候失败。微服务结构意味着问题是局部的,不扩散。其中一部分组件可能会失败,并直接影响其他部分,不会阻止其他任何部分。而且,多亏队列,一旦服务恢复在线状态,就可以继续工作。

接下来的工作

以上就是我们的微服务架构......现在。我们一直在寻找改进方法,正如您可以看到我们走向微服务的途径一直在变化。我们不仅继续添加功能,而且不断重新审视系统的不同部分,我们认为我们可以做得更好。还有一些我们建立的工具,例如Fare,我们希望一旦它们适合公共时就开源。请让我们知道你是否感兴趣!

微服务不是万能的,它们并不能解决所有问题,但它们对于Karma这个项目来说非常有效。也许他们会适合你未来的项目?

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
什么是微服务?
自2011年以来,微服务一直是软件社区的重要组成部分,但与许多其他架构和设计理念一样,自从成立以来,围绕这种架构风格的争论不断。与许多这些炒作一样,有一种倾向于转换所有现有的软件或要求使用这种风格实施所有新软件。作为回应,许多人将这种风格视为纯粹的表面炒作,并且以与面向服务的体系结构(SOA)和跨平台面向对象的通信协议(即公共对象请求代理体系结构(Common Object Request Broker Architecture))相同的方式讽刺地期待它的突出地位被废, CORBA)。
Hi胡瀚
2018/07/04
8400
什么是微服务?
微服务简介
我们先来看看你为什么要考虑使用微服务。 构建单体应用 让我们假设你们要开始制定一个全新的出租车招标程序,旨在与Uber和Hailo进行竞争。经过一些初步会议和需求收集之后,您将手动或者使用Rails
用户1263954
2018/01/30
1.1K0
微服务简介
【微服务架构】一文读懂单片到微服务架构的模式和最佳实践
在本文中,我们将学习如何使用设计模式、原则和最佳实践来设计微服务架构。我们将使用正确的架构设计模式和技术。 在本文结束时,您将了解如何在微服务分布式架构上设计系统以实现高可用性、高可扩展性、低延迟和对网络故障的弹性,从而处理数百万个请求。 Event-Driven Architecture 本课程将是软件架构设计的旅程,逐步将架构单片演变为事件驱动的微服务。 我们将从设计处理少量请求的电子商务整体架构开始软件架构的基础知识。 Journey of Design Architectures 之后逐步演
架构师研究会
2022/03/30
9270
使用API网关构建微服务
当您选择将应用程序构建为一组微服务时,您需要确定应用程序的客户端将如何与微服务器进行交互。使用单体应用程序,只有一组(通常是复制的,负载均衡的)端点。然而,在微服务架构中,每个微服务都暴露出一组通常是
用户1263954
2018/01/30
1.9K0
使用API网关构建微服务
用于在所有级别上构建微服务的29个顶级工具
关于微服务有很多很棒的文章。对于那些一直没有接受微服务的人,或者新手,本文是为了提供顶级开源工具的整合。微服务架构,或仅微服务,是用于开发软件系统的高度可扩展的结构风格。这种体系结构可用于企业,政府,学校和慈善机构等的企业应用程序。它与传统风格的单片体系结构完全相反,它专注于单个单元应用程序。
February
2018/12/06
1.6K0
如何基于 DDD 构建微服务?
本文将讨论微服务与 DDD 涉及到的概念、策划和设计方法,并且尝试将一个单体应用拆分成多个基于 DDD 的微服务。
深度学习与Python
2020/07/30
5830
如何基于 DDD 构建微服务?
Chris Richardson微服务翻译:构建微服务之使用API网关
Chris Richardson 微服务系列翻译全7篇链接: 微服务介绍 构建微服务之使用API网关(本文) 构建微服务之微服务架构的进程通讯 微服务架构中的服务发现 微服务之事件驱动的数据管理 微服
butterfly100
2018/04/17
8800
Chris Richardson微服务翻译:构建微服务之使用API网关
无服务器化的微服务持续交付
前言 我在刚进入 ThoughtWorks 的时候就做微服务,当时不知道什么叫做微服务,只是我们通过一个小的技术应用替换原先的大应用的一个部分,当时只是做一个解耦,后来等微服务的概念兴起的时候才知道我们当时做的是微服务,这是我做微服务的起因。 最近在做 DevOps 的一些咨询,在海外做一些互联网行业的并购,用了 DevOps 的相关技术。这次我就讲一下我之前做的一个案例,就是无服务化的微服务的持续交付。 一 什么是无服务器架构 无服务器架构,这个词2012年就已经出现了,当时是因为移动互联网兴起。大家会发
DevOps时代
2018/02/02
1.8K0
无服务器化的微服务持续交付
我们如何转型微服务?
微服务在这个时代是一个常常被提及的话题。 我在 SoundCloud时, 曾经负责把一个巨石架构的 Ruby on Rails 应用迁移到微服务。这个故事的技术层面, 我做过多次演讲并且在 SoundCloud 的技术博客上发表过系列文章。这些工程的知识是人们最感兴趣的, 但最近我意识到我从来没有向大众解释我们是如何开启这段微服务之旅的。 抱歉让技术粉失望了, 我们迁移到微服务的原因更多是从产能考虑而非纯技术原因。下面我会做出解释。 注意:这篇文章有很多修正主义的成分, 为了使它更容易理解, 我们把一个相当
DevOps时代
2018/02/02
9150
我们如何转型微服务?
微服务架构10个最重要的设计模式
自从软件开发的早期(1960年代)以来,解决大型软件系统中的复杂性一直是一项艰巨的任务。多年来,软件工程师和架构师为解决软件系统的复杂性进行了许多尝试:David Parnas的模块化和信息隐藏(1972),Edsger W. Dijkstra的关注分离(1974),面向服务的体系结构(1998)。
肉眼品世界
2021/01/06
1.1K0
微服务架构10个最重要的设计模式
[翻译]微服务设计模式 - 2. 微服务应用模式
服务使用同步协议(如 HTTP/REST )或异步协议(如 AMQP )进行通信。服务可以彼此独立开发和部署。每项服务都有其自有数据库以便与其他服务分离。服务之间的数据一致性使用 SAGA 模式
干货满满张哈希
2021/04/12
3850
[翻译]微服务设计模式 - 2. 微服务应用模式
【微服务】构建应用程序的顶级微服务设计模式
在当今市场上,微服务已成为构建应用程序的首选解决方案。众所周知,它们可以解决各种挑战,但是,熟练的专业人员在使用此架构时经常面临挑战。因此,相反,开发人员可以探索这些问题中的常见模式,并可以创建可重用的解决方案来提高应用程序的性能。 因此,在这篇关于微服务设计模式的文章中,我将讨论构建成功的微服务所必需的顶级模式。 本文将介绍以下主题: 什么是微服务? 用于设计微服务架构的原则 微服务的设计模式 什么是微服务? 微服务,又名微服务架构,是一种架构风格,将应用程序构建为围绕业务领域建模的小型自治服务的集
架构师研究会
2022/04/11
5120
【微服务】构建应用程序的顶级微服务设计模式
构建领域驱动的微服务
微服务中的术语"微"传达了一个服务的大小,但这不是将一个应用变为微服务的唯一准则。当团队转变到基于微服务的架构时,需要提高敏捷性(自动部署和频繁发布)。很难对微服务架构的风格做一个准确的定义。我倾向于Adrian Cockcroft 的定义:"由松耦合且具有边界上下文的元素构成的面向服务的架构"。
charlieroro
2021/04/09
4270
构建领域驱动的微服务
如何构建基于 DDD 领域驱动的微服务?
尽管微服务中的“微”一词表示服务的规模,但它并不是使用微服务的唯一标准。当团队转向基于微服务的架构时,他们旨在提高敏捷性以及自主且频繁地部署功能。很难确定这种架构风格的简单定义。我喜欢Adrian Cockcroft的关于微服务的简短定义:“ 面向服务的体系结构,它由松散耦合的、具有上下文边界的元素组成。”
架构之家
2022/07/12
4650
如何构建基于 DDD 领域驱动的微服务?
微服务简介
我们假设,您开始开发一个打车应用,打算与 Uber 和 Hailo 竞争。经过初步交流和需求收集,您开始手动或者使用类似 Rails、 Spring Boot、 Play 或者 Maven 等平台来生成一个新项目。
张哥编程
2024/12/19
1020
微服务简介
【微服务】微服务间通信的最佳实践
一个好的 API 架构对于有效处理微服务之间的通信很重要。不要害怕创建新的微服务,并尽可能地尝试解耦功能。例如,与其创建一个通知服务,不如尝试为电子邮件通知、SMS 通知和移动推送通知创建单独的微服务。 在这里,我假设您有一个 API 网关来管理请求、处理到负载平衡服务器的路由并限制未经授权的访问。 通讯类型 同步协议:HTTP 是一种同步协议。客户端发送请求并等待服务的响应。这与客户端代码执行无关,它可以是同步的(线程被阻塞)或异步的(线程未被阻塞,并且响应最终会到达回调)。这里的重点是协议(HTTP/H
架构师研究会
2022/03/08
1.2K0
R.I.P. :传统整体式架构 VS 微服务
我咨询了十几个微服务项目。有些人表示,微服务真棒(这是未来!),而有些人很沮丧(谁发明了这个废物?)
李郑
2018/06/25
9240
实用微服务
如今,微服务是软件体系结构领域中最受欢迎的热门词汇之一。有许多材料都在介绍微服务的基本原理以及它的好处,但教你如何在企业场景中使用微服务的资料就十分少了。
用户2412608
2018/07/04
4K0
实用微服务
微服务模式系列之二:微服务架构
译者评论: 微服务架构大家已经耳熟能详,但是我认为这篇文章最有价值的是这段: 但这类解决方案中也存在着以下弊端: 开发者必须应对创建分布式系统所产生的额外的复杂因素。 现有开发者工具/IDE主要面向单体应用程序,因此无法显式支持分布式应用的开发。 测试工作更加困难。 开发者必须采取服务间通信机制。 很难在不使用分布式事务机制的情况下跨服务实现功能。 跨服务实现功能要求各团队进行密切协作。 部署复杂。在生产环境下,对这类多种服务类型构建而成的系统进行部署与管理十分困难。 内存占用量更高。微
yuanyi928
2018/04/02
8520
微服务模式系列之二:微服务架构
搞懂微服务
首先服务提供者(用户、商品等微服务子模块)按照指定格式的服务接口描述,向注册中心注册服务,声明自己能够提供哪些服务以及服务的地址是什么,完成服务发布。
赵云龙龙
2022/04/26
5990
搞懂微服务
相关推荐
什么是微服务?
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档