美文网首页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