当前位置: 首页 > news >正文

基于docker+Keepalived+Haproxy高可用前后的分离技术

基于docker+Keepalived+Haproxy高可用前后端分离技术

架构图

image-20231008112141771

服务名docker-ip地址docker-keepalived-vip-ip
haproxy-01docker-ip自动分配 未指定ip192.168.31.252
haproxy-02docker-ip自动分配 未指定ip192.168.31.253

安装haproxy

宿主机ip 192.168.31.254
宿主机keepalived虚拟网络未定义

  1. 下载docker镜像
    docker pull haproxy:2.1
    

    image-20231008133511141

  2. 配置haproxy 配置文件 文件名haproxy.cfg
global#工作目录chroot /usr/local/etc/haproxy#日志文件,使用rsyslog服务中local5日志设备(/var/log/local5),等级infolog 127.0.0.1 local5 info#守护进程运行daemondefaultslog 127.0.0.1 local0 err #[err warning info debug]mode http                #默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OKretries 2                #两次连接失败就认为是服务器不可用,也可以通过后面设置option redispatch        #当serverId对应的服务器挂掉后,强制定向到其他健康的服务器option abortonclose      #当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接option dontlognull       #日志中不记录负载均衡的心跳检测记录maxconn 4096             #默认的最大连接数timeout connect 5000ms   #连接超时timeout client 30000ms   #客户端超时timeout server 30000ms   #服务器超时#timeout check 2000      #=心跳检测超时######## 监控界面配置 #################	
listen  admin_stats#监控界面的访问的IP和端口bind  0.0.0.0:8888#访问协议mode        http#URI相对地址stats uri   /dbs#统计报告格式stats realm     Global\ statistics#登陆帐户信息stats auth  admin:admin########frontend配置##############
#mycat负载均衡
listen  proxy-mycat#访问的IP和端口bind  0.0.0.0:9000  #网络协议mode  tcp#负载均衡算法(轮询算法)#轮询算法:roundrobin#权重算法:static-rr#最少连接算法:leastconn#请求源IP算法:source balance  roundrobin# 这里是容器中的IP地址,由于配置的是轮询roundrobin,weight 权重其实没有生效server haproxy01 192.168.31.252:4001 check weight 1 maxconn 2000 server haproxy02 192.168.31.253:4002 check weight 1 maxconn 2000 # 使用keepalive检测死链option tcpka

创建Haproxy容器

haproxy01

docker run -d -p 4001:8888 -p 9000:8066  \
-v /haproxy/haproxy01:/usr/local/etc/haproxy  \
--name haproxy01 --privileged  haproxy:2.1

haproxy02

docker run -d -p 4002:8888 -p 9001:8066 \
-v /haproxy/haproxy02:/usr/local/etc/haproxy \
--name haproxy02 --privileged  haproxy:2.1
参数配置详解
-p 4001:8888        将Haproxy提供的监控界面服务端口8888映射到宿主机的4001端口-p 4002:3306        将Haproxy提供的数据库负载均衡的服务端口3306映射到宿主机的4002端口-v /home/soft/haproxy:/usr/local/etc/haproxy       将宿主机的/home/soft/haproxy目录映射到容器的/usr/local/etc/haproxy目录。将来在宿主机的/home/soft/haproxy中放入配置文件,在相映射的容器目录中就可以使用了。--name h1            给容器起名,为了保证Haproxy的高可用,将来也会启动多个Haproxy容器实例--privileged          配置权限--net=net1           使用的网段,数据库实例使用的都是net1网段,需和数据库实例使用的网段保持一致--ip 172.18.0.7     手动分配的ip地址,如不设置,docker虚拟机也会给其分配一个ip地址 haproxy:2.1               docker run使用的镜像名

image-20231008142452384

在haproxy容器中启动haproxy实例

由于容器是使用-d做后台运行的,因此之后还需要进入后台运行的容器,把haproxy中间件启动起来。

进入后台运行的容器:

docker exec -it haproxy01 /bin/bash

启用配置文件(启用完配置文件才算是真的启动了haproxy服务)
(haproxy01 、haproxy02 都需要执行)

haproxy -f /usr/local/etc/haproxy/haproxy.cfg

image-20231008143136453

查看haproxy监控界面

http://对应ip:4001/dbs
用户名:admin
密码:admin
对应上面的配置

image-20231008143421736

keepalived搭建

(haproxy01 、haproxy02 都需要执行)

