Apollo 配置中心

一、简介

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

服务端基于Spring Boot和Spring Cloud开发,打包后可以直接运行,不需要额外安装Tomcat等应用容器。

Java客户端 不依赖任何框架,能够运行于所有Java运行时环境,同时对Spring/Spring Boot环境也有较好的支持。

.Net客户端 不依赖任何框架,能够运行于所有.Net运行时环境。

官方 GitHub: https://github.com/ctripcorp/apollo
官方 Gitee: https://gitee.com/nobodyiam/apollo

二、安装部署

2.1 环境准备

java: JDK 1.8.+
maven: 3.3.9
mysql: 版本要求(5.6.5+)
查看数据库版本:SHOW VARIABLES WHERE Variable_name = 'version';
Apollo服务端: 1.9+
Apollo客户端: 1.7+

2.2 安装包下载

  1. 源码下载 从(Apollo-github) 下载最新的源码,也可以通过 git 命令下载到本地

    git clone https://github.com/ctripcorp/apollo

  2. 下载安装包 地址:https://github.com/ctripcorp/apollo/releases

2.3 创建数据库

Apollo 服务端总共需要两个数据库:ApolloPortalDBApolloConfigDB

我们可以在下载的源码包里面找到,文件目录为:apollo\scripts\sql,路径如下图所示:

2.4 打开工程

将下载下来的 Apollo 源码导入 idea 中,修改/apollo/scripts/build.bat

修改后启动build.bat,linux系统为build.sh

打包成功后,我们找到 apollo-configservice、apollo-adminservice、apollo-portal下target 目录,找到已经打好的三个jar包,copy 出来放到一个单独的目录,方便我们启动

启动顺序为:apollo-configservice > apollo-adminservice > apollo-portal三个服务

启动脚本,放到记事本,修改后缀名为 .bat就可以一键启动三个服务了

@echo off
start cmd /c "java -jar apollo-configservice-1.10.0-SNAPSHOT.jar"									  
start cmd /c "java -jar apollo-adminservice-1.10.0-SNAPSHOT.jar"									  
start cmd /c "java -jar apollo-portal-1.10.0-SNAPSHOT.jar"
spause                   // 防止运行完毕后直接关闭界面

全部启动成功之后,打开浏览器输入:http://localhost:8070/,看到 Apollo 登录页面说明启动成功

用户名密码: apollo/admin


输入 http://localhost:8080 ,如果出现eureka 的管理界面,说明服务启动正常。

三、客户端使用

3.1 导入jar包

       <dependency>
            <groupId>com.ctrip.framework.apollo</groupId>
            <artifactId>apollo-client</artifactId>
            <version>1.8.0</version>
        </dependency>
        <!--        数据库jar-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
            <version>1.5.9.RELEASE</version>
        </dependency>

3.2 创建应用

创建后新增一个命名空间为test,因为已经创建好了所以这里可以看到我有一个为test的命名空间

3.3 修改配置

如下:

spring.datasource.driver-class-name = com.mysql.cj.jdbc.Driver
spring.datasource.url = jdbc:mysql://127.0.0.1:3306/lgpt?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
spring.datasource.username = root
spring.datasource.password = 1234
mxn.name = nihaoccccc

前四个为数据库配置,最后一项为测试数据,可自行更改

3.4 新增测试项目

新建项目ApolloTest,导入pom

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>top.heyiyuanqi</groupId>
    <artifactId>ApolloTest</artifactId>
    <version>1.0-SNAPSHOT</version>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.8.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.ctrip.framework.apollo</groupId>
            <artifactId>apollo-client</artifactId>
            <version>1.8.0</version>
        </dependency>
        <!--        数据库jar-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
            <version>1.5.9.RELEASE</version>
        </dependency>

    </dependencies>

</project>

导入配置文件:

app:
  id: "002"
apollo:
  meta: http://localhost:8080
  bootstrap:
    enabled: true
    namespaces: application,test.properties,test2.properties

server:
  port: 8092

注意:经过多次测试,不确定是版本问题还是其他问题,当app: id: 不加"" 会被读取为2,而不是002,与Apollo的AppId:002不对应,导致无法读到该命名空间私有的配置,正常英文命名应该不会出现这个问题

导入控制层:

package top.heyiyuanqi.test;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @program: apollo-mxn
 * @ClassName TestController
 * @description:
 * @author: lyy
 * @create: 2021-09-15 17:45
 * @Version 1.0
 **/
@RestController
public class TestController {

    @Value(value = "${mxn.name}")
    private String name;

    @Value(value = "${mxnnn.name}")
    private String getName;

    @RequestMapping("test")
    public String test(){
        return "hello world "+name;
    }

    @RequestMapping("test2")
    public String test2(){
        return "hello world "+getName;
    }

}

导入启动类:

package top.heyiyuanqi;

import com.ctrip.framework.apollo.spring.annotation.EnableApolloConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@EnableApolloConfig
public class ApolloTestApplication {
    public static void main(String[] args) {
        SpringApplication.run(ApolloTestApplication.class, args);
    }
}

正常访问http://localhost:8092/test

参考文章:https://www.cnblogs.com/mingyueyy/p/15304212.html