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 安装包下载
源码下载 从(Apollo-github) 下载最新的源码,也可以通过 git 命令下载到本地
git clone https://github.com/ctripcorp/apollo
2.3 创建数据库
Apollo 服务端总共需要两个数据库:ApolloPortalDB和 ApolloConfigDB
我们可以在下载的源码包里面找到,文件目录为: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