1、进入docker-haproxy服务
docker exec -it haproxy01 /bin/bash
2、更新update,安装keepalived
apt-get update
apt-get install keepalived更换源这里就不操作了
3、安装vim 安装ifconfig命令 安装ping
apt-get install net-tools  vim   iputils-ping
4、新建并写入一个keepalived的配置文件(注意把注释删掉)
vim /etc/keepalived/keepalived.confvrrp_instance  VI_1 {#定义节点属性state  MASTER#定义虚拟网卡interface  eth0#定义组vriidvirtual_router_id  100#定义权重priority  100#定义心跳检测时间1秒advert_int  1#定义组用户密码authentication {auth_type  PASSauth_pass  123456}#定义docker内ip地址,必须要在和haproxy同一个网段virtual_ipaddress {172.17.0.66}
}
keepalived配置文件详细说明
vrrp_instance  VI_1 {state  MASTER   #Keepalive的身份(MASTER为主服务,BACKUP为备用服务,抢占到ip的为主服务器,没有抢占到的自动降级为备用服务器)interface  eth0  #docker中虚拟ip使用到的docker内部网卡virtual_router_id  51  #虚拟路由标识,MASTER和BACKUP的虚拟路由标识必须一致。 标识可以是0~255之间任意值。priority  100   #硬件设备条件不同时采用的权重,MASTER权重要高于BACKUP,数字越大优先级越高。advert_int  1  #keepalived节点之间的心跳检测间隔,单位为秒,主备之间必须一致。authentication {   auth_type  PASSauth_pass  123456}  #心跳检测需要登录到keepalived节点内,登录使用的账号密码。主备必须用相同的密码才能正常通信。virtual_ipaddress {172.18.0.201}  #虚拟ip,该虚拟ip将被写入到上面的docker网卡ens33中,如数据库集群的网段是172.18.0.xxx,这里就定义个大一点的该网段的ip地址。由于是docker内部的虚拟ip,在docker内部能访问,出了docker是不能访问的。
}
image-20231008150323665
启动keepalived
service keepalived start
执行 /bin/systemctl start keepalived.service 即可

image-20231008150247369

尝试宿主机能否ping通keepalived占有的虚拟ip,能ping通就说明这个虚拟ip已经配置成功了:

image-20231008150639375

如若ping不通需检查配置是否正确,以及网络模式是否是桥接。

一开始我使用的网络模式是nat,无法ping通,改为桥接后重启linux可以ping通

三、在宿主机内安装Keepalived

Haproxy容器内的keepalive已经正常运行了,其抢占的虚拟ip也可以正常ping通了。

之后需要把该虚拟ip和宿主机的ip做映射,以使外部网络可以访问到该虚拟ip,需要在宿主机上也安装keepalived。

宿主机的linux是centos,所以安装命令有所不同:

yum install -y keepalived  
apt-get   install -y keepalived

编写Keepalived配置文件

位置/etc/keepalived文件夹
宿主机配置信息

vrrp_instance VI_1 {state MASTER#这里是宿主机的网卡,可以通过ip a查看当前自己电脑上用的网卡名是哪个interface ens33virtual_router_id 100priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {#这里是指定的一个宿主机上的虚拟ip,一定要和宿主机网卡在同一个网段,我的宿主机网卡ip是192.168.1.85,所以指定虚拟ip是给的90192.168.136.140}
}#接受监听数据来源的端口,网页入口使用
virtual_server 192.168.136.140 8888 {delay_loop 3lb_algo rr lb_kind NATpersistence_timeout 50protocol TCP#把接受到的数据转发给docker服务的网段及端口,由于是发给docker服务,所以和docker服务数据要一致real_server 172.18.0.15 8888 {weight 1}
}#接受数据库数据端口,宿主机数据库端口是3306,所以这里也要和宿主机数据接受端口一致
virtual_server 192.168.136.140 8066 {delay_loop 3lb_algo rr lb_kind NATpersistence_timeout 50protocol TCP#同理转发数据库给服务的端口和ip要求和docker服务中的数据一致real_server 172.18.0.15 8066 {weight 1}
}

image-20231008154345698

配置文件详解
注意:1. 如上配置中的virtual_server 192.168.31.252,这是我当前的宿主机的网段ip地址,需将配置中所有192.168.132.252改成自己使用的宿主机网段2. ipaddress查看自己连接宿主机的ip地址,查看ip地址对应的网卡名。把interface eth1一项修改成自己正确的宿主机网卡名。
3、启动keepalived
service keepalived start执行 /bin/systemctl start keepalived.service 即可  如果报错

启动成功后,尝试ping宿主机供请求访问的ip ping 192.168.31.99

