Spring Cloud 系列之 Dubbo RPC 通信

Dubbo 介绍

Spring Cloud 系列之 Dubbo RPC 通信

官网:

Github:https://github.com/apache/dubbo

2018 年 2 月 15 日,阿里巴巴的服务治理框架 dubbo 通过投票,顺利成为 Apache 基金会孵化项目。

Apache Dubbo 是一款高性能、轻量级的开源 Java RPC 框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。

Dubbo 架构

Dubbo 提供三个核心功能:基于接口的远程调用、容错和负载均衡,以及服务的自动注册与发现。Dubbo 框架广泛的在阿里巴巴内部使用,以及当当、去哪儿、网易考拉、滴滴等都在使用。

Spring Cloud 系列之 Dubbo RPC 通信

节点角色说明 节点 角色说明
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:依赖服务接口,远程调用服务,服务消费者

Spring Cloud 系列之 Dubbo RPC 通信

依赖关系

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:声明需要暴露的服务接口

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsxfpd.html