1、Dubbo概念
1.1 一个高性能、轻量级的java RPC框架,主要的核心功能为:
- 、基于接口的远程方法调用
- 、容错性与负载均衡
- 、自动服务注册与发现
注:官方文档的描述如下:
Apache Dubbo |ˈdʌbəʊ| is a high-performance, light weight, java based RPC framework. Dubbo offers three key functionalities, which include interface based remote call, fault tolerance & load balancing, and automatic service registration & discovery.
1.2 dubbo的设计结构
总结:容器在启动时将服务提供者(Provider)注册到注册中心(Register),服务消费者(Consumer)从注册中心订阅需要的服务,注册中心将以长连接的方式通知服务消费者,服务消费者即可同步地调用服务提供者的相关方法。同时,监控中心(Monitor)也会通过异步感知到服务提供者及消费者的相关信息,如接口暴露,注册情况以及接口的调用明细,调用时间等信息。
2、Dubbo的简单使用
备注:以下借助dubbo-admin查看相关服务信息(比较直观,可选),关于dubbo-admin的安装可参考上一篇博文 dubbo 监控中心 —— dubbo-admin安装使用
2.1 注册中心搭建
2.1.1 先来搭建一个注册中心,dubbo官方推荐使用zookeeper作为注册中心,接下来我们也使用zookeeper作为注册中心,下面简单演示下window下的安装方式
1)、下载zookeeper,先到zookeeper的官网,找到Download点击进去
2)、在跳转后的页面点击 archive
3)、在跳转的页面选择一个版本下载(这里我下载的是3.5.5版本)
4)、解压下载的压缩包,并进入其 conf 目录下,找到文件 zoo_sample.cfg,复制一份改名为 zoo.cfg
5)、修改 zoo.cfg 文件的 dataDir(端口可以使用默认端口2181),指定为自己本机上的任意一个存在的目录,这里是指定到zookeeper安装目录下的data目录,所以需要手动创建data目录
6)、进入zookeeper安装目录的bin目录,启动zkServer.cmd
2.2 dubbo的使用
2.2.1 创建项目provider 和 consumer
备注:下面演示provider的创建,consumer操作基本一致。
2.2.2 演示服务提供者暴露服务
1)、添加项目所需的依赖
<!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>2.7.0</version>
</dependency>
<!-- 引入zookeeper客户端的依赖,dubbo 2.6以前引入zkClient, 2.6后之后引入curator -->
<!-- https://mvnrepository.com/artifact/org.apache.curator/curator-framework -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.2.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.curator/curator-recipes -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.2.0</version>
</dependency>
2)、编写提供者(provider)项目要暴露的服务接口(service及对应实现类)
package cn.zrz.service;
public interface ProviderService {
String getProduct(Integer id);
}
package cn.zrz.service.impl;
import cn.zrz.service.ProviderService;
public class ProviderServiceImpl implements ProviderService {
public String getProduct(Integer id) {
return "产品" + id;
}
}
3)、声明要对外暴露的接口(在类路径下创建一个application.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://dubbo.apache.org/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://dubbo.apache.org/schema/dubbo
http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
<!-- 配置应用名称 -->
<dubbo:application name="provider" />
<!-- 配置注册中心的位置 -->
<dubbo:registry address="zookeeper://127.0.0.1:2181" />
<!-- 配置dubbo的通讯方式,即使用的协议及使用的端口 -->
<dubbo:protocol name="dubbo" port="20880" />
<!-- 配置对外暴露的接口及接口的实现(ref) -->
<dubbo:service interface="cn.zrz.service.ProviderService" ref="providerService" />
<!-- 添加服务接口的实现类 -->
<bean id="providerService" class="cn.zrz.service.impl.ProviderServiceImpl" />
</beans>
4)、编写一个主类MainApplication(如果为web项目则可以不用),用于启动应用
package cn.zrz;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApplication {
public static void main(String[] args) throws Exception {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:application.xml");
context.start();
System.in.read(); //阻塞方法的结束
}
}
5)、通过 dubbo-admin 即可查看到服务已暴露出去
2.2.3 演示服务消费者调用远程服务
1)、添加依赖
<!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>2.7.0</version>
</dependency>
<!-- 引入zookeeper客户端的依赖,dubbo 2.6以前引入zkClient, 2.6后之后引入curator -->
<!-- https://mvnrepository.com/artifact/org.apache.curator/curator-framework -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.2.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.curator/curator-recipes -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.2.0</version>
</dependency>
2)、将提供者的接口类复制一份放到消费者项目中
3)、编写消费者的业务类service及实现类
package cn.zrz.service;
public interface ConsumerService {
void buyProduct(Integer productId);
}
package cn.zrz.service.impl;
import cn.zrz.service.ConsumerService;
import cn.zrz.service.ProviderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class ConsumerServiceImpl implements ConsumerService {
@Autowired
private ProviderService providerService;
public void buyProduct(Integer productId) {
String product = providerService.getProduct(productId);
System.out.println("已购买到:" + product);
}
}
4)、配置引用远程暴露的接口
<?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://dubbo.apache.org/schema/dubbo" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://dubbo.apache.org/schema/dubbo
http://dubbo.apache.org/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 开启spring 注解包扫描,这里为了方便spring的自动注入,不是dubbo配置必须的 -->
<context:component-scan base-package="cn.zrz.service" />
<!-- 配置应用的名称 -->
<dubbo:application name="consumer" />
<!-- 指定注册中心的位置 -->
<dubbo:registry address="zookeeper://127.0.0.1:2181" />
<!-- 引用远程服务代理 -->
<dubbo:reference interface="cn.zrz.service.ProviderService" id="providerService" />
</beans>
5)、编写主类(MainApplication)启动项目进行测试接口的调用是否成功
package cn.zrz;
import cn.zrz.service.ConsumerService;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApplication {
public static void main(String[] args) throws Exception {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:application.xml");
context.start();
ConsumerService consumerService = context.getBean(ConsumerService.class);
consumerService.buyProduct(1);
System.in.read(); //这里同样阻塞一下方法,方便通过dubbo-admin看到消费者的信息
}
}
6)、查看控制台发现打印了购买的产品信息,即方法调用成功
7)、再来通过dubbo-admin同样可以查看到消费者的信息
有什么不对的地方,欢迎指正!
获取项目源码