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

简介: 阿里云容器服务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自动判断,选取一个实例进行访问。在这个过程中没有用到集中式的负载均衡,而是通过客户端发现和负载均衡。

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


转载自:https://yq.aliyun.com/articles/57265?spm=5176.100244.teamconlist.3.lGVR5V

相关实践学习
使用ACS算力快速搭建生成式会话应用
阿里云容器计算服务 ACS(Container Compute Service)以Kubernetes为使用界面,采用Serverless形态提供弹性的算力资源,使您轻松高效运行容器应用。本文将指导您如何通过ACS控制台及ACS集群证书在ACS集群中快速部署并公开一个容器化生成式AI会话应用,并监控应用的运行情况。
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
8月前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
2268 10
|
8月前
|
监控 Java 数据库
从零学 Dropwizard:手把手搭轻量 Java 微服务,告别 Spring 臃肿
Dropwizard 整合 Jetty、Jersey 等成熟组件,开箱即用,无需复杂配置。轻量高效,启动快,资源占用少,内置监控、健康检查与安全防护,搭配 Docker 部署便捷,是构建生产级 Java 微服务的极简利器。
854 117
|
7月前
|
负载均衡 Java API
《深入理解Spring》Spring Cloud 构建分布式系统的微服务全家桶
Spring Cloud为微服务架构提供一站式解决方案,涵盖服务注册、配置管理、负载均衡、熔断限流等核心功能,助力开发者构建高可用、易扩展的分布式系统,并持续向云原生演进。
|
安全 Java Apache
微服务——SpringBoot使用归纳——Spring Boot中集成 Shiro——Shiro 身份和权限认证
本文介绍了 Apache Shiro 的身份认证与权限认证机制。在身份认证部分,分析了 Shiro 的认证流程,包括应用程序调用 `Subject.login(token)` 方法、SecurityManager 接管认证以及通过 Realm 进行具体的安全验证。权限认证部分阐述了权限(permission)、角色(role)和用户(user)三者的关系,其中用户可拥有多个角色,角色则对应不同的权限组合,例如普通用户仅能查看或添加信息,而管理员可执行所有操作。
641 0
|
安全 Java 数据安全/隐私保护
微服务——SpringBoot使用归纳——Spring Boot中集成 Shiro——Shiro 三大核心组件
本课程介绍如何在Spring Boot中集成Shiro框架,主要讲解Shiro的认证与授权功能。Shiro是一个简单易用的Java安全框架,用于认证、授权、加密和会话管理等。其核心组件包括Subject(认证主体)、SecurityManager(安全管理员)和Realm(域)。Subject负责身份认证,包含Principals(身份)和Credentials(凭证);SecurityManager是架构核心,协调内部组件运作;Realm则是连接Shiro与应用数据的桥梁,用于访问用户账户及权限信息。通过学习,您将掌握Shiro的基本原理及其在项目中的应用。
481 0
|
NoSQL Java 关系型数据库
微服务——SpringBoot使用归纳——Spring Boot 中集成Redis——Redis 介绍
本文介绍在 Spring Boot 中集成 Redis 的方法。Redis 是一种支持多种数据结构的非关系型数据库(NoSQL),具备高并发、高性能和灵活扩展的特点,适用于缓存、实时数据分析等场景。其数据以键值对形式存储,支持字符串、哈希、列表、集合等类型。通过将 Redis 与 Mysql 集群结合使用,可实现数据同步,提升系统稳定性。例如,在网站架构中优先从 Redis 获取数据,故障时回退至 Mysql,确保服务不中断。
457 0
微服务——SpringBoot使用归纳——Spring Boot 中集成Redis——Redis 介绍
|
Java 数据安全/隐私保护 微服务
微服务——SpringBoot使用归纳——Spring Boot中使用监听器——Spring Boot中自定义事件监听
本文介绍了在Spring Boot中实现自定义事件监听的完整流程。首先通过继承`ApplicationEvent`创建自定义事件,例如包含用户数据的`MyEvent`。接着,实现`ApplicationListener`接口构建监听器,用于捕获并处理事件。最后,在服务层通过`ApplicationContext`发布事件,触发监听器执行相应逻辑。文章结合微服务场景,展示了如何在微服务A处理完逻辑后通知微服务B,具有很强的实战意义。
732 0
|
缓存 Java 数据库
微服务——SpringBoot使用归纳——Spring Boot中使用监听器——监听器介绍和使用
本文介绍了在Spring Boot中使用监听器的方法。首先讲解了Web监听器的概念,即通过监听特定事件(如ServletContext、HttpSession和ServletRequest的创建与销毁)实现监控和处理逻辑。接着详细说明了三种实际应用场景:1) 监听Servlet上下文对象以初始化缓存数据;2) 监听HTTP会话Session对象统计在线用户数;3) 监听客户端请求的Servlet Request对象获取访问信息。每种场景均配有代码示例,帮助开发者理解并应用监听器功能。
715 0
|
Java 关系型数据库 数据库
微服务——SpringBoot使用归纳——Spring Boot事务配置管理——常见问题总结
本文总结了Spring Boot中使用事务的常见问题,虽然通过`@Transactional`注解可以轻松实现事务管理,但在实际项目中仍有许多潜在坑点。文章详细分析了三个典型问题:1) 异常未被捕获导致事务未回滚,需明确指定`rollbackFor`属性;2) 异常被try-catch“吃掉”,应避免在事务方法中直接处理异常;3) 事务范围与锁范围不一致引发并发问题,建议调整锁策略以覆盖事务范围。这些问题看似简单,但一旦发生,排查难度较大,因此开发时需格外留意。最后,文章提供了课程源代码下载地址,供读者实践参考。
393 0

相关产品

  • 容器计算服务
  • 容器服务Kubernetes版