【Dubbo+Zookeeper】——SpringBoot+Dubbo+Zookeeper知识整合

🎼个人主页:【Y小夜】

😎作者简介:一位双非学校的大二学生,编程爱好者,

专注于基础和实战分享,欢迎私信咨询!

🎆入门专栏:🎇【 MySQLJava基础Rust

🎈热门专栏:🎊【 PythonJavawebVue框架

++感谢您的点赞、关注、评论、收藏、是对我最大的认可和支持!❤️++

目录

🎯分布式理论

🎃分布式系统

🎃Dubbo框架

🎃单一应用架构

🎃垂直应用架构

🎃分布式服务架构

🎃流动计算架构

🎯什么是RPC?

🎃RPC基本原理

🎯Dubbo

🎃什么是dubbo?

✨dubbo基本概念

✨调用关系说明

🎃window下安装zookeeper

[🎯SpringBoot + Dubbo + zookeeper](#🎯SpringBoot + Dubbo + zookeeper)

🎃框架搭建

🎃服务提供者

🎃消费者

[5. 测试类编写;](#5. 测试类编写;)


🎯分布式理论

🎃分布式系统

"分布式系统是若干独立计算机的集合,这些计算机对 于用户来说就像单个相关系统"

分布式系统(distributed system)是建立在网络之上的软件系统。

首先需要明确的是,只有当单个节点的处理能力无法满足日益增长的计算、存储任务的时候,且硬件的 提升(加内存、加磁盘、使用更好的CPU)高昂到得不偿失的时候,应用程序也不能进一步优化的时 候,我们才需要考虑分布式系统。因为,分布式系统要解决的问题本身就是和单机系统一样的,而由于 分布式系统多节点、通过网络通信的拓扑结构,会引入很多单机系统没有的问题,为了解决这些问题又 会引入更多的机制、协议,带来更多的问题。

🎃Dubbo框架

随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及 流动计算架构势在必行,急需一个治理系统确保架构有条不紊的演进。

🎃单一应用架构

当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。此时,用于简化增删改查工作量的数据访问框架(ORM)是关键。

适用于小型网站,小型管理系统,将所有功能都部署到一个功能里,简单易用。

缺点:

  • 1、性能扩展比较难
  • 2、协同开发问题
  • 3、不利于升级维护

🎃垂直应用架构

当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,将应用拆成互不相干的几个应用,以提 升效率。此时,用于加速前端页面开发的Web框架(MVC)是关键

通过切分业务来实现各个模块独立部署,降低了维护和部署的难度,团队各司其职更易管理,性能扩展 也更方便,更有针对性。

缺点: 公用模块无法重复利用,开发性的浪费

🎃分布式服务架构

当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定 的服务中心,使前端应用能更快速的响应多变的市场需求。此时,用于提高业务复用及整合的**分布式服务框架(RPC)**是关键。

🎃流动计算架构

当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问 压力实时管理集群容量,提高集群利用率。此时,用于**提高机器利用率的资源调度和治理中心**(**SOA)[ Service Oriented Architecture]是关键**

🎯什么是RPC?

RPC【Remote Procedure Call】是指远程过程调用,是一种进程间通信方式,他是一种技术的思想,而 不是规范。它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数,而不用 程序员显式编码这个远程调用的细节。即程序员无论是调用本地的还是远程的函数,本质上编写的调用 代码基本相同。

也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由 于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。为什么要用 RPC呢?就是无法在一个进程内,甚至一个计算机内通过本地调用的方式完成的需求,比如不同的系统 间的通讯,甚至不同的组织间的通讯,由于计算能力需要横向扩展,需要在多台机器组成的集群上部署 应用。RPC就是要像调用本地的函数一样去调远程函数;

🎃RPC基本原理

🎯Dubbo

🎃什么是dubbo?

Apache Dubbo |ˈdʌbəʊ| 是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向 接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现

✨dubbo基本概念

服务提供者**(Provider)**:暴露服务的服务提供方,服务提供者在启动时,向注册中心注册自己提 供的服务。

服务消费者**(Consumer)**: 调用远程服务的服务消费方,服务消费者在启动时,向注册中心订阅自 己所需的服务,服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如 果调用失败,再选另一台调用。

注册中心**(Registry)**:注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基 于长连接推送变更数据给消费者

**监控中心**(Monitor)**:**服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发 送一次统计数据到监控中

✨调用关系说明

l 服务容器负责启动,加载,运行服务提供者。 l 服务提供者在启动时,向注册中心注册自己提供的服务。

l 服务消费者在启动时,向注册中心订阅自己所需的服务。

l 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费 者。

l 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再 选另一台调用。

l 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

🎃window下安装zookeeper

1、下载zookeeper ;

2、运行/bin/zkServer.cmd ,初次运行会报错,没有zoo.cfg配置文件;

可能遇到问题:闪退 !

解决方案:编辑zkServer.cmd文件末尾添加 pause 。这样运行出错就不会退出,会提示错误信息, 方便找到原因

3、修改zoo.cfg配置文件 将conf文件夹下面的zoo_sample.cfg复制一份改名为zoo.cfg即可

注意几个重要位置: dataDir=./ 临时数据存储的目录(可写相对路径) clientPort=2181 zookeeper的端口号 修改完成后再次启动zookeeper

4、使用zkCli.cmd测试 ls /:列出zookeeper根下保存的所有节点

[zk: 127.0.0.1:2181(CONNECTED) 4] ls /
 [zookeeper]

create --e /kuangshen 123:创建一个kuangshen节点,值为123

get /kuangshen:获取/kuangshen节点的值

再来查看一下节点

🎯SpringBoot + Dubbo + zookeeper

🎃框架搭建

1. 启动zookeeper !

2. IDEA创建一个空项目;

3.创建一个模块,实现服务提供者:provider-server , 选择web依赖即可

4.项目创建完毕,我们写一个服务,比如卖票的服务;

5.创建一个模块,实现服务消费者:consumer-server , 选择web依赖即可

6.项目创建完毕,我们写一个服务,比如用户的服务;

🎃服务提供者

1、将服务提供者注册到注册中心,我们需要整合Dubbo和zookeeper,所以需要导包 我们从dubbo官网进入github,看下方的帮助文档,找到dubbo-springboot,找到依赖包

XML 复制代码
<!-- Dubbo Spring Boot Starter -->
 <dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo-spring-boot-starter</artifactId>
    <version>2.7.3</version>
 </dependency>    

2、在springboot配置文件中配置dubbo相关属性

XML 复制代码
#当前应用名字
dubbo.application.name=provider-server
 #注册中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
 #扫描指定包下服务
dubbo.scan.base-packages=com.kuang.provider.service

3.在service的实现类中配置服务注解,发布服务!注意导包问题

java 复制代码
import org.apache.dubbo.config.annotation.Service;
 import org.springframework.stereotype.Component;
 @Service //将服务发布出去
@Component //放在容器中
public class TicketServiceImpl implements TicketService {
    @Override
    public String getTicket() {
        return "aaqa";
    }
 }

🎃消费者

1、导入依赖,和之前的依赖一样;

配置参数

java 复制代码
#当前应用名字
dubbo.application.name=consumer-server
 #注册中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
  1. 本来正常步骤是需要将服务提供者的接口打包,然后用pom文件导入,我们这里使用简单的方式,直 接将服务的接口拿过来,路径必须保证正确,即和服务提供者相同;

4.完善消费者的服务类

java 复制代码
package com.kuang.consumer.service;
 import com.kuang.provider.service.TicketService;
 import org.apache.dubbo.config.annotation.Reference;
 import org.springframework.stereotype.Service;
 @Service //注入到容器中
public class UserService {
    @Reference //远程引用指定的服务,他会按照全类名进行匹配,看谁给注册中心注册了这个全
类名
    TicketService ticketService;
    public void bugTicket(){
        String ticket = ticketService.getTicket();
        System.out.println("在注册中心买到"+ticket);
    }
 }

5. 测试类编写;

java 复制代码
@RunWith(SpringRunner.class)
 @SpringBootTest
 public class ConsumerServerApplicationTests {
    @Autowired
    UserService userService;
    @Test
    public void contextLoads() {
        userService.bugTicket();
    }
 }
相关推荐
解决方案工程师1 分钟前
【Kafka】Kafka高性能解读
分布式·kafka
yellowatumn4 分钟前
RocketMq\Kafka如何保障消息不丢失?
分布式·kafka·rocketmq
python资深爱好者24 分钟前
什么容错性以及Spark Streaming如何保证容错性
大数据·分布式·spark
HeartRaindj2 小时前
【中间件开发】kafka使用场景与设计原理
分布式·中间件·kafka
ITPUB-微风3 小时前
网易严选DevOps实践:从传统到云原生的演进
运维·云原生·devops
桂月二二3 小时前
基于eBPF的全栈可观测性系统:重新定义云原生环境诊断范式
云原生
明达技术3 小时前
探索分布式 IO 模块网络适配器
分布式
ITPUB-微风4 小时前
云原生数据抽象与弹性加速:Fluid开源系统的技术解析
云原生·开源
爬山算法4 小时前
Zookeeper(58)如何在Zookeeper中实现分布式锁?
分布式·zookeeper·云原生
明明跟你说过6 小时前
【Kubernetes】常用命令全解析:从入门到实战(下)
运维·云原生·容器·kubernetes·k8s