在阿里云容器服务上开发基于Docker的Spring Cloud微服务应用(六)-阿里云开发者社区

开发者社区> libinjingshan> 正文

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

简介: 本文介绍了如何通过Spring Config Server和阿里云的对象存储OSS来进行配置信息的集中管理。
+关注继续查看

集中配置管理

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

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

二、部署Spring Cloud应用示例

三、服务发现

四、服务间通信与集成

五、服务智能路由

六、集中配置管理(本文)

七、高可用和容错

八、监控和日志

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

在传统的运维中,如果一个服务器或着运行环境升级升级,可以通过自动化脚本对服务器进行更新。随着时间的推移和需求的不断变化,可能需要运维人员登陆进入服务器进行改动。这样做虽然方便,但积累起来会造成服务器环境的"漂移",意味着自从上次代码部署后在这个服务器发生了什么改变谁都不记得了,也许微小的一个差异就会引起错误。

不变基础架构(Immutable Infrastructure)的意思我们不再打补丁了,也不允许运维人员登陆进入手工修改。如果服务器需要升级,那就把原来的服务停掉,删除服务器,用一个新的服务器替换。不变架构保证了线上运行的代码和配置永远是有版本控制,并且一致的。

Spring Cloud Config Server

这样做会带来一些不方便,如果一个服务需要更新一个基础配置,也需要在代码的配置文件中进行更改,构建一个新的镜像,然后把该服务的所有实例停掉进行替换。有时候为了更改一个配置信息而重新构建镜像,这件事总让人觉得有些不对。能不能应用的配置信息也集中管理起来?

Spring Cloud提供的集中配置管理(Config Server)可以解决这个问题。服务在启动的时候统一从一个集中的配置服务器中读取的配置,这样可以保证服务的代码和配置选项都不变的情况下又能够得到最新的配置信息。

我们在下面会演示如何创建Config Server,如何让其它服务访问Config Server。

注意:本文的示例程序没有包含这部分内容。如果向获得详细描述,请参见Spring官方文档。

创建Config Server

在build.gradle中引入对Config Server的依赖。

dependencies {
    compile('org.springframework.cloud:spring-cloud-config-server')
   ...
}

通过@EnableConfigServer注解将主class声明为Config Server:

@SpringBootApplication
@EnableConfigServer
public class ConfigServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ConfigServerApplication.class, args);
    }
}

application.properties中定义Config Server的侦听端口和从git中获得配置信息:

server.port=8888
spring.cloud.config.server.git.uri=https://github.com/xxxx/spring-cloud-samples-config

git.uri指向存储配置信息的git仓库,里面为每个服务创建一个.properties文件,例如如下文件目录结构:

$ tree springcloud-samples-config/
springcloud-samples-config/
├── foo-cloud.properties
└── foo.properties

0 directories, 2 files

foo.properties是为一个名字为foo的服务存储配置信息的文件,foo-cloud.properties是同样的foo服务在cloud profile下使用的配置信息。

具体关于Config Server内容可以参见Spring官方文档:Spring Cloud Config Server

假定foo需要一个名字为message的配置信息,可以在foo.properties中写入:

message = Spring Cloud!

Config Server启动后可以通过http协议访问,获取配置信息:

$ curl http://localhost:8888/foo/message
Spring Cloud!

在其它服务中配置对Config Server的访问

所有需要从Config Server中获取配置信息的服务,需要在build.gradle中引入Spring Config依赖:

dependencies {
    compile('org.springframework.cloud:spring-cloud-starter-config')
    ...
}

@RefreshScope注解将FooController class声明为从Config Server中获取配置。

@RefreshScope
@RestController
public class FooController {
    ...

bootstrap.yml声明Config Server的地址和端口号,在这里分别是config-server8888

spring:
  ...
  cloud:
    config:
      uri: http://config-server:8888

启动容器时,通过容器间的links将真正的Config Server和服务关联起来。

假定这个服务就上文提到的foo服务,那么它如何获取message配置呢?这也是通过注解完成。

public class FooController {
    ...
    @Value("${message}")
    private String message;
    ...

@Value("${message}")表示在应用启动时自动注入FooController的message变量。

利用阿里云OSS进行配置信息同步

通过Spring Config Server进行配置信息同步可能有一个潜在的问题,例如上面的示例中,在bootstrap.yml中配置对配置服务器的访问。bootstrap.yml是在应用启动时解析的,如果在启动时配置服务器还没有启动则会出现依赖它的所有服务也无法成功启动。

我们这里展示的是通过阿里云的对象存储(OSS)完成服务的集中配置管理。原理是所有的容器挂载OSS,启动成功后容器内的应用从OSS中读取配置。由于OSS具有非常高的可靠性,并且对其内容的更改会被所有服务读到,非常适用于配置信息同步这个场景。

更进一步,阿里云容器服务上提供了OSSFS的支持。OSSFS可以把OSS模拟成为文件系统,应用可以直接用传统的文件系统API访问OSS,而不必使用OSS API。由于一般应用都是将配置存储在文件系统中,使用OSSFS意味着应用不必做任何变更就实现了配置信息的中心化管理。

下面演示如何创建OSS以及挂载OSSFS。

创建OSS Bucket并为子账号授权

进入OSS管理控制台,创建OSS Bucket,注意所属地域要选择容器集群所在地域,如下图所示:

oss01

Bucket创建好后,将配置文件上传。

oss02

基于安全的考虑,建议进入安全令牌创建子账号,并记录下AccessKeyId和AccessKeySecret。

oss03

进入容器服务控制台,在数据卷菜单下创建新的数据卷:

oss04

选择刚才创建的bucket:
oss05

在部署模版文件中为服务挂载OSSFS

在docker-compose.yml中为服务增加如下声明:

