05-Zookeeper典型使用场景实战

上一篇:04-Zookeeper集群详解

1. Zookeeper 分布式锁加锁原理

在这里插入图片描述

如上实现方式在并发问题比较严重的情况下,性能会下降的比较厉害,主要原因是,所有的连接都在对同一个节点进行监听,当服务器检测到删除事件时,要通知所有的连接,所有的连接同时收到事件,再次并发竞争,这就是羊群效应。这种加锁方式是非公平锁的具体实现:如何避免呢,我们看下面这种方式。

在这里插入图片描述

如上借助于临时顺序节点,可以避免同时多个节点的并发竞争锁,缓解了服务端压力。这种实现方式所有加锁请求都进行排队加锁,是公平锁的具体实现。

前面这两种加锁方式有一个共同的特质,就是都是互斥锁,同一时间只能有一个请求占用,如果是大量的并发上来,性能是会急剧下降的,所有的请求都得加锁,那是不是真的所有的请求都需要加锁呢?答案是否定的,比如如果数据没有进行任何修改的话,是不需要加锁的,但是如果读数据的请求还没读完,这个时候来了一个写请求,怎么办呢?有人已经在读数据了,这个时候是不能写数据的,不然数据就不正确了。直到前面读锁全部释放掉以后,写请求才能执行,所以需要给这个读请求加一个标识(读锁),让写请求知道,这个时候是不能修改数据的。不然数据就不一致了。如果已经有人在写数据了,再来一个请求写数据,也是不允许的,这样也会导致数据的不一致,所以所有的写请求,都需要加一个写锁,是为了避免同时对共享数据进行写操作。

举个例子

1、读写并发不一致

在这里插入图片描述

2、双写不一致情况
在这里插入图片描述

Zookeeper 共享锁实现原理
在这里插入图片描述

2. 注册中心实战

注册中心场景分析:

  1. 在分布式服务体系结构比较简单的场景下,我们的服务可能是这样的
    在这里插入图片描述

现在 Order-Service 需要调用外部服务的 User-Service ,对于外部的服务依赖,我们直接配置在我们的服务配置文件中,在服务调用关系比较简单的场景,是完全OK的。随着服务的扩张,User-Service 可能需要进行集群部署,如下:
在这里插入图片描述

如果系统的调用不是很复杂,可以通过配置管理,然后实现一个简单的客户端负载均衡也是OK的,但是随着业务的发展,服务模块进行更加细粒度的划分,业务也变得更加复杂,再使用简单的配置文件管理,将变得难以维护。当然我们可以再前面加一个服务代理,比如nginx做反向代理, 如下
在这里插入图片描述
如果我们是如下场景呢?
在这里插入图片描述

服务不再是A-B,B-C 那么简单,而是错综复杂的微小服务的调用

这个时候我们可以借助于Zookeeper的基本特性来实现一个注册中心,什么是注册中心,顾名思义,就是让众多的服务,都在Zookeeper中进行注册,啥是注册,注册就是把自己的一些服务信息,比如IP,端口,还有一些更加具体的服务信息,都写到 Zookeeper节点上, 这样有需要的服务就可以直接从zookeeper上面去拿,怎么拿呢? 这时我们可以定义统一的名称,比如,User-Service, 那所有的用户服务在启动的时候,都在User-Service 这个节点下面创建一个子节点(临时节点),这个子节点保持唯一就好,代表了每个服务实例的唯一标识,有依赖用户服务的比如Order-Service 就可以通过User-Service 这个父节点,就能获取所有的User-Service 子节点,并且获取所有的子节点信息(IP,端口等信息),拿到子节点的数据后Order-Service可以对其进行缓存,然后实现一个客户端的负载均衡,同时还可以对这个User-Service 目录进行监听, 这样有新的节点加入,或者退出,Order-Service都能收到通知,这样Order-Service重新获取所有子节点,且进行数据更新。这个用户服务的子节点的类型为临时节点。 第一节课有讲过,Zookeeper中临时节点生命周期是和SESSION绑定的,如果SESSION超时了,对应的节点会被删除,被删除时,Zookeeper 会通知对该节点父节点进行监听的客户端, 这样对应的客户端又可以刷新本地缓存了。当有新服务加入时,同样也会通知对应的客户端,刷新本地缓存,要达到这个目标需要客户端重复的注册对父节点的监听。这样就实现了服务的自动注册和自动退出。
在这里插入图片描述

Spring Cloud 生态也提供了Zookeeper注册中心的实现,这个项目叫 Spring Cloud Zookeeper 下面我们来进行实战。

项目说明:
为了简化需求,我们以两个服务来进行讲解,实际使用时可以举一反三
user-center : 用户服务
product-center: 产品服务

用户调用产品服务,且实现客户端的负载均衡,产品服务自动加入集群,自动退出服务。

3. 项目构建

  1. 创建user-center 项目
    在这里插入图片描述

