dubbo是阿里开源的一套分布式框架,目前在不少互联网企业中有使用,dubbo的解耦作的很好,学习使用成本也很低,让你的项目很简单的就实现了分布式、服务发现、故障切换等看似很高大上的功能,一些具体的介绍网上不少, 这篇文档简单介绍下整套环境的的搭建。nginx
dubbo consumer provider 注册中心,是须要的核心部分,admin,monitor不搭建,对业务也没有影响,这里注册中心,咱们使用zookeeper实现,也是目前生产环境中使用的最多的中间件。git
首先下载zookeeper,这里使用的是3.4.9的稳定版,将conf/zoo_sample.cfg 复制一份,重名为zoo.cfg修改配置以下web
dataDir=/tmp/zookeeper clientPort=2181
这两项配置,按照本机的实际状况配置,运行 zkServer.cmd,启动 zookeeperspring
新建maven项目,以下图所示apache
其中,api-dubbo是声明的接口,api
consumer-dubbo是消费者服务器
provider-dubbo是提供者网络
根pom配置app
<properties> <org.springframework.version>4.1.3.RELEASE</org.springframework.version> </properties> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${org.springframework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${org.springframework.version}</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.5.3</version> </dependency> <dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> <version>0.1.0</version> </dependency> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.3.3</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.16</version> </dependency> </dependencies>
api-dubbo中 只有一个接口文件,框架
public interface DemoService { public String sayHello(String name); }
consumer-dubbo
public class Consumer { public static void main(String[] args) throws Exception { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"dubbo-demo-consumer.xml"}); context.start(); DemoService demoService = (DemoService)context.getBean("demoService"); // get service invocation proxy String hello = demoService.sayHello("world"); System.out.println( hello ); } }
内容很简单,加载配置文件启动spring,获取bean,调用其中的方法sayHello
配置文件dubbo-demo-consumer.xml内容以下:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd "> <!-- 消费方应用名 --> <dubbo:application name="consumer-of-helloworld-app" /> <dubbo:registry protocol="zookeeper" address="127.0.0.1:2181" /> <!-- 生成远程服务代理 --> <dubbo:reference id="demoService" interface="com.kent.dubbo.demo.DemoService" /> </beans>
provider-dubbo
public class DemoServiceImpl implements DemoService { public String sayHello(String name) { System.out.println("[" + new SimpleDateFormat("HH:mm:ss").format(new Date()) + "] Hello " + name + ", request from consumer: " + RpcContext.getContext().getRemoteAddress()); return "Hello " + name + ", response form provider: " + RpcContext.getContext().getLocalAddress(); } }
DempServiceImpl实现api-dubbo中的接口。
public class DubboProviderDemo { public static void main(String[] args) throws Exception { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"dubbo-demo-provider.xml"}); context.start(); System.in.read(); } }
main方法也很简单 加载配置文件启动spring
<?xml version="1.0" encoding="UTF-8"?> <!--suppress SpringFacetInspection --> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd "> <dubbo:application name="hello-world-app" /> <!-- zk地址 --> <dubbo:registry protocol="zookeeper" address="127.0.0.1:2181" /> <!-- 本地端口 --> <dubbo:protocol name="dubbo" port="20880" /> <!-- 声明须要暴露的服务接口 --> <dubbo:service interface="com.kent.dubbo.demo.DemoService" ref="demoService" /> <bean id="demoService" class="com.kent.dubbo.demo.DemoServiceImpl" /> </beans>
运行时,首先启动DubboProviderDemo
启动Consumer
其中consumer的配置很简单
provider的配置中,本机启动了20880端口,用于接收consumer的请求。
第一次使用的人都很疑惑,zk到底是在作什么。
传统企业开发中,如webservice或http服务,客户端若是要请求服务端的接口,必需要知道服务端的接口信息,而当客户端数量愈来愈多后,服务端必需要增长机器,实现集群,以支撑请求,这时候,每每会增长F5或nginx之类负载设备,每增长一台服务器,就要修改,刷新负载的配置。
能够脑补下,当N个服务端,N个客户端之间,几百上千台服务器的状况下,还可能出现各类服务器当机,网络中断的状况下,这时,是什么状况。
而dubbo与之不一样的是,dubbo实现的是服务的动态寻址与路由
客户端和服务端之间,经过ZK,实现服务的订阅。ZK充当的角色是服务注册查找中心
例子中
服务端启动时去ZK注册com.kent.dubbo.demo.DemoService接口的节点信息,包括了调用接口所须要的信息。
客户端启动时去ZK查找com.kent.dubbo.demo.DemoService接口的节点信息,
当接口调用时,客户端直接去调用对应的服务端接口。
而当服务端的服务发生变化时,服务端和ZK之间的心跳会通知ZK节点的变化信息,ZK同时也会通知客户端,客户端则在下次请求时,就按照变化后的信息调用服务端接口。
dubbo-admin 管理模块,实现服务治理的一些功能。
修改WEB-INF下的dubbo.properties
的ZK配置后,发布在TOMCAT下
就能够看到以前例子中信息。
注意下,一些同窗可能在TOMCAT启动时会遇到
org.springframework.beans.factory.BeanCreationException: Error creating bean wit
h name 'uriBrokerService': Cannot create inner bean '(inner bean)' of type .......
这是由于JDK使用的1.8 ,网上下载的war包,一些依赖包的版本须要修改后才能使用1.8,换回1.7这个问题就能够解决了,或者去git上拉代码,本身编译。
具体的admin的介绍,就不详细说了。
monitor是监控模块。部署前修改conf下的dubbo.properties
dubbo.container=log4j,spring,registry,jetty dubbo.application.name=simple-monitor dubbo.application.owner= dubbo.registry.address=zookeeper://127.0.0.1:2181 dubbo.protocol.port=7070 dubbo.jetty.port=8089 dubbo.jetty.directory=D:/dubbo-monitor-simple-2.5.3/monitor dubbo.charts.directory=D:/dubbo-monitor-simple-2.5.3/monitor/charts dubbo.statistics.directory=D:/dubbo-monitor-simple-2.5.3/monitor/statistics dubbo.log4j.file=D:/dubbo-monitor-simple-2.5.3/logs/dubbo-monitor-simple.log dubbo.log4j.level=WARN
其中主要是须要修改monitor的路径位置,根据实际的信息配置。
另外 consumer和provider须要增长配置
<dubbo:monitor protocol="registry"/>
修改完毕后运行bin下的start.bat
效果以下
常常容易遇到的问题是,界面出来了 可是 statistics和charts 就是图中的图表是出不来,可能的缘由以下:
1 配置中的路径若是有问题
2 monitor的lib中使用的dubbo jar包的版本 须要和consumer和provider保持一致!