服务的部署和发布策略
本文为阿里云容器服务Spring Cloud应用开发系列文章的第九篇。前文讨论了如何开发基于Spring Cloud微服务应用,所有代码通过标准的Dockerfile构建成为不同的镜像,我们还要写docker-compose.yml来描述容器启动参数和容器之间的关系,这个文件也就是我们常说的部署模版文件。
一、在阿里云容器服务上开发Spring Cloud微服务应用
三、服务发现
四、服务间通信与集成
五、服务智能路由
六、集中配置管理
七、高可用和容错
八、监控和日志
九、服务的部署和发布策略(本文)
部署服务
在示例代码中有两个docker compose文件,一个是docker-compose.yml
,另外一个是docker-compose.acs.yml
。它们两者的区别是docker-compose.yml
中的数据库是MySQL容器,docker-compose.acs.yml
中服务连接的是阿里云的RDS
。
version: "2"
services:
discovery1:
container_name: discovery1
image: registry.aliyuncs.com/jingshanlb/discovery-server
labels:
# demo only, do not use it in production
aliyun.routing.port_8761: http://eureka1
environment:
- ADDITIONAL_EUREKA_SERVER_LIST=http://discovery2:8761/eureka/
- SPRING_PROFILES_ACTIVE=cloud
discovery2:
container_name: discovery2
image: registry.aliyuncs.com/jingshanlb/discovery-server
environment:
- ADDITIONAL_EUREKA_SERVER_LIST=http://discovery1:8761/eureka/
- SPRING_PROFILES_ACTIVE=cloud
- affinity:service!=discovery1
gateway:
image: registry.aliyuncs.com/jingshanlb/gateway
ports:
- "8080:8080"
labels:
aliyun.scale: "2"
aliyun.lb.port_8080: http://${slbname}:8080
environment:
- EUREKA_SERVER_LIST=http://discovery1:8761/eureka/,http://discovery2:8761/eureka/
- SPRING_PROFILES_ACTIVE=cloud
- 'availability:az==2'
mysql:
image: registry.aliyuncs.com/acs-sample/mysql:5.7
environment:
- MYSQL_ROOT_PASSWORD=passw0rd
- MYSQL_DATABASE=foodb
- MYSQL_USER=user1
- MYSQL_PASSWORD=passw0rd
foo:
image: registry.aliyuncs.com/jingshanlb/foo
links:
- mysql:mysql
environment:
- EUREKA_SERVER_LIST=http://discovery1:8761/eureka/,http://discovery2:8761/eureka/
- SPRING_PROFILES_ACTIVE=cloud
- MYSQL_DATABASE=foodb
- MYSQL_USERNAME=user1
- MYSQL_PASSWORD=passw0rd
bar:
image: registry.aliyuncs.com/jingshanlb/bar
environment:
- EUREKA_SERVER_LIST=http://discovery1:8761/eureka/,http://discovery2:8761/eureka/
- SPRING_PROFILES_ACTIVE=cloud
- SERVER_PORT=8080
- MANAGEMENT_PORT=8081
foobar:
image: registry.aliyuncs.com/jingshanlb/foobar
environment:
- EUREKA_SERVER_LIST=http://discovery1:8761/eureka/,http://discovery2:8761/eureka/
- SPRING_PROFILES_ACTIVE=cloud
两个Eureka Server组成的集群,容器名分别为discovery1
和discovery2
,对于所有使用Eureka的其它服务来说,启动时的环境变量EUREKA_SERVER_LIST
设置成这两个Eureka Server的URL,Eureka Client需要这个信息决定连接那个Eureka Server。
discovery1通过aliyun.routing.port_8761
声明为对外可以访问,访问端点可以在控制台界面中的discovery1页面看到。
gateway服务通过aliyun.lb.port_8080
配置为由SLB进行负载均衡。更多关于aliyun.lb和aliyun.routing的区别可以参见阿里云容器服务服务编排文档。
foo的mysql:mysql
links声明将mysql(容器)和mysql(foo代码使用的DNS地址)绑定起来,而且是跨主机的绑定。
模版部署文件中的其它内容已经都在前文中介绍过了,这里就不再重复了。
部署的过程在前面的文章已经讨论过了,这里把仅输入部署模版文件内容的部分再简单介绍一下。
拷贝docker-compose.yml内容,粘贴进入模版编辑器。注意其中的${slbname}
将来会替换为前面创建的负载均衡名字或ID。
点击创建并部署
按钮,在对话框中输入负载均衡ID,确认后创建应用。
服务升级
部署成功的应用如果镜像发生了变化,需要在对应用重新部署
,如果docker-compose.yml内容发生了变化,需要执行变更配置
。
发布策略
阿里云容器服务提供了多种发布策略,我们介绍一下这其中最简明的一种方式:rolling update
发布,意思是在更新的服务时按顺序更新,只有当前一个服务更新成功后再做下一个服务的更新。这里的要求时需要用aliyun.scale
标签声明容器实例数量,并且通过aliyun.probe
声明了健康检查方式。
下面部署模版演示了如何使用rolling update模式发布(例子来源:服务编排文档)。
web:
image: wordpress
...
labels:
aliyun.probe.url: http://container/license.txt
aliyun.probe.initial_delay_seconds: '10'
aliyun.routing.port_80: http://wordpress
aliyun.rolling_updates: 'true'
aliyun.scale: '2'
阿里云容器服务的服务治理能力
在本系列文章中我们讨论了如何利用SpringCloud构建一个微服务应用,以及如何在阿里云容器服务上部署微服务应用。阿里云容器服务在完全兼容Docker API的前提提供了服务治理能力,这些服务治理能力都是和语言无关的,比如服务的注册、发现和绑定,服务健康检查,高可用保证,服务接入路由,多重服务发布策略,服务的管控等。
后续会有相关的文章详细介绍这些功能。
总结
容器技术的应用隔离和一致性交付能力使得它成为微服务架构的最佳实践之一。由于封装了互联网级别的Netfix开源产品,Spring Cloud成为Java语言实现微服务应用的成熟框架。
阿里云的容器服务不但提供了语言无关的服务治理能力,同时对Spring Cloud应用也有很好的支持,还有很多对云应用动态管理的很多扩展。所有这些因素都使得阿里云容器服务部署运行微服务应用的一个完美平台。