同样的方式创建一个 product-center

  1. 解压项目用idea打开,用maven导入项目
    在这里插入图片描述

同样的方式引入product-center 项目

  1. 配置zookeeper
    user-center 服务:
    application.properties
spring.application.name=user-center
#zookeeper 连接地址 , 
#如果使用了 spring cloud zookeeper config这个配置应该配置在 bootstrap.yml/bootstrap.properties中
spring.cloud.zookeeper.connect-string=192.168.109.200:2181
#将本服务注册到zookeeper,如果不希望自己被发现可以配置为false, 默认为 true 
spring.cloud.zookeeper.discovery.register=true

代码编写:
配置 Resttemplate 支持负载均衡方式

@SpringBootApplication
public class UserCenterApplication {public static void main(String[] args) {SpringApplication.run(UserCenterApplication.class, args);}@Bean@LoadBalancedpublic RestTemplate restTemplate(){return new RestTemplate();}
}

编写测试类:
TestController, Spring Cloud 支持 Feign, Spring RestTemplate,WebClient 以 逻辑名称,替代具体url的形式访问。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;@RestController
public class TestController {@Autowiredprivate RestTemplate restTemplate;@GetMapping("/test")public String test(){return this.restTemplate.getForObject( "http://product-center/getInfo" ,String.class);}
}

product-center 服务:
application.properties

spring.application.name=user-center
#zookeeper 连接地址
spring.cloud.zookeeper.connect-string=192.168.109.200:2181
#将本服务注册到zookeeper
spring.cloud.zookeeper.discovery.register=true

主类,接收一个getInfo 请求

@SpringBootApplication
@RestController
public class ProductCenterApplication {@Value("${server.port}")private String port;@Value( "${spring.application.name}" )private String name;@GetMapping("/getInfo")public String getServerPortAndName(){return  this.name +" : "+ this.port;}public static void main(String[] args) {SpringApplication.run(ProductCenterApplication.class, args);}}

启动两个product-center 实例

通过idea 配置,启动多个实例,用端口区分不同的应用
在这里插入图片描述
在这里插入图片描述

启动一个user-center 实例,默认8080端口
在这里插入图片描述

启动服务 :访问 http://localhost:8080/test
在这里插入图片描述
已经实现了,服务端的自动发现和客户端负载均衡。

停掉product-center: 10002,再次访问

在这里插入图片描述

一定的超时时间过去之后,product-center: 10002 会从zookeeper中剔除,zookeeper会通知客户端,进行本地缓存刷新,再次访问, 已经实现了失效节点的自动退出。
在这里插入图片描述


下一篇:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/143482.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

gym_unity学习笔记

最近学了一段时间gym_unity,把一些资料留在这里 实例 实例gym_unity训练RollerBall:https://blog.csdn.net/alibutter/article/details/120908687实例gyn_unity训练3DBall:https://zhuanlan.zhihu.com/p/554927641?utm_id0 源码&#xff1…

Linux部署elk日志监控系统

目录 一、简介 二、部署elasticsearch 2.1 安装jdk11(jdk版本>11) 2.2 下载安装包 2.3 授权elk用户 2.4 配置elasticsearch.yml 2.5 启动elasticsearch 三、部署logstash 3.1 启动测试 3.2 可能出现的报错 3.3 指定配置文件启动logstash 3.4 安装El…

DevExpress WinForms图表组件 - 直观的数据信息呈现新方式!(一)

凭借界面控件DevExpress WinForms全面的2D和3D图表类型的集合,DevExpress WinForms的图表控件设计大大简化了开发者直观地向最终用户呈现信息的方式。 DevExpress WinForms有180组件和UI库,能为Windows Forms平台创建具有影响力的业务解决方案。同时能完…

【笔记】Splay

【笔记】Splay 目录 简介右旋左旋 核心思想操作a. Splayb. 插入c. 删除 信息的维护例题AcWing 2437. SplayP3369 【模板】普通平衡树 简介 Splay 是一种平衡树,并且是一棵二叉搜索树(BST)。 它满足对于任意节点,都有左子树上任意…

常见应用层协议

一.HTTP(超文本传输协议) HTTP 和 HTTPS 二.FTP(文件传输协议) 三.SMTP(简单邮件传输协议) 四.POP3(邮局协议版本3) 五.IMAP(互联网消息访问协议) 六.DNS&am…

利用证书给pdf文件添加数字签名

文章目录 给pdf文件签名一、文件准备1. 构建印章2. 获取证书方法一 阿里云申请证书方法二 自建证书 二、利用证书给pdf签名三、设定签名位置在指定坐标签名在指定签名域签名 传送门 给pdf文件签名 如何给pdf文件签名,这样pdf文件就具有不可修改性,具有鉴…

钡铼BL302与PLC:提升酿酒业效率与品质的利器

