美文网首页System Design Spring cloudJava后台
基于Springboot的Apollo基本使用(一)

基于Springboot的Apollo基本使用(一)

作者: kidd卡盟 | 来源:发表于2018-09-11 18:34 被阅读790次

基于Springboot的Apollo基本使用(一)

1.Apollo简介

项目组最近的项目都是使用springcloud微服务开发,整个微服务框架中分布式的系统服务、集群等等都非常的多。

每一个服务都有着自己的配置(包括参数配置、服务器地址配置、功能开关等都能),当配置需要修改的时候就显得异常的麻烦,传统的通过配置文件、数据库配置完全不能满足要求。

在这种情况下,诞生了很多的统一配置的服务,虽然springcloud有自己的config配置中心,但是和携程的apollo相比还是太弱了,对比之后我们使用了Apollo。

Apollo(阿波罗)是携程框架部门研发的开源配置管理中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性。

github上携程开发人员对Apollo做了特别细致的介绍,但是对于我们只使用springboot进行开发的项目来说,其实只用到了里面一小部分内容。

因此我主要将Apollo和Springboot相关的内容整理出来,本文首先对Apollo进行QuickStart简单入门介绍以及基于Springboot框架的使用。

1.1Apollo配置中心基础模型

  1. 开发人员在配置中心对某些应用的配置(就是一些键值对的信息)进行修改
  2. 配置中心通知客户端进行配置更新(需要注册监听事件)
  3. Apollo客户端(应用程序)从配置中心拉取更新最新配置
basic-architecture.png

1.2Apollo的总体设计

overall-architecture.png

上图是Apollo的总体设计,从下往上看:

  • ConfigService(Apollo集成在一个jar包中)提供配置的读取,推送功能,Apollo客户端(你的应用程序)从这儿读取配置。
  • AdminService(Apollo集成在一个jar包中)提供配置的修改、发布功能,Apollo Portal(开发人员登录的修改配置的系统)调用该服务。
  • ConfigService和AdminService都是多实例服务,需要将它们注册到Eureka中。
  • 在Eureka之上有一层MetaServer用于封装Eureka的服务发现接口。
  • Client和Portal通过域名访问MetaServer获取ConfigService和AdminService的服务列表(IP+Port),然后直接通过套接字访问服务。
  • 为了简化部署,实际上会把Configservice、Eureka和MetaServer部署在同一个JVM进程中。

1.3Apollo配置分类

因为对于不同的应用,在不同的环境(开发、测试)、不同的集群(华东、华北)、不同的命名空间(例如springboot的application.property文件、你自己自定义的myappconfig.property),配置都有可能不同。

所以Apollo支持了4个维度管理Key-Value格式的配置(这些都是可以配置的):

  • application(应用)
    • 在springboot的application.property定义appid这个key的value,标识该类型的应用。
  • environment(4种环境)
    • DEV(开发环境)
    • FAT(功能测试)
    • UAT(验收测试)
    • PRO(生产环境)
  • cluster(集群)
  • namespace(命名空间,其实就是某个应用的不同配置文件)

2.Apollo QuickStart

携程的开发人员为了让大家几分钟快速上手Apollo配置中心,已经准备了一套安装包,大家按照教程马上就能部署好了(注意windows环境要安装能运行bash脚本的软件如gitbash)——》QuickStart github地址

安装包在不同的端口安装了配置中心的不同服务:

1. 打开 http://localhost:8070 进入配置中心就可以对各种应用进行配置(修改键值对)

image

  • 进入配置中心就可以新建项目(对应你的应用)
    比如你有一个叫KiddService的接口,可以给它起一个唯一标识的应用Id(这里我叫kiddApp),提交之后在主页就可以看到了。
image
  • 进入该项目的配置,先发布后配置或先配置后发布都行,这样你的应用就可以从配置中心拉取配置了。


    image
  • 编辑配置,其实就是添加或修改键值对


    image

2. Springboot客户端连接Apollo配置中心

使用Springboo客户端连接Apollo特别的简单,只需要几步:

  • 必要的设置

    • AppId,在application.properties文件加入指定appId,app.id=YOUR-APP-ID。
    • Apollo Meta Server,前面说过,这是对Eureka的一个封装服务,主要是用来得到ConfigServer的地址。在application.propertiesbootstrap.properties中指定apollo.meta=http://config-service-url
    • 本地配置缓存路径,确保目录存在
      • Mac/Linux: /opt/data/{appId}/config-cache
      • Windows: C:\opt\data{appId}\config-cache
  • 可选设置

    • Environment(上面说的四种环境)
      • 在Java程序启动脚本中,可以指定-Denv=YOUR-ENVIRONMENT
      • 还可以通过操作系统的System Environment ENV来指定
      • 通过配置文件来指定env=YOUR-ENVIRONMENT;(windows C:\opt\settings\server.properties)(linux /opt/settings/server.properties)
    • Cluster(集群)
      • 在Java程序启动脚本中,可以指定-Dapollo.cluster=SomeCluster
      • 过Spring Boot的配置文件,apollo.cluster=SomeCluster
      • 可以在server.properties配置文件中指定idc=xxx

例如在我的quickstart测试环境中我在application.properties文件中只要如下配置就行了:

server.port=9017
app.id=apolloapp
apollo.meta=http://127.0.0.1:8080
  • Maven Dependency(maven的依赖)
    <dependency>
        <groupId>com.ctrip.framework.apollo</groupId>
        <artifactId>apollo-client</artifactId>
        <version>1.0.0</version>
    </dependency>
  • 获取本应用的配置

    在springboot下获取配置的方法有很多种,以我开发的KiddService为例:

    • 1.直接调用Apollo的api(代码非常简单,废话。如果仅仅为了获取一个配置值搞得那么复杂别人还用它干啥?)
        Config config = ConfigService.getAppConfig(); //config instance is singleton for each namespace and is never null
        String someKey = "key1";
        String someDefaultValue = "none";
        String value = config.getProperty(someKey, someDefaultValue);
    
    • 2.使用xml整合Spring(都什么年代了,还用xml,这里不介绍了,有兴趣的同学去看Apollo Java客户端使用指南
    • 3.使用Java配置(注意有两个注解)
    @Configuration
    @EnableApolloConfig
    public class AppConfig {
     @Bean
     public TestJavaConfigBean javaConfigBean() {
        return new TestJavaConfigBean();
        }
    }
    public class TestJavaConfigBean {
        @Value("${timeout:100}")
        private int timeout;
        private int batch;
    
        @Value("${batch:200}")
        public void setBatch(int batch) {
        this.batch = batch;
        }
    
        public int getTimeout() {
        return timeout;
        }
    
        public int getBatch() {
        return batch;
        }
    }
    

    一般所有的配置放在一个bean里面就可以了

相关文章

网友评论

  • 71dd45b6e719:博主您好,我在maven里面添加了阿波罗的jar包,为什么找不到@EnableApolloConfig这个注解呢?

本文标题:基于Springboot的Apollo基本使用(一)

本文链接:https://www.haomeiwen.com/subject/iozugftx.html