对于开发人员来说,微服务是个既火爆又受追捧的话题,谁不想用上微服务架构呢。但是对于企业来说,微服务却并非万能药,在团队构建和交付软件的过程中,其实微服务是面临着很多挑战的,比如软件管理文化问题、系统一致性问题、分布式系统冗余问题…
1 什么是事件驱动型微服务?
什么是事件驱动型微服务?Kenny Bastani 用一个大家每天都在用的事件驱动例子——前端 Web 应用程序来进行解释。在每一个 Web 浏览器中,事件都是被用来捕获用户输入的一种处理方式。通过显式的映射函数处理连接到页面元素的事件,通常我们称之为动作或者命令,触发时会调用用户接口进行状态改变。除此之外,事件也在一些后端系统中被广泛使用,被用来使用领域驱动设计模式进行设计。但是最近一段时间,随着微服务概念的广泛采用,关于如何在分布式后端系统中利用事件驱动技术又重新点燃了大家的兴趣。
在分布式系统中,计算打破了单一型应用程序的边界,在单一型架构中,我们可以通过使用多线程并发方式调用计算资源。但是当我们演进到微服务架构时,应用程序架构被切分为很多个分离的服务,通过互相之间通信以满足特定用例。事件提供了一种分布式计算方式,我们可以将事件作为消息在微服务架构内部传输。采用针对微服务的事件优先方式的一个主要原因是管理领域实体的连通性,这些实体之间通过外键关系横跨不同应用程序和数据库边界。 一个微服务可能需要观察另一个微服务所产生的事件,这样做是为了维持不同应用程序所管理的不同实体之间的外键关系。
在 Kenny Bastani 看来,微服务倾向于使用 HTTP 协议进行通信,通过不同应用程序提供的 REST API 接口进行通信。每一个微服务的业务逻辑可以使用协议进行交互和触发动作。但是也存在异步的非阻塞通信协议,例如 AMQP。这种通信方式是基于消息的,是多个服务之间消息交换的首选方式。多个 Spring 项目支持这种工作流方式,现在这种通信方式最流行的项目是 Spring Cloud Stream,它允许客户在不用修改应用程序代码的情况下交换消息中间件。例如我想要在 Apache Kafka 和 RabbitMQ 之间切换状态,我可以在不修改核心代码的情况下交换后端数据。
2 Spring Cloud:解决系统一致性问题
在一个出售 T-shirt 的在线商店,这个在线商店的 10 个微架构中,后端有 5 个,有目录、账户、库存、购物车等等不同服务,每个服务都是由独立团队管理,它们可以独立地部署相应的变化。在底下是数据库,数据库用来存储记录,有时候可能会有一些问题,因为这不是系统中的一致性。
因为前端应用担心如何与后端的服务进行联系,因此我们需要使用 API 决定需要联系的服务。一个服务可能会将你的请求和后端的服务联系在一起,而我们恰恰需要这样一个后端服务的层面,便于管理。 对此 Kenny Bastani 推荐 Spring Cloud:它可以解决刚才提到的问题——前端开发者不用担心到底应该跟哪个服务接触,后端的服务也不用担心这个服务在哪里。 因此在线商店的网页上,如果你想看客户服务,直接将请求打上,后端便会自动地对你的服务做出反应,不用担心后端的复杂性。但是,每一个底下的服务可以做独立的变更,也不用担心应用会对生产有什么影响。应用可以按照名称来找到不同服务。这样之后,配置可以是中央化的管理,在线网站有了相关应用之后,可以有用户的验证。
3 从 Spring Cloud Stream 到 Spring Boot:痛点这样解决
另外 Kenny Bastani 还表示: 如果微服务没有被使用恰当,会让你淹没在你从未知道的服务中。你有很多的变化,可是你不知道这些变化的历史,便不知道哪儿好哪儿不好。
我们怎么才能看到曾经的变化呢,怎么去描述有什么样的变化呢?我们要对所有数据安全命令和查询进行建模,之后扩大更新数据库的状态到最新版本。
首先需要有命令服务、有 Spring Boot,即提出命令可以更新账户;然后再做事件处理器,即查询服务;然后再去观察将这些服务写到数据库当中;最后是查询服务。所有的关键内容都是无缝连接的,从 API 开始到分布式系统,再之后到无缝 API,我们可以观察命令和查询操作了解 API 的样式。
Spring Cloud Stream 允许我们快速地创造针对输入和输出的消息通道,帮助提供一种生产和消费事件信息的手段。所有包含连接到不同服务的管道会自动完成配置,只需要通过使用默认的 Spring Cloud Stream 选项就能完成了。
而提及 Spring Boot,据 Kenny Bastani 介绍,这是一个构建在 Spring 生态环境上的本地云应用框架。Spring Boot 出现之前,所有的应用程序都是在 Spring 框架上运行的。Spring Boot 跨出了一步,允许你通过指定组件形式快速提供生产环境所需的 Spring 应用。
例如,有用户想利用微服务搭建一个 Web 应用程序,需要能够连接到 MySQL 数据库,也要能够连接到 RabbitMQ 消息中间件。就可以使用 Spring 指定每一个组件的依赖关系,Spring Boot 会自动使用默认配置对所有组件进行配置。类似于 Spring Boot 这样的工具,提供了默认的“做事方式”,也提供了自定义的入口。最后的结果是你不再需要担心在生产环境下准备调优应用程序所需的一切。Spring Boot 提供的默认选项已经足够你运行在生产环境了。
以上信息来自 Kenny Bastani 在 Spring Summit 2017 上演讲,更多讲师信息,请点击 阅读原文 下载讲师演讲 PPT。
[广告]赞助链接: 舆情监测,互联网舆情首选查舆情:http://www.chayuqing.com/ 四季很好,只要有你,文娱排行榜:http://www.yaopaiming.com/
网络尖刀
公众号:mcbang_com
数据、技术、运营
知安
公众号:knowsafe
黑客、技术、安全
查舆情
公众号:chayuqing_com
舆情、文娱、品牌