| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> Java-SpringBoot:SpringBoot+Dubbo+Zookeeper -> 正文阅读 |
|
[Java知识库]Java-SpringBoot:SpringBoot+Dubbo+Zookeeper |
学习视频:B站 狂神说Java – https://www.bilibili.com/video/BV1PE411i7CV SpringBoot 官方文档链接 – https://docs.spring.io/spring-boot/docs/2.2.5.RELEASE/reference/htmlsingle/#appendix Dubbo官方连接-- https://dubbo.apache.org/zh/ Dubbo的官方文档连接: zookeeper官方链接-- https://dubbo.apache.org/zh/docs/v2.7/user/references/registry/zookeeper/ 分布式系统什么是分布式系统?在《分布式系统原理与范型》一书中有如下定义:“分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像单个相关系统”; 分布式系统是由一组通过网络进行通信、为了完成共同的任务而协调工作的计算机节点组成的系统。分布式系统的出现是为了用廉价的、普通的机器完成单个计算机无法完成的计算、存储任务。其目的是利用更多的机器,处理更多的数据。 分布式系统(distributed system)是建立在网络之上的软件系统。 首先需要明确的是,只有当单个节点的处理能力无法满足日益增长的计算、存储任务的时候,且硬件的提升(加内存、加磁盘、使用更好的CPU)高昂到得不偿失的时候,应用程序也不能进一步优化的时候,我们才需要考虑分布式系统。因为,分布式系统要解决的问题本身就是和单机系统一样的,而由于分布式系统多节点、通过网络通信的拓扑结构,会引入很多单机系统没有的问题,为了解决这些问题又会引入更多的机制、协议,带来更多的问题。。。 例如:假设百度、淘宝系统,它们有100个服务器。这些服务器会完成各自特定的功能。在原来的情况下,每个机器 都能完成一个完整的下单、出货、结账的功能。当业务量猛增/数据量海量上升的时候,增加服务器去完成这个功能(某些服务器处理下单、一些服务器处理库存、另一些服务器处理账单)。那么此时就要去考虑,如何调用其中的某台服务器去执行完成特定任务呢?它们之间的通信连接是如何进行的? 分布式:将一个大的系统划分为多个业务模块,业务模块分别部署到不同的机器上,各个业务模块之间通过接口进行数据交互。 分布式、集群两者之间的区别:
分布式系统、微服务架构之间的区别:
分布式理论CAP 原理C:Consistency 即一致性,访问所有的节点得到的数据应该是一样的。注意,这里的一致性指的是强一致性,也就是数据更新完,访问任何节点看到的数据完全一致,要和弱一致性,最终一致性区分开来。 **A:Availability 即可用性,所有的节点都保持高可用性。**注意,这里的高可用还包括不能出现延迟,比如:如果节点B由于等待数据同步而阻塞请求,那么节点 B 就不满足高可用性。也就是说,任何没有发生故障的服务必须在有限的时间内返回合理的结果集。 **P:Partiton tolerence 即分区容忍性,这里的分区是指网络意义上的分区。**由于网络是不可靠的,所有节点之间很可能出现无法通讯的情况,在节点不能通信时,要保证系统可以继续正常服务。 CAP 原理说:一个数据分布式系统不可能同时满足 C 和 A 和 P 这3个条件。所以系统架构师在设计系统时,不要将精力浪费在如何设计能满足三者的完美分布式系统,而是应该进行取舍。由于网络的不可靠性质,大多数开源的分布式系统都会实现 P,也就是分区容忍性,之后在 C 和 A 中做抉择。 CAP 理论告诉我们一个悲惨但不得不接受的事实——我们只能在 C、A、P 中选择两个条件。而对于业务系统而言,我们**往往选择牺牲一致性来换取系统的可用性和分区容错性。**不过这里要指出的是,所谓的“牺牲一致性”并不是完全放弃数据一致性,而是牺牲强一致性换取弱一致性。 DubboDubbo简介Dubbo的官网链接:https://dubbo.apache.org/zh/ Apache Dubbo 是一款高性能、轻量级的开源 Java 服务框架。Apache Dubbo |?d?b??| 提供了六大核心能力:
随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,急需一个治理系统确保架构有条不紊的演进。在Dubbo官方文档中,关于应用架构的演变图: 系统应用架构单一应用架构原来的单一应用架构:当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。此时,用于简化增删改查工作量的数据访问框架(ORM)是关键。 单一应用架构适用于小型网站,小型管理系统,将所有功能都部署到一个功能里,简单易用。 缺点: 1、性能扩展比较难 2、协同开发问题 3、不利于升级维护 垂直应用架构当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,将应用拆成互不相干的几个应用,以提升效率。此时,用于加速前端页面开发的Web框架(MVC)是关键。 通过切分业务来实现各个模块独立部署,降低了维护和部署的难度,团队各司其职更易管理,性能扩展也更方便,更有针对性。 缺点:公用模块无法重复利用,开发性的浪费 分布式服务架构当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。此时,用于提高业务复用及整合的**分布式服务框架(RPC)**是关键。 流动计算架构当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。此时,用于提高机器利用率的资源调度和治理中心(SOA)[ Service Oriented Architecture]是关键。 Dubbo要解决的问题/为什么要用Dubbo?在分布式系统中,系统被拆分为了不同的服务,每个服务器去负责提供整个业务系统的某项核心任务。这种分布式架构能够利用多台服务器去减轻单个服务器的负载,提高了系统的并发量和性能。比如电商系统可以简单地拆分成订单系统、商品系统、登录系统等等,拆分之后的每个服务可以部署在不同的机器上,如果某一个服务的访问量比较大的话也可以将这个服务同时部署在多台机器上。 当一个系统被划分到不同服务器上的服务时,在要完成整个服务功能的时候,就需要这些服务之间相互联系 通信连接 去协作完成任务。 我们可以使用 Java RMI(Java Remote Method Invocation)、Hessian这种支持远程调用的框架来简单地暴露和引用远程服务。但是!当服务越来越多之后,服务调用关系越来越复杂。当应用访问压力越来越大后,负载均衡以及服务监控的需求也迫在眉睫。我们可以用 F5 这类硬件来做负载均衡,但这样增加了成本,并且存在单点故障的风险。 不过,Dubbo 的出现让上述问题得到了解决。Dubbo 帮助我们解决了什么问题呢?
另外,Dubbo 除了能够应用在分布式系统中,也可以应用在现在比较火的微服务系统中。不过,由于 Spring Cloud 在微服务中应用更加广泛,所以,我觉得一般我们提 Dubbo 的话,大部分是分布式系统的情况。 RPC基础什么是RPC?链接:https://www.jianshu.com/p/2accc2840a1b RPC(Remote Procedure Call) 即远程过程调用。
两个不同的服务器上的服务提供的方法不在一个内存空间,所以,需要通过网络编程才能传递方法调用所需要的参数。并且,方法调用的结果也需要通过网络编程来接收。 在实现这个过程调用中,我们需要考虑:考虑底层传输方式(TCP还是UDP)、序列化方式等等方面。 通过 RPC 可以帮助我们调用远程计算机上某个服务的方法,这个过程就像调用本地方法一样简单。并且!我们不需要了解底层网络编程的具体细节。 总结一下,RPC要解决的两个问题:
实际情况下,RPC很少用到http协议来进行数据传输,毕竟我只是想传输一下数据而已,何必动用到一个文本传输的应用层协议呢,我为什么不直接使用二进制传输?比如直接用Java的Socket协议进行传输? RPC基本原理RPC框架基本示意图: RPC的步骤解析:
RPC两个核心模块:通讯、序列化
HTTP :SpringCloud(生态)中使用通信的方式 Netty:30天~ Dubbo~18年重启! Dubbo 3.x RPC Error Exception Dubbo主要用来做RPC。 专业的事,交给专业的人来做~ Dubbo 架构Dubbo 架构中的核心角色有哪些?官方文档中的框架设计章节 已经介绍的非常详细了,我这里把一些比较重要的点再提一下。 上述节点简单介绍以及他们之间的关系:
服务提供者(Provider):暴露服务的服务提供方,服务提供者在启动时,向注册中心注册自己提供的服务。 服务消费者(Consumer):调用远程服务的服务消费方,服务消费者在启动时,向注册中心订阅自己所需的服务,服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。 注册中心(Registry):注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者 监控中心(Monitor):服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心 调用关系说明 l 服务容器负责启动,加载,运行服务提供者。 l 服务提供者在启动时,向注册中心注册自己提供的服务。 l 服务消费者在启动时,向注册中心订阅自己所需的服务。 l 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。 l 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。 l 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。 Dubbo 中的 Invoker 概念了解么?
简单来说, 按照 Dubbo 官方的话来说,
假如我们需要调用一个远程方法,我们需要动态代理来屏蔽远程调用的细节吧!我们屏蔽掉的这些细节就依赖对应的 Dubbo 的工作原理了解么?下图是 Dubbo 的整体设计,从下至上分为十层,各层均为单向依赖。
Dubbo环境搭建Zookeeperzookeeper官方链接:https://dubbo.apache.org/zh/docs/v2.7/user/references/registry/zookeeper/ 在apache中有zookeeper的下载链接:https://zookeeper.apache.org/releases.html 在使用的时候添加关于 zookeeper的客户端 jar 依赖:
zookeeper下载和安装教程(for windows)链接:https://blog.csdn.net/zlbdmm/article/details/109669049 Zookeeper安装1、下载zookeeper :地址https://zookeeper.apache.org/releases.html, 我们下载3.4.14 , 最新版!解压zookeeper 2、运行/bin/zkServer.cmd ,初次运行会报错,没有zoo.cfg配置文件; 可能遇到问题:闪退 ! 解决方案:编辑zkServer.cmd文件末尾添加pause 。这样运行出错就不会退出,会提示错误信息,方便找到原因。 运行 zkServer.cmd文件,提示错误。错误:
这提示我们的 conf 配置文件夹中缺失 zoo.cfg 。然后我们将conf文件中的 zoo_sample.cfg 复制,并粘贴到该文件夹下,名字改为:zoo.cfg。
这时候发现还是不对,虽然不闪退了。 但是错误提示的是: 找不到或无法加载主类 org.apache.zookeeper.server.quorum.QuorumPeerMain 原因是:【解决该问题的博客:https://blog.csdn.net/yemuyouhan/article/details/106959830】 也就是下载的是未编译的 jar 包。 我重新去下载了 *.bin.tar.gz的 编译的jar包进行解压安装。然后重新去进行复制创建 zoo.cfg文件,管理员身份启动运行 zkServer.cmd 文件。 运行结果如下所示, 表示成功 zookeeper简单操作使用客户端连接 zookeeper:
打开运行结果: 在客户端使用ls命令来查看当前Zookeeper中所包含的内容:
创建一个新的znode节点“zk"以及与它关联的字符串:
获取znode节点‘zk’
删除znode节点"zk"
退出 zookeeper客户端:
Windowns下安装dubbo-admindubbo本身并不是一个服务软件。它其实就是一个jar包,能够帮你的java程序连接到zookeeper,并利用zookeeper消费、提供服务。 但是为了让用户更好的管理监控众多的dubbo服务,官方提供了一个可视化的监控程序dubbo-admin,不过这个监控即使不装也不影响使用。 我们这里来安装一下: 1、下载dubbo-admin 地址 :https://github.com/apache/dubbo-admin/tree/master 2、解压进入目录 修改 dubbo-admin\src\main\resources \application.properties 指定zookeeper地址。我们找到 application.properties 配置文件: application.properties:
在application.properties 资源配置文件中:
在该资源配置文件中添加 zookeeper的port信息、dubbo-admin的服务port信息等:
3、在我们的项目目录下打包dubbo-admin
第一次打包的过程有点慢,需要耐心等待!直到成功! 可能由于我是对整个 dubbo-admin-master 文件夹进行了打包,所以打包的时间有点长。 在dubbo-admin-server 以及 dubbo-admin-test 这两个文件夹下都有 target,即打包好的 jar包。 【我前面是在 dubbo-admin-server中的资源配置文件中修改的端口号 7001,所以运行这个文件夹下的 jar 包】 4、执行 dubbo-admin\target 路径下打包好的 jar 包
【注意:zookeeper的服务一定要打开!】 执行完毕,我们去访问一下 Dubbo Admin ,url路径:http://localhost:7001/ 这时候我们需要输入登录账户和密码,我们都是默认的root-root; 在前面的 application.properties 中的定义账户和密码:
登录成功后,查看界面: 安装完成! SpringBoot + Dubbo + zookeeper:服务注册实战在前面已经完成了Zookeeper 的安装,以及 dubbo-admin的可视化监控程序来查看服务。 在这里,SpringBoot整合Dubbo+Zookeeper 去实现 服务注册、服务发现。 环境搭建启动zookeeper !!! 创建一个空的项目:dubbo+zookeeper。 服务端:提供服务新建一个模块 module,选择SpringBoot创建。依赖选择spring web。 provider-server模块:【关于买票的服务】
TicketService:
TicketServiceImpl:
服务消费者:获取服务消费在这里同样创建一个模块 module。选择SpringBoot创建,依赖选择spring web。 consumer-server模块:
UserService:
系统的需求:现在用户想要去使用买票的服务,如何去获取呢?因为这属于两个微服务 SpringBoot项目。
服务消费者消费服务提供者的服务:Dubbo+Zookeeper为了便于去接收,那么在 application.properties 配置文件中关于 port:
服务提供者将服务提供者注册到注册中心,我们需要整合Dubbo和zookeeper,所以需要导包。我们从dubbo官网进入github,看下方的帮助文档,找到dubbo-springboot,找到依赖包。
导入依赖:dubbo+zookeeper
在springboot配置文件中配置dubbo相关属性。配置文件application.properties:
在service的实现类中配置服务注解,发布服务!
TicketServiceImpl:
实现的逻辑:在项目启动之后,会去扫描指定的包下带有@Component注解的服务,对于@Service注解的服务,将它发布在指定的注册中心。 服务消费者消费者如何进行消费呢?
关于pom.xml中的maven依赖:和服务提供者一样
配置参数: ? 在springboot配置文件中配置dubbo相关属性。配置文件application.properties:
远程注入服务:
在这个service层中也创建一个 TicketService:
完善消费者的服务类 service类: UserService:
测试: 在服务消费者/客户端这里编写测试类,测试看能否获取服务进行消费。
启动项目进行测试:
错误提示: 在启动服务提供者服务的时候,一直报错:
错误信息提示的是没有找到这个定义的类: org/apache/curator/x/discovery/ 。但在我前面的依赖中已经导入了 curator的相关依赖:curator-framework、curator-recipes
此时还需要再导入这个关于 curator的maven依赖:curator-x-discovery
同样的,我们在服务提供者模块中的pom.xml配置信息中也添加关于 curator-x-discovery 这个curator的maven依赖。 此时再重新启动 provider-server 服务提供者主程序,启动consumer-server服务消费者的测试类,查看结果。可以看到在控制台输出:
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 21:41:51- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |