一、Apollo的搭建
Apollo(阿波罗)是携程框架部门研发的开源配置管理中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性。
1.下载相关文件
我们演示将Apollo搭建到Linux下,虚拟机或云服务器都可以。安装下载有两种方式,一是下载官网源码自己进行编译,一是下载官方编译好的文件。这里选取第二种方式讲解。
下载地址:
https://github.com/ctripcorp/apollo/releases
下载下方三个文件
下载完成后,分别解压,然后放到一个新建apollo的文件夹下,打包上传到服务器的/usr/local/目录下
2.上传文件至服务器后解压。
apollo需要jdk支持,所以需要服务器安装一个jdk,请自行百度安装。。。
3.下载apollo需要的两个数据库文件
下载地址
https://github.com/nobodyiam/apollo-build-scripts/tree/master/sql
在你的数据库中执行这两个sql即可
4.进入到服务器中修改apollo的相关配置
分别修改apollo下三个文件下的/config/application-github.properties文件
spring.datasource.url = jdbc:mysql://{数据库ip}:{数据库port}/ApolloConfigDB?characterEncoding=utf8
spring.datasource.username = 数据库用户名
spring.datasource.password = 数据库密码
5.修改三个服务的启动端口和日志输出位置(尽量不用改)
修改三个服务下/script目录中的start.sh脚本文件
建议只修改apollo-configservice服务下的启动端口,避免8080冲突。我这里是将三个服务的端口开头的8全部修改为9了。
## Adjust log dir if necessary 日志位置
LOG_DIR=/opt/logs/100003172
## Adjust server port if necessary 服务启动端口号
SERVER_PORT=${SERVER_PORT:=9090}
6.修改apollo-portal服务下的meta配置
修改apollo-portal/config/apollo-env.properties,配置不同环境下的服务地址
local.meta=http://{你的ip}:9080
dev.meta=http://{你的ip}:9080
同时修改数据库apolloconfigdb中serverconfig表的eureka.service.url
其中的地址就是apollo-configservice的服务地址
再修改apolloportaldb数据库中serverconfig表的apollo.portal.envs字段。
此为可支持的环境列表,上面写的local和dev中间使用英文逗号分隔。
7.编写一个apollo的启动和停止脚本
编写一个一键启动的脚本,省的三个服务一个一个操作
startAll.sh
#!/bin/bash
cd /usr/local/apollo/apollo-adminservice-1.9.1-github/scripts/
./shutdown.sh
cd ~
cd /usr/local/apollo/apollo-configservice-1.9.1-github/scripts/
./shutdown.sh
cd ~
cd /usr/local/apollo/apollo-portal-1.9.1-github/scripts/
./shutdown.sh
cd ~
rm -rf /opt/logs/
ps -ef | grep apollo
shutdownAll.sh
#!/bin/bash
cd /usr/local/apollo/apollo-adminservice-1.9.1-github/scripts/
./shutdown.sh
cd ~
cd /usr/local/apollo/apollo-configservice-1.9.1-github/scripts/
./shutdown.sh
cd ~
cd /usr/local/apollo/apollo-portal-1.9.1-github/scripts/
./shutdown.sh
cd ~
rm -rf /opt/logs/
ps -ef | grep apollo
两个脚本放到apollo目录下,与三个服务同级,并赋予chmod 777 权限。
chmod 777 startAll.sh shutdownAll.sh
8.启动apollo,三个服务启动是有顺序的,脚本中已经排序好了。
./startAll.sh
启动后会打印日志
这样就启动了,访问apollo地址 http://ip:9070 (9070是我设置的端口)
默认账号密码是 : apollo/admin
PS:apollo比较占内存,停止的话就执行
./shutdownAll.sh
输出以下日志就停止apollo了
二、SpringBoot使用Apollo
1.引入pom依赖
<!--apollo配置-->
<dependency>
<groupId>com.ctrip.framework.apollo</groupId>
<artifactId>apollo-client</artifactId>
<version>1.3.0</version>
</dependency>
2.配置文件
上一篇文章讲过springboot配置多个环境的配置文件,现在暂且使用dev环境来演示,在application-dev.yml文件中加入以下配置
app:
id: csdn-server-app-dev #在配置中心配置的应用身份信息(apollo中创建的,暂时咱们还没创建)
apollo:
meta: http://{ip}:9080 #{ip}换成你自己的ip,端口上文讲过
bootstrap:
namespaces: application # 配置的命名空间,多个逗号分隔,一个namespace相当于一个配置文件
enabled: true #在应用启动阶段是否向Spring容器注入被托管的properties文件配置信息
eagerLoad:
enabled: true #将Apollo配置加载提到初始化日志系统之前
3.apollo创建应用
在apollo页面中创建一个csnd-server-app-dev的应用
4.配置启动类
启动类中加上@EnableApolloConfig注解
package com.luoye.csdn_course_server;
import com.ctrip.framework.apollo.spring.annotation.EnableApolloConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@EnableApolloConfig
public class CsdnCourseServerApplication {
public static void main(String[] args) {
SpringApplication.run(CsdnCourseServerApplication.class, args);
}
}
测试
apollo的csnd-server-app-dev应用中增加一个配置
新增的配置需要发布之后才能生效
编写controller测试
@Value("${ceshi:local}") //给一个默认值,如果没有找到输出local
private String ceshi;
@GetMapping(value = "/test")
@ApiOperation(value = "测试apollo接口")
public String test(){
return ceshi;
}
此时,我application-dev.yml中并没有配置ceshi这个字段,只配置了apollo的相关,但是在apollo中添加了ceshi字段,value为dev。
但是如果你此时在本地环境启动项目,将会报错
reason: Could not complete get operation [Cause: connect timed out]
需要配置一句话
-Dapollo.configService=http://{ip}:9080
启动项目,请求测试接口。
返回dev,证明apollo已经配置的没问题了,并且可以成功的取到值。
三、动态获取配置
我们尝试在项目启动时,修改apollo的配置,将ceshi字段的value修改一下,改成stg。
再来请求接口
哦吼!返回了stg。
这里我记得动态获取不到的,但是不知道为什么现在又可以了,那动态获取配置就没啥说的了。
使用apollo的好处就是,当你的项目部署上去之后,如果需要修改某个配置文件的value,就不需要重新打包部署了。比如说有一段代码需要执行一次,在代码外层使用一个开关控制,将开关配置到apollo上,当你执行完一次之后,通过apollo修改开关关闭就可以了。当然也有更多的便利性功能,你可以慢慢的探索。
如果您有疑问的话,请在下方留言,谢谢!