dubbo是一个分布式服务框架,支持rpc即远程服务调用,底层基于Netty实现,现在项目中使用,都是通过spring来集成,很容易和spring项目结合使用,配置使用dubbo服务,就和配置本地服务一样,传统基于http调用的服务,都可以通过dubbo来改造实现。dubbo支持负载均衡,是一个理想的服务治理框架。dubbo框架体现了soa的思想,将服务统一管理,便于维护,消费者与服务提供者实现弱耦合。
dubbo服务涉及到的角色有:
- 注册中心:提供服务注册与服务发现功能,容器启动,服务提供者会在这里注册自己提供的服务,服务消费者会在这里订阅自己所需的服务。
- 服务提供者:暴露服务的服务提供方
- 服务消费者:需要调用远程服务的消费方
- 监控中心:统计服务调用的次数和调用时间
下面给出一个最简单的示例:
dubbo默认使用zookeeper做配置管理,因此底层也需要依赖zookeeper,我们做这个示例之前,需要安装一个zookeeper,windows下可以直接下载zookeeper压缩包,解压即可。我们需要拷贝一份配置conf目录下zoo_sample.cfg为zoo.cfg,使用默认配置,我们无需做任何修改,zookeeper默认开启2181端口。在windows下启动zookeeper,只需要在zookeeper安装目录的命令行下运行bin\zkServer.cmd
启动之后,没有报错,就表示启动成功,会开启2181监听端口,等待客户端连接:
接着,我们可以创建我们的maven工程,我们创建一个dubboservice的父工程,然后创建三个子模块,分别是接口模块,服务提供者模块,消费者模块。
只需要在parent工程的pom.xml配置文件中加入依赖:
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.3</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.8</version>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
</dependencies>
<modules>
<module>dubbo-api</module>
<module>dubbo-provider</module>
<module>dubbo-comsumer</module>
</modules>
在dubbo-api项目模块中编写服务接口BusinessService.java
package com.xxx.service;
public interface BusinessService {
String hello(String name);
int add(int a,int b);
}
dubbo-provicer项目模块中,实现BusinessService接口
首先这个模块要依赖dubbo-api,因此pom.xml文件中需要加入依赖:
<dependency>
<groupId>com.xxx</groupId>
<artifactId>dubbo-api</artifactId>
<version>1.0</version>
</dependency>
编写实现BusinessService接口的服务类:
package com.xxx.service;
public class BusinessServiceImpl implements BusinessService{
@Override
public String hello(String name) {
return "hello,"+name+",this is dubbo service provider,welcome you.";
}
@Override
public int add(int a, int b) {
return a + b;
}
}
使用spring配置文件,配置服务提供者提供的服务,以及注册地址,配置文件中需要加入dubbo命名空间:
<?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="dubbo-provider"/>
<dubbo:registry protocol="zookeeper" address="zookeeper://localhost:2181"/>
<dubbo:protocol name="dubbo" port="20880"/>
<bean id="businessService" class="com.xxx.service.BusinessServiceImpl"/>
<dubbo:service interface="com.xxx.service.BusinessService" ref="businessService"/>
</beans>
编写服务启动类,等待消费者来消费服务:
package com.xxx.service;
import java.io.IOException;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class ProviderServer {
public static void main(String[] args) throws IOException {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"classpath:dubbo-provider.xml"});
context.start();
System.out.println("dubbo service provider start ok.");
System.in.read();
}
}
最后,我们来准备服务消费者dubbo-consumer项目模块代码,同样需要引入dubbo-api依赖。
<dependency>
<groupId>com.xxx</groupId>
<artifactId>dubbo-api</artifactId>
<version>1.0</version>
</dependency>
作为消费者,除启动消费者之外,无需额外的代码,但是我们也需要一个spring配置文件来配置服务发现的地址:
<?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="dubbo-consumer"/>
<dubbo:registry address="zookeeper://localhost:2181"/>
<dubbo:reference interface="com.xxx.service.BusinessService" id="businessService"/>
</beans>
配置服务发现的地址,以及我们需要调用的服务接口。
编写启动消费者类:
package com.xxx.service;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class ComsumerMain {
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"classpath:dubbo-comsumer.xml"});
context.start();
BusinessService service = (BusinessService) context.getBean("businessService");
String hello = service.hello("consumer");
System.out.println(hello);
int result = service.add(5, 3);
System.out.println("service.add(5,3)="+result);
}
}
代码中,我们启动消费者服务,找到我们需要调用的服务businessService,然后调用它的hello(String name)方法和add(int a,int b)方法,分别获得返回值,然后打印结果。
运行以上程序,打印信息如下:
服务提供方控制台信息:
服务消费者控制台信息:
通过示例,服务消费方成功调用了服务提供方的服务,得到了预期结果。我们可以通过zookeeper终端查看我们的服务,zookeeper安装目录命令行下运行bin\zkCli.cmd命令:
我们通过ls /dubbo命令,查看到com.xxx.service.BusinessService服务注册到了zookeeper的/dubbo节点上。