微服务架构与Dubbo

一、微服务架构
微服务架构是一种架构概念,旨在通过将功能分解到各个离散的服务中以实现对解决方案的解耦。
分布式系统式若干独立系统的集合,但是用户使用起来好像是在使用一套系统。
和微服务对应的是单体式开发,即所有的功能打包在一个WAR包里,基本没有外部依赖,部署在一个JavaEE容器里,包括DO/DAO,Service,UI等所有逻辑。
微服务架构将庞大的单体应用程序分解成一套服务,使得每个服务可以由一个团队独立专注开发,每个微服务独立部署。开发人员需要基于RPC或者消息实现微服务之间的调用和通信
目前两种微服务架构解决方案:
(1)SpringBoot+SpringCloud
(2)Dubbo+ZooKeeper:Dubbo是一个阿里巴巴开源出来的一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。ZooKeeper用来实现服务的注册与发现和进行负载均衡。

补充:
(1)RPC(远程调用):
RPC是指远程过程调用,也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。
在这里插入图片描述
常用的RPC框架包括gRPC、Thrift、Dubbo等。

二、Dubbo
在这里插入图片描述
Dubbo 作为一款微服务框架,最重要的是向用户提供跨进程的 RPC 远程调用能力。如上图所示,Dubbo 的服务消费者(Consumer)通过一系列的工作将请求发送给服务提供者(Provider)。
2.1 Dubbo性能高的原因
Dubbo是一个RPC框架,主要干的是远程过程(方法)调用,提升性能就要从最关键、最耗时的两个方面入手:序列化和网络通信。
序列化:Java网络开发中,本地的对象要在网络上传输,必须要实现Serializable接口,也就是必须序列化,序列化的方案很多:xml、json、二进制流…,其中效率最高的就是二进制流,而dubbo采用的就是效率最高的二进制。
网络通信:不同于HTTP需要进行7步走(三次握手和四次挥手),dubbo采用Socket通信机制,一步到位,提升了通信效率,并且可以建立长连接,不用反复连接,直接传输数据。
2.2 dubbo的三大核心功能
面向接口的远程方法调用智能容错和负载均衡服务自动注册和发现
在这里插入图片描述
"Container"就是Spring容器,dubbo和Spring是无缝对接的。"Provider"启动时加载到"Container"容器中,启动完服务后spring容器注册到"Registry"注册中心。"Consumer"启动时也需要加载到Spring容器中(未画出),服务启动完成后Spring容器也取"Registry"注册中心订阅(subscribe)服务,订阅完成后注册中心将地址列表(如果有变更,Registry将基于长连接推送变更数据给Provider)发送(notify)给Consumer,Consumer根据这些地址基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。Consumer和Provider在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心Monitor
说明:Consumer、Provider、Container和Register需要进行开发,Monitor是现成的,不需要进行开发。也可以没有Registry,Provider告诉Consumer地址,Consumer直接调用。
2.3 dubbo支持的协议
Consumer向Provider请求服务(invoke)时支持多种协议:Dubbo、hessian、rmi、http、thrift、redis等,dubbo官方推荐使用dubbo协议,默认端口20880。
使用dubbo协议,Spring配置文件加入:
<dubbo:protocol name=“dubbo” port=“20880”>

三、 dubbo调用服务方式–直连方式
3.1 直连方式(只包括Provider工程和Consumer工程)
实例:
1.新建项目作为Provider
(1)在IDEA中新建空项目,在空项目中新建maven项目,新建java和resources目录。
(2)在pom.xml文件中删除多余依赖,加入所需依赖:
**加粗样式**
在这里插入图片描述
(3)新建实体类User:
在这里插入图片描述
新建服务接口和实现类:
在这里插入图片描述
在这里插入图片描述
(4)新建dubbo的核心配置文件(Spring的xml),将建立的服务暴露出去。
在这里插入图片描述
补充说明:
<dubbo:application >标签中的name属性值即为服务名称。
dubbo:service标签的registry置为N/A表示使用不通过注册中心的直连方式。
(5)配置监听器
在这里插入图片描述
(6)配置项目的tomcat
(7)打包
注释掉下图中的标签:
在这里插入图片描述
打包项目到本地仓库:
在这里插入图片描述
取消注释:
在这里插入图片描述
2.新建项目作为Consumer
在这里插入图片描述
(1)与1的(1)相同
(2)与2的(2)的区别
加入下面依赖:
在这里插入图片描述
(3)配置dubbo核心配置文件
在这里插入图片描述
(4)配置spring的核心配置文件
在这里插入图片描述

(5)编写控制层代码
在这里插入图片描述
(6)修改web.xml
在这里插入图片描述
(7)创建页面
在这里插入图片描述
(8)部署tomcat,启功Comsumer和Provider服务
在这里插入图片描述

效果如下:
在这里插入图片描述
3.2 直连方式(将接口和实体bean单独放到一个接口工程里)
建立3个工程,分别是接口工程、Provider工程和Consumer工程,这也是官方推荐的工程。
接口工程是maven java工程。
(一)建立接口工程
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
新建实体类:
在这里插入图片描述
新建服务类
在这里插入图片描述
(二)新建Provider工程
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
添加依赖:
在这里插入图片描述
在这里插入图片描述
注意:还需要引入接口工程,并对接口工程里的接口具体实现
在这里插入图片描述
实现接口:
在这里插入图片描述
新建核心配置文件dubbo-userservice-provider.xml:
在这里插入图片描述
修改web.xml文件:
在这里插入图片描述
配置tomcat。
(三)新建Consumer工程:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

也要导入接口工程:
在这里插入图片描述
新建核心配置文件dubbo-consumer.xml:
在这里插入图片描述
Consumer用到了.jsp页面,需要新建spring(SpringMVC)的核心配置文件applicationContext.xml:
在这里插入图片描述
新建控制层的类:
在这里插入图片描述
修改web.xml
在这里插入图片描述
创建页面
在这里插入图片描述
配置tomcat。
启动Comsumer和Provider服务,浏览器访问:
在这里插入图片描述
总结:Consumer直接引入接口工程,接口工程只有接口,而接口的具体实现在Provider项目(Provider引入接口工程实现)中。
问题:
直连方式无注册中心,Consumer直接向指定的Provider请求服务,不能保证服务最优化,没有考虑集群之间存在调度问题。

四、注册中心ZooKeeper
4.1 注册中心
对于服务提供方,需要发布服务,而且由于应用系统的复杂性,服务的数量、类型也不断膨胀;对于服务消费方,最关心如何获取到它所需要的服务,而面对复杂的应用系统,需要管理大量的服务调用。
而且,对于服务提供方和服务消费者来说,还有可能兼具这两种角色,即需要提供服务,又需要消费服务,通过统一管理起来,可以有效地优化内部应用对服务发布/使用的流程的管理,服务注册中心可以通过特定协议来完成服务对外的统一。
Dubbo推荐Zookeeper注册中心。
Zookeeper是Apacahe Hadoop的子项目,是一个树形的目录结构,支持变更推送(服务有变更会被推送),适合作为Dubbo服务的注册中心。
下图为Zookeeper的管理方式:
在这里插入图片描述
4.2安装Zookeeper
下载官网:
zookeeper.apache.org
在这里插入图片描述
下载的压缩包:
在这里插入图片描述
解压文件:
在这里插入图片描述
在这里插入图片描述
打开conf目录:
在这里插入图片描述
复制zoo_sample.cfg文件为zoo.fcg
在这里插入图片描述
编辑zoo.cfg:
修改dataDir的值并在本地文件夹建立项目的空目录
在这里插入图片描述
在这里插入图片描述
双击执行bin目录下的zkServer.cmd:
在这里插入图片描述
在这里插入图片描述
五、dubbo调用服务方式–使用注册中心
(一)新建接口工程
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
加依赖:

新建实体类:
在这里插入图片描述
接口类:
在这里插入图片描述

(二)新建Provider工程
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
加依赖:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
新建接口实现类:
在这里插入图片描述
新建dubbo核心配置文件dubbo-zk-userservice-provider.xml:
在这里插入图片描述
在这里插入图片描述
(三)新建Consumer项目
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
添加依赖:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
修改核心配置文件:
在这里插入图片描述
新建SpringMVC核心配置文件applicationContext.xml:
在这里插入图片描述
修改web.xml:
在这里插入图片描述
新建控制层类:
在这里插入图片描述
在这里插入图片描述
配置tomcat。
打开Zookeeper,双击bin目录下的zkServer.sh:
在这里插入图片描述

启动Comsumer和Provider服务,浏览器访问:
在这里插入图片描述
六、版本号version
有的时候,想要改进Provider里的实现类的内容,或者增加新的实现类,为了区分,可以使用版本号。
(一)新建provider
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
添加依赖:
在这里插入图片描述
在这里插入图片描述
从上图中,可以看出引入的是之前创建的接口工程。
新建多个接口实现类:
在这里插入图片描述
在这里插入图片描述
新建核心配置文件dubbo-userservice-multi-provider.xml:
在这里插入图片描述
注意:不管一个接口是否有多个实现类,只要服务提供者向外暴露接口服务时指定了版本号,作为消费者引用远程接口服务的时候就必须执行版本号。

