RocketMQ
RocketMQRocketMQ入门消息队列
消息队列中间件 - Message Queue 是分布式系统中重要的组建,主要解决 应用解耦、异步消息、流量削峰 等问题。
消息队列实现了高性能、高可用、可伸缩和最终一致性架构,是大型分布式系统不可缺少的中间件。
目前主流的消息队列有 RocketMQ、Kafka、RabbitMQ、ActiveMQ等。本文将主要介绍 RocketMQ
消息队列的作用
异构系统之间的调用解耦
基于”发布订阅”机制的数据分发
异步消息处理
削峰限流
消息队列选型Kafka
Apache Kafka 是一个开源流处理平台,是一个高吞吐的分布式发布订阅消息系统
使用场景:大流量应用、对消息延迟不敏感的场景
RabbitMQ
RabbitMQ 开源的消息队列系统,实现了高级消息队列协议(AMQP)
使用场景:企业级别内部应用,数据可靠性高,对于并发和延迟不敏感的场景
RocketMQ
Apache RocketMQ 由阿里巴巴集团贡献的开源分布式消息中间件
适用场景:低延迟应用,瞬间大流量处理效率不如kafka
RocketMQ概述
Apache R ...
SpringCloud
SpringCloud
微服务服务架构演变单体架构
将业务的所有功能集中在一个项目中开发并打包部署
优点:架构简单、部署成本低
缺点:耦合度高
分布式架构
根据业务功能对系统进行拆分,每个业务模块作为一个独立项目开发
优点:降低服务耦合,利于服务升级拓展
问题
服务拆分的粒度
服务地址的维护
服务远程的调用
服务状态的感知
微服务
微服务是一种经过良好架构设计的分布式架构设计方案。
微服务架构的特征:
单一职责:微服务拆分粒度更小,每个服务都对应唯一的业务能力,做到单一职责,避免重复业务开发
面向服务:每个微服务对外暴露业务接口
独立自治:开发独立,技术独立,数据独立,部署独立
级联隔离:服务调用要做好隔离、容错、降级,避免出现级联问题
微服务的优缺点:
优点:拆分粒度更小,服务更加独立,耦合度更低
缺点:架构非常复杂,运维、监控、部署难度高
微服务技术对比:
SpringCloud
SpringCloud集成了各种微服务组件,并基于SpringBoot实现组件的自动装配,从而提供开箱即用的体验
SpringCloud和Spring ...
Docker在Linux环境下常见部署
Docker在Linux环境下常见部署
Docker是一个开源的应用容器引擎,让开发者可以打包应用及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows机器上。使用Docker可以更方便地打包、测试以及部署应用程序。
Docker安装安装yum-utils1yum install -y yum-utils device-mapper-persistent-data lvm2
为yum源添加docker仓库位置1yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
安装Docker1yum install docker-ce
启动Docker1systemctl start docker
自启动Docker1systemctl enable docker
查看Docker版本1docker -v
查看Docker信息1docker info
查看Docker帮助1docker help
查看Docker状态1systemctl st ...
Redis高级
Redis分布式缓存Redis集群单节点Redis问题
数据丢失问题:redis是内存存储,服务重启可能会导致数据丢失
并发能力问题:redis本身具有较强的并发能力,但是无法满足高并发的场景
故障恢复问题:Redis宕机会导致服务不可用,需要一种自动故障恢复的方法
存储能力问题:Redis单节点存储数据量难以满足海量数据需求
Redis持久化RDB持久化
RDB(Redis Database Backup file-Redis数据备份文件,也称Redis数据快照)指将内存中的所有数据记录到磁盘中。当Redis实例故障重启时,从磁盘读取快照文件,恢复数据。
快照文件称为RDB文件,默认保存在当前运行目录中。Redis停机时会执行一次RDB。
RDB文件
关闭服务之前,进行一次RDB文件的保存
查看挂载目录下的RDB文件
Redis配置RDB
Redis内部存在触发RDB的机制,可以在配置文件redis.conf文件中进行配置。
Redis的Fork原理
bgsave开始时会fork主进程得到子进程,子进程共享主进程的内存数据。异步完成fork后读取内存数据并 ...
Redis实战
Redis实战
短信登录基于Session实现登录
session共享问题
多台Tomcat不共享session存储空间,当请求切换到不同的Tomcat服务时导致数据丢失的问题
session的替代方案应该满足:
数据共享
内存存储
key-value结构
基于Redis实现共享session登录
redis代替session考虑的问题
选择合适的数据结构
设置合适的key
选择合适的存储粒度
设置合适的有效期
解决状态登录刷新的问题
值得注意,这里需要登录的路径才会走拦截器刷新token有效期,导致不需要登录即未拦截的路径没有刷新token有效期。
商户查询缓存什么是缓存
缓存就是数据交换的缓存区(称作Cache),是存贮数据的临时的地方,一般读写性能较高。
添加Redis缓存
缓存更新策略
三种常见的缓存读写策略Cache Aside Pattern(旁路缓存模式)
在更新数据库的同时更新缓存
这是平时比较多的缓存读写模式,比较适合读多写少的场景
同步时时,尽量选择删除缓存,在读少写多的场景下,避免对于缓存过多无效的写操作
如何保证缓存和数据库数据 ...
JUC 并发编程
JUC并发编程理论基础线程和进程进程
进程是程序的一次执行过程,是系统运行程序的基本单位,进程是动态的,操作系统运行一个程序即一个进程从创建、运行到消亡的过程。
在操作系统上,可以同时运行很多进程,每个进程之间相互隔离互不干扰,CPU通过时间片轮转算法,为每一个进程分配时间片,并在时间片使用结束后切换下一个进程继续执行,通过这种方式实现宏观上的多个线程同时运行。
每个进程都有自己独立的内存空间,并且进程之间的通信非常麻烦(例如共享某些数据),而且CPU执行不同进程会产生上下文切换,非常耗时。
线程
后来线程横空出世,一个进程可以有多个线程,线程是一个比进程更小的执行单位,线程是程序执行中一个单一的顺序控制流程,与进程不同的是,各个线程之间共享程序的内存空间即共享进程所在内存空间。在同一JVM进程中,同类的多个线程共享进程的堆和方法区资源,每个线程都有自己的程序计数器、虚拟机栈和本地方法栈。因此,系统中产生一个线程或是中各个线程之间切换工作时,负担要比进程小得多,上下文切换的速度也高于进程,所以线程也称为轻量级进程。
在Java中,当我们启动main函数时,其实就是启动一个JVM进 ...
分布式搜索-ElasticSearch
分布式搜索-ElasticSearchElasticSearch的定义
ElasticSearch是一款强大的开源搜索引擎,可以帮助我们从海量数据中快速找到需要的内容。
ElasticSearch结合kibana、logstash、beats即elastic stack(ELK),被广泛应用在日志数据分析、实时监控等领域。ElasticSearch是elastic stack的核心、负责存储、搜索、分析数据。
Lucene是一个Java语言的搜索引擎类库,具有易扩展、高性能(基于倒排索引)的优势,但是只限于Java语言开发、学习复杂、不支持水平扩展。
2010年、Shay Banon重写了Compass,取名为ElasticSearch,相比于Lucene,ElasticSearch具备下列优势:支持分布式,可水平扩展;提供Restful接口,可被任何语言调用。
总结
ElasticSearch是一个开源的分布式搜索引擎,可以用来实现搜索、日志统计、分析、系统监控等功能。
倒排索引传统数据库(例如MySQL)采用正向索引,实例tb_goods中id插件索引:
ElasticSe ...
消息队列 MQ
消息队列-MQ同步通讯和异步通讯
同步调用的问题微服务间基于Feign的调用属于同步方式,存在一些问题。
总结同步调用的优点
时效性强、立即获得结果
同步调用的问题
耦合性高
性能和吞吐能力下降
有额外的资源消耗
有级联失败的问题
异步调用方案异步调用常见的实现是事件驱动模式
异步通信的优点:
优势一:通过事件发布完成服务解耦,耦合度低
优势二:性能提升,吞吐量提高
优势三:服务没有强依赖,不担心级联失败问题,故障隔离
优势四:流量削峰
异步通信的缺点:
依赖于Broken的可靠性,安全性,吞吐能力
架构复杂,业务没有明显的流程线,不易于追踪管理
MQMQ(Message Queue)是消息队列,存放消息的队列,就是事件驱动架构的Broker。
RabbitMQRabbitMQ是基于Erlang语言开发的开源通信中间件。
RabbitMQ部署下载docker镜像1docker pull rabbitmq:3.9-management
启动RabbitMQ服务12345docker run \-p 5672:5672 -p 15672:15672 \--name ...
Jenkins
JenkinsJenkins简介
Jenkins是开源CI&CD软件领导者,提供超过1000个插件来支持构建、部署、自动化,满足任何项目的需要。
我们可以利用Jenkins来构建和部署我们的项目,它可以实现从代码仓库获取代码,将代码打包成可执行文件并通过远程的ssh工具执行脚本来运行我们的项目。
Jenkins的安装及配置Docker环境下的安装Docker拉取Jenkins镜像1docker pull jenkins/jenkins
创建并运行Jenkins容器12345docker run --name jenkins \-p 8090:8080 -p 50000:5000 \-u root \-v /mydata/jenkins_home:/var/jenkins_home \-d jenkins/jenkins
Jenkins配置访问地址登录访问:http://ip:8090/ 登录Jenkins
第一次登录需要输入管理员密码
从容器启动日志中获取管理密码1docker logs jenkins
选择安装插件方式
插件安装
创建管理员账号
实例配置和UR ...
Spring Cloud Alibaba(三) Seata
Spring Cloud Alibaba(三)Seata
Seate是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。
Seata将为用户提供了AT、TCC、SAGA和XA事务模型,为用户打造一站式的分布式解决方案。
项目场景搭建逻辑约定
图书借阅流程:调用图书服务书籍数量减1->添加借阅记录->调用用户服务可借阅数减1
约束:每个用户最多同时借阅2本不用的书,图书馆中的所有书都有且仅有3本
数据库修改用户表添加字段book_count记录用户可借阅书籍数量
书籍表添加字段count记录书籍剩余数量
服务修改borrow-servicedao层BorrowMapper.java123456789101112131415161718@Mapperpublic interface BorrowMapper { /** * 根据条件查询借阅列表 * @param uid * @param bid * @return */ List<Borrow> g ...