在阿里云容器服务上开发基于Docker的Spring Cloud微服务应用

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 阿里云容器服务Spring Cloud应用开发系列文章

本文为阿里云容器服务Spring Cloud应用开发系列文章的第一篇。

一、在阿里云容器服务上开发Spring Cloud微服务应用(本文)

二、部署Spring Cloud应用示例

三、服务发现

四、服务间通信与集成

五、服务智能路由

六、集中配置管理

七、高可用和容错

八、监控和日志

九、服务的部署和发布策略

微服务概述

单体应用通常指在一个程序中满足多个业务或技术领域的需求,不同的需求领域内化为模块。假定我们要开发一个Web应用,通常的MVC模式可以满足要求。针对不同领域有不少代码生成工具可以快生成代码框架,从0到1创建一个应用非常容易。放在一个应用里处理所有的事情的好处是非常大的,比如程序的调试相对容易,执行效率高。

单体的应用在规模变大后其前述好处会很快衰减。随着业务的增长,需求的调整和变更,应用内部会以模块为基础进行重构,增加和删减、改变模块的能力。应用逐渐超越开发人员所能掌控的范围,代码死角开始出现,重构变得困难。变更经常是牵一发而动全身。针对任何一个模块的扩容或升级都是对整个应用的所有模块的扩容和升级。程序对外界的依赖越来越复杂,自动化测试的覆盖率低。

如何避免单体应用的问题引入了微服务的概念。每个服务只处理一件事情,应用由多个服务构成。服务之间通过Web协议进行通信,例如http/json。代码要易于抛弃:出问题的代码可以更容易地重写。运行的服务也要易于抛弃,升级时用一个新的服务实例替代旧的实例。

把单体应用分解为一些列微服务,开发团队也可以进行“重构”,每个小团队负责一个服务,维护和学习成本下降了。由于服务间通过接口进行连接,每个服务的内部实现机制可以根据领域选择更合适的技术,混合编程是很自然的事情,试错的成本降低、试错的频率加快,从而意味着创新的速度可以提高。

没有银弹

如此美好的微服务也不是“银弹”。它只是说了“微”是好的,但没有说出如何变“微”。如果对业务领域的理解不全,对需求的把控不准,服务可能只是小的单体应用而已。

另外的问题来源于分布式计算。单体服务中两个模块的调用是高效、可靠的,而两个服务之间的网络通信是低效且不可靠的。分布式计算中的很多经典问题无法绕开,比如服务的可用性、数据的一致性等。

服务实例数目的不断变化,数据流量的波动导致监控和日志分析的复杂度大大提升。现在开源的监控和日志方案很多,但如何搭建并定制一套自己的方案并不是一件容易的事。

当然我们不能因噎废食,如果有一个平台已经能够提供其中大部分非功能需求,比如高可用、监控和日志等,那么在其上构建和运营一个微服务应用很容易了。阿里云的容器服务就是这样一个平台。

Docker技术以及阿里云容器服务

微服务的实现需要有高度标准化的交付技术来支撑,容器技术很好地满足了这个需求。利用容器技术把应用及其依赖做成一个标准的镜像,从开发到测试到生产环境都用同样的镜像,DevOps把开发和运维中间的鸿沟弥补起来。容器技术正逐渐成为微服务和DevOps领域的最佳实践,成为这些领域创新的基石。

在本系列文章中,我们探讨在阿里云的容器服务上,如何利用Spring Cloud来构造一个微服务应用。

Spring Cloud和Netflix概述

Spring Cloud是Springframework里的一个项目,提供了开发分布式系统中比较常见的一些模式能力。其中配置管理(Config Server)、服务发现(Eureka)、服务熔断(Hystrix)、智能路由(Zuul)等是基于Netflix OSS的一个封装,利用Java注解(annotation)声明,可以在Spring Boot应用里便捷地使用Netflix的开源产品构建生产级可用的微服务应用。

代码示例

本系列文章的内容围绕着一个虚拟的场景构建了一个完整的微服务应用,可以在本地的Docker上运行,或部署到阿里云容器服务上。示例代码在此

服务化应用

示例模拟的场景是企业内部应用服务化,服务之间通过API相互访问。foo服务和bar服务是两类基本服务,允许内网其他服务通过API访问,但不对外网提供服务。foobar对外提供服务,在处理时需要调用foo服务和bar服务。

服务发现机制由discovery-server提供,基于Eureka实现。由于discovery-server的业务无关性,开发人员可以直接使用Docker镜像。

foobar服务通过注册到智能应用路由gateway服务上对外提供服务,gateway基于Zuul,其代码业务无关,开发人员可以直接使用其Docker镜像,但由于zuul是通过配置文件来描述不同的服务对应的URL访问模式,所以在实际使用中需要改变镜像中的配置文件,或者通过挂载Volume实现配置文件的共享和修改。

