一.Dubbo支持Apollo的介绍
Apollo是携程开源的一款配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。
Dubbo目前的最新版本2.7.0将过去单一的注册中心拆分成了注册中心、元数据中心和配置中心。其中配置中心起到的作用之一,就是将配置外部化,也就是将配置从应用内部剥离出去,可以在一个地方统一管理配置,也可以在程序启动之后从配置中心修改配置,再动态刷新到应用(前提是应用自身支持在启动之后切换该配置)。
目前Dubbo已经支持Zookeeper、Nacos、Apollo作为配置中心。本文就将介绍将Apollo作为配置中心的使用方式。
二.Apollo的安装与使用。
本部分不赘述,请参考官方文档:https://github.com/ctripcorp/apollo/wiki/Apollo%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97
三.Apollo配置Dubbo属性:
打开本地安装的Apollo首页并登陆:
新建一个应用dubbo-demo-provider,
新建一个namespace,名为dubbo,目前dubbo默认支持的命名空间为dubbo。
注意不要勾选部门前缀,同时设置为public。当设置为private时,只有相同的app.id的应用才可以获取此配置。而public可以被所有应用获取。
添加两条配置:
添加属性之后,点击“发布”。
四.Dubbo应用搭建
1.下载Dubbo 2.7.0的源码。Dubbo源码中自带了一个demo模块,可以直接运行。本文就通过修改它的配置,来使用Apollo配置中心。
2.打开dubbo-demo-xml-provider模块下的dubbo-provider.xml配置文件,注释掉
<dubbo:registry address="multicast://224.5.6.7:1234" />
添加下面的配置:
<dubbo:config-center app-name="dubbo-demo-provider" protocol="apollo" address="127.0.0.1:8080"/>
3.打开dubbo-demo-xml-consumer作同样的配置。
4.demo代码讲解:
首先是定义了一个接口:
public interface DemoService {
String sayHello(String name);
}
在provider端实现这一接口:
public class DemoServiceImpl implements DemoService {
private static final Logger logger = LoggerFactory.getLogger(DemoServiceImpl.class);
@Override
public String sayHello(String name) {
logger.info("Hello " + name + ", request from consumer: " + RpcContext.getContext().getRemoteAddress());
return "Hello " + name + ", response from provider: " + RpcContext.getContext().getLocalAddress();
}
}
服务端启动类:
public class Application {
/**
* In order to make sure multicast registry works, need to specify '-Djava.net.preferIPv4Stack=true' before
* launch the application
*/
public static void main(String[] args) throws Exception {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring/dubbo-provider.xml");
context.start();
System.in.read();
}
}
消费者启动类:
public class Application {
/**
* In order to make sure multicast registry works, need to specify '-Djava.net.preferIPv4Stack=true' before
* launch the application
*/
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring/dubbo-consumer.xml");
context.start();
DemoService demoService = context.getBean("demoService", DemoService.class);
String hello = demoService.sayHello("world");
System.out.println("result: " + hello);
}
}
五.下载zookeeper并启动
因为demo中需要使用zookeeper作为注册中心,所以需下载zookeeper并启动。具体方式请自行搜索。
六.启动应用
首先启动provider,输出日志:
可以看到,因为没有设置app.id,所以只能读取public的配置
再启动consumer,启动日志:
说明consumer调用provider成功
七.总结
Dubbo目前对支持Apollo作为配置中心做了一个初步的实现,目前所有的配置都是放到一个key下面(即value的一行是一个dubbo自身的配置)dubbo拿到这个配置后,自己解析为自身的多个配置。后续可能会修改为支持apollo上有多个key。
通过引入配置中心,可以在应用中减少配置,将配置放到配置中心统一管理。并且配置中心可以在不重启应用的情况下修改配置并推送给应用。当然前提是应用的配置本身支持在启动后改变并生效(某些配置可能在启动时生效,但启动后不能修改)。