微服务实战系列之Dubbo(上)

前言

随着一年一度冬至的到来,2023的步伐也将远去。而博主的系列文章,也将从今天起,越来越聚焦如何构建微服务“内核”上。前序系列文章几乎囊括了微服务的方方面面,无论使用什么框架、组件或工具,皆可拿来用之。

那么,今天博主将推出微服务开发框架系列文章,欢迎各位盆友继续跟着博主的步伐,快乐徜徉于微服务的世界。Let’s Go!

本期主题,博主将带着各位盆友,聚焦在经典的RPC框架:Dubbo,一个盛行于互联网平台的宠儿。

在这里插入图片描述

一、读懂RPC

我们提到Dubbo,那不得不提RPC(远程过程调用,Remote Procedure Call缩写)。首先了解一下什么是RPC

RPC是一个通信协议,允许客户端通过网络调用非本地的服务,即像调用本地服务一样,调用一个“远程”的网络服务。一般用于构建分布式平台,实现跨网络访问通信。

1. 主要特点
  • 经典3跨
    无需关注“远程”服务如何实现,支持3跨(跨网络、跨平台、跨语言)。只要一个Client,根据RPC通信规范,即可叩开一个Remote Server的大门。此乃经典的C/S程序架构模式。
  • 服务可重用性
    既然满足3跨,那可了不起了。随时随地,任你“驰骋”。只要Server有,统统皆拿走。此刻,博主不禁暗然自喜中…
2. 核心组件

我们已知RPC是一个通信过程的协议,如使用它,必须遵循相应的“制度”,否则,乱了“江湖规矩”。满足RPC调用,必须具备以下四个模块:

模块名称模块简介
Client一个客户端,可发起远程调用的程序,一般称之为“消费者”
Client Stub一个客户端的请求存根,记录调用的服务信息,实现请求信息“编码”和服务端返回信息的“解码”
Server一个服务端,可提供服务的正在运行的程序,一般称之为“生产者”
Server Stub一个服务端的响应存根,记录接收的客户端信息,实现客户端数据“解码”;发起服务调用并向Client Stub返回经过“编码”的信息。

具体交互流程图,示意如下,请参考:

在这里插入图片描述

3. 关键技术

我们可能知道或至少了解,通信的基本原理:
在这里插入图片描述

首先需要通信的双方,其次需要一个通信的媒介或载体,最后是信息内容。当然该过程存在一定的干扰项(比如平台、网络、语言等等),因此一定程度上存在可能“失真”的风险。

那么RPC既然是一个通信协议,那也基本遵循该原理,核心技术包括:

–序列化和反序列化(Sequence)
将对象转换为二进制或逆向转换,即实现RPC过程中的编码解码的过程。
–动态代理(Proxy)

动态代理是一种在运行时创建代理类的机制,动态代理可以在不修改源代码的情况下,在运行时为某个接口动态生成实现类,并且可以拦截接口中的方法调用,从而实现一些特殊的功能.。

比如AOP、日志、注解等皆使用了动态代理技术实现。而在RPC中,主要用它完成调用过程的核心处理逻辑(2个Stub皆采用该技术),包括封装请求信息、发起调用和返回响应信息等传输过程实现。

到此为止,我想各位盆友已对RPC有了深刻的认识和了解。那么接下来,博主顺势而为,继续带着大家走进人见人爱的Dubbo

二、走进Dubbo

Apache Dubbo is a high-performance, Java-based open-source RPC framework.

翻译成大白话:Dubbo是一个基于JAVA高性能开源RPC框架。

1. 架构图

在这里插入图片描述
通过Dubbo架构图(来自官网)观察,是不是很很高效很经典?一个标准的端到端的服务框架。

组件名称组件含义
Consumer服务消费者,用于使用服务
Provider服务提供者,也叫生产者,用于提供服务
ZooKeeper用于满足Dubbo服务治理的工具,称之为服务注册中心

当然,Dubbo 在微服务应用开发框架之上抽象了一套 RPC 服务定义、暴露、调用与治理的编程范式,所以实际上它的服务能力包含了服务治理内容,可参考下图(来自官网):
在这里插入图片描述

2. 关键特性

- Transparent interface based RPC
提供基于RPC的透明接口
- Intelligent load balancing
提供智能的负载均衡策略
- Automatic service registration and discovery
提供自动的服务注册和发现能力
- High extensibility
提供较高的扩展能力
- Runtime traffic routing
提供运行时的服务管理和路由能力
- Visualized service governance
提供可视化服务治理能力

3. 交互原理

通过1、2两方面总结,Dubbo可以说深刻体现了什么是发布、什么是订阅,进而探究为实现高性能分布式系统,Dubbo到底是如何工作的。