image-20231008154658429

image-20231008154626406

测试Haproxy监控服务

通过宿主机keepalived绑定的ip访问haproxy监控服务

image-20231008154800808

注意,这次访问haproxy监控服务的ip192.168.31.99是宿主机keepalived所占有的虚拟ip,

keepalived通过这个虚拟ip192.168.31.99 转发请求到docker的虚拟ip 172.17.0.66。

haproxy01容器中的keepalived所在主服务器haproxy最后进行负载均衡请求分发。

这次访问的已经不是原本的未使用keepalived时的宿主机192.168.132.252的ip了
以上都是为了实现高可用功能,没有配置前后端分离。

至此完成高可用

Haproxy配置动静分离页面

修改主配置文件如下
globalchroot /usr/local/etc/haproxylog 127.0.0.1   local0 info                     ##定义日志级别;log 127.0.0.1   local1 noticemaxconn 4096            ##设定每个haproxy进程所接受的最大并发连接数uid 99                  ##指定运行服务的用户和组gid 99daemon                  ##指定运行模式为daemon,以守护进程的方式工作在后台
defaultslog     global                          ##采取global中的日志配置mode    http                            ##默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OKoption  httplog                         ##采用http日志格式记录日志option  dontlognull                     ##不记录健康检查的日志记录option httpclose                        ##关闭保持连接retries 3                               ##检查节点最多失败次数maxconn 2000                            ##最大连接数,定义不得大于global中的值contimeout      5000    ##连接超时时间,毫秒,在此期间,如若客户端与服务端无法成功建立连接,则断掉clitimeout      50000   ##设置连接客户端发送数据时的成功连接最长等待时间,单位为毫秒,如若在这期间无法请求成功,则断掉srvtimeout      50000   ##设置服务器端回应客户端数据发送的最长等待时间,如果在这期间还无法发送成功,则断掉##################无分离页面需求的配置##############
#listen webcluster 0.0.0.0:80                   ##指定haproxy服务监听地址和端口
#       option  httpchk GET /index.html         ##指定http请求方法和默认文件
#       balance roundrobin                      ##指定轮询调度算法
#       server  inst1 192.168.100.155:80 check inter 2000 fall 3                ##定义web节点,检测心跳频率,单位为毫秒,定义检查节点最多失败次数
#       server  inst2 192.168.100.156:80 check inter 2000 fall 3##################有分离页面需求的配置##############
frontend http                           ##定义名称为httpbind *:80                       ##指定监听地址和端口acl linuxfan1 hdr_end(host) -i 192.168.31.253                ##指定类型为访问路径的域名,-i不区分大小写acl linuxfan2 hdr_end(host) -i www.ceshi.conacl linuxfan3 path_end -i .jsp .do .css .js                     ##指定请求文件格式为.jsp#acl linuxfan3 hdr_reg -i \.(css|png|jpg|jpeg|gif|ico|swf|xml|txt|pdf|do|jsp|js)$       ##调用正则表达式acl linuxfan4 path_end -i .html .css .png .jpg .jpeg .xml       ##指定请求文件格式为.htmlacl linuxfan5 path_beg -i /WebRoot                              ##指定访问URL中的路径,如http://www.linuxfan.cn/WebRoot/index.jspuse_backend dongtai if linuxfan1 linuxfan3use_backend dongtai if linuxfan2 linuxfan3use_backend dongtai if linuxfan1 linuxfan5 linuxfan3use_backend dongtai if linuxfan2 linuxfan5 linuxfan3default_backend jingtai                                 ##默认的请求使用backend dongtaibackend jingtai         ##定义backend :jingtaimode http                       ##定义模式balance roundrobin              ##定义调度算法为轮询server jingtai01 192.168.31.253:80 check inter 2000 fall 3             ##定义节点backend dongtaimode httpbalance roundrobinserver dongtai01 192.168.31.254:8080 check inter 2000 fall 3

部署nginx

创建目录

mkdir -p /usr/local/docker/nginx
vim docker-compose.yml
version: "3.0"
services:nginx:image: nginx:1.21.6restart: always#network_mode: "host"ports:- 80:80- 443:443volumes:- "./nginx/html:/usr/share/nginx/html"- "./nginx/conf.d:/etc/nginx/conf.d"- "./nginx/ssl:/etc/nginx/ssl"- "./nginx/logs:/var/log/nginx"

启动
image-20231008171725061

部署tomcat

创建目录,为了放置 Tomcat 的配置文件等

mkdir  bin  conf  docker-compose.yml  logs  webapps

