【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();
    }
 }
相关推荐
键盘鼓手苏苏13 小时前
Kubernetes与GitOps高级实践
云原生·kubernetes·k8
凌乱的豆包15 小时前
Spring Cloud Alibaba Nacos 服务注册发现和分布式配置中心
分布式
七夜zippoe15 小时前
Spring Cloud与Dubbo架构哲学对决
java·spring cloud·架构·dubbo·配置中心
zjshuster15 小时前
Dubbo 框架
dubbo
Aray123416 小时前
论Serverless架构模式及其应用实践
云原生·架构·serverless
AI攻城狮16 小时前
OpenClaw 本地内存检索与 node-llama-cpp 的依赖关系深度解析
人工智能·云原生·aigc
独隅17 小时前
PyTorch 分布式训练完整指南:策略、实现与模型选型
人工智能·pytorch·分布式
沃尔威武18 小时前
微服务架构下:如何用gRPC实现跨语言高效通信
微服务·云原生·架构
张32319 小时前
K8s 标签
云原生·容器·kubernetes
墨北小七20 小时前
小说大模型的分布式训练——张量并行架构设计与实现
分布式