本文共 4413 字,大约阅读时间需要 14 分钟。
导读 | 前文谈到了云原生应用在部署架构中需要考虑的重要问题。文本将介绍一个常见的应用架构模式来提升应用的可用性和可伸缩性 - 分布式会话管理。并利用Docker和阿里云容器服务在本地和云端进行了示例应用的部署和验证。 |
前文谈到了云原生应用在部署架构中需要考虑的重要问题。文本将介绍一个常见的应用架构模式来提升应用的可用性和可伸缩性 - 分布式会话管理。
随着业务增长,Web应用也从单节点部署演变为集群部署。这时候除了需要为应用服务器增加负载均衡之外,也要解决会话(session)管理的问题。Session在应用中常被用于存储用户相关的数据。在高可用系统中,如果一台应用服务宕机,其他服务器需要能够接管当前活跃的会话,继续为用户提供服务。所以我们必须提供分布式的会话管理能力。
Spring/Spring Boot应用中利用Spring Session配合Redis是一个流行的分布式的会话管理方案,它有如下几个优点:
关于 Spring Session 的信息可以从官方文档获得
首先从Github获得示例代码
class="hljs stata" data-language="">git clone https://github.com/denverdino/docker-spring-boot-sample-session-rediscd docker-spring-boot-sample-session-redis
本工程基于Spring Boot使用Redis会话存储的官方示例,并做简单调整如下:
其中 /src/main/resources/application.properties 内容:
class="hljs stylus" data-language="">spring.session.store-type=redisserver.session.timeout=5spring.redis.host=redisspring.redis.port=6379
它会配置基于Redis的分布式会话存储支持,会话超时时间为“5”秒,Redis服务域名为“redis”,端口 “6379”。
我们再查看项目的Maven配置文件pom.xml
class="hljs dust" data-language="">其中它除了声明了对Spring Boot框架的支持,还添加了来自Spotify的4.0.0 org.springframework.boot spring-boot-starter-parent 1.4.1.RELEASE spring-boot-sample-session-redis Spring Boot Session Redis Sample Spring Boot Session Redis Sample http://projects.spring.io/spring-boot/ Pivotal Software, Inc. http://www.spring.io org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-data-redis org.springframework.session spring-session org.springframework.boot spring-boot-starter-test test org.springframework.boot spring-boot-maven-plugin com.spotify docker-maven-plugin 0.4.13 registry.cn-hangzhou.aliyuncs.com/denverdino/spring-boot-session-redis openjdk:8-jre ["java", "-jar", "/${project.build.finalName}.jar"] / ${project.build.directory} ${project.build.finalName}.jar
docker-maven-plugin
构建应用的Docker镜像 我们可以来用maven命令来构建Spring Boot示例应用(参数是为了跳过单元测试) class="hljs stylus" data-language="">mvn package -Dmaven.test.skip=true
也可以利用maven命令构建示例应用的Docker镜像
class="hljs armasm" data-language="">mvn package docker:build -Dmaven.test.skip=true
注:关于“docker-maven-plugin”插件的更多信息,可以参考容器化Spring Boot应用一文
构建镜像完成,可以使用如下docker-compose.yml模板来在本地部署和测试应用。其中web服务会启动Spring Boot测试应用,并利用容器链接通过“redis”别名来访问redis服务中的Redis容器
class="hljs vim" data-language="">web: image: registry.cn-hangzhou.aliyuncs.com/denverdino/spring-boot-session-redis ports: - 8080:8080 links: - redis:redisredis: image: redis:3
执行docker-compose up 命令之后,我们就会看到“redis”容器和“web”应用容器相继启动
我们可以通过浏览器来访问测试应用。如果会话不存在或会话超时(5秒钟),应用会生成一个UUID保存在会话中并返回;如果会话存在,则会直接返回会话中保存的UUID。
阿里云容器服务提供了对分布式的Docker应用的部署和管理能力。我们可以简单地扩展之前的Docker Compose模板来在云端部署应用。
class="hljs vim" data-language="">web: image: registry.cn-hangzhou.aliyuncs.com/denverdino/spring-boot-session-redis labels: aliyun.scale: "3" aliyun.routing.port_8080: spring-boot links: - redis:redisredis: image: redis:3
注:
在云原生应用中,分布式会话管理是一个重要的应用模式。本文利用Docker和阿里云容器服务在本地和云端进行了示例应用的部署和验证。
如果大家有兴趣,还可以将容器模板中的Redis镜像替换成阿里云提供的Redis服务,这样可以在生产系统中提供更好的可用性和和可伸缩性。可以参考在阿里云容器服务中使用RDS
本文转载自:
免费提供最新Linux技术教程书籍,为开源技术爱好者努力做得更多更好: