Java:分布式RPC框架Apache Dubbo
创始人
2025-05-30 11:58:35

目录

  • 一、软件架构的演进过程【了解】
  • 二、Dubbo概述【了解】
    • 1、Dubbo简介
    • 2、Dubb架构
  • 三、服务注册中心Zookeeper
      • 1、 安装
      • 2、 启动&停止
  • 四、Dubbo快速入门
    • 1、服务提供方开发
    • 2、服务消费方开发

一、软件架构的演进过程【了解】

1、单体架构

一个包,包含了应用所有功能的应用程序,我们通常称之为单体应用。
简单理解类比前端,把所有代码写到一个文件里。

2、垂直架构
在这里插入图片描述

按照业务进行切割,形成小的单体项目。
简单理解前端的组件化,但是不同组件仍有重复代码。

3、SOA架构
在这里插入图片描述

将重复功能或模块抽取成组件的形式,对外提供服务,在项目与服务之间使用ESB(企业服务总线)的形式作为通信的桥梁。
简单理解前端的组件化,并且把重复代码【粗略】抽离出来。

4、微服务架构
在这里插入图片描述

和 SOA 架构类似,
微服务架构强调的一个重点是“业务需要彻底的组件化和服务化”。
将系统服务层完全独立出来,抽取为一个一个的微服务。
抽取的粒度更细,遵循单一原则。
简单理解前端的组件化,并且把重复代码【颗粒度更细】抽离出来。

二、Dubbo概述【了解】

1、Dubbo简介

Apache Dubbo是一款高性能的Java RPC框架

什么是RPC?

RPC全称为remote procedure call,即远程过程调用。比如两台服务器A和B,A服务器上部署一个应用,B服务器上部署一个应用,A服务器上的应用想调用B服务器上的应用提供的方法由于两个应用不在一个内存空间,不能直接调用,所以需要通过网络来表达调用的语义和传达调用的数据

Dubbo提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。

2、Dubb架构

在这里插入图片描述
图例说明:

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

调用关系说明:

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

三、服务注册中心Zookeeper

1、 安装

下载地址:http://archive.apache.org/dist/zookeeper/

2、 启动&停止

在这里插入图片描述
需要注意:

Zookeeper在Windows下启动只需要运行zkServer.cmd双击即可(需保证运行环境中正确安装了Java运行环境)

但是在有的时候会出现双击闪退的情况。针对闪退,可按照以下步骤进行解决:
1 、编辑zkServer.cmd文件末尾添加pause 。这样运行出错就不会退出,会提示错误信息,方便找到原因。例如原因如下:
在这里插入图片描述

2、重新双击运行zkServer.cmd
在这里插入图片描述
错误原因 ,找不到zoo.cfg配置文件

3、查看zkEnv.cmd
在这里插入图片描述
4 、增加zoo.cfg文件,如下
在这里插入图片描述
5、 zoo.cfg配置文件介绍

修改dataDir属性值,在上级目录下增加data目录
在这里插入图片描述
6、重新双击zkServer.cmd启动
在这里插入图片描述

四、Dubbo快速入门

Dubbo作为一个RPC框架,其最核心的功能就是要实现跨网络的远程调用。本小节就是要创建两个应用,一个作为服务的提供方,一个作为服务的消费方。通过Dubbo来实现服务消费方远程调用服务提供方的方法。

1、服务提供方开发

开发步骤:

先创建一个dubbodemo的工程。在文件夹下创建提供者和消费者项目。

1、创建maven工程(打包方式为war)dubbodemo_provider,在pom.xml文件中导入如下坐标

war

UTF-8
1.8
1.8
5.0.5.RELEASE


org.springframeworkspring-webmvc${spring.version}

org.springframeworkspring-jdbc${spring.version}

org.springframeworkspring-aspects${spring.version}

org.springframeworkspring-jms${spring.version}

org.springframeworkspring-context-support${spring.version}


com.alibabadubbo2.6.0

org.apache.zookeeperzookeeper3.4.7

com.github.sgroschupfzkclient0.1

javassistjavassist3.12.1.GA

com.alibabafastjson1.2.47



org.apache.maven.pluginsmaven-compiler-plugin2.3.21.81.8org.apache.tomcat.maventomcat7-maven-plugin2.28081/


