利用Docker轻松实现云原生应用: Spring Boot + Redis分布式会话

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 前文谈到了云原生应用在部署架构中需要考虑的重要问题。文本将介绍一个常见的应用架构模式来提升应用的可用性和可伸缩性 - 分布式会话管理。并利用Docker和阿里云容器服务在本地和云端进行了示例应用的部署和验证。

14808310188670

本文为利用Docker和容器服务轻松实现云原生应用系列的第二篇

前文谈到了云原生应用在部署架构中需要考虑的重要问题。文本将介绍一个常见的应用架构模式来提升应用的可用性和可伸缩性 - 分布式会话管理。

随着业务增长,Web应用也从单节点部署演变为集群部署。这时候除了需要为应用服务器增加负载均衡之外,也要解决会话(session)管理的问题。Session在应用中常被用于存储用户相关的数据。在高可用系统中,如果一台应用服务宕机,其他服务器需要能够接管当前活跃的会话,继续为用户提供服务。所以我们必须提供分布式的会话管理能力。

Spring/Spring Boot应用中利用Spring Session配合Redis是一个流行的分布式的会话管理方案,它有如下几个优点:

  • 将session所持久化状态从应用服务器本地内存卸载到外部Redis服务中,可以提升应用的可用性
  • 应用服务器是无状态的,满足 12-factor 的要求,可以更好地支持应用水平扩展

关于 Spring Session 的信息可以从官方文档获得

利用Docker来本地测试Spring Boot + Redis会话存储

首先从Github获得示例代码

git clone https://github.com/denverdino/docker-spring-boot-sample-session-redis
cd docker-spring-boot-sample-session-redis

本工程基于Spring Boot使用Redis会话存储的官方示例,并做简单调整如下:

其中 /src/main/resources/application.properties 内容:

spring.session.store-type=redis
server.session.timeout=5
spring.redis.host=redis
spring.redis.port=6379

它会配置基于Redis的分布式会话存储支持,会话超时时间为“5”秒,Redis服务域名为“redis”,端口 “6379”。

我们再查看项目的Maven配置文件pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <!-- Your own application should inherit from spring-boot-starter-parent -->
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.4.1.RELEASE</version>
    </parent>
    <artifactId>spring-boot-sample-session-redis</artifactId>
    <name>Spring Boot Session Redis Sample</name>
    <description>Spring Boot Session Redis Sample</description>
    <url>http://projects.spring.io/spring-boot/</url>
    <organization>
        <name>Pivotal Software, Inc.</name>
        <url>http://www.spring.io</url>
    </organization>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>0.4.13</version>
                <configuration>
                    <imageName>registry.cn-hangzhou.aliyuncs.com/denverdino/spring-boot-session-redis</imageName>
                    <baseImage>openjdk:8-jre</baseImage>
                    <entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>
                    <resources>
                       <resource>
                         <targetPath>/</targetPath>
                         <directory>${project.build.directory}</directory>
                         <include>${project.build.finalName}.jar</include>
                       </resource>
                    </resources>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

其中它除了声明了对Spring Boot框架的支持,还添加了来自Spotifydocker-maven-plugin构建应用的Docker镜像

我们可以来用maven命令来构建Spring Boot示例应用(参数是为了跳过单元测试)

mvn package -Dmaven.test.skip=true

也可以利用maven命令构建示例应用的Docker镜像

mvn package docker:build -Dmaven.test.skip=true

注:关于“docker-maven-plugin”插件的更多信息,可以参考容器化Spring Boot应用一文

构建镜像完成,可以使用如下docker-compose.yml模板来在本地部署和测试应用。其中web服务会启动Spring Boot测试应用,并利用容器链接通过“redis”别名来访问redis服务中的Redis容器

web:
  image: registry.cn-hangzhou.aliyuncs.com/denverdino/spring-boot-session-redis
  ports:
    - 8080:8080
  links:
    - redis:redis
redis:
  image: redis:3

执行 docker-compose up 命令之后,我们就会看到“redis”容器和“web”应用容器相继启动

我们可以通过浏览器来访问http://localhost:8080/测试应用。如果会话不存在或会话超时(5秒钟),应用会生成一个UUID保存在会话中并返回;如果会话存在,则会直接返回会话中保存的UUID。

利用容器服务来部署分布式会话管理应用

阿里云容器服务提供了对分布式的Docker应用的部署和管理能力。我们可以简单地扩展之前的Docker Compose模板来在云端部署应用。

web:
  image: registry.cn-hangzhou.aliyuncs.com/denverdino/spring-boot-session-redis
  labels:
    aliyun.scale: "3"
    aliyun.routing.port_8080: spring-boot
  links:
    - redis:redis
