在开发的过程中,我们的项目很多的一些配置的信息都是基于配置文件去进行配置的,例如数据库、redis的连接信息,feign的url等等,当配置多了之后,我们在不同的环境会有不同的配置内容,配置的内容也有可能会时不时的去发生改变,可是每次一改都需要我们去重启项目,确实比较麻烦。而我开发过程中确实也遇到这样的问题,前段时间,我们部门的一位大佬实在忍受不了~~所以也他陆陆续续的将项目加上了apollo,不得不说,用起来还是挺爽的。

1.什么是apollo

 Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。服务端基于Spring Boot和Spring Cloud开发,打包后可以直接运行,不需要额外安装Tomcat等应用容器。Java客户端不依赖任何框架,能够运行于所有Java运行时环境,同时对Spring/Spring Boot环境也有较好的支持。

2.Spring Boot+Apollo的快速上手

这里我是使用了GitHub上的quick start的版本,个人觉得适合刚入门想了解使用apollo的同学们

(参考的url:https://github.com/ctripcorp/apollo)

我是本机装了个虚拟机(CentOS),环境是:jdk1.8,mysql5.7

apollo quick start download:https://github.com/nobodyiam/apollo-build-scripts

  • 下载apollo项目

如何实现spring boot apollo 优先使用本地配置的具体操作步骤 springboot接入apollo_Apollo

通过打开上面的quick start的地址,点击下载,就会得到一个压缩文件,解压出来后是apollo的项目

 

  • 创建数据库和配置启动脚本数据库信息

打开下载好的apollo项目,其中有一个sql的文件夹,里面有apolloconfigdb.sql、apolloportaldb.sql,我们需要在数据库中执行,会看到分别创建了两个库

如何实现spring boot apollo 优先使用本地配置的具体操作步骤 springboot接入apollo_SpringBoot+Apollo_02

,运行sql脚本成功后,我们可以在apolloportaldb中执行以下语句来验证:

如何实现spring boot apollo 优先使用本地配置的具体操作步骤 springboot接入apollo_sql_03

接下来是配置数据库的连接信息

如何实现spring boot apollo 优先使用本地配置的具体操作步骤 springboot接入apollo_数据库_04

我们打开demo.sh,然后对这一块的配置信息做修改,改为自己对应的数据库

# apollo config db info
apollo_config_db_url=jdbc:mysql://localhost:3306/apolloconfigdb?characterEncoding=utf8
apollo_config_db_username=root
apollo_config_db_password=

# apollo portal db info
apollo_portal_db_url=jdbc:mysql://localhost:3306/apolloportaldb?characterEncoding=utf8
apollo_portal_db_username=root
apollo_portal_db_password=

  • 启动Apollo

将该项目拖到Linux环境上,默认项目启动,是会使用8070,8080,8090这3个端口,所以我们启动的时候可以查看一下端口有没有被占用,也可以在demo.sh文件中修改我们自己想要的端口。

然后就是执行启动脚本(Linux下)

如何实现spring boot apollo 优先使用本地配置的具体操作步骤 springboot接入apollo_数据库_05

启动完成之后,我们通过访问ip:8070 就可以进入Apollo的登录页面,账号密码是apollo:admin,接下来我们可以在里面创建项目,配置自己的命名空间,例如我新建了一个appId为demoproject的项目(AppId是应用的身份信息,是从服务端获取配置的一个重要信息),然后我假设我的项目中有setting.properties的文件,这个时候我要将它移到Apollo上,我创建了一个新的namespace,如下

如何实现spring boot apollo 优先使用本地配置的具体操作步骤 springboot接入apollo_mysql_06

  • SpringBoot项目中获取Apollo配置

我简单的创建了一个demo项目,首先我们需要添加apollo的依赖

<dependency> <groupId>com.ctrip.framework.apollo</groupId> <artifactId>apollo-client</artifactId> <version>1.0.0</version> </dependency>

在application配置文件中,我们需要定义appId和url

app.id=demoproject
apollo.meta=http://192.168.1.123:8080

然后在我们项目的启动类中加上注解 @EnableApolloConfig,代表我们开启了Apollo配置,如下

@SpringBootApplication
@EnableApolloConfig
public class DemoApplication {

	public static void main(String[] args) {
		SpringApplication.run(DemoApplication.class, args);
	}

}

接下来新建一个ConfigUtil,用来获取在Apollo上添加的配置内容

public class ConfigUtil {

    //setting为我在Apollo上创建的命名空间
    private static Config config = ConfigService.getConfig("setting");

    public static String getConfig(String key) {
        return config.getProperty(key, "defaultValue");
    }
}

再创建一个Controller,写一个测试的接口,传输为我们定义的key,用于测试是否能从Apollo上获取到我们的配置内容

@RestController
public class ApolloController {

    @GetMapping("getConfig")
    public String getConfig(String key) {
        return ConfigUtil.getConfig(key);
    }
}

是不是觉得代码的编写工作就完成了,其实还没有呢,Apollo上是可以分多个环境的,DEV,PRO,FAT,UAT,所以最后一步我们还需要指定我们是选用那个环境下的配置,我在这里是从启动参数中去设置的

如何实现spring boot apollo 优先使用本地配置的具体操作步骤 springboot接入apollo_mysql_07

到这里为止,我们所有的准备工作就都做好了,接下来就是启动项目了。在启动项目的过程中,我们需要查看一下启动的日志,看看有没有“Load fail”的字眼,有的话得看看是什么原因没有拉取到,我一开始也是没能获取到,不过后来发现是没有加上选择指定环境导致的。

然后通过访问我们自己测试项目的接口localhost:10031/getConfig?key=xxx看看能不能获取到Apollo上的配置

如何实现spring boot apollo 优先使用本地配置的具体操作步骤 springboot接入apollo_Apollo_08

由于该项目是quick start,所以有些地方写的比较简单,仅供上手参考,如果发现有错误的地方,欢迎留言矫正~~