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 即一个管理注册中心的容器
- 它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
-
导入Dubbo和zookeeper的Maven依赖
-
配置文件配置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(); } }
-
-
运行SpringApplication
- 运行zookeeper服务
- 运行dubbo-admin服务(监控中心)
- 访问 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服务挂了怎么办?
注册中心对等集群,任意一台宕掉后,会自动切换到另一台
注册中心全部宕掉,服务提供者和消费者仍可以通过本地缓存通讯
服务提供者无状态,任一台宕机后,不影响使用
服务提供者全部宕机,服务消费者会无法使用,并无限次重连等待服务者恢复
本文来自博客园,作者:没有烦恼的猫猫,转载请注明原文链接:https://www.cnblogs.com/maomao777/p/17073176.html