(二)创建Consumer
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
添加依赖:
在这里插入图片描述
在这里插入图片描述
新建核心配置文件dubbo-multi-consumer.xml:
在这里插入图片描述
如上图,dubbo引用多个标签,id不能相同,并写明不同的版本号。
新建SpringMVC的核心配置文件:
在这里插入图片描述
修改web.xml:
在这里插入图片描述
在这里插入图片描述
新建.jsp文件:
在这里插入图片描述
配置tomcat,并启动Comsumer和Provider服务。
在这里插入图片描述
七、关闭检查
dubbo缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止Spring初始化完成,以便上线时,能及早地发现问题,默认check=true。通过check=false关闭检查,比如,测试时,有些服务不关心,或者出现了循环依赖,必须有一方先启动。
在这里插入图片描述

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

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

相关文章

静默拷贝U盘里的ppt/pptx

专门用于拷贝老师讲课的课件&#xff01;&#xff01;&#xff01;本程序需要编译&#xff0c;运行后无界面&#xff0c;如果需要关闭的话&#xff0c;请从任务管理器里关闭 附上代码&#xff1a; import os import shutil import time import psutil# 获取本机硬盘盘符列表 …

搭建Zookeeper完全分布式集群(CentOS 9 )

ZooKeeper是一个开源的分布式协调服务&#xff0c;它为分布式应用提供了高效且可靠的分布式协调服务&#xff0c;并且是分布式应用保证数据一致性的解决方案。该项目由雅虎公司创建&#xff0c;是Google Chubby的开源实现。 分布式应用可以基于ZooKeeper实现诸如数据发布/订阅…

Vue的生命周期的详解

Vue的生命周期是每个使用Vue框架的前端人员都需要掌握的知识&#xff0c;以此作为记录。 Vue的生命周期就是vue实例从创建到销毁的全过程&#xff0c;也就是new Vue() 开始就是vue生命周期的开始。Vue 实例有⼀个完整的⽣命周期&#xff0c;也就是从开始创建、初始化数据、编译…

算法|最大堆、最小堆和堆排序的实现(JavaScript)

一些概念 堆&#xff1a;特殊的完全二叉树&#xff0c;具有特定性质的完全二叉树。大根堆&#xff1a;父节点 > 子节点小根堆&#xff1a;父节点 < 子节点 二叉堆也属于完全二叉树&#xff0c;所以可以用数组表示。 若下标从1开始&#xff0c;左节点为 2*i &#xff0…

树莓派4B+Debian(Raspbian)+开机自启动Python文件

非系统全面的教程&#xff0c;只是记录操作过程中的问题和解决方案。 说明1&#xff1a;树莓派的不同版本&#xff0c;要查看CPU的位数、内存大小&#xff1b;从而确定安装的raspbian的对应版本 若是对应64位的OS&#xff0c;安装成了32位的OS&#xff0c;可能会对系统中安装…

ChatGPT助手:写作无忧

ChatGPT无限次数:点击直达 ChatGPT助手&#xff1a;写作无忧 在当今信息爆炸的时代&#xff0c;写作已经成为了各行各业不可或缺的技能。无论是学术论文、技术博客还是市场推广文案&#xff0c;文字的质量往往决定了一篇作品的成败。然而&#xff0c;对于许多人来说&#xff0…

5、JVM-G1详解

G1收集器 -XX:UseG1GC G1 (Garbage-First)是一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器. 以极高概率满足GC停顿时间要求的同时,还具备高吞吐量性能特征. G1将Java堆划分为多个大小相等的独立区域&#xff08;Region&#xff09;&#xff0c;JVM目标…

Qt中定时器的3种实现方法

一.使用QTimer定时器类&#xff08;首选&#xff09; 1.示例代码&#xff1a; MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); ui->setupUi(this); time1 new QTimer(); time1->setInterval(1000…

SQL书写顺序与执行顺序

