• 「Java分享客栈」Nacos配置中心称王称霸,我Apollo一生也不弱于人!


    前言

    Apollo又称阿波罗配置中心,在前两年还是挺火的,但阿里SpringCloud套件席卷国内之后,nacos就成为了最被亲睐的分布式配置中心,nacos是配置中心和注册中心二合一的产品,单纯功能上Apollo其实更强大一些。本篇就把Apollo的安装及使用分享给大家。


    安装

    1、安装包

    1)、GitHub下载:https://github.com/nobodyiam/apollo-build-scripts

    2)、网盘下载:https://github.com/ctripcorp/apollo/wiki/Quick-Start(看这个文档下面给的网盘链接)

    2、环境要求

    虚拟机:内存2G+

    JDK:java1.8k环境

    数据库:mysql在5.7+(如果在低版本数据库执行阿波罗结构时,默认是不能支持在一个表中有两个时间戳类型字段,所以建议大家使用mysql在5.7以上。)

    3、创建数据库表

    去Github上下载最新的apollo-build-scripts-master 整个阿波罗环境包

    创建两个数据库

    在apollo-build-scripts-master\sql目录下有两个SQL文件:分别为:apolloconfigdb(存放配置文件信息)、apolloportaldb(门户网站),在数据库中执行创建;

    111.png

    4、修改SQL脚本

    修改apollo安装脚本demo.sh,修改其中的数据库连接信息和相关服务地址信息。

    222.png

    5、启动

    执行命令:./demo.sh start

    PS:记得关闭防火墙,如果连的是远程数据库,记得开放mysql用户的权限,root@'%',也别用本机数据库,虚拟机可能ping不通本机,连不上本机数据库。

    333.png

    6、访问

    启动后,访问地址:http://192.168.121.129:8070

    默认账号密码:apollo admin

    444.png

    7、简单使用

    1)、创建项目

    555.png

    666.png

    2)、新增配置

    777.png

    3)、点击发布

    888.png

    999.png

    1010.png


    常规用法

    注意:

    1)、这里示例使用的是renren-fast,是单一项目,所以就创建一个apollo项目即可,然后可以创建多个namespace,存放不同环境的配置文件(开发、测试、生产);

    2)、如果是微服务项目,那么给每一个微服务都创建一个apollo项目,应用ID是每个微服务的appId,应用名称也尽量见名知意。

    1、删除示例项目

    1111.png

    2、创建新项目

    1212.png

    1313.png

    3、命名空间

    可以创建不同环境的配置文件命名空间,并且可以展开伸缩。

    1414.png

    PS:这里是测试,真实环境最好按照规范比如renren.user这样来命名。
    1515.png

    1616.png

    4、yml命名空间

    如果是yml命名空间,就直接文本拷贝进来。

    1717.png

    如果是默认的properties命名空间,自己项目的配置是yml格式,就要先进行转换,然后拷贝到文本中。

    yml转properties转换工具:yml转properties工具

    拷贝到文本中

    1818.png

    它会自己转换

    1919.png

    最后点击发布即可

    2020.png


    SpringBoot整合

    1、问题说明

    使用阿波罗注意事项:

    1)、本地缓存地址:windows:C:\opt\data\,Linux:/opt/data

    2)、本地环境设置地址:windows:C:\opt\settings,Linux:/opt/settings

    3)、如果配置完成后可以读取到apollo发布的配置信息,但是修改后再发布,发现项目获取不到最新的,需要检查一下本地缓存地址data目录下的配置文件是否更新,或者是否存在这个缓存文件,如果不存在,说明根本没有缓存成功,这个命名空间大概有问题。

    PS:这里笔者出现的问题就是本地根本没缓存application-dev这个命名空间的配置信息,因为我创建的时候用的是yml格式,删掉后我改用properties格式,然后就可以了。

    2、前情回顾

    在前面搭建Apollo环境OK的前提下,这是案例环境的截图,有四个命名空间。

    2121.png

    3、官方文档

    1)、Apollo使用指南:https://github.com/ctripcorp/apollo/wiki/Apollo使用指南

    2)、java样例客户端启动:https://github.com/ctripcorp/apollo/wiki/Apollo开发指南#23-java样例客户端启动

    3)、spring-boot集成方式推荐:https://github.com/ctripcorp/apollo/wiki/Java客户端使用指南#3213-spring-boot集成方式推荐

    4、引入依赖

    <!-- apollo依赖 -->
    <dependency>
        <groupId>com.ctrip.framework.apollo</groupId>
        <artifactId>apollo-client</artifactId>
        <version>1.1.0</version>
    </dependency>
    
    <dependency>
        <groupId>com.ctrip.framework.apollo</groupId>
        <artifactId>apollo-core</artifactId>
        <version>1.1.0</version>
    </dependency>
    

    5、配置文件

    删掉项目原本的application.yml等配置文件,在resources下新建一个application.properties文件。

    app.id=renren-fast
    apollo.meta=http://192.168.1.128:8080
    # 注入非默认application namespace或多个namespace的配置示例
    apollo.bootstrap.enabled=true
    apollo.bootstrap.namespaces=application,application-dev,application-prod,application-test
    

    2222.png

    6、启动注解

    启动类加上开启Apollo的注解:@EnableApolloConfig

    @SpringBootApplication(exclude={DataSourceAutoConfiguration.class})
    @EnableApolloConfig
    public class RenrenApplication extends SpringBootServletInitializer {
    
        public static void main(String[] args) {
            SpringApplication.run(RenrenApplication.class, args);
        }
    
        @Override
        protected SpringApplicationBuilder configure(SpringApplicationBuilder app) {
            return app.sources(RenrenApplication.class);
        }
    
    }
    

    7、修改环境

    可选项,这个settings/server.properties也可以不创建,在需要切换不同环境时才需要。

    修改/opt/settings/server.properties(Mac/Linux)或 C:\opt\settings\server.properties(Windows)文件,没有目录就新建出来,设置env为DEV:env=DEV

    说明:

    1)、这个环境配置的意义,可以参考:https://github.com/ctripcorp/apollo/wiki/Java客户端使用指南#3213-spring-boot集成方式推荐,搜索关键字env=DEV,也可以自己去网上找资料;

    2)、这个C:\opt\settings\server.properties是需要自己创建的,不会自己生成。

    8、本地缓存

    阿波罗在本地的缓存地址,缓存的其实就是这些配置文件,如果阿波罗挂掉了,项目会访问这个缓存文件,也不影响项目运行。

    2323.png

    9、验证

    测试一个接口看是否能获取到配置信息

    2424.png

    启动后访问接口

    2525.png

    查看是否有打印出数据源url

    2626.png

    修改一下配置后再发布,看是否会刷新:发现删掉的部分已经没了。

    2727.png


    Java动态读取配置

    此案例参考了每特教育的案例:

    网关内集成了swagger文档,把swagger写死的部分作为json保存在apollo中,网关服务通过java代码动态获取apollo保存的json信息,赋给swagger文档实现。

    1、网关代码

    @SpringBootApplication
    @EnableEurekaClient
    @EnableZuulProxy
    @EnableSwagger2Doc
    @EnableApolloConfig
    public class AppGateWay {
    
          // 获取ApolloConfig
          @ApolloConfig
          private Config appConfig;
    
          public static void main(String[] args) {
                SpringApplication.run(AppGateWay.class, args);
          }
    
          // 添加文档来源
          @Component
          @Primary
          class DocumentationConfig implements SwaggerResourcesProvider {
    
                @Override
                public List<SwaggerResource> get() {
    
                      // 开启监听,配置文件发生改变需要更改
                      appConfig.addChangeListener(new ConfigChangeListener() {
    
                           @Override
                           public void onChange(ConfigChangeEvent changeEvent) {
                                 get();
                           }
                      });
                      return resources();
                }
    
                /**
                 * 从阿波罗服务器中获取resources
                 *
                 * @return
                 */
                private List<SwaggerResource> resources() {
    
                      List resources = new ArrayList<>();
                      // app-itmayiedu-order
                      // 网关使用服务别名获取远程服务的SwaggerApi
                      String swaggerDocJson = swaggerDocument();
                      JSONArray jsonArray = JSONArray.parseArray(swaggerDocJson);
                      for (Object object : jsonArray) {
                           JSONObject jsonObject = (JSONObject) object;
                           String name = jsonObject.getString("name");
                           String location = jsonObject.getString("location");
                           String version = jsonObject.getString("version");
                           resources.add(swaggerResource(name, location, version));
                      }
                      return resources;
                }
    
                /**
                 * 获取swaggerDocument配置
                 * 这里使用apollo提供的config来获取mayikt.zuul.swaggerDocument这个key对应的json值
                 * @return
                 */
                private String swaggerDocument() {
                      String property = appConfig.getProperty("mayikt.zuul.swaggerDocument", "");
                      return property;
                }
    
                private SwaggerResource swaggerResource(String name, String location, String version) {
                      SwaggerResource swaggerResource = new SwaggerResource();
                      swaggerResource.setName(name);
                      swaggerResource.setLocation(location);
                      swaggerResource.setSwaggerVersion(version);
                      return swaggerResource;
                }
          }
    
    }
    

    2、新建key-value

    在apollo中对应的命名空间内新建一个key-value:mayikt.zuul.swaggerDocument,对应上面config.getProperty("mayikt.zuul.swaggerDocument",""),后面空表示没取到就返回空串。

    key:mayikt.zuul.swaggerDocument

    value是如下内容:

    [
        {
            "name": "app-mayikt-member",
            "location": "/app-mayikt-member/v2/api-docs",
            "version": "2.0"
        },
        {
            "name": "app-mayikt-weixin",
            "location": "/app-mayikt-weixin/v2/api-docs",
            "version": "2.0"
        }
    ]
    

    监听Apollo

    PS:这个监听类会在项目启动后自动开启一个线程和apollo建立长连接,监听apollo配置的变化并打印出日志。切忌使用AOP或者放在get方法里面,这样会开启很多线程和apollo连接,导致系统CPU飙高。

    新增下面一个监听类即可:

    @Component
    @Slf4j
    public class MyCommandLineRunner implements CommandLineRunner {
    
          @ApolloConfig
          private Config config;
    
          @Override
          public void run(String... args) throws Exception {
            config.addChangeListener(new ConfigChangeListener() {
                  @Override
                  public void onChange(ConfigChangeEvent changeEvent) {
                       log.debug("分布式配置中心监听: {}", changeEvent.changedKeys().toString());
                  }
            });
          }
    
    }
    

    总结

    Apollo配置中心是携程团队精心创作的开源产品,哪怕现在Nacos如日中天,Apollo也依然受到很多项目团队的欢迎。有些公司的研发团队开发项目并不一定会使用阿里微服务套件,像Apollo这样的组件就会成为选项之一,大家感兴趣的话可以尝试一下新版本的使用,也可以收藏本篇,以后若用到翻出来参考即可。


    分享

    8年多工作及学习过程中在云笔记中记录了很多内容,我闲暇之余都做了下整理,本篇只是其中之一,有感兴趣的朋友可以私信我获取,什么时候用到了翻开说不定就能节省很多时间。



    本人原创文章纯手打,觉得有一滴滴帮助就请点个推荐吧~
    本人持续分享实际工作经验和主流技术,喜欢的话可以关注下哦~


    __EOF__

  • 本文作者: 福隆苑居士
  • 本文链接: https://www.cnblogs.com/fulongyuanjushi/p/16344059.html
  • 关于博主: 评论和私信会在第一时间回复。或者直接私信我。
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。
  • 相关阅读:
    「优选算法刷题」:二进制求和
    Inductor characater
    【无标题】
    英语邮件格式范文
    Java字节码增强技术(NoClassDefFoundError)问题
    TypeScript笔记:接口
    excel函数公式
    AutoDL使用手册
    SQL11 高级操作符练习(1)
    基于Spring Cloud创建弹性微服务
  • 原文地址:https://www.cnblogs.com/fulongyuanjushi/p/16344059.html