2、配置web.xml文件

创建 webapp/WEB-INF/web.xml


contextConfigLocationclasspath:applicationContext*.xmlorg.springframework.web.context.ContextLoaderListener

3、创建服务接口

package com.atguigu.service;
public interface HelloService {public String sayHello(String name);
}

4、创建服务实现类

package com.atguigu.service.impl;
import com.alibaba.dubbo.config.annotation.Service;
import com.atguigu.service.HelloService;
@Service
public class HelloServiceImpl implements HelloService {@Overridepublic String sayHello(String name) {return "hello " + name;}
}

注意:服务实现类上使用的 Service 注解是Dubbo提供的,用于对外发布服务

5、在src/main/resources下创建 applicationContext-service.xml




启动服务
在这里插入图片描述

2、服务消费方开发

开发步骤:

1、创建 maven 工程(打包方式为war)dubbodemo_consumerpom.xml 配置和上面服务提供者相同,只需要将 Tomcat 插件的端口号改为8082即可

war

UTF-8
1.8
1.8
5.0.5.RELEASE


org.springframeworkspring-webmvc${spring.version}

org.springframeworkspring-jdbc${spring.version}

org.springframeworkspring-aspects${spring.version}

org.springframeworkspring-jms${spring.version}

org.springframeworkspring-context-support${spring.version}


com.alibabadubbo2.6.0

org.apache.zookeeperzookeeper3.4.7

com.github.sgroschupfzkclient0.1

javassistjavassist3.12.1.GA

com.alibabafastjson1.2.47



org.apache.maven.pluginsmaven-compiler-plugin2.3.21.81.8org.apache.tomcat.maventomcat7-maven-plugin2.28082/


2、配置webapp/WEB-INF/web.xml文件


springmvcorg.springframework.web.servlet.DispatcherServletcontextConfigLocationclasspath:applicationContext-web.xml1springmvc/

3、将服务提供者工程中的HelloService接口复制到当前工程

package com.atguigu.service;
public interface HelloService {public String sayHello(String name);
}

4、编写Controller

