栏目分类:
子分类:
返回
终身学习网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
终身学习网 > IT > 软件开发 > 后端开发 > Java

远程过程调用RPC 4:RPC服务框架Dubbo

Java 更新时间:发布时间: 百科书网 趣学号

前文介绍了RPC框架的相关内容:

RPC服务框架Dubbo
  • 简介
  • 部署架构
  • 序列化
  • 网络协议
  • 线程派发
  • 负载均衡
  • 注册中心
  • 配置
  • 简单demo
    • 生产者 provider
      • 服务接口定义
      • 服务端接口实现
      • pom依赖
      • 配置
      • 启动类中加载配置
    • 消费者 consumer
      • 调用的接口
      • pom配置
      • 启动类调用接口
    • 效果

简介

之前学习了很多RPC以及RPC框架的相关内容,本文具体学习一种热门的RPC框架:Dubbo。
Dubbo官方文档
作为一个RPC框架,Dubbo提供了RPC通信与微服务治理两大关键能力。这意味着,使用Dubbo开发的微服务,将具备相互之间的远程发现与通信能力, 同时利用Dubbo提供的丰富服务治理能力,可以实现诸如服务发现、负载均衡、流量调度等服务治理诉求。同时Dubbo是高度可扩展的,用户几乎可以在任意功能点去定制自己的实现,以改变框架的默认行为来满足自己的业务需求。
Dubbo最早诞生于阿里巴巴,随后加入Apache软件基金会,项目从设计之初就是为了解决企业的服务化问题,因此充分考虑了大规模集群场景下的服务开发与治理问题,如易用性、性能、流量管理、集群可伸缩性等。

部署架构


可以看出,Dubbo也是由以下三个核心组件构成:

  • 注册中心
  • 配置中心
    存储 Dubbo 启动阶段的全局配置,保证配置的跨环境共享与全局一致性
    负责服务治理规则(路由规则、动态配置等)的存储与推送。
  • 元数据中心
    接收 Provider 上报的服务接口元数据,为 Admin 等控制台提供运维能力(如服务测试、接口文档等)
    作为服务发现机制的补充,提供额外的接口/方法级别配置信息的同步能力,相当于注册中心的额外扩展
序列化

Dubbo支持多种序列化方式(Dubbo 2.7):

  • dubbo序列化
  • hessian2序列化(默认,非原生hessian2)
  • json序列化(性能不如上面两种)
  • Java序列化(性能很差)
  • Kryo
  • fst

此外,dubbo支持我们自定义的序列化协议。扩展方式为:

src
 |-main
    |-java
        |-com
            |-xxx
                |-XxxSerialization.java (实现Serialization接口)
                |-XxxObjectInput.java (实现ObjectInput接口)
                |-XxxObjectOutput.java (实现ObjectOutput接口)
    |-resources
        |-META-INF
            |-dubbo
                |-org.apache.dubbo.common.serialize.Serialization (纯文本文件,内容为:xxx=com.xxx.XxxSerialization)
网络协议

协议是 RPC 的核心,它规范了数据在网络中的传输内容和格式。除必须的请求、响应数据外,通常还会包含额外控制数据,如单次请求的序列化方式、超时时间、压缩方式和鉴权信息等。

Triple协议:兼容gRPC ,以HTTP2作为传输层构建新的协议:

  • 跨语言互通
  • 提供更完善的请求模型,除了 Request/Response 模型,还应该支持 Streaming 和 Bidirectional
  • 易扩展、穿透性高,包括但不限于 Tracing / Monitoring 等支持,也应该能被各层设备识别,网关设施等可以识别数据报文,对 Service Mesh 部署友好,降低用户理解难度
  • 多种序列化方式支持、平滑升级
  • 用户升级无感知

Dubbo支持在不同服务在性能上适用不同协议进行传输,比如大数据用短连接协议,小数据大并发用长连接协议。
此外,也可以自定义通信协议。

线程派发


dubbo支持以下几种线程派发方式:

派发方式解释
all所有消息都派发到线程池,包括请求,响应,连接事件,断开事件,心跳等
direct所有消息都不派发到线程池,全部在 IO 线程上直接执行
message只有请求响应消息派发到线程池,其它连接断开事件,心跳等消息,直接在 IO 线程上执行
execution只有请求消息派发到线程池,不含响应,响应和其它连接断开事件,心跳等消息,直接在 IO 线程上执行
connection在 IO 线程上,将连接断开事件放入队列,有序逐个执行,其它消息派发到线程池

此外,支持自定义线程池。

负载均衡

Dubbo 提供了4种负载均衡实现:

  • 基于权重随机算法的 RandomLoadBalance
  • 基于最少活跃调用数算法的 LeastActiveLoadBalance
  • 基于hash一致性的 ConsistentHashLoadBalance
  • 基于加权轮询算法的 RoundRobinLoadBalance

支持自定义的负载均衡。

注册中心

推荐使用Zookeeper作为注册中心。也可以使用

  • Nacos
  • Multicase
  • Redis
  • Simple

此外,支持多注册中心。比如:中文站有些服务来不及在青岛部署,只在杭州部署,而青岛的其它应用需要引用此服务,就可以将服务同时注册到两个注册中心。

配置

Dubbo支持以下几种配置方式:

  • 基于XML的配置
  • 动态配置中心
  • 属性配置
  • 自动加载环境变量
  • API配置
  • 注解配置

常见配置项主要有:

标签用途解释
dubbo:service/服务配置暴露一个服务
dubbo:application/应用配置用于配置当前应用信息(生产者/消费者)
dubbo:registry/注册中心配置用于配置连接注册中心相关信息
dubbo:monitor/监控中心配置用于配置连接监控中心相关信息,可选
简单demo

一个使用Dubbo的简单demo,参考自官方文档。
一个生产者provider,一个消费者consumer
项目结构如下:

生产者 provider 服务接口定义

一个接口,对外提供服务

package com.mxb.provider.service;

public interface ProviderService {
    String sayHello(String word);
}
服务端接口实现

在实际实现中,返回字符串"hello xxx",xxx为用户传入的字符串

package com.mxb.provider.service;

public class ProviderServiceImpl implements ProviderService{

    @Override
    public String sayHello(String word) {
        return "hello" + word;
    }
}
pom依赖

导入以下

        
            com.alibaba
            dubbo
            2.6.6
        
        
            io.netty
            netty-all
            4.1.32.Final
        
        
            org.apache.curator
            curator-framework
            2.8.0
        
        
            org.apache.curator
            curator-recipes
            2.8.0
        
配置

采用xml方式进行配置。
配置文件为resource文件夹下的:META-INF/spring/myprovider.xml




    
    
        
        
        
    

    

    
    
    

    
    

    
    

    
    


此处registry的address为N/A表示由dubbo自动分配地址,可以理解为一种直连的方式,不通过注册中心。

启动类中加载配置

设置配置文件的路径,启动服务

@SpringBootApplication
public class ProviderApplication {
    public static void main(String[] args) throws IOException {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("META-INF/spring/myprovider.xml");
        context.start();
        System.in.read();
    }
}
消费者 consumer 调用的接口

要调用的接口为:

package com.mxb.consumer;
public interface ProviderService {
    String sayHello(String word);
}
pom配置

同provider

启动类调用接口
@SpringBootApplication
public class ConsumerApplication {

    public static void main(String[] args) throws IOException {
        ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("consumer.xml");
        context.start();
        ProviderService providerService = (ProviderService) context.getBean("providerService");
        String str = providerService.sayHello(" mxb");
        System.out.println(str);
        System.in.read();
    }
}

这里调用了远程接口。

效果

先启动provider再启动consumer,控制台输出:hello mxb

转载请注明:文章转载自 www.051e.com
本文地址:http://www.051e.com/it/956799.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 ©2023-2025 051e.com

ICP备案号:京ICP备12030808号