  bar:
    image: xxxx
    ...
    volumes:
      - 'foobar-config-oss:/config'

volumes中,foobar-config-oss是前面创建的OSS Bucket名字,/config是在容器中的挂载点。

验证OSSFS是否已经挂载成功

我们准备通过登陆进入容器来验证OSSFS是否已经挂载成功。

首先在容器服务的控制台上点击集群连接信息进入连接信息页面。

cluster_access

复制环境变量配置,在你的命令行窗口配置环境变量,下载证书,将证书解压缩到工作目录。

在工作目录下运行如下命令,获得挂载OSSFS的容器ID:

docker ps

进入容器,查看/config下的配置文件内容。

$ docker exec -ti 8eb8de74440c ash
/ # cat /config/bar-config.txt
message=Hello OSS!

可以看到容器已经成功挂载OSSFS。如果配置文件发生变更,上传进入OSS Bucket后容器就可以读到最新的内容。所以容器示例都挂载同一个数据卷,实现了配置信息的集中化管理和分布读取。

小节

本文介绍了如何通过Spring Config Server和阿里云的对象存储OSS来进行配置信息的集中管理。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
SpringCloud迁移至EDAS微服务——Series2:在 ECS 集群中部署 Web 应用
SpringCloud迁移至EDAS微服务——Series2:在 ECS 集群中部署 Web 应用
1707 0
基于容器服务的持续集成与云端交付(三)- 从零搭建持续交付系统
前言 在上一篇文章中讨论了容器服务提供的交付能力,在本文中我们将讨论如何从零搭建一个持续交付系统。 对于大多数公司而言,选择一个合适自己的持续交付系统是尤为重要的一件事情,不同的公司、不同的业务使用的场景也各不相同,因此要根据自己的业务场景与发展方向来选择合适的方案。
8294 0
Docker 为 ASP.NET Core Web 应用程序生成 Docker 映像,创建并运行多个容器
1.为 ASP.NET Core 应用程序生成 Docker 映像 下载这个事例项目:https://github.com/dotnet/dotnet-docker/tree/master/samples/aspnetapp 下载完成后给这项目生成一个镜像名为aspnetapp镜像 docker build -t aspnetapp .
882 0
Docker 为 ASP.NET Core WebApi 应用程序生成 Docker 映像,创建容器并运行
1.使用VS2017新建ASP.NET Core WebApi项目 选择API启用Docker支持 2.为 ASP.NET Core WebApi 应用程序生成 Docker 映像,并创建容器运行 生成项目,将项目拷贝到 E:\web\aspnetcore.
1656 0
阿里云容器服务--自定义路由和负载均衡策略
阿里云容器服务已经提供了默认的简单路由服务来提供http请求的路由和负载均衡,但是对某些对路由和负载均衡有定制需求的用户来说,这往往不能满足用户的需求,下面我们就来介绍阿里云容器服务推出的自定义路由镜像acs/proxy
9815 0
免费 | 开发部署效率提升 12 倍,这款应用托管服务让云上运维更简单
应用托管服务,顾名思义,就是一个用来构建和部署应用的全托管式平台,简化部署和运维过程。 在使用应用托管服务之前,上线一款简单的应用,需要经历: 购买 ECS; 配置 VPC; 配置 RDS; 配置 SLB; 前前后后可能有12个步骤,而借助阿里云Web应用托管服务,可省去云端资源的申购与编排、软件运行时环境的安装与配置、应用程序的启停与维护、部署环境模板的分发与重放等多个环节,一步便能实现赢得上线。
2314 0
Alibaba Cloud Toolkit 发布 RDS MySQL 插件,开发效率更“biu”了
阿里云RDS官方针对Alibaba Cloud Toolkit所有开发者推出了免费试用RDS MySQL实例,2019年3月31日前,任何Alibaba Cloud Toolkit使用者均可免费购买1台阿里云数据库MySQL基础版指定规格实例(1核1G+20GB SSD云盘,时长1个月,限1次)。
2314 0
What is new? 阿里云 RDS for MySQL 8.0 上线 独家技术解读
原作者: 阿里云高级技术专家 冷香 MySQL 8.0 简介 MySQL 5.7 到 8.0,Oracle 官方跳跃了 Major Version 版本号,随之而来的就是在 MySQL 8.0 上做了许多重大更新,在往企业级数据库的路上大步前行,全新 Data Dictionary 设计,支持 Atomic DDL,全新的版本升级策略,安全和账号管理加强,InnoDB 功能增强等,目前小版本已经 release 到 8.0.16,新的功能仍然在持续推出。
3913 0
+关注
libinjingshan
李斌,目前负责阿里云容器服务解决方案的研发工作。加入阿里之前,李斌曾在IBM工作,专注于企业软件开发,DevOps,微服务和Docker实践。
24
文章
0
问答
来源圈子
更多
容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级 Kubernetes 容器化应用的全生命周期管理。容器服务 Kubernetes 版简化集群的搭建和扩容等工作,整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳的 Kubernetes 容器化应用运行环境。
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载