先随便启动一个 tomcat 容器(用第一种方法,docker run),主要是为了获取 tomcat 容器内部的配置文件

#启动一个容器docker run -d --name tomcat tomcat# 查看 容器 获取容器IDdocker ps -a

其中将,容器内 tomcat 文件夹下的 conf bin logs webapps 里面的内容都拷贝到上面宿主机上创建的对应文件夹内。容器的文件拷贝到宿主机的命令如下:

# 注意!是在宿主机上执行这条命令。
docker cp 容器名:/usr/local/tomcat/webapps/* /usr/local/tomcat/webapps
其它文件夹内的内容也要这样拷贝到宿主机对应的文件夹内。

创建这个文件,docker-compose.yml

version: '3'
services:tomcat:user: rootrestart: alwayscontainer_name: tomcatimage: tomcatprivileged: trueenvironment:- TZ="Asia/Shanghai"ports:- 1002:8080volumes:- /usr/local/tomcat/webapps/:/usr/local/tomcat/webapps/- /usr/local/tomcat/conf:/usr/local/tomcat/conf- /usr/local/tomcat/logs:/usr/local/tomcat/logs- /usr/local/tomcat/bin:/usr/local/tomcat/bin- /etc/localtime:/etc/localtime

相关文章:

基于docker+Keepalived+Haproxy高可用前后的分离技术

基于dockerKeepalivedHaproxy高可用前后端分离技术 架构图 服务名docker-ip地址docker-keepalived-vip-iphaproxy-01docker-ip自动分配 未指定ip192.168.31.252haproxy-02docker-ip自动分配 未指定ip192.168.31.253 安装haproxy 宿主机ip 192.168.31.254 宿主机keepalived虚…...

安装配置deep learning开发环境

1. 下载安装anacondahttps://www.anaconda.com/download-success vim ~/.condarcchannels: - bioconda - https://mirrors.ustc.edu.cn/anaconda/pkgs/main/ - https://mirrors.ustc.edu.cn/anaconda/cloud/conda-forge/ - https://mirrors.tuna.tsinghua.edu.cn/anaco…...

Docker基础(CentOS 7)

参考资料 hub.docker.com 查看docker官方仓库,需要梯子 Docker命令大全 黑马程序员docker实操教程 (黑马讲的真的不错 容器与虚拟机 安装 yum install -y docker Docker服务命令 启动服务 systemctl start docker停止服务 systemctl stop docker重启…...

HTTP的基本格式

HTTP/HTTPS HTTPhttp的协议格式 HTTP 应用层,一方面是需要自定义协议,一方面也会用到一些现成的协议. HTTP协议,就是最常用到的应用层协议. 使用浏览器,打开网站,使用手机app,加载数据,这些过程大概率都是HTTP来支持的 HTTP是一个超文本传输协议, 文本>字符串 超文本>除…...

Qt元对象系统 day5

Qt元对象系统 day5 内存管理 QObject以对象树的形式组织起来,当为一个对象创建子对象时,子对象回自动添加到父对象的children()列表中。父对象拥有子对象所有权,比如父对象可以在自己的析构函数中删除它的孩子对象。使用findChild()或findC…...

【audio】alsa pcm音频路径

文章目录 AML方案音频路径分析dump alsa pcm各个音频路径的原始音频流数据 AML方案音频路径分析 一个Audio Patch用来表示一个或多个source端到一个或多个sink端。这个是从代码的注释翻译来的,大家可以把它比作大坝,可以有好几个入水口和出水口&#xf…...

NLP - 数据预处理 - 文本按句子进行切分

NLP - 数据预处理 - 文本按句子进行切分 文章目录 NLP - 数据预处理 - 文本按句子进行切分一、前言二、环境配置1、安装nltk库2、下载punkt分句器 三、运行程序四、额外补充 一、前言 在学习对数据训练的预处理的时候遇到了一个问题,就是如何将文本按句子切分&#…...

【轻松玩转MacOS】常用软件篇

引言 在本篇文章中,我将介绍如何安装和使用一些常用的软件,如Safari浏览器、邮件、日历、地图等。让我们一起来看看吧! 一、Safari浏览器 Safari是MacOS自带的浏览器,具有简洁、快速、安全的特点。 以下是一些Safari浏览器的使…...

Akshare简记

文章目录 基本信息安装Anaconda安装(推荐)Anaconda设置AKShare安装使用AKShare更新数据接口一览数据字典用例Hello WorldMFI指标SMA指标BOLL线指标股市新闻情绪判断市场情绪指标ARBR条件选股回测配对交易策略日线策略计算相近产品基本信息 线上文档:...

Jmeter常用断言之断言持续时间简介

Duration Assertion:断言持续时间。 断言持续时间通常用于做性能测试,一般用于检查HTTP请求的响应时间是否超过预期值。而这个响应时间是性能测试中常关注的一个性能指标。 一、添加断言方式 根据需要可在【测试计划】、【线程组】、【线程请求】下添加…...

C/C++/VS2022/指针/数组 调试出现debug

这个情况就很难受,编译没错,但是运行出现问题了,如果点击中止(重试、忽略)下一次运行还是会出现,看了显示的大致意思是在数组arry上出现了什么错误,经过检查发现,原来是数组在数入时…...

【设计模式】使用原型模式完成业务中“各种O”的转换

文章目录 1.原型模式概述2.浅拷贝与深拷贝2.1.浅拷贝的实现方式2.2.深拷贝的实现方式 3.结语 1.原型模式概述 原型模式是一种非常简单易懂的模型,在书上的定义是这样的: Specify the kinds of objects to create using a prototypical instance,and cre…...

[C++ 网络协议] IOCP(Input Output Completion Port)

1.什么是IOCP IOCP(Input Output Completion Port)输入输出完成端口。其实就是基于重叠I/O的一种改进的模型。 重叠I/O具有缺点:重复调用非阻塞模式的accpet函数和以进入alertablewait状态为目的的SleepEx函数会影响程序性能。 而IOCP提供…...

R实现地图相关图形绘制

大家好,我是带我去滑雪! 地图相关图形绘制具有许多优点,这些优点使其在各种领域和应用中非常有用。例如:地图相关图形提供了一种直观的方式来可视化数据,使数据更容易理解和分析。通过地图,可以看到数据的空…...

【Jmeter】性能测试脚本开发——性能测试环境准备、Jmeter脚本编写和执行

文章目录 一、常用的Jmeter元件二、性能测试环境准备三、编写Jmeter脚本四、执行测试脚本 一、常用的Jmeter元件 取样器-HTTP请求 作用:发送HTTP请求配置原件-HTTP请求默认值 作用:设置HTTP请求的默认参数配置原件-用户定义的变量 作用:定义…...

看好你家电视盒的后门!数千个Android电视盒感染了与欺诈相关的危险恶意软件

如果你从Android电视盒获得流媒体修复程序,则你的设备可能会被恶意软件所感染,这些恶意软件能够进行广告欺诈、创建假帐户,并通过悄悄地将你的数据转移到中国的服务器来销售对家庭网络的访问。 根据本周的一份新报告,网络安全公司…...

LeetCode 1251. 平均售价

题目链接:1251. 平均售价 题目描述 表:Prices Column NameTypeproduct_idintstart_datedateend_datedatepriceint (product_id,start_date,end_date) 是 prices 表的主键(具有唯一值的列的组合)。 price…...

TypeScript 笔记:String 字符串

1 对象属性 length 返回字符串的长度 2 对象方法 charAt() 返回在指定位置的字符 charCodeAt() 返回在指定的位置的字符的 Unicode 编码 concat 连接两个或更多的字符串 indexOf 返回某个指定的字符串值在字符串中首次出现的位置 lastIndexOf 从后向前搜索字符串&…...

蓝牙技术|Matter或能改变中国智能家居市场,蓝牙技术将得到进一步应用

近年来,智能家居开放协议标准Matter(目前版本 1.1)由连接标准联盟发布,该联盟是一个由数百家公司组成的全球性机构,旨在提供与物联网 (IoT) 相关的标准。例如,Matter 用于允许 Amazon Alexa、Apple Home、G…...

VB.NET vs. VB6.0:现代化编程语言 VS 经典老旧语言

目录 ​.NET背景: 特点: VB6.0背景: 特点: 两者之间的不同: 总结: 升华: .NET背景: VB.NET一种简单,现代,面向对象计算机编程语言,有微软开发,VB.NET是一种基于.NET Framework的面向对象…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...

【Oracle APEX开发小技巧12】

有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化

缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...

莫兰迪高级灰总结计划简约商务通用PPT模版

莫兰迪高级灰总结计划简约商务通用PPT模版,莫兰迪调色板清新简约工作汇报PPT模版,莫兰迪时尚风极简设计PPT模版,大学生毕业论文答辩PPT模版,莫兰迪配色总结计划简约商务通用PPT模版,莫兰迪商务汇报PPT模版,…...