啤酒是人类非常古老的酒精饮料,是水和茶之后世界上消耗量排名第三的饮料。 啤酒在生产过程中主要有制造麦芽、粉碎原料、糖化、发酵、贮酒後熟、过滤、灌装包装等工序流程。需要用到风选机、筛分机、糖化锅、发酵设备、过滤机、灌装机、包装机等食品机械设备。这些食…

指针笔试题详解

个人主页:点我进入主页 专栏分类:C语言初阶 C语言程序设计————KTV C语言小游戏 C语言进阶 C语言刷题 欢迎大家点赞,评论,收藏。 一起努力,一起奔赴大厂。 目录 1.前言 2.指针题写出下列程序的结…

【算法练习Day1】二分查找移除元素

​ ​📝个人主页:Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:练题 🎯长路漫漫浩浩,万事皆有期待 文章目录 二分查找解决方法一&…

在比特币上使用可检索性证明支付存储费用

我们为用户开发了一种为云存储付费的新方法。 与亚马逊的 S3 等传统云存储相比,用户不必信任服务器。 我们使用比特币智能合约来确保支付取决于服务器的可检索性证明 (PoR),该证明只能在数据仍然可用且需要时可以检索的情况下生成。 可检索性证明 (PoR)…

C/C++学习路线总结与分享

目录 1、学习C语言 2、学习C 3、了解基础的网络知识 4、Linux相关知识 5、数据库知识 6、数据结构与算法 7、需要重点关注的编程技术 7.1、socket网络编程 7.2、多线程与多线程编程 7.3、多进程及多进程通信 7.4、动态链接库编程 7.5、数据库编程 7.6、设计模式 …

Super Marker插件——标记资源,提高效率

插件介绍: 这是一款可以给资源添加颜色或图标标记📌的插件,当资源文件比较多的时候,颜色标记可以让你一眼定位到要使用的资源,提高开发效率。 插件地址: Cocos商店:https://store.cocos.com/a…

机器学习,深度学习

一 、Numpy 1.1 安装numpy 2.2 Numpy操作数组 jupyter扩展插件(用于显示目录) 1、pip install jupyter_contrib_nbextensions -i https://pypi.tuna.tsinghua.edu.cn/simple 2、pip install jupyter_nbextensions_configurator -i https://pypi.tuna.t…

c#:System.Text.Json 的使用三(从Newtonsoft迁移)

环境: .net 6.0vs2022 系列篇: 《c#:System.Text.Json 的使用一》 《c#:System.Text.Json 的使用二》 《c#:System.Text.Json 的使用三(从Newtonsoft迁移)》 参考: 《MSDN: 从 Newt…

Kafka 常见问题

文章目录 kafka 如何确保消息的可靠性传输Kafka 高性能的体现利用Partition实现并行处理利用PageCache 如何提高 Kafka 性能调整内核参数来优化IO性能减少网络开销批处理数据压缩降低网络负载高效的序列化方式 kafka 如何确保消息的可靠性传输 消费端弄丢了数据 唯一可能导致…

python抓取网页视频

1. 喜马拉雅音频 1-1 喜马拉雅 import requests import json import time import random import hashliburl https://www.ximalaya.com/revision/play/v1/audio?id46103875&ptype1headers { user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.3…

小黑下班品尝网红团结湖四川麻辣烫,吃的特别撑,支付宝抽到3元红包,耳机找到,开始接触强化学习的leetcode之旅:LCR 188. 买卖芯片的最佳时机

小黑代码 class Solution:def bestTiming(self, prices: List[int]) -> int:# 数组长度n len(prices)if n < 2:return 0# 结果变量profit 0# 记录第i天之前的股票价格最小值min_ prices[0]for i in range(1, n):if prices[i]-min_ > profit:profit prices[i]-min…

品牌出海的关键步骤:市场定位与创新营销

现如今越来越多的企业开始将目光投向海外市场&#xff0c;寻求品牌出海的机会。品牌出海是指企业将自身品牌拓展至海外市场&#xff0c;通过进军国际市场来实现增长和发展。然而&#xff0c;面对不同的文化、市场环境和消费者需求&#xff0c;成功的品牌出海需要制定有效的策略…

手撸RPC【gw-rpc】

文章目录 基于 Netty 的简易版 RPC需求分析简易RPC框架的整体实现协议模块 &#x1f4d6;自定义协议 &#x1f195;序列化方式 &#x1f522; 服务工厂 &#x1f3ed;服务调用方 ❓前置知识——动态代理&#x1f573;️Proxy类InvocationHandler 接口 RPC服务代理类内嵌Netty客…

印章篆刻小程序商城的作用是什么

印章的需求度也有很高市场需求&#xff0c;处理办公印章外&#xff0c;还有艺术类的&#xff0c;而对爱好者来说&#xff0c;需要找到一家靠谱的品牌制作&#xff0c;包括材料、样式、内容等都有较高要求&#xff0c;线上可以接触到更多雕刻商家。 而对品牌来说&#xff0c;需…