转载

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

微服务架构中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, 注解配置),这里我只讲注解配置。

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

按照上图,在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

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

到此第一个云配置完成,简单吧。

开发小技巧

本地开发我们可以有两个application.yml和application.properties,yml保存我们本地开发的配置,properties保存apollo的配置,本地开发时,我们只需要注释掉properties内的内容,注释掉@EnableApolloConfig即可完成加载本地yml配置文件,上线反之。通过注释文件和代码即可完成本地线上环境切换。

apollo保存Yml(根据报错一步步排查问题)

如何理解NameSpace和集群(Cluster)

首先我们先有一个概念

AppId 对 省

集群 对 市

NameSpace 对 区

nameSpace是最底层的配置文件的描述,可以理解namesapce就是一个文件

那么我们如何通过Apollo客户端描述一个NameSpace,就像我们如何精确描述一个区一样的。

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

首先我们创建一个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,却可以访问成功。

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

怎么搞?

我第一想到去持久层Mysql看下。在ApolloConfigDB.AppNamespace表中我们可以看到,最后我们配置的yml类型Namespace存储携带了yml后缀,所以我们添加yml文件后缀名.

高效Springboot配置管理,Apollo快速上手
#修改配置文件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 。

最后总结

Apollo易用性,集群性,高可用非常适合企业开发,而且他用法远不止作为SpringBoot的配置管理,既然我们可以通过Http拿到配置数据,是不是还有其他很多的应用方法。

  • 爬虫配置,运维配置,前端配置。各种复杂,量大,易变的配置文件管理。
  • 另外官网文档提到了其他Python, .NET等等客户端

最后一句话:Apollo不难,多看看github文档你就会了(中文的啊,还有专门的源码解析)

原文  https://juejin.im/post/5dc59ed6f265da4d1c69a8be
正文到此结束
Loading...