美文网首页Apollo分布式配置中心配置中心
从零到一,搭建apollo配置中心和apollo客户端(附源码)

从零到一,搭建apollo配置中心和apollo客户端(附源码)

作者: 初晨的笔记 | 来源:发表于2019-04-16 19:31 被阅读0次

    目录

    1、Apollo服务端的搭建

    2、创建一个配置的应用并发布配置

    3、客户端拉取apollo中的配置


    1、Apollo服务端的搭建

    apollo_index.jpg

    如上图为Apollo服务端搭建完成的界面

    Apollo对环境的要求

    • Apollo服务端:jdk 1.8+
    • Apollo客户端:jdk 1.7+
    • Mysql 5.6.5+

    源码下载和基础数据的导入

    在上述环境准备好后,需要到官方下载源码构建,下载地址为:https://github.com/ctripcorp/apollo/releases
    选择最新的稳定版1.3.0,如下图

    apollo_release.png
    这里可以选择两种方式构建,一种是通过源码构建,一种通过安装包直接启动,下面分开介绍。不管通过哪种方式构建apollo服务端,都数据导入数据库的基础数据,如下图
    apollo_config_db.png
    从下载的源码中拿到Apollo运行需要的两个数据库ApolloConfigDB、ApolloPortalDB,使用数据库脚本导入到数据库,如下图
    portal_config_4.png

    通过安装包构建

    下载解压上图中的apollo-portal-1.3.0-github.zip、apollo-adminservice-1.3.0-github.zip、apollo-configservice-1.3.0-github.zip,并且修改各自对应config目录下的application-github.properties文件,以portal压缩包为例,根据自己的数据库地址修改对应配置如下图


    portal_config_3.png

    值得注意的是,script目录下的start.sh脚本,如果是本地启动的话需要修改其log路径和启动jvm参数,如下图


    portal_config_2.png

    上述三个项目都修改完配置文件后,分别在对应script目录下启动start.sh,一定注意启动顺序,由于相互依赖,所以必须按照config==>admin==>portal的顺序启动。启动完成后访问192.168.56.8070,正常的话会出现如下图的界面。

    apollo_login.jpg

    通过初始账号apollo密码admin登录,如下图


    apollo_index.jpg

    2、创建一个配置的应用并发布配置

    创建一个配置的应用

    点击创建项目,如下图

    add_project.png
    应用名称随便填,后续可以修改。添加完成后如下图:
    add_project.png

    添加好项目后,会有一个私有的nameSpace,名字叫application,其中==nameSpace类比于Springbooot的application.properties==,现在我们在该空间中添加配置,如下图

    add_config.jpg
    注意添加配置后一定要发布才会生效,如下图
    pub_config.jpg

    3、客户端拉取apollo中的配置

    创建一个SpringBoot项目,命名为config-client-apollo,源码地址:config-client-apollo

    • 配置依赖
    <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.0.5.RELEASE</version>
            <relativePath /> <!-- lookup parent from repository -->
        </parent>
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
            <java.version>1.8</java.version>
            <apollo-client-version>1.0.0</apollo-client-version>
        </properties>
        
        <!-- 管理依赖  -->
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-dependencies</artifactId>
                    <version>Finchley.RELEASE</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
        <dependencies>
    
            <dependency>
                <groupId>com.ctrip.framework.apollo</groupId>
                <artifactId>apollo-client</artifactId>
                <version>${apollo-client-version}</version>
            </dependency>
            
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-context</artifactId>
            </dependency>       
         
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
    • 主入口文件
    @SpringBootApplication
    @EnableApolloConfig
    public class ApolloClientApplication {
    
        public static void main(String[] args) throws IOException {
    
            SpringApplication.run(ApolloClientApplication.class, args);
        }
    }
    
    • 配置文件

    在resource目录下面创建META-INF目录,创建app.properties文件,内容如下

    app.id=test
    

    application.yml的配置为

    server:
      port: 8018
    
    spring:
      application:
        name: config-client-apollo
    
    apollo:
      bootstrap:
        enabled: true
        namespaces: application
      meta: http://192.168.10.89:8080
    
    • 测试配置是否生效
    1. 使用@Value注解,注入从apollo获取的配置,该方式可以做到动态加载,apollo服务端修改后,客户端可以实时获取到最新配置。
    @RestController
    @RequestMapping("test")
    @RefreshScope
    public class ConfigClientController {
    
        @Value("${test-config}")
        private String config;
    
        @RequestMapping("/getConfig")
        public String getConfigInfo() {
            return config;
        }
    }
    
    1. 一般我们会使用@ConfigurationProperties(prefix = "redis.cache")注解将配置文件注入到一个bean中接收,但是该种方式并不可以动态更新,需要手动更新,如下图
    @Component
    @ConfigurationProperties(prefix = "redis.cache")
    @RefreshScope
    public class ApolloRefreshConfig {
      private String host ;
      private String name;
      public String getHost() {
        return host;
    }
    public void setHost(String host) {
        this.host = host;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public String toString() {
        return "ApolloRefreshConfig [host=" + host + ", name=" + name + "]";
    }
    }
    

    刷新配置

    @Component
    public class SpringBootApolloRefreshConfig {
      private static final Logger logger = LoggerFactory.getLogger(SpringBootApolloRefreshConfig.class);
    
     @Resource
     private ApolloRefreshConfig apolloRefreshConfig;
     @Resource
     private RefreshScope refreshScope;
     
      @ApolloConfigChangeListener({ "test"})
      public void onChange(ConfigChangeEvent changeEvent) {
          boolean configChange=false;
        for (String changedKey : changeEvent.changedKeys()) {
            if (changedKey.startsWith("redis.cache")) {
                configChange=true;
                break;
            }
        }
          if (!configChange) {
            return;
        }
        refreshScope.refresh("redis.cache");
      }
    }
    

    到此客户端程序完成,启动项目,查看日志,可以明显看到客户端在连接apollo服务端

    启动完成后测试,如下图,拿到配置说明成功拿到apollo服务端的配置 test.jpg

    项目源码地址:config-client-apollo

    相关文章

      网友评论

        本文标题:从零到一,搭建apollo配置中心和apollo客户端(附源码)

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