在这里插入图片描述

关键步骤:

3.1 注册服务

服务提供者Provider在启动时,向注册中心发布自己的服务。

3.2 订阅服务

服务消费者Consumer在启动时,从注册中心订阅自己的服务。

3.3 调用服务

订阅完成后,即可通过业务接口,进行服务调用。

3.4 服务治理

包括服务调用、服务运维、服务限流、熔断等。


结语

作为支持分布式开发的高性能JAVA框架,Dubbo显然具备很高的使用价值。不仅推动了微服务一时兴起的潮流,也帮助使用者快速构建自己微服务体系提供了很好的参考坐标

好了,本期主题到此结束,欢迎订阅与交流!


历史回顾

  • 微服务实战系列之ZooKeeper(实践篇)
  • 微服务实战系列之ZooKeeper(下)
  • 微服务实战系列之ZooKeeper(中)
  • 微服务实战系列之ZooKeeper(上)
  • 微服务实战系列之MQ
  • 微服务实战系列之通信
  • 微服务实战系列之J2Cache
  • 微服务实战系列之Cache(技巧篇)
  • 微服务实战系列之MemCache
  • 微服务实战系列之EhCache
  • 微服务实战系列之Redis
  • 微服务实战系列之Cache
  • 微服务实战系列之Nginx(技巧篇)
  • 微服务实战系列之Nginx
  • 微服务实战系列之Feign
  • 微服务实战系列之Sentinel
  • 微服务实战系列之Token
  • 微服务实战系列之Nacos
  • 微服务实战系列之Gateway
  • 微服务实战系列之加密RSA
  • 微服务实战系列之签名Sign

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/357345.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多线程图解

关于多线程一直是我们学习iOS的一个重点,不仅是面试中经常被问到的问题,而且我们开发过程过程中经常会用到的技术,下面是一张关于多线程的图解,希望可以帮助大家学习多线程的开发。 转载于:https://www.cnblogs.com/lyy-5518/p/53…

spring作业_Spring和石英:多作业计划服务

spring作业作业调度对于应用程序来说是如此重要。 尤其是在大型项目中,处理大量工作可能是一个问题。 Spring和Quartz为解决该问题带来了巨大的好处。 本文展示了如何通过使用Spring和Quartz轻松地计划多个作业。 二手技术: JDK 1.6.0_21 春天3.1.1 石…

react常用知识点总结

1、什么是jsx JSX是JavaScript的扩展语法,这种<></>标签的写法就是 JSX。JSX 编写的组件通过预处理器 babel 解析后,再交给 React 库渲染到指定父容器下,形成最终html页面,供浏览器解析和显示。 JSX会被babel编译为&#xff1a;React.createElement()&#xff0c…

今日工作小结

1)用xib自定义cell写tableviewDemo代码&#xff0c;转模型&#xff0c;cell重用 见本地develop-demo-FriendTableViewDemo 2)textview的内容不定格显示&#xff0c;这好似用导航跳转过去&#xff0c;他会减去64像素&#xff0c;也就是导航的高度都是ScrollView引起的&#xff0…

全球数据一致性,事务,微服务和Spring Boot / Tomcat / Jetty

我们通常会构建需要一起执行以下几项操作的应用程序&#xff1a;调用后端&#xff08;微&#xff09;服务&#xff0c;写入数据库&#xff0c;发送JMS消息等。但是&#xff0c;如果在调用其中之一时出错&#xff0c;会发生什么情况&#xff1f;远程资源&#xff0c;例如&#x…

前端导入导出文件

一、导出 1、返回值是url&#xff1a;创建个a标签即可 printRecord(params).then((response) > {if (response.success) {let a document.createElement(a);//创建a标签//从新页面打开&#xff0c;下载的话不需要这个&#xff0c;打开一个图片需要从新页面打开a.setAttrib…

选取文档元素的API

除了现在常用的选取API 1 document.getElementById() 2 document.getElementsByName() 3 document.getElementsByTagName() 4 ... 新增的API 主要是  document.querySelector(div>ul)  document.querySelectorAll(div>ul>li) 这两个API的强大之处在于能像CSS选…

vue进阶

1、vue-cli 使用 在开发中&#xff0c;需要打包的东西不止是js、css、html。还有更多的东西要处理&#xff0c;这些插件和加载器如果我们一一去添加就会比较麻烦&#xff0c;vue官方提供了一个快速搭建vue项目的脚手架&#xff0c;使用它能快速的构建一个web工程模板。 官网&…

每天一个linux命令(1):ln 命令

