京东项目用到了Apollo,还是深入学习一下阿波罗吧。

参考于:https://blog.csdn.net/Youth_lql/article/details/111885323?spm=1001.2014.3001.5501

Apollo是携程的开源项目,它是分布式配置中心,能够集中化管理应用的不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。

Apollo相关链接

文档地址:https://www.apolloconfig.com/#/zh/

下载地址:https://github.com/apolloconfig/apollo

Apollo一共三个包:apollo-portal-2.1.0、apollo-configservice-2.1.0、apollo-adminservice-2.1.0

但是本教程使用Windows-Quick-Start版本,去Github下载即可,没有发行包,但是git pull 就是编译过的版本哦!https://github.com/apolloconfig/apollo-quick-start

Apollo运行前置要求

官方教程:https://www.apolloconfig.com/#/zh/deployment/quick-start

2.0版本Apollo环境要求:JAVA8 、MySQL5.6.5以上

1.0版本Apollo要求JAVA7、MySQL5.6以上

创建2个数据库ApolloPortalDBApolloConfigDB给服务端使用,其中SQL脚本在:https://github.com/apolloconfig/apollo-quick-start/tree/master/sql

分别导入相应的SQL文件到数据库即可。

对了 还需要安装git bash。不然在Windows环境无法模拟Linux命令执行。这个一般安装git就有了。

Apollo启动

1、修改MySQL配置文件 文件在demo.sh中

你也可以完全替换 将下文:${APOLLO_CONFIG_DB_USERNAME:-你的DB账号} 完全换成比如 root。为啥要保留-前面的内容呢,是因为脚本启动的时候可以指定参数。但是我们不需要指定参数。我们就在配置文件写死。将来启动的时候 直接 xxx.sh start 即可完事,停止的时候直接 xxx.sh stop

# apollo config db info
apollo_config_db_url=${APOLLO_CONFIG_DB_URL:-"jdbc:mysql://localhost:43306/ApolloConfigDB?characterEncoding=utf8&serverTimezone=Asia/Shanghai"}
apollo_config_db_username=${APOLLO_CONFIG_DB_USERNAME:-你的DB账号}
apollo_config_db_password=${APOLLO_CONFIG_DB_PASSWORD:-你的DB密码}

# apollo portal db info
apollo_portal_db_url=${APOLLO_PORTAL_DB_URL:-"jdbc:mysql://localhost:43306/ApolloPortalDB?characterEncoding=utf8&serverTimezone=Asia/Shanghai"}
apollo_portal_db_username=${APOLLO_PORTAL_DB_USERNAME:-你的DB账号}
apollo_portal_db_password=${APOLLO_PORTAL_DB_PASSWORD:-你的DB密码}

实际还有一点,这一点很多网上都没有说明。如果你电脑装了虚拟机。你用过脚本启动Apollo后,Eureka的ipAddr是错误的。你的Eureka注册中的需要追加参数:-Deureka.instance.ip-address

BASE_JAVA_OPTS="$JAVA_OPTS -Denv=dev -Deureka.instance.ip-address=你要使用的IP"

Apollo-Config项目会启动一个Eureka:端口8080。真实的Apollo管理页面端口是8070。未来我们在配置文件中,就是使用8080端口。

访问:127.0.0.1:8070 默认账号apollo ,密码是admin

登录后效果如下:

1、创建部门

添加一个json 为:

[{"orgId":"TEST1","orgName":"样例部门1"},{"orgId":"TEST2","orgName":"样例部门2"},{"orgId":"study","orgName":"学习嘿嘿"}]

创建应用

进入我们刚才创建的应用

创建一个配置

发布配置

SpringBoot代码接入

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

Apollo启动参数需要我们去指定环境

方式一:启动参数填写

-Denv=dev

方式二:main方法第一行添加

      System.setProperty("env","DEV");

填写配置文件

Apollo客户端依赖于AppIdApollo Meta Server等环境信息来工作

# 指定你穿件的appid
app.id=study001

# 指定你的apollo的地址
apollo.meta=http://192.168.2.104:8080
apollo.bootstrap.enabled=true
apollo.bootstrap.cluster=default
apollo.bootstrap.namespaces=application
# 指定apollo缓存文件夹名称,默认会在target统计文件夹名称 Apollo客户端会把从服务端获取到的配置在本地文件系统缓存一份,用于在遇到服务不可用,或网络不通的时候,依然能从本地恢复配置,不影响应用正常运行。
apollo.cacheDir=apollo-cache-dir

启动类注解

注意@EnableApolloConfig要和@Configuration一起使用,不然不会生效。 但是我测试似乎没加也没毛病,但是最好加一下。

@EnableApolloConfig // 开启apollo配置

使用值

@Value

    // Apollo重连有效后,就会恢复配置的值!
    @Value("${username:我是默认值,只有Apoolo不可达,以及没缓存的时候,才是我}")
    public String username;

配置文件使用Demo

ageKey=${ApolloKey:"如果Apollo没有,就用我当默认值"}

总结:使用值有2种方式:配置文件如果有的值,@Value如果在Apollo拿不到就会先用配置文件的值,如果Apollo发布了,就会替换了配置文件的值!

Apollo真实案例

场景:我们有个请求电信接口的需求。电信有多个环境,我们Java代码写的逻辑是Base_Host + API_Route。这样就会有个问题,在切换环境的时候,只想切换Base_Host。所以就得需要一个监听器,监听到某个Key的变化。然后就有了操作代码的入口。解决方案就是:

@ApolloConfigChangeListener(“NameSpace”)

NameSpace一般都叫application

    @ApolloConfigChangeListener("application")
    public void changeConfig(ConfigChangeEvent changeEvent){
        System.out.println("Apollo配置文件发送变动了!");
        ConfigChange change = changeEvent.getChange("base.host");
        if (Objects.nonNull(change)){
            Base_Host_inConfig = change.getNewValue(); // 替换新的配置值
            setBaseHost(); // 调用此方法替换其他BaseHost。这样就实现了动态切换环境了
        }
    }
特殊说明:
上述文章均是作者实际操作后产出。烦请各位,请勿直接盗用!转载记得标注原文链接:www.zanglikun.com
第三方平台不会及时更新本文最新内容。如果发现本文资料不全,可访问本人的Java博客搜索:标题关键字。以获取全部资料 ❤