Dubbo 介绍
官网:
Github:https://github.com/apache/dubbo
2018 年 2 月 15 日,阿里巴巴的服务治理框架 dubbo 通过投票,顺利成为 Apache 基金会孵化项目。
Apache Dubbo 是一款高性能、轻量级的开源 Java RPC 框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
Dubbo 架构Dubbo 提供三个核心功能:基于接口的远程调用、容错和负载均衡,以及服务的自动注册与发现。Dubbo 框架广泛的在阿里巴巴内部使用,以及当当、去哪儿、网易考拉、滴滴等都在使用。
节点角色说明 节点 角色说明Provider 暴露服务的服务提供方
Consumer 调用远程服务的服务消费方
Registry 服务注册与发现的注册中心
Monitor 统计服务的调用次数和调用时间的监控中心
Container 服务运行容器
调用关系说明
服务容器负责启动,加载,运行服务提供者。
服务提供者在启动时,向注册中心注册自己提供的服务。
服务消费者在启动时,向注册中心订阅自己所需的服务。
注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
Dubbo 快速入门我们先通过一个简单的案例让大家理解一下 Dubbo 的使用,然后基于 Spring Boot 和 Spring Cloud 环境整合 Dubbo。
Dubbo 采用全 Spring 配置方式,透明化接入应用,对应用没有任何 API 侵入,只需用 Spring 加载 Dubbo 的配置即可。
依赖JDK 1.6 以上和 Maven 3.0 以上,采用 Maven 多模块聚合工程构建 api 模块,provider 模块以及 consumer 模块。
聚合工程项目结构如下图,简单介绍一下:
dubbo-api:服务接口
dubbo-provider:依赖服务接口,具体的业务实现,服务提供者
dubbo-coonsumer:依赖服务接口,远程调用服务,服务消费者
依赖关系dubbo-parent 的 pom.xml 依赖 apache dubbo。
<dependencies> <!-- apache dubbo 依赖 --> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo</artifactId> <version>2.7.7</version> </dependency> </dependencies>dubbo-provider 和 dubbo-consumer 的 pom.xml 依赖 dubbo-api 服务接口。
<dependencies> <!-- dubbo-api 依赖 --> <dependency> <groupId>org.example</groupId> <artifactId>dubbo-api</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies> 定义服务接口dubbo-api 中编写 HelloService.java
package org.example.service; /** * Hello服务 */ public interface HelloService { String sayHello(String name); } 定义服务提供者 在 provider 模块中实现服务接口dubbo-provider 中编写 HelloServiceImpl.java
package org.example.service.impl; import org.example.service.HelloService; /** * 服务实现 */ public class HelloServiceImpl implements HelloService { public String sayHello(String name) { return "hello " + name; } } 配置服务提供者dubbo-provider.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 "> <!-- 提供方应用信息,用于计算依赖关系 --> <dubbo:application name="hello-world-app"/> <!-- 使用 multicast 广播注册中心暴露服务地址 --> <dubbo:registry address="multicast://224.5.6.7:1234"/> <!-- 用 dubbo 协议在 20880 端口暴露服务 --> <dubbo:protocol name="dubbo" port="20880"/> <!-- 声明需要暴露的服务接口 --> <dubbo:service interface="org.example.service.HelloService" ref="helloService"/> <!-- 和本地 bean 一样实现服务 --> <bean id="helloService" class="org.example.service.impl.HelloServiceImpl"/> </beans> 加载 Spring 配置启动服务 package org.example; import org.springframework.context.support.ClassPathXmlApplicationContext; /** * 发布服务 */ public class Provider { public static void main(String[] args) throws Exception { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:dubbo-provider.xml"); context.start(); System.out.println("服务注册成功!"); System.in.read(); // 按任意键退出 } } 定义服务消费者 通过 Spring 配置引用远程服务dubbo-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://dubbo.apache.org/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans "> <!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 --> <dubbo:application name="consumer-of-helloworld-app" /> <!-- 使用 multicast 广播注册中心暴露发现服务地址 --> <dubbo:registry address="multicast://224.5.6.7:1234" /> <!-- 生成远程服务代理,可以和本地 bean 一样使用 helloService --> <dubbo:reference id="helloService" interface="org.example.service.HelloService" /> </beans> 加载 Spring 配置并调用远程服务 package org.example; import org.example.service.HelloService; import org.springframework.context.support.ClassPathXmlApplicationContext; /** * 调用远程服务 */ public class Consumer { public static void main(String[] args) throws Exception { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:dubbo-consumer.xml"); context.start(); HelloService helloService = (HelloService) context.getBean("helloService"); // 获取远程服务代理 String result = helloService.sayHello("world"); // 执行远程方法 System.out.println(result); // 显示调用结果 } } Dubbo 常用标签dubbo:application:应用程序名称
dubbo:registry:连接注册中心信息(配置注册中心)
dubbo:protocol:服务提供者注册服务采用的协议
Dubbo 协议,默认
RMI 协议
Hessian 协议
HTTP 协议
WebService 协议
Thrift 协议
Memcached 协议
Redis 协议
Rest 协议(RESTful)
Grpc 协议
更多协议信息请参考:
dubbo:service:声明需要暴露的服务接口