redis:
  image: redis:3

注:

  • 通过aliyun.xxx标签声明了,web应用由3个容器组成应用集群,并可以通过虚拟域名“spring-boot”进行访问
  • 通过路由服务来访问应用是无需使用 ports 对容器端口进行宿主机端口映射的

部署之后,web服务在控制台的截图如下,可以直接点击访问端点来验证应用。

14808300491575

总结

在云原生应用中,分布式会话管理是一个重要的应用模式。本文利用Docker和阿里云容器服务在本地和云端进行了示例应用的部署和验证。

如果大家有兴趣,还可以将容器模板中的Redis镜像替换成阿里云提供的Redis服务,这样可以在生产系统中提供更好的可用性和和可伸缩性。可以参考在阿里云容器服务中使用RDS

想了解更多容器服务内容,请访问 https://www.aliyun.com/product/containerservice

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
5天前
|
弹性计算 运维 持续交付
探索Docker容器化技术及其在生产环境中的应用
探索Docker容器化技术及其在生产环境中的应用
32 5
|
17天前
|
安全 Java 网络安全
当网络安全成为数字生活的守护者:Spring Security,为您的应用筑起坚不可摧的防线
【9月更文挑战第2天】在数字化时代,网络安全至关重要。本文通过在线银行应用案例,详细介绍了Spring Security这一Java核心安全框架的核心功能及其配置方法。从身份验证、授权控制到防御常见攻击,Spring Security提供了全面的解决方案,确保应用安全。通过示例代码展示了如何配置`WebSecurityConfigurerAdapter`及`HttpSecurity`,帮助开发者有效保护应用免受安全威胁。
40 4
|
17天前
|
NoSQL 关系型数据库 Redis
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
mall在linux环境下的部署(基于Docker容器),docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongodb、minio详细教程,拉取镜像、运行容器
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
|
6天前
|
Cloud Native 持续交付 Docker
探索Docker容器化技术及其在软件开发中的应用
探索Docker容器化技术及其在软件开发中的应用
17 7
|
4天前
|
Devops jenkins 持续交付
DevOps实践:构建和部署一个Docker化的应用
【9月更文挑战第14天】在当今快节奏的软件开发领域,DevOps已经成为提升效率、加速交付的关键。本文将引导你理解DevOps的核心概念,并通过一个实际的示例—构建和部署一个Docker化的应用—来深入探讨其实践方法。我们将从简单的应用出发,逐步实现Docker容器化,并最终通过CI/CD流水线自动化部署过程。这不仅是对DevOps流程的一次实操演练,也是对现代软件开发理念的一次深刻体验。
|
9天前
|
持续交付 开发者 Docker
掌握 Docker:容器化技术在现代开发中的应用
Docker 是一个开源容器化平台,使开发者能够将应用程序及其依赖项封装在轻量级容器中,确保跨平台的一致性。本文介绍了 Docker 的基本概念、核心组件及优势,并展示了其在快速部署、一致性、可移植性和微服务架构中的应用。通过示例说明了 Docker 在本地开发环境搭建、服务依赖管理和 CI/CD 流程中的作用,以及多阶段构建、资源限制和网络模式等高级特性。掌握 Docker 可大幅提升开发效率和应用管理能力。
|
6天前
|
人工智能 Kubernetes Cloud Native
深度对话 解锁阿里云分布式云原生技术落地新姿势
深度对话 解锁阿里云分布式云原生技术落地新姿势
深度对话 解锁阿里云分布式云原生技术落地新姿势
|
14天前
|
负载均衡 持续交付 Docker
Docker的应用场景有哪些?
Docker的应用场景有哪些?
47 6
|
14天前
|
负载均衡 大数据 测试技术
docker容器技术有哪些应用场景?
docker容器技术有哪些应用场景?
30 5
|
17天前
|
IDE Java 开发工具
还在为繁琐的配置头疼吗?一文教你如何用 Spring Boot 快速启动,让开发效率飙升,从此告别加班——打造你的首个轻量级应用!
【9月更文挑战第2天】Spring Boot 是一款基于 Spring 框架的简化开发工具包,采用“约定优于配置”的原则,帮助开发者快速创建独立的生产级应用程序。本文将指导您完成首个 Spring Boot 项目的搭建过程,包括环境配置、项目初始化、添加依赖、编写控制器及运行应用。首先需确保 JDK 版本不低于 8,并安装支持 Spring Boot 的现代 IDE,如 IntelliJ IDEA 或 Eclipse。
54 5