深入浅出:理解 RPC 和 Dubbo 架构

这篇具有很好参考价值的文章主要介绍了深入浅出:理解 RPC 和 Dubbo 架构。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

简介

Apache Dubbo是一款高性能的Java RPC框架.其前身是阿里巴巴公司开源的一个高性能,轻量级的开源Java RPC框架,可以和Spring框架无缝集成.

Dubbo 官网

RPC

RPC介绍

Remote Procedure Call 远程过程调用,是分布式架构的核心,按响应方式分以下两种:

  1. 同步调用:客户端调用服务方方法,等待直到服务方返回结果或者超时,再继续自己的操作
  2. 异步调用:客户端把消息发送给中间件,不再等待服务端返回,直接继续自己的操作

RPC是一种进程间的通信方式,它允许应用程序调用网络上的另一个应用程序中的方法,对于服务消费者而言,无需了解远程调用的底层细节,是透明的.

需要注意的是RPC并不是一个具体的技术,而是指整个网络远程调用过程

RPC是一个泛化的概念,严格来说一切远程过程调用手段都属于RPC范畴,各种开发语言都有自己的RPC框架.JAVA中RPC框架比较多,广发使用的有Dubbo,RMI,Spring Cloud,Hessian等.

RPC组件

简单来说一个RPC架构里包含以下4个组件:

  1. 客户端(Client):服务调用者
  2. 客户端存根(Client Stub):存放服务端地址信息,将客户端的请求参数打包成网络消息,再通过网络发送给服务方
  3. 服务端存根(Server Stub):接受客户端发送过来的消息并解包,再调用本地服务
  4. 服务端(Server):服务提供者

深入浅出:理解 RPC 和 Dubbo 架构

RPC调用

深入浅出:理解 RPC 和 Dubbo 架构

  1. 客户端调用以本地调用方式调用服务
  2. 客户端存根接收到调用后负责将方法,参数等组装成能够进行网络传输的消息体,在Java里就是序列化的过程
  3. 客户端存根找到服务地址,并将消息通过网络发送到服务端;
  4. 服务端存根收到消息后进行解码,在Java里就是反序列化的过程
  5. 服务端存根根据解码结果调用本地服务
  6. 本地服务执行处理逻辑
  7. 本地服务将结果返回给服务端存根
  8. 服务端存根将返回结果打包成消息,Java里的序列化
  9. 服务端存根将打包后的消息通过网络发送至消费方
  10. 客户端存根接收到消息,并进行解码,Java里的反序列化
  11. 服务调用方得到最终结果

Dubbo

Dubbo架构

Dubbo架构图(Dubbo官方提供)如下:
深入浅出:理解 RPC 和 Dubbo 架构
节点角色说明

节点 角色说明
Provider(服务提供者) 暴露服务的服务提供方
Consumer(服务消费者) 调用远程服务的服务消费方
Registry(服务注册中心) 服务注册与发现的注册中心
Monitor(服务监控中心) 统计服务的调用次数和调用时间的监控中心
Container(服务容器) 服务运行容器

注意:

  • 虚线都是异步访问,实线都是同步访问
  • 蓝色虚线:在启动时完成的功能
  • 红色虚线(实线)都是程序运行过程中执行的功能

调用关系说明

  1. 服务容器负责启动,加载,运行服务提供者
  2. 服务提供者在启动时,向注册中心注册自己提供的服务
  3. 服务消费者在启动时,向注册中心订阅自己所需的服务
  4. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者
  5. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用
  6. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心

Dubbo快速开发

代码结构过于复杂,这里只展示部分代码,全部代码地址 存入git.

深入浅出:理解 RPC 和 Dubbo 架构
服务消费者

package com.fanqiechaodan.controller;

import com.fanqiechaodan.pojo.User;
import com.fanqiechaodan.service.UserService;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author fanqiechaodan
 * @Classname UserController
 * @Description
 */
@RestController
public class UserController {

    @Reference
    UserService userService;

    @GetMapping(value = "/get/{id}")
    public User getUser(@PathVariable(value = "id")String id){
        return userService.findById(id);
    }
}

服务提供者

package com.fanqiechaodan.service.impl;

import com.fanqiechaodan.service.UserService;
import com.fanqiechaodan.pojo.User;
import org.apache.dubbo.config.annotation.Service;

/**
 * @author fanqiechaodan
 * @Classname UserServiceImpl
 * @Description
 */
@Service
public class UserServiceImpl implements UserService {

    @Override
    public User findById(String id) {
        User user = new User();
        user.setId(id);
        user.setName("番茄炒蛋");
        return user;
    }
}

测试:
深入浅出:理解 RPC 和 Dubbo 架构
深入浅出:理解 RPC 和 Dubbo 架构文章来源地址https://www.toymoban.com/news/detail-411263.html

到了这里,关于深入浅出:理解 RPC 和 Dubbo 架构的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 深入浅出 -- 系统架构之单体架构

    单体架构(Monolithic Architecture)是一种传统的软件架构模式,将整个应用程序作为一个单一的、统一的单元进行开发、部署和扩展。在单体架构中,所有的功能模块都被打包在一起,共享同一个代码库和数据库。 例如,在网上商城系统中,JavaWeb工程通常会被打成WA R包部署在

    2024年04月10日
    浏览(34)
  • 深入浅出对话系统——自然语言理解模块

    首先回顾一下自然语言理解的概念。 自然语言理解(Natural Language Understanding)包含三个子模块: 其中领域识别和意图识别都是分类问题,而语义槽填充属于序列标注问题。所以,在自然语言理解中,我们要解决两个分类任务和一个序列标注任务。既然其中两个问题都属于分类任

    2024年02月08日
    浏览(35)
  • 【C++】模板初阶 【 深入浅出理解 模板 】

    如何实现一个通用的交换函数呢? 使用函数重载虽然可以实现 ,但是有一下几个不好的地方: 重载的函数 仅仅是类型不同 ,代码复用率比较低, 只要有新类型出现时,就需要用户自己增加对应的函数 代码的可维护性比较低,一个出错可能所有的重载均出错 那能否 告诉编

    2024年02月05日
    浏览(31)
  • 深入浅出MySQL - 架构与执行

    Photo by Merilin Kirsika Tedder from Pexels MySQL作为一个流行的开源关系型数据库管理系统,它可以运行在多种平台上,支持多种存储引擎,提供了灵活的数据操作和管理功能。MySQL的逻辑架构可以分为三层: 连接层 、 服务层 和 引擎层 ,下方是网上流传度很广的一张架构图。 需要注

    2024年02月09日
    浏览(32)
  • 深入浅出讲解自动驾驶 - 激光雷达原理和结构简介

    💂 个人主页 : 同学来啦 🤟 版权 : 本文由【同学来啦】原创、在CSDN首发、需要转载请联系博主 💬 如果文章对你有帮助, 欢迎关注、点赞、收藏和订阅专栏哦 激光雷达最先应用于海洋深度探测领域,其实现思路是通过相同回波之间的时间差实现海洋深度测算。后来不断演

    2024年02月16日
    浏览(28)
  • 理解C#委托(Delegate)通俗易懂,深入浅出

    委托首先是一个数据类型,我们可以像定义结构体一样定义一个委托类型,委托(Delegate) 是存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变 委托的定义 例如: 在定义委托类型时要指定函数的参数类型和返回值,一旦声明了委托类型,委托对象必须使用

    2024年02月02日
    浏览(33)
  • 深入浅出 -- 系统架构之微服务架构选型参考图

    技术选型架构图 是一个用于展示项目中所采用的各种技术和组件之间关系的图表。 它通常包括以下几个部分: 1. 项目名称和描述:简要介绍项目的背景和目标。 2. 技术栈:列出项目中使用的主要技术和工具,如编程语言、框架、数据库等。 3. 组件关系:用箭头表示各个组

    2024年04月09日
    浏览(33)
  • 深入浅出推荐系统(一):推荐系统基本架构

    过去八九年在广告、生活服务、电商等领域从事大数据及推荐系统相关工作,近来打算对过去的工作做一个系统性的梳理。一方面帮自己查缺补漏、进行更深入的学习;另一方面也希望能通过博客结交同好,增进交流。 这一博客系列以介绍推荐系统为主,会少量涉及广告系统

    2023年04月26日
    浏览(42)
  • 深入浅出 -- 系统架构之微服务架构的新挑战

    尽管微服务架构有着高度独立的软件模块、单一的业务职责、可灵活调整的技术栈等优势,但也不能忽略它所带来的弊端。本篇文章,我们从网络、性能、运维、组织架构和集成测试五个方面来聊一下设计微服务架构需要考虑哪些问题,对设计有哪些挑战呢? 前面我们聊过了

    2024年04月09日
    浏览(34)
  • 深入浅出理解CSS中的3D变换:踏上立体视觉之旅

    在现代Web设计中,CSS 3D变换已经成为增强用户体验、打造沉浸式界面的重要手段。借助CSS的3D变换属性,我们可以轻松实现元素在三维空间中的旋转、移动、缩放等操作,从而创造出生动活泼、富有立体感的网页效果。本文将从基础知识出发,通过易于理解的概念解析和实战

    2024年04月22日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包