Dubbo - Zookeeper

Dubbo - Zookeeper

分布式微服务
SpringBoot-狂神(20. Springboot+Dubbo+Zookeeper)学习笔记
Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。

Zookeeper ZooKeeper也可以作为注册中心

  • ZooKeeper主要服务于分布式系统,可以用ZooKeeper来做:统一配置管理、统一命名服务、分布式锁、集群管理。
  • 使用分布式系统就无法避免对节点管理的问题(需要实时感知节点的状态、对节点进行统一管理等等),而由于这些问题处理起来可能相对麻烦和提高了系统的复杂性,ZooKeeper作为一个能够通用解决这些问题的中间件就应运而生了。

图片

Dubbo是一种分布式的服务架构,用于改进 RPC远程服务呼叫机制,并提供 SOA服务管理。
SpringCloud是一组有序的框架。
Spring Boot开发的便利,使得分布式系统架构的开发变得更加简单,比如服务发现,配置中心,消息总线,负载平衡,断路器,数据监控等等。Spring并不是一个重复的过程,而是将各个公司开发的更加成熟、更加可靠的服务架构结合在一起,通过 Spring Boot的重新包装,避免了那些繁琐的设计和实现,从而为开发者提供了一系列易于理解、易于部署和维护的分布式系统开发工具箱。

Dubbo的性能更高,但是开发更难

简单使用

Springboot 最简单的整合Dubbo框架实战案例
特别提醒,这里的@Service使用的是dubbo依赖包提供的com.alibaba.dubbo.config.annotation.Service

在项目启动类需要开启dubbo自动配置注解,@EnableDubboConfiguration:

测试Demo

  • zookeeper的默认端口号为:2181 即注册中心的端口号
    • zookeeper:服务注册与发现
  • Dubbo的默认端口号为:20880 即一个管理注册中心的容器
    • 它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
  1. 导入Dubbo和zookeeper的Maven依赖

  2. 配置文件配置Dubbo相关配置

    • 提供者provider-server

    • #服务应用名字
      dubbo.application.name=provider-server
      #注册中心地址
      dubbo.registry.address=zookeeper://127.0.0.1:2181
      #哪些服务要被注册 有@DubboService注解的
      dubbo.scan.base-packages=com.mao.service
      
    • 在被扫描的包下的Bean(也就是想要注册的服务上)上使用 @DubboService + Spring的@Service 注解

      @DubboService  //可以被扫描到,在项目已启动就自动注册到注册中心
      @Service
      public class TicketserviceImpl implements Ticketservice {
          @Override
          public string getTicket() i
          return "《毛毛学Java》";
          }
      }
      
    • 消费者customer-server

    • #服务应用名字
      dubbo.application.name=customer-server
      #注册中心地址 127.0.0.1:2181 可以是任何一个电脑的zookeeper端口
      dubbo.registry.address=zookeeper://127.0.0.1:2181
      
      • 使用@DubboReference引入服务接口(前提是消费者的接口位置要跟提供者的接口位置相同)
      @Service
      public class CustomerService {
          //想拿到provider-server提供的票,要去注册中心拿到服务
          @DubboReference //引用, Pom坐标,可以定义路径相同的接口名
          Ticketservice ticketService;
      
      	 public void buyTicket(){
              string ticket= ticketservice.getTicket();
          }
      }
      
  3. 运行SpringApplication

    • 运行zookeeper服务
    • 运行dubbo-admin服务(监控中心)
      1. 访问 localhost:7001 (他是一个管理注册中心服务的一个可视化web界面)

Dubbo+ZooKeeper 经典面试题

1.dubbo的工作流程

provider向注册中心去注册自己为一个服务
consumer去注册中心订阅服务,注册中心会通知consumer注册好的服务,consumer会将provider的地址等信息拉取到本地缓存
consumer去调用provider
consumer和provider都异步的通知监控中心

2.Dubbo的通信原理

Dubbo底层使用 hessain2进行二进制序列化进行远程调用
Dubbo底层使用 netty框架进行异步通信。NIO

3.dubbo负载均衡策略有哪些?

random loadbalance
默认情况下,dubbo是random loadbalance随机调用实现负载均衡,可以对provider不同实例设置不同的权重,会按照权重来负载均衡,权重大分配的流量高
roundrobin loadbalance
默认就是均匀地将流量达到各个机器上,值得注意的是,要根据机器的性能,调整权重。
leastactive loadbalance
dubbo自动感知,如果某个机器性能越差,那么接收的请求就越少,给不活跃的机器更少的请求
consistanthash loadbalance
一致性hash算法,相同参数的请求一定分发到同一个provider上,provider挂掉的时候,会基于虚拟机节点均匀分配甚于的流量,抖动不会太大.适用于订单,同一个订单的操作,分配到同一个机器上,这样就可以避免高并发场景下,数据库和缓存中数据不一致的情况
3.zookeeper注册中心挂了,dubbo可以继续使用吗?

可以,因为刚开始dubbo初始化的时候,消费者会将提供者的地址等信息缓存到dubbo,注册中心挂了dubbo可以继续通信

4.zookeeper 都有哪些功能?

集群管理:监控节点存活状态、运行请求等。
主节点选举:主节点挂掉了之后可以从备用的节点开始新一轮选主,主节点选举说的就是这个选举的过程,使用 zookeeper 可以协助完成这个过程。
分布式锁:zookeeper 提供两种锁:独占锁、共享锁。独占锁即一次只能有一个线程使用资源,共享锁是读锁共享,读写互斥,即可以有多线线程同时读同一个资源,如果要使用写锁也只能有一个线程使用。zookeeper可以对分布式锁进行控制。
命名服务:在分布式系统中,通过使用命名服务,客户端应用能够根据指定名字来获取资源或服务的地址,提供者等信息。

5.Zookeeper的watch机制(通知机制)

Zookeeper系统中其实类似于window系统中的文件夹,zookeeper可以建立普通节点和临时节点,但是每个节点只能有一个,例如:/a/b/c节点已经存在,那么再来申请/a/b/c的节点就会失败。此时可以设置watch此节点,当/a/b/c节点删除后,会通知watch此节点的所有线程,线程再来创建节点,完成设定的任务。(分布式锁,高可用性)

6.zookeeper 怎么保证主从节点的状态同步?

zookeeper 的核心是原子广播,这个机制保证了各个 server 之间的同步。实现这个机制的协议叫做 zab 协议。 zab 协议有两种模式,分别是恢复模式(选主)和广播模式(同步)。当服务启动或者在领导者崩溃后,zab 就进入了恢复模式,当领导者被选举出来,且大多数 server 完成了和 leader 的状态同步以后,恢复模式就结束了。状态同步保证了 leader 和 server 具有相同的系统状态。

7.什么是 zab 协议

ZAB 是 Zookeeper 原子广播协议的简称

整个ZAB协议主要包括消息广播和崩溃恢复两个过程,进一步可以分为三个阶段,分别是:

发现 Discovery
同步 Synchronization
广播 Broadcast

组成ZAB协议的每一个分布式进程,都会循环执行这三个阶段,将这样一个循环称为一个主进程周期。

8.如果zookeeper服务挂了怎么办?

注册中心对等集群,任意一台宕掉后,会自动切换到另一台

注册中心全部宕掉,服务提供者和消费者仍可以通过本地缓存通讯

服务提供者无状态,任一台宕机后,不影响使用

服务提供者全部宕机,服务消费者会无法使用,并无限次重连等待服务者恢复

posted @ 2023-01-29 16:56  没有烦恼的猫猫  阅读(189)  评论(0编辑  收藏  举报