每天一个linux命令&#xff08;35&#xff09;&#xff1a;ln 命令 ln 是linux中又一个非常重要命令&#xff0c;它的功能是为某一个文件在另外一个位置建立一个同步的链接.当我们需要在不同的目录&#xff0c;用到相同的文件时&#xff0c;我们不需要在 每一个需要的目录下都放…

ehcache 程序_将Ehcache添加到Openxava应用程序

ehcache 程序介绍 本文介绍如何在Openxava应用程序上快速启用Ehcache&#xff0c;从而提高性能。 查看实体及其图形时&#xff0c;将加载关系。 添加第二级缓存可加快关联元素的检索速度&#xff0c;因为已加载的元素是从缓存而不是数据库中检索的。 最终&#xff0c;该页面解…

Diff 算法核心原理

什么是虚拟DOM 讲Diff算法前&#xff0c;我先给大家讲一讲什么是虚拟DOM吧。这有利于后面大家对Diff算法的理解加深。 虚拟DOM是一个对象&#xff0c;一个什么样的对象呢&#xff1f;一个用来表示真实DOM的对象&#xff0c;要记住这句话。我举个例子&#xff0c;请看以下真实…

比较Java 8中的命令式和功能性算法

Mario Fusco的流行推文令人印象深刻&#xff0c;显示了类似算法的命令性和功能性方法之间的主要区别实际上是&#xff1a; 势在必行–功能分离pic.twitter.com/G2cC6iBkDJ — Mario Fusco&#xff08;mariofusco&#xff09; 2015年3月1日 两种算法都做同样的事情&#xff0…

mvc的视图中显示DataTable的方法

mvc的视图中显示DataTable的方法&#xff1a; 不断的循环画出table {ViewBag.Title "ShowDataTable"; } using System.Data; model Models.ConModel{var table Model.ExcelTable as DataTable; }<script src"~/Scripts/My97DatePicker/WdatePicker.js"…

rem,em,px,rpx等

1、任意浏览器的默认字体高都是16px。谷歌浏览器显示的最小字体大小是12px。 exp&#xff1a;突破谷歌浏览器显示12px限制。 &#xff08;1&#xff09;、<div>文本</div> 文本嵌套块标签&#xff0c;这是因为缩放只对有宽高的标签有效&#xff0c;缩放的时候也是…

python 列表 字典 读写文件:pickle模块的基本使用

建议大家使用cPickle&#xff0c;速度更快&#xff01;&#xff01;&#xff01; python数据持久存储&#xff1a;pickle模块的基本使用&#xff08;转载&#xff09; 作者: pzxbc出处: http://pzxbc.cnblogs.com/本文版权归作者和博客园共有&#xff0c;欢迎转载&#xff0c;但…

first-child、first-of-type等属性的差别

1、xxx:first-child 伪类 xxx作为第一个子元素 //p元素作为第一个子元素的都会变色 p:first-child { background:yellow; } //p作为父元素的 第一个子元素。不要求第一个元素的类型 p>:first-child {background:yellow; }//p作为父元素的 第一个子元素。要求第一个元素的类…

js 手机端触发事事件、javascript手机端/移动端触发事件

处理Touch事件能让你跟踪用户的每一根手指的位置。你可以绑定以下四种Touch事件: touchstart: // 手指放到屏幕上的时候触发 touchmove: // 手指在屏幕上移动的时候触发 touchend: // 手指从屏幕上拿起的时候触发 touchcancel: // 系统取消touch事件的时候触发。至于系统…

java 8 lambda_Java 8的烹调方式– Lambda项目

java 8 lambda什么是project lambda &#xff1a;Project lambda是用于以Java语言语法启用lambda表达式的项目。 Lambda表达式是功能编程语言&#xff08;如lisp&#xff09;中的主要语法。 Groovy将是支持lambda表达式&#xff08;也称为闭包&#xff09;的java的最接近亲戚。…

我的Serverless实战——引领云计算的下一个十年

前言&#xff1a;如今&#xff0c;越来越多的大厂企业开始大规模使用Serverless&#xff0c;处于变革中的开发者&#xff0c;大多已从观望状态转向尝试阶段&#xff0c;越来越多Serverless落地场景被解锁。作为基础研发底座&#xff0c;越来越多企业开始接受Serverless&#xf…

各种边距clientWidth、offsetWidth、scrollWidth、clientLeft、getBoundingClientRect详解

1、clientWidth、offsetWidth、scrollWidth <!DOCTYPE html> <html><head><meta charset"utf-8" /><style>#box1 {padding: 50px;position: static;}#box {border: 1px solid red;overflow: scroll;height: 200px;width: 500px;}#con…