高效Springboot配置管理,Apollo快速上手

发表于:2019-11-14 11:52

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:maodun    来源:掘金

分享:
  技术选型
  微服务架构中Springboot配置文件繁多,Apollo统一高效的管理Springboot配置文件。
  简单说就是说所有Springboot项目本地不再需要配置文件,所有配置文件由Apollo统一管理,讲的高大上点叫做云配置。
  Apollo优点:
  开源,由Springboot开发,支持集群部署。
  提供了良好WebUI体验,角色权限控制,环境区分,灰度发布等等细粒度的配置文件管控。
  唯一依赖是Mysql,Apollo将配置文件存储到Mysql。
  中文文档极为丰富,学习起来及其容易,github.com/ctripcorp/a…
  其他的技术
  SpringConfig:原生不自带WebUI,配置文件通过Git托管,需要通过Git来管理配置文件。
  Zookeeper:没有WebUI,文件由Zookeeper自己管理。(好像没啥用)
  nacos: 阿里巴巴开源的配置文件管理中心,容易和SpringCloud Alibaba整合,有WebUI。
  1分钟搭建一个单机的
  不用docker搭建,docker搭建有问题的,需要调节一些参数。
  解压后,把sql文件夹里的两条SQl怼到你mysql里面去(Docker快速搭建Mysql)
  修改demo.sh里的jdbc配置。其他的都不要改,确保本机8080,8070端口可用,调用demo.sh。
  浏览器访问 你的主机Ip:8070,账户密码分别为apollo admin。即可搭建成功
  由于这个是快速上手的版本,Apollo里的有些功能是砍掉的(不影响我们管理的我们的Springboot文件)。体验全部功能请参考github里的分布式搭建指南。
  SpringBoot对其整合
  简单整合
  在你的Apollo界面中,新建一个项目,配置中只有AppId重要,其他随意选。在你的Springboot添加Maven依赖,2019年11为止最新的Apollo client jar包版本。
   <dependency>
  <groupId>com.ctrip.framework.apollo</groupId>
  <artifactId>apollo-client</artifactId>
  <version>1.5.0</version>
  </dependency>
  和Springboot和Spring整合有两种方式(xml, 注解配置),这里我只讲注解配置。
  按照上图,在Apollo端配置你的配置文件,修改启动文件和本地application.properties
   import com.ctrip.framework.apollo.spring.annotation.EnableApolloConfig;
  import org.springframework.boot.SpringApplication;
  import org.springframework.boot.autoconfigure.SpringBootApplication;
  import org.springframework.web.bind.annotation.GetMapping;
  import org.springframework.web.bind.annotation.RestController;
  @SpringBootApplication
  @EnableApolloConfig
  @RestController
  public class TestApplication {
  public static void main(String[] args) {
  SpringApplication.run(TestApplication.class, args);
  }
  @GetMapping("/hello")
  public String hello() {
  return "我是来自Apollo的8000";
  }
  }
   本地文件配置,Apollo需要指定服务器地址,至此你不再需要把其他配置文件保存至本地。
   #指定Appid,也就是你在Apollo创建项目指定的Appid,一定要指定对
  app.id=test
  #指定你的Apollo地址,Apollo 8070为WebUI地址,8080为Eureka注册地址
    apollo.meta=http://192.168.208.102:8080
   本地访问 localhost:8000,注意这个8000是上图中我指定的server.port=8000
  到此第一个云配置完成,简单吧。
  开发小技巧
  本地开发我们可以有两个application.yml和application.properties,yml保存我们本地开发的配置,properties保存apollo的配置,本地开发时,我们只需要注释掉properties内的内容,注释掉@EnableApolloConfig即可完成加载本地yml配置文件,上线反之。通过注释文件和代码即可完成本地线上环境切换。
  apollo保存Yml(根据报错一步步排查问题)
  如何理解NameSpace和集群(Cluster)
  首先我们先有一个概念
  AppId 对 省
  集群 对 市
  NameSpace 对 区
  nameSpace是最底层的配置文件的描述,可以理解namesapce就是一个文件
  那么我们如何通过Apollo客户端描述一个NameSpace,就像我们如何精确描述一个区一样的。
  首先我们创建一个private类型yml格式的NameSpace,名称随意,只要本地配置文件能对应上就可以了。
   #指定Appid,也就是你在Apollo创建项目指定的Appid,一定要指定对
  app.id=test
  #指定你的Apollo地址,Apollo 8070为WebUI地址,8080为Eureka注册地址
  apollo.meta=http://192.168.208.102:8080
  apollo.bootstrap.enabled=true
  #如果你不手动指定集群,默认集群就是default
  #如何指定集群 apollo.cluster={你的集群名}
  #指定下你的yml配置的namespace
  apollo.bootstrap.namespaces=testyml
  启动报错
   2019-11-09 04:16:14.513  WARN 9116 --- [           main] c.c.f.a.i.AbstractConfigRepository       : Sync config failed, will retry. Repository class com.ctrip.framework.apollo.internals.RemoteConfigRepository, reason: Load Apollo Config failed - appId: test, cluster: default, namespace: testyml, url: http://192.168.208.102:8080/configs/test/default/testyml?ip=192.168.208.1 [Cause: [status code: 404] Could not find config for namespace - appId: test, cluster: default, namespace: testyml, please check whether the configs are released in Apollo!]
  有报错,根本不慌
  报错为 http://192.168.208.102:8080/configs/test/default/testyml?ip=192.168.208.1  404找不到,可以看到我们Apollo客户端其实就是用Http请求拿去配置数据(上面的ip地址分别是我apollo部署的地址和我本机的地址),但是我们如果更改配置为http://192.168.208.102:8080/configs/test/default/application?ip=192.168.208.1也就是将testyml改为我们已有的application NameSpace,却可以访问成功。
  怎么搞?
  我第一想到去持久层Mysql看下。在ApolloConfigDB.AppNamespace表中我们可以看到,最后我们配置的yml类型Namespace存储携带了yml后缀,所以我们添加yml文件后缀名.

   #修改配置文件application.properties
  apollo.bootstrap.namespaces=testyml.yml
  成功,搞定,非常简单是不是
  复杂整合,监听配置变化,动态依赖注入
  相信看到这里,Apollo也不难嘛,很容易用的,它主要优点来自于WebUI和细粒度的配置管理
  好的,我们写一个复杂的
   @SpringBootApplication
  @EnableApolloConfig
  @RestController
  public class TestApplication {
  //在你yml里面添加一个
  //test: 随意
  @Value("${test}")
  private String content;
  public static void main(String[] args) {
  SpringApplication.run(TestApplication.class, args);
  }
  //监听testyml.yml的变化,填你自己的Namespace啊
  @ApolloConfigChangeListener("testyml.yml")
  public void change(ConfigChangeEvent cg){
  System.out.println("发生改变了啦,我听到了啊--------------------" + cg.getChange("test"));
  }
  @GetMapping("/hello")
  public String hello() {
  return "我是来自Apollo的" + content;
  }
  }
  application.properties文件
   #指定Appid,也就是你在Apollo创建项目指定的Appid,一定要指定对
  app.id=test
  #指定你的Apollo地址,Apollo 8070为WebUI地址,8080为Eureka注册地址
  apollo.meta=http://192.168.208.102:8080
  apollo.bootstrap.enabled=true
  #指定下你的yml配置
  apollo.bootstrap.namespaces=testyml.yml
  启动后,可以尝试去Apollo修改下你的NameSpace的test对应的value,看看程序会打印出来什么。
  快速接入公司业务
  参考别人写好的业务Demo:https://github.com/ctripcorp/apollo-use-cases
  最后总结
  Apollo易用性,集群性,高可用非常适合企业开发,而且他用法远不止作为SpringBoot的配置管理,既然我们可以通过Http拿到配置数据,是不是还有其他很多的应用方法。
  爬虫配置,运维配置,前端配置。各种复杂,量大,易变的配置文件管理。
  另外官网文档提到了其他Python, .NET等等客户端
  最后一句话:Apollo不难,多看看github文档你就会了(中文的啊,还有专门的源码解析)

      本文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号