goahead如何使用cgi服务_如何使用消息队列,Spring Boot和Kubernetes扩展微服务

本文通过一个详细的购物例子,展示了如何利用消息队列,Spring Boot和Kubernetes进行微服务的开发,并阐述了针对微服务的伸缩,监控等方式,帮助用户快速利用这些工具开发健壮的系统。

当你设计和构建大规模应用时,你将面临两个重大挑战:可伸缩性和健壮性

你应该这样设计你的服务,即使它受到间歇性的重负载,它仍能可靠地运行。

以Apple Store为例。

每年都有数百万的Apple客户预先注册购买新的iPhone。

这是数百万人同时购买物品。

如果你要将Apple商店的流量描述为每秒的请求数量,那么它可能是下图的样子:

b81caae504260ea6097572c5000d6c72.png

现在想象一下,你的任务是构建这样的应用程序。

你正在建立一个商店,用户可以在那里购买自己喜欢的商品。

你构建一个微服务来呈现网页并提供静态资产。 你还构建了一个后端REST API来处理传入的请求。

你希望将两个组件分开,因为这样可以使用相同的REST API,为网站和移动应用程序提供服务。

b0cc85765fa92c05506a2a8bea11bddb.gif

今天是重要的一天,你的商店上线了。

你决定将应用程序扩展为前端四个实例和后端四个实例,因为你预测网站比平常更繁忙。

cc9a30915c4365f0ceb516528c09472f.gif

你开始接收越来越多的流量。

前端服务正在很好得处理流量。 但是你注意到连接到数据库的后端正在努力跟上事务的数量。

不用担心,你可以将后端的副本数量扩展到8。

73227cf1da92278d3e7f7a987f7cad13.gif

你收到的流量更多,后端无法应对。

一些服务开始丢弃连接。 愤怒的客户与你的客服取得联系。 而现在你被淹没在大量流量中。

你的后端无法应付它,它会失去很多连接。

9b267584f9d341be184bc946d3a4a49b.gif

你刚丢了一大笔钱,你的顾客也不高兴。

你的应用程序并没有设计得健壮且高可用:

  • 前端和后端紧密耦合——实际上它不能在没有后端的情况下处理应用
  • 前端和后端必须一致扩展——如果没有足够的后端,你可能会淹没在流量中
  • 如果后端不可用,则无法处理传入的事务。

失去事务意味着收入损失。

你可以重新设计架构,以便将前端和后端用队列分离。

40d828e65ebd5fe75b16fe60c0a5433f.gif

前端将消息发布到队列,而后端则一次处理一个待处理消息。

新架构有一些明显的好处:

  • 如果后端不可用,则队列充当缓冲区
  • 如果前端产生的消息多于后端可以处理的消息,则这些消息将缓冲在队列中
  • 你可以独立于前端扩展后端——即你可以拥有数百个前端服务和后端的单个实例

如何构建这样的应用程序?

你如何设计可处理数十万个请求的服务? 你如何部署动态扩展的应用程序?

在深入了解部署和扩展的细节之前,让我们关注应用程序。

编写Spring应用程序

该服务有三个组件:前端,后端和消息代理。

前端是一个简单的Spring Boot Web应用程序,带有Thymeleaf模板引擎。

后端是一个消耗队列消息的工作者。

由于Spring Boot与JSM能出色得集成,因此你可以使用它来发送和接收异步消息。

你可以在learnk8s / spring-boot-k8s-hpa中找到一个连接到JSM的前端和后端应用程序的示例项目。

请注意,该应用程序是用Java 10编写的,以利用改进的Docker容器集成能力。

只有一个代码库,你可以将项目配置为作为前端或后端运行。

你应该知道该应用程序具有:

  • 一个购买物品的主页
  • 管理面板,你可以在其中检查队列中的消息数
  • 一个 /health 端点,用于在应用程序准备好接收流量时发出信号
  • 一个 /submit 端点,从表单接收提交并在队列中创建消息
  • 一个 /metrics 端点,用于公开队列中待处理消息的数量(稍后将详细介绍)

该应用程序可以在两种模式下运行:

作为前端,应用程序呈现人们可以购买物品的网页。

5db47dca8d5cadf6f62132639774a0b7.png

作为工作者,应用程序等待队列中的消息并处理它们。

d1d1d408eead59f4a57ca1854590b15d.png

请注意,在示例项目中,使用Thread.sleep(5000)等待五秒钟来模拟处理。

你可以通过更改application.yaml中的值来在任一模式下配置应用程序。

模拟应用程序的运行

默认情况下,应用程序作为前端和工作程序启动。

你可以运行该应用程序,只要你在本地运行ActiveMQ实例,你就应该能够购买物品并让系统处理这些物品。

3282ed985ad8b9e5e5fe15f92bf7c8ef.gif

如果检查日志,则应该看到工作程序处理项目。

它确实工作了!编写Spring Boot应用程序很容易。

一个更有趣的主题是学习如何将Spring Boot连接到消息代理。

使用JMS发送和接收消息

Spring JMS(Java消息服务)是一种使用标准协议发送和接收消息的强大机制。

如果你以前使用过JDBC API,那么你应该熟悉JMS API,因为它的工作方式很类似。

你可以按JMS方式来使用的最流行的消息代理是ActiveMQ——一个开源消息服务器。

使用这两个组件,你可以使用熟悉的接口(JMS)将消息发布到队列(ActiveMQ),并使用相同的接口来接收消息。

更妙的是,Spring Boot与JMS的集成非常好,因此你可以立即加快速度。

实际上,以下短类封装了用于与队列交互的逻辑:

@Componentpublic class QueueService implements MessageListener {private static final Logger LOGGER = LoggerFactory.getLogger(QueueService.class);@Autowiredprivate JmsTemplate jmsTemplate;public void send(String destination, String message) {LOGGER.info("sending message='{}' to destination='{}'
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值