package com.atguigu.controller;import com.alibaba.dubbo.config.annotation.Reference;
import com.atguigu.service.HelloService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("/demo")
public class HelloController {@Referenceprivate HelloService helloService;@RequestMapping("/hello")@ResponseBodypublic String getName(String name){//远程调用String result = helloService.sayHello(name);System.out.println(result);return result;}
}

注意:Controller中注入HelloService使用的是Dubbo提供的@Reference注解

5、在src/main/resources下创建applicationContext-web.xml




6、启动服务
在这里插入图片描述

7、运行测试

在浏览器输入http://localhost:8082/demo/hello?name=Jack,查看浏览器输出结果

*思考一*:上面的Dubbo入门案例中我们是将HelloService接口从服务提供者工程(dubbodemo_provider)复制到服务消费者工程(dubbodemo_consumer)中,这种做法是否合适?还有没有更好的方式?

答:这种做法显然是不好的,同一个接口被复制了两份,不利于后期维护。更好的方式是单独创建一个maven工程,将此接口创建在这个maven工程中。需要依赖此接口的工程只需要在自己工程的pom.xml文件中引入maven坐标即可。

*思考二*:在服务消费者工程(dubbodemo_consumer)中只是引用了HelloService接口,并没有提供实现类,Dubbo是如何做到远程调用的?

答:Dubbo底层是基于代理技术为HelloService接口创建代理对象,远程调用是通过此代理对象完成的。

*思考三*:上面的Dubbo入门案例中我们使用Zookeeper作为服务注册中心,服务提供者需要将自己的服务信息注册到Zookeeper,服务消费者需要从Zookeeper订阅自己所需要的服务,此时Zookeeper服务就变得非常重要了,那如何防止Zookeeper单点故障呢?

答:Zookeeper其实是支持集群模式的,可以配置Zookeeper集群来达到Zookeeper服务的高可用,防止出现单点故障。

相关内容

热门资讯

实用的 PyYAML 使用技巧 AML 是一个被广泛使用的数据序列化和配置语言,作为一个开发者,总是不免...
C语言学习之路--指针篇 目录一、前言二、指针一、指针是什么1、指针的重要理解2、指针变量3、其他问题二、指针和指针类型1、指...
最牛,狂赚近70%! 最牛,狂... 【导读】前5月主动权益类基金平均净值增长率为2.43%,最牛业绩逼近70%中国基金报记者 方丽 曹雯...
电容笔和Apple penci... 跟Apple Pencil最主要不同,市场上大部分的电容笔都没有重力的压感࿰...
便携制氧机方案——PCBA/芯...   便携制氧机采用分子筛的吸附性能,通过物理原理,以无油压缩机为动力&#...
考研复试——离散数学 三年疫情都没有笔试,今年恢复,大概率会有笔试。 2023年3月19号&#...
分布式任务处理XXL-JOB 分布式任务处理XXL-JOB 什么是分布式任务调度 对一个视频的转码可以理解为一个任务的执行...
DirectX12(D3D12... 目录1、前言1.1、一些感慨1.2、运行效果展示1.3、示例简介1.4、示例操作说明1.5、本章内容...
小红书运营工具有哪些?新手运营...   很多人多多少少都会觉得小红书运营有一定的难度。但是其实在解决这些难题的时候,我们也...
Jetson NX 配置 py... Jetson NX 配置pytorch 参考文档 官方教程–还得是官方啊 参考博客1 参考博客...
c++ error:cross... 最近在写代码的时候,碰到了 crosses initialization of ......
XShell安装配置教程及云服... 目录一、 XShell的作用二、 下载XShell1.访问XShell官网,填写姓名和...
五年五任!道通科技任命90后董... 【高管动态】深圳市道通科技股份有限公司的董秘,也许是最不好干的岗位之一了。根据道通科技(600208...
C++初阶——前言 目录 1. 什么是C++ 2. C++的发展史 3. C+&...
每周股票复盘:西部矿业(601... 截至2025年5月30日收盘,西部矿业(601168)报收于15.8元,较上周的16.07元下跌1....
特朗普癫了?突然反咬中美贸易协... 知道他会反口,没想到这么快反口。不然为什么叫“疯王”呢?从昨晚到现在,特朗普又搞出三件大事:反咬中国...
DevOps是什么?DevOp... 目录专栏导读一、DevOps是什么?二、为什么会出现DevOps?1、容...
“石家庄富豪”要签50亿美元大... 频繁资产腾挪,收效如何? 作者 | 伍玥 编辑丨高岩 来源 | 野马财经 创新生物医药的出海热潮正在...
【零基础入门SpringBoo... 一、上手第一个程序 1、系统要求 此处以我自己使用的版本为例,在后期学习过程中遇到一...
马斯克黯然下课,临走前给特朗普... 黯然下课,马斯克要走了。5月底,马斯克正式宣布,即将卸任“政府效率部”部长职务,为其在特朗普政府的任...
Scala函数式编程 一、基本函数编程 在Scala 中函数式编程和面向对象编程完美融合在一起了 1 基础概念 1&#...
ChatGPT-4 前两天推出 ChatGPT-4,其创建者 OpenAI 展示了该机器人的增强功能——包...
UEFI 基础教程 (十三) ... 一、 修改UEFI UiApp源代码 修改 FrontPageStrings.uni 与 Front...
首进品牌超30%,餐饮选址新风... 总第4232期作者 |餐饮老板内参内参君逃离商场的餐饮人,正把店开到“高质价比商业体”“可能要撤店了...
94:二叉树的中序遍历 94:二叉树的中序遍历 总结 给定一个二叉树的根节点 root ,返...
03 - 初识Linux进程 ---- 整理自狄泰软件唐佐林老师课程 查看所有文章链接:(更新中&...
中年男人又一宝?新型护肝科技一... 凌晨一点的上海陆家嘴,写字楼里依然灯火通明。30岁互联网大厂产品经理张磊目不转睛盯着电脑屏幕,手机健...
零入门kubernetes网络... 《零入门kubernetes网络实战》视频专栏地址 https://www.ixigua.com/7...
“一部手机游景区”,带你玩转V... “一部手机游景区”已经不再是一个概念,现在各地纷纷大力发展VR智慧景区,...
Pytorch学习笔记--多G... 目录 1--前言 2--报错代码 3--解决方法 1--前言         最近在复现一篇 Pa...