▌文章的主要内容包括:
在早期单体应用的时代,监控等系统配置管理可能并不是什么困难的问题。但是在微服务架构中,和安全、日志、非功能需求一样,配置管理也是一种非功能需求。配置中心也是整个微服务架构体系中的一个重要组件,即使它的功能看上去并不起眼,无非就是简单配置管理和存取,但它是整个微服务架构中不可或缺的一环。
在Choerodon的微服务体系中,如何通过更加高效的配置管理方式,帮助微服务系统进行配置规划,推动项目的持续交付,动态调整和控制系统的运行状态,这些问题都值得深入思考和研究。
在讲配置中心之前,首先提到一个核心的概念,就是服务的“配置”。配置可能各位都不陌生,一个配置项大多是key-value的形式,value可能是一个有限值的集合。Choerodon通过这些配置项,来控制系统的运行状态,可以说,配置其实是独立于程序的可配变量,同一份程序在不同配置下会有不同的行为。
常见的配置有如下几种:
而微服务的配置中心,将散落在各处的应用系统配置信息收集起来,进行集中式的统一管理,并且提供额外功能,如动态刷新,版本控制,功能开关等。
举一个简单的例子,有这样的一个配置:logging.level。在生产环境上的日志级别通常为error级别,但是在一些测试环境,或者当系统出问题时,开发人员会期望日志的级别为debug,此时则需要一种机制来帮助实现。
既然已经有了这么多种形式来管理配置,又为什么要引入配置中心呢?
在传统单体应用中,开发者将系统打成一个包,并在包里提供一些配置,当需要修改配置时,只需要登录到服务器上将配置修改,然后reload一下就可以了。
在微服务体系中,服务的数量以及配置信息日益增多,比如各种服务器参数配置、各种数据库访问参数配置、各种环境下配置信息的不同、配置信息修改之后实时生效等等,显然开发者已经不可能登录到一台台虚拟机中,对配置进行修改重启,并且,传统的配置管理可能会带来如下的一些问题:
同时,随着“微服务+容器化+DevOps”落地,对于服务的配置管理也提出了更高的要求。
所以,一个能够方便用户进行自助式的配置管理,标准化的配置中心服务,是Choerodon社区里的开发者急切所需的。
在Choerodon猪齿鱼中,将服务的配置按照不同的功能,大致分为3类。
对配置进行分类之后,还需要一种设计原则,来指导开发者对服务的配置进行划分。在Choerodon猪齿鱼中,开发者遵循下面的一些原则。
# bootstrap.yml server: port: 8080 spring: application: name: iam-service cloud: config: failFast: true retry: maxAttempts: 6 multiplier: 1.5 maxInterval: 2000 uri: localhost:8010 enabled: false management: port: 80381 security: enabled: false security: basic: enabled: false
# application.yml spring: datasource: url: jdbc:mysql://localhost/iam_service?useUnicode=true&characterEncoding=utf-8&useSSL=false username: choerodon password: 123456 eureka: instance: preferIpAddress: true leaseRenewalIntervalInSeconds: 10 leaseExpirationDurationInSeconds: 30 metadata-map: VERSION: v1 client: serviceUrl: defaultZone: http://localhost:8000/eureka/ registryFetchIntervalSeconds: 10 hystrix: command: default: execution: isolation: thread: timeoutInMilliseconds: 15000 ribbon: ReadTimeout: 5000 ConnectTimeout: 5000 mybatis: mapperLocations: classpath*:/mapper/*.xml configuration: # 数据库下划线转驼峰配置 mapUnderscoreToCamelCase: true
# application-default.yml spring: datasource: url: jdbc:mysql://127.0.0.1:3307/iam_service?useUnicode=true&characterEncoding=utf-8&useSSL=false username: username password: pwd
首先来看Spring Cloud自带的配置中心是怎么样的,如下图所示:
Spring Cloud Config将不同环境的所有配置存放在git 仓库中,服务启动时通过接口拉取配置。遵循{ServiceID}-{profile}.properties的结构,按照profile拉取自己所需的配置。
当开发者修改了配置项之后,需要结合spring config bus将配置通知到对应的服务,实现配置的动态更新。
可以看到,Spring Cloud Config已经具备了一个配置中心的雏形,可以满足小型项目对配置的管理,但仍然有着很多局限性。配置使用git库进行管理,那么git库的权限如何来判断?不同环境的安全性也得不到保障。配置的添加和删除,配置项的汇总,也只能通过git命令来实现,对运维人员也并不友好。
Choerodon猪齿鱼在Spring Cloud Config的基础上,将配置由git库存储改为由db存储。并且添加单独的manager-service来对配置进行管理。config-server则专注于将配置传递给服务。
同时,服务在部署的时候,通过猪齿鱼提供的工具包choerodon-tool-config将服务中的application.yml文件初始化到数据库中。在服务运行时通过前端来对配置进行操作,及时更新配置到各服务上,流程如下图所示:
同时可以在页面上依据已有的配置创建新的配置,并将配置应用给正在运行的服务实例。对于失效的配置文件,也可以在页面中删除。如下图所示:
Choerodon猪齿鱼通过配置中心管理服务配置的创建,生效,乃至销毁,并结合Chart来管理服务部署时的配置,通过这样的一种机制,满足了对服务配置整个生命周期管理的基本要求和配置版本、动态生效等进一步的需求。
回顾一下这篇文章,整体介绍了配置中心在微服务架构中的作用,并提出了Choerodon对于配置管理的一些心得和规范。服务配置是服务运行起来的基础,而配置中心是整个微服务技术体系中的关键基础保障,如何做好服务配置规划,并推动项目的持续交付,则是Choerodon仍需持续考虑的问题。
Choerodon 猪齿鱼 作为开源多云应用敏捷全链路技术平台,是基于开源技术Kubernetes,Istio,knative,Gitlab,Spring Cloud来实现本地和云端环境的集成,实现企业多云/混合云应用环境的一致性。平台通过提供精益敏捷、持续交付、容器环境、微服务、DevOps等能力来帮助组织团队来完成软件的生命周期管理,从而更快、更频繁地交付更稳定的软件。
更加详细的内容,请参阅 Release Notes 和 官网 。
大家也可以通过以下社区途径了解猪齿鱼的最新动态、产品特性,以及参与社区贡献:
欢迎加入Choerodon猪齿鱼社区,共同为企业数字化服务打造一个开放的生态平台。
本篇文章出自 Choerodon猪齿鱼社区 董凡。