1、书写顺序 sql语句的书写顺序: select >> from >> where >> group by >> having >> order by >> limit select [ALL | DISTINCT | DISTINCTROW | TOP] 字段 from 表 [inner join right join | left join 表2] [on 连接条件] [where …

代码学习记录25---单调栈

随想录日记part45 t i m e &#xff1a; time&#xff1a; time&#xff1a; 2024.04.17 主要内容&#xff1a;今天开始要学习单调栈的相关知识了&#xff0c;今天的内容主要涉及&#xff1a;每日温度 &#xff1b;下一个更大元素 I 739. 每日温度 496.下一个更大元素 I Topic…

pytorch中unsqueeze用法说明

在指定的位置插入一个维度&#xff0c;有两个参数&#xff0c;input是输入的tensor&#xff0c;dim是要插到的维度 需要注意的是dim的范围是[-input.dim()-1, input.dim()1)&#xff0c;是一个左闭右开的区间&#xff0c;当dim为负值时&#xff0c;会自动转换为dim diminput.…

书生·浦语大模型全链路开源体系-第4课

书生浦语大模型全链路开源体系-第4课 书生浦语大模型全链路开源体系-第4课相关资源XTuner 微调 LLMXTuner 微调小助手认知环境安装前期准备启动微调模型格式转换模型合并微调结果验证 将认知助手上传至OpenXLab将认知助手应用部署到OpenXLab使用XTuner微调多模态LLM前期准备启动…

Mac电脑上有什么好玩的格斗游戏 《真人快打1》可以在苹果电脑上玩吗

你是不是喜欢玩格斗游戏&#xff1f;你是不是想在你的Mac电脑上体验一些刺激和激烈的对战&#xff1f;在这篇文章中&#xff0c;我们将介绍Mac电脑上有什么好玩的格斗游戏&#xff0c;以及《真人快打1》可以在苹果电脑上玩吗。 一、Mac电脑上有什么好玩的格斗游戏 格斗游戏是…

HTML优化SEO

在网站开发中&#xff0c;除了关注设计和用户体验&#xff0c;SEO&#xff08;搜索引擎优化&#xff09;也是提升网站流量和可见度的关键。合理的HTML结构和元素运用能够帮助搜索引擎更好地理解页面内容&#xff0c;从而提高搜索排名。以下是一些基于HTML的SEO优化技巧&#xf…

命令模式

命令模式&#xff1a;将一个请求封装为一个对象&#xff0c;从而使你可用不同的请求对客户进行参数化&#xff1b;对请求排队或记录请求日志&#xff0c;以及支持可撤销的操作。 命令模式的好处&#xff1a; 1、它能较容易地设计一个命令队列&#xff1b; 2、在需要的情况下&a…

gpt-6有望成为通用工具

OpenAI CEO山姆奥特曼&#xff08;Sam Altman&#xff09;在最新的博客访谈中&#xff0c;提到gpt-6有望成为通用工具。 奥特曼还认为&#xff0c;目前的模型不够聪明&#xff0c;“使用GPT-2进行科学研究曾被认为是不切实际的想法。而如今&#xff0c;虽然人们使用GPT-4进行科…

获取公募基金净值【数据分析系列博文】

摘要 从指定网址获取公募基金净值数据&#xff0c;快速解析并存储数据。 &#xff08;该博文针对自由学习者获取数据&#xff1b;而在投顾、基金、证券等公司&#xff0c;通常有Wind、聚源、通联等厂商采购的数据&#xff09; 导入所需的库&#xff1a;代码导入了一些常用的库…

OpenCV从入门到精通实战(八)——基于dlib的人脸关键点定位

本文使用Python库dlib和OpenCV来实现面部特征点的检测和标注。 下面是代码的主要步骤和相关的代码片段&#xff1a; 步骤一&#xff1a;导入必要的库和设置参数 首先&#xff0c;代码导入了必要的Python库&#xff0c;并通过argparse设置了输入图像和面部标记预测器的参数。…

.NET/C#汇总 —— ADO.NET、XML、HTTP、AJAX、WebService

1. .NET和C#有什么区别? .NET⼀般指 .NET FrameWork框架,它是⼀种平台,⼀种技术。 C#是⼀种编程语⾔,可以基于.NET平台的应⽤。 2.请编程遍历⻚⾯上所有TextBox控件并给它赋值为string.Empty? foreach (System.Windows.Forms.Control control in this.Controls) {if (c…

抓取电商产品数据的方法|电商平台商品详情数据|批量上架|商品搬家|电商封装API数据采集接口更高效安全的数据采集

大量级电商数据采集时使用电商API接口有以下优势&#xff1a; 1. 数据准确性&#xff1a;通过电商API接口获取数据&#xff0c;可以保证数据的准确性和实时性&#xff0c;避免了手动采集可能出现的错误和延迟。 2. 自动化采集&#xff1a;API接口可以实现自动化的数据获取和更…