大家好,今天我要给大家分享是的携程提出的统一配置服务中心开源项目-Apollo。
在此,感谢Apollo开源项目团队为此做出的努力付出。^_^
-----------------------------------------------------------简介,老手觉得麻烦可绕过---------------------------------------
首先我们要了解Apollo是做什么的:很简单就是把我们以前写在项目里的properties数据放到一个远程项目里面让我们远程获取。(这里只是我个人为了大家好理解这么写的,里面还有其他更多的功能比如集群、高可用、自带管理后台等等,详情请大家去阿波罗官网细细阅读文档)。apollo文档
你说这有什么用?
假设一个场景:公司产品经理给了小明同学一个需求,说我们公司的双十一活动每人每个商品限购10个。那么你实现的原理是不是会在代码里写一个变量commodity_number=10或者在properties文件里配置commodity_number=10然后获取配置文件数据再去写后续的逻辑代码? OK 你这样其实没问题的,写法正确,但是实际情况可能会有变化的,比如上线了,现在由于商品卖得太火爆,为了大家都能尽可能的获得一件商品,产品经理现在要你改成每人每件商品限购5个。这时你就尴尬了吧,你得先去改代码然后找上测试,然后才能上线。你自己算算这样得花多少时间完成?
那么为了解决这种问题携程推出了一款开源项目叫Apollo,他怎么解决这个问题呢?他把你在本地的properties数据放到远程apollo项目里。你发布好服务端之后,利用apollo自带的后台管理界面通过key-value的形式来配置你的数据,在通过客户端可以超级简单调用代码就可以在你自己的项目里获取到你想要数据了。并且这个数据是实时更新的。那么我们现在来想想上面的场景采用apollo过后是不是小明同学就可以随便点击几下鼠标操作几下键盘就可以完成需求了?
【提醒】Apollo服务端跟客户端之间的数据是实时更新的,服务器会实时推送数据到客户端,采用的是spring的长连接,并且客户端也会采用心跳机制去拉取服务端的数据。大致原理如下图:
---------------------------------------------------------------------干货开始----------------------------------------------------------------
一、首先你需要的东西:
1、阿波罗官方代码:https://github.com/ctripcorp/apollo 这里面包含了服务端与客户端。有点大建议大家在【码云】>【新建仓库】然后利用创建按钮上面的【导入已有仓库项目】来下载代码,这样快的多。我就不让大家从我的码云仓库下载了,自己动手记忆会牢记些。
2、JDK 1.8 +
(建议JDK安装目录不要带有中文、【空格】、特殊符号等,例如:Program Files 这种会导致使用Quick Start 里面的./demo.sh start出错,会提示【/c/Program: No such file or directory】 就是因为空格的问题,其他异常请按照具体异常处理)
3、MYSQL 5.6.5+ 【请大家注意:目前apollo只支持mysql数据库,其他数据库可能会有兼容问题】
4、eclipse
5、maven
数据库文件放在:apollo\scripts\db\migration
二、启动服务端项目
1、服务端项目共有三个:
依次启动顺序:apollo-configservice>apollo-adminservice>apollo-portal
2、启动apollo-configservice:请找到项目里面的ConfigServiceApplication.java,这时不能直接使用main方法。必须加上启动参数
如下操作:
-Dapollo_profile=github
-Dspring.datasource.url=jdbc:mysql://localhost:3306/ApolloConfigDB?characterEncoding=utf-8
-Dspring.datasource.username=root
-Dspring.datasource.password=123456
-Dlogging.file=/opt/log/apollo.log
点击Run就行了
【注意】
在启动apollo-configservice的过程中会在日志中输出eureka注册失败的信息,如com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused
。需要注意的是,这个是预期的情况,因为apollo-configservice需要向Meta Server(它自己)注册服务,但是因为在启动过程中,自己还没起来,所以会报这个错。后面会进行重试的动作,不用管这种异常,等自己服务起来后就会注册正常了。懵逼的同学请百度:eureka
3、apollo-adminservice 是同理操作
4、apollo-portal启动
启动类在:com.ctrip.framework.apollo.portal.PortalApplication
配置也是差不多的只不过VM里面的数据不一样:
-Dapollo_profile=github,auth
-Ddev_meta=http://localhost:8080/
-Dserver.port=8070
-Dspring.datasource.url=jdbc:mysql://localhost:3306/ApolloPortalDB?characterEncoding=utf8
-Dspring.datasource.username=root
-Dspring.datasource.password=123456
-Dlogging.file=/opt/log/apollo.log
注意这里数据库是ApolloPortalDB
三、解决jar包冲突
有些人下载下来,并且mvn eclipse:eclipse之后,导入eclipse都是成功的,但是启动ConfigServiceApplication时的main方法会提示jar冲突,那是因为项目里多引入了log4j-slf4j-impl 这个jar包导致冲突。怎么去掉?我只给解决思路:
如图:
去每一个项目pom搜索jar包,有的话就去掉引入。并且在那个项目里面Referenced Libraries里面也要去Remove。
OK 以上操作完了基本上项目就全部启动成功了
eureka管理地址:http://localhost:8080/
apollo后台管理地址:http://localhost:8070
默认超级账号:
name:apollo
pass:admin
由于我们是自己搭建的apollo,并不是用Quick Start项目来启动的,所以SimpleApp这个应用是无效的,我们得自己创建一个:
【注意】
AppId: | 100004458 |
---|
这个Appld必须跟apollo-demo里面app.properties配置文件的app.id 一致
添加一个数据:
那么我们现在增加了一个数据:httptimeout=123123
四、客户端获取数据
1、启动apollo-demo项目,
找到启动类:com.ctrip.framework.apollo.demo.api.SimpleApolloConfigDemo
Run Comfig VM:
-Denv=dev
-Ddev_meta=http://localhost:8080
启动成功后
在控制台输入:httptimeout
效果图:
那么我们就已经获取到我们设置的数据了。
总结:apollo的官方文档很全面,几个小时就能自己搭建了。建议大家可以去仔细阅读下这个文档。比我写的详细规范多了,
而且apollo里面用的技术有很多比如eureka、分布式等等,让使用者用起来非常方便。
最后是apollo的架构图:我相信如果你真的自己动手能跟我一样搭建了这套项目你就能看懂下面的图了