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

技术选型

微服务架构中Springboot配置文件繁多,Apollo统一高效的管理Springboot配置文件。前端

简单说就是说全部Springboot项目本地再也不须要配置文件,全部配置文件由Apollo统一管理,讲的高大上点叫作云配置。java

Apollo优势:mysql

  • 开源,由Springboot开发,支持集群部署。
  • 提供了良好WebUI体验,角色权限控制,环境区分,灰度发布等等细粒度的配置文件管控。
  • 惟一依赖是Mysql,Apollo将配置文件存储到Mysql。
  • 中文文档极为丰富,学习起来及其容易,github.com/ctripcorp/a…

其余的技术git

  • SpringConfig:原生不自带WebUI,配置文件经过Git托管,须要经过Git来管理配置文件。
  • Zookeeper:没有WebUI,文件由Zookeeper本身管理。(好像没啥用)
  • nacos: 阿里巴巴开源的配置文件管理中心,容易和SpringCloud Alibaba整合,有WebUI。

1分钟搭建一个单机的

不用docker搭建,docker搭建有问题的,须要调节一些参数。
百度网盘下载github

  • 解压后,把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包版本。web

<dependency>
    <groupId>com.ctrip.framework.apollo</groupId>
    <artifactId>apollo-client</artifactId>
    <version>1.5.0</version>
</dependency>
复制代码

和Springboot和Spring整合有两种方式(xml, 注解配置),这里我只讲注解配置。 spring

按照上图,在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须要指定服务器地址,至此你再也不须要把其余配置文件保存至本地。sql

#指定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=8000docker

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

开发小技巧

本地开发咱们能够有两个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

最后总结

Apollo易用性,集群性,高可用很是适合企业开发,并且他用法远不止做为SpringBoot的配置管理,既然咱们能够经过Http拿到配置数据,是否是还有其余不少的应用方法。

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

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

相关文章
相关标签/搜索