foo, bar和foobar的代码中都包含了Eureka和Ribbon Client,实现了向Eureka的自注册和查询Eureka的能力,Ribbon实现了客户端的负载均衡。本示例中没有引入Hystrix。

逻辑架构

服务间的逻辑架构如下图所示。

arch01

每个服务在运行时都可以根据负载水平弹性扩展,每个服务可能由多个运行中的实例构成。所有服务实例在启动时自动注册到Eureka Server,服务之间的发现也是通过Eureka Server获取实例信息,并由Ribbon Client自动判断,选取一个实例进行访问。在这个过程中没有用到集中式的负载均衡,而是通过客户端发现和负载均衡。

在下一篇文章中我们会讨论如何编译和部署这个应用。

更多精彩活动:【有“福”同享.第二季】每日一分享,虚机邮箱免费用

相关实践学习
巧用云服务器ECS制作节日贺卡
本场景带您体验如何在一台CentOS 7操作系统的ECS实例上,通过搭建web服务器,上传源码到web容器,制作节日贺卡网页。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
12天前
|
Cloud Native Go 开发工具
不改一行代码轻松玩转 Go 应用微服务治理
为了更好的进行 Go 应用微服务治理,提高研发效率和系统稳定性,本文将介绍 MSE 微服务治理方案,无需修改业务代码,实现治理能力。
19653 2
|
2天前
|
Prometheus 监控 Kubernetes
Prometheus 在微服务架构中的应用
【8月更文第29天】随着微服务架构的普及,监控和跟踪各个服务的状态变得尤为重要。Prometheus 是一个开源的监控系统和时间序列数据库,非常适合用于微服务架构中的监控。本文将详细介绍 Prometheus 如何支持微服务架构下的监控需求,包括服务发现、服务间的监控指标收集以及如何配置 Prometheus 来适应这些需求。
9 0
|
2天前
|
监控 JavaScript 测试技术
从单体应用迁移到微服务的最佳实践
【8月更文第29天】随着软件架构的发展,越来越多的企业开始考虑从传统的单体应用迁移到微服务架构。虽然迁移可以带来诸如更好的可扩展性、更高的灵活性等优势,但这一过程也可能充满挑战。本文将详细介绍如何顺利地进行这一转变,并提供一些实用的步骤和示例代码。
12 0
|
4天前
|
运维 开发者 Docker
Docker容器化技术在运维中的应用实践
【8月更文挑战第27天】本文旨在探讨Docker容器化技术如何在现代运维工作中发挥核心作用,通过深入浅出的方式介绍Docker的基本概念、优势以及实际应用场景。文章将结合具体案例,展示如何利用Docker简化部署流程、提高资源利用率和加强应用的可移植性。读者将获得对Docker容器技术在实际运维中应用的全面认识,并能够理解其在提升运维效率与质量方面的重要性。
|
11天前
|
Kubernetes Shell 测试技术
在Docker中,可以在一个容器中同时运行多个应用进程吗?
在Docker中,可以在一个容器中同时运行多个应用进程吗?
|
11天前
|
存储 Kubernetes 监控
在Docker中,很多应用容器都是默认后台运行的,怎么查看它们的输出和日志信息?
在Docker中,很多应用容器都是默认后台运行的,怎么查看它们的输出和日志信息?
|
11天前
|
Java Docker 微服务
微服务架构已成为Java Web开发的新趋势,它通过将应用分解为独立、可部署的服务单元,提升了系统的灵活性与可维护性。
微服务架构已成为Java Web开发的新趋势,它通过将应用分解为独立、可部署的服务单元,提升了系统的灵活性与可维护性。每个服务负责特定功能,通过轻量通信机制协作。利用Spring Boot与Spring Cloud等框架可简化开发流程,支持模块化设计、独立部署、技术多样性和容错性,适应快速迭代的需求。
56 1
|
12天前
|
监控 Java 开发者
随着软件开发的发展,传统单体应用已难以适应现代业务需求,微服务架构因此兴起,成为构建可伸缩、分布式系统的主流
随着软件开发的发展,传统单体应用已难以适应现代业务需求,微服务架构因此兴起,成为构建可伸缩、分布式系统的主流。本文探讨Java微服务架构的设计原则与实践。核心思想是将应用拆分为独立服务单元,增强模块化与扩展性。Java开发者可利用Spring Boot等框架简化开发流程。设计时需遵循单一职责、自治性和面向接口编程的原则。以电商系统为例,将订单处理、商品管理和用户认证等拆分为独立服务,提高可维护性和容错能力。还需考虑服务间通信、数据一致性及监控等高级话题。掌握这些原则和工具,开发者能构建高效、可维护的微服务应用,更好地应对未来挑战。
49 1
|
13天前
|
前端开发 PHP 开发者
React Server Component 使用问题之怎么使用Docker运行PHP应用
React Server Component 使用问题之怎么使用Docker运行PHP应用

相关产品

  • 容器计算服务
  • 下一篇
    云函数