自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(104)
  • 收藏
  • 关注

原创 认证、授权、凭证、保密、传输、验证

以摘要代替明文如果密码本身比较复杂,那么一次简单的哈希摘要就至少可以保证,即使在传输过程中有信息泄露,也不会被逆推出原信息;即使密码在一个系统中泄露了,也不至于威胁到其他系统的使用。但这种处理不能防止弱密码被彩虹表攻击所破解。

2024-04-14 23:40:19 813

原创 设计原则、设计模式、设计模式项目实战

抽象:主要是讲如何隐藏方法的具体实现,让调用者之需要关系方法提供了哪些功能,并不需要知道这些功能是如何实现的,可借助interface和abstract两个关键字实现,简化操作,让用户只关心功能点,不用关心具体实现。工厂模式是用来创建不同但相关类型的对象(继承同一父类或接口的一组子类),由给定的参数来决定创建哪种类型的对象。建造者模式用来创造一种类型的复杂的对象,通过设置不同的可选参数,定制化的创建不同的对象。这两者的区别在哪里呢?多态:多态就是指子类可以替代父类,多态能提供代码的扩展性和复用性。

2024-04-07 22:59:05 519

原创 缓存、分布式缓存、缓存的风险

分布式缓存和进程内缓存,各有所长,也各有局限,它们是互补的,而不是竞争关系,而多级缓存就是,使用进程内缓存做一级缓存,分布式做二级缓存,如果能在一级缓存中查询到结果接直接返回,否则就到二级缓存中去查询,再将二级缓存的结果回填到一级缓存,以后的访问就没有网络请求了。这种现象,就被称为缓存击穿。大量的数据同时失效,那么之所以会出现这样的情况,往往是因为系统有专门的缓存预热功能,也可能是因为,大量的公共数据都是由某一次冷操作加载的,这样可能会出现又一次载入的缓存的大批数据具有相同的过期时间,在同一时刻一起失效。

2024-04-07 22:46:40 596

原创 内容分发网络的工作过程

即根据请求中的某些数据(可以是MAC、IP地址,也可以是更上层协议中的某些参数)作为特征值,来计算需要落在哪些节点上,算法一般会保证同一个特征值,每次都一定落在相同的服务器上,这里的一致性意思就是,保证服务器集群的某个真实服务器出现故障的时候,只影响该服务器的哈希,而不会导致整个服务集群的哈希键值对重新分布。数据链路层的负载均衡所做的工作,就是修改请求的数据帧中的MAC目标地址,让用户原本是发送给负载均衡器的请求的数据帧,被二层交换机直接根据新的Mac目标地址,转发到服务器集群中。

2024-04-07 20:53:38 599

原创 本地事务、分布式事务、

还有一种Shadow Paging实现原子性和持久性,大概思路就是对数据的变动会写到硬盘的数据中,但并不是直接地修改原先的数据,而是将原来的数据复制一份副本保留原数据,修改副本,同时保存两份,一份修改前的数据,一份修改后的数据,这种的坏处就是性能比较差。而消息队列用于进程间通讯的方法。为了阶段两阶段提交的单点问题、性能问题、数据一致性问题,三阶段提交出现,就是在提交阶段,增加一个doCommit询问阶段,评估一下每个事务参与者数据库的自身状态,评估该事务是否可以顺利完成,但是最终一致性问题还是存在。

2024-03-31 22:32:16 541

原创 亿级数据库迁移、分库分表、实践

在测试阶段,并发上不去,线程配置如下:核心线程池配置了16个,最大线程配置了750,然后配置了5000的缓冲队列,主要是当提交任务大于核心线程数时,后续任务会首先提交到缓冲队列。分布式和并行化的方式都是自己手写代码实现,其实可以用ScheduleX和MapReduce实现,框架已经实现任务分发,并行处理,充实,reduce等功能。增加机器节点,任务进行水平扩展,把大任务拆分为独立的子任务,所有子任务执行结果等价于各个子任务结果,手动根据不同租户或商家平摊到不同机器节点上执行。3、老系统升级过度新系统。

2024-03-24 22:35:51 179

原创 Rocket MQ 从入门到实践

生产者将消息推送到队列之后,如果有消费者去消费这个主题上的消息,在队列上记录下不同消费者互不干扰不同的消费位置,它就可享有同一份消息。生产者将消息发送给Exchange交换机,交换机路由到不同的队列,不同的消费者针对不同的队列进行消费,实现简单、但是消息存储冗余。是否一致:如果消息的量级规模存在巨大差异,或者说消息的链路重要程度存在差异,则应该使用不同的主题进行隔离拆分。是否一致:不同类型的消息,如顺序消息和普通消息需要使用不同的主题进行拆分,无法通过tag标签进行分类。即不丢消息,但也有少量重复。

2024-03-17 21:02:09 917

原创 ApplicationContextAware 接口妙用

但是SpringBoot的强大让我们无需再配置xml文件,也因此我们无法通过上述方式拿到ApplicationContext对象,所以当在项目需要用到spring中的bean对象时,一般做法就是实现ApplicationContextAware接口,通过这个接口就可以获取到ApplicationContext对象,进入从ApplicationContext中获取所需要bean对象。ApplicationContextAware接口的基本介绍。

2023-12-06 15:11:16 76

原创 Netty&NIO

Netty&NIO

2022-09-01 18:55:47 321 1

原创 认证中心(单点登陆)之SpringSecurity+OAuth2

认证中心(单点登陆)之SpringSecurity+OAuth2

2022-08-25 19:16:21 785

原创 分布式系统的流量防卫兵之Sentinel

分布式系统的流量防卫兵之Sentinel

2022-08-25 11:25:28 141

原创 SpringCloud之Hystrix、Resilience4j、GateWay、Sentinel、Config、Bus、Stream

SpringCloud之Hystrix、Resilience4j、GateWay、Sentinel、Config、Bus、Stream

2022-08-24 18:11:05 649

原创 Redis核心技术与实战

Redis 三大主线高性能主线,包括线程模型、数据结构、持久化、网络框架;高可靠主线,包括主从复制、哨兵机制;高可扩展主线,包括数据分片、负载均衡。Redis底层数据结构动态字符串、双向链表、压缩列表、哈希表、跳表和整数数组为什么哈希表操作变慢了?当你往 Redis 中写入大量数据后,就可能发现操作有时候会突然变慢了。这其实是因为你忽略了一个潜在的风险点,那就是哈希表的冲突问题和 rehash 可能带来的操作阻塞。Redis 解决哈希冲突的方式,就是链式哈希。链式哈希也很容易理解,就是指同

2022-04-18 22:26:52 2870

原创 数据结构与算法之链表

如何分析、统计算法的执行效率和资源消耗?多项式时间复杂度。O(1)首先你必须明确一个概念,O(1) 只是常量级时间复杂度的一种表示方法,并不是指只执行了一行代码。比如这段代码,即便有 3 行,它的时间复杂度也是 O(1),而不是 O(3)。 int i = 8; int j = 6; int sum = i + j;我稍微总结一下,只要代码的执行时间不随 n 的增大而增长,这样代码的时间复杂度我们都记作 O(1)。或者说,一般情况下,只要算法中不存在循环语句、递归语句,即使有成千上万行的代

2022-02-11 21:14:29 413

原创 如何对CPU过载进行排查

如何对CPU过载进行排查?1、怎么找出有问题的进程2、掌握简单的GC分析技巧3、掌握多线程分析技巧4、多线程的使用注意的问题案例现象CUP使用率持续在80%左右持续在3~8之间1、业务量,高峰期6000/分钟发送量,平均2000/分钟发送量2、服务器状况,两个节点接收数据,单节点消费数据3、每个消息发送处理时间平均为10秒4、单线程模式下节点最大消费能力每秒100条分析1、数据量并不大2、服务器物力资源够用3、单节点有足够的处理能力分析排查-CPU的负载什么事load数?

2022-01-28 11:32:51 1646

原创 Java 虚拟机

01、Java 代码是怎么运行的?Java 代码有很多种不同的运行方式。比如说可以在开发工具中运行,可以双击执行 jar 文件运行,也可以在命令行中运行,甚至可以在网页中运行。当然,这些执行方式都离不开 JRE,也就是 Java 运行时环境。实际上,JRE 仅包含运行 Java 程序的必需组件,包括 Java 虚拟机以及 Java 核心类库等。我们 Java 程序员经常接触到的 JDK(Java 开发工具包)同样包含了 JRE,并且还附带了一系列开发、诊断工具。Java 虚拟机可以由硬件实现[1],但

2022-01-27 11:05:06 1069

原创 Flink 学习(一)

了解数据处理过程的基本模式?数据输入(Source)数据处理(Transformation)数据输出(Sink)大数据处理计算模式流计算与批计算对比Flink核心特性1、统一数据处理组件栈,处理不同类型的数据需求(Batch、Stream、Machine Learning Graph)2、支持事件时间(Event Time)、接入时间(Ingestion Time) 、处理时间(Processing Time)等概念3、基于轻量级分布式快照实现的容错4、支持有状态计算(Suppor

2021-12-31 19:37:37 1299

原创 消息队列(一)

为什么需要消息队列?哪些问题适合使用消息队列来解决?异步处理流量控制服务解耦以上就是消息队列最常被使用的三种场景:异步处理、流量控制和服务解耦。当然,消息队列的适用范围不仅仅局限于这些场景,还有包括:作为发布 / 订阅系统实现一个微服务级系统间的观察者模式;连接流计算任务和数据;用于将消息广播给大量接收者。该如何选择消息队列?RabbitMQ我们说一下老牌儿消息队列 RabbitMQ,俗称兔子 MQ。RabbitMQ 是使用一种比较小众的编程语言:Erlang 语言编写的,它最早是为电

2021-12-31 17:34:12 322

原创 微服务(三)

Dubbo框架里的微服务组件?微服务的架构主要包括服务描述、服务发现、服务调用、服务监控、服务追踪以及服务治理这几个基本组件。服务发布与引用三种常用方式:RESTful API、XML 配置以及 IDL 文件,其中 Dubbo 框架主要是使用 XML 配置方式,接下来我通过具体实例,来给你讲讲 Dubbo 框架服务发布与引用是如何实现的。首先来看服务发布的过程,下面这段代码是服务提供者的 XML 配置。<?xml version="1.0" encoding="UTF-8"?>&l

2021-12-31 16:02:43 1240

原创 微服务(二)

注册中心原理在微服务架构下,主要有三种角色:服务提供者(RPC Server)、服务消费者(RPC Client)和服务注册中心(Registry),三者的交互关系请看下面这张图,我来简单解释一下。RPC Server 提供服务,在启动时,根据服务发布文件 server.xml 中的配置的信息,向 Registry 注册自身服务,并向 Registry 定期发送心跳汇报存活状态。RPC Client 调用服务,在启动时,根据服务引用文件 client.xml 中配置的信息,向 Registry 订阅服

2021-12-31 15:01:01 382

原创 Executor与线程池

定义线程是一个重量级的对象,应该避免频繁创建和销毁。class XXXPool{ // 获取池化资源 XXX acquire() { } // 释放池化资源 void release(XXX x){ }} 线程池是一种生产者 - 消费者模式//采用一般意义上池化资源的设计方法class ThreadPool{ // 获取空闲线程 Thread acquire() { } // 释放线程 void release(Thread t){ }}

2021-12-30 23:30:26 1059

原创 Java线程生命周期

通用的线程生命周期通用的线程生命周期基本上可以用下图这个“五态模型”来描述。这五态分别是:初始状态、可运行状态、运行状态、休眠状态和终止状态。初始状态,指的是线程已经被创建,但是还不允许分配 CPU 执行。这个状态属于编程语言特有的,不过这里所谓的被创建,仅仅是在编程语言层面被创建,而在操作系统层面,真正的线程还没有创建。可运行状态,指的是线程可以分配 CPU 执行。在这种状态下,真正的操作系统线程已经被成功创建了,所以可以分配 CPU 执行。当有空闲的 CPU 时,操作系统会将其分配给一个处于可运

2021-11-19 23:01:07 92

原创 并发编程之解决原子性问题

那原子性问题到底该如何解决呢?原子性问题的源头是线程切换,如果能够禁用线程切换那不就能解决这个问题了吗?而操作系统做线程切换是依赖 CPU 中断的,所以禁止 CPU 发生中断就能够禁止线程切换。在早期单核 CPU 时代,这个方案的确是可行的,而且也有很多应用案例,但是并不适合多核场景。这里我们以 32 位 CPU 上执行 long 型变量的写操作为例来说明这个问题,long 型变量是 64 位,在 32 位 CPU 上执行写操作会被拆分成两次写操作(写高 32 位和写低 32 位,如下图所示)。在单

2021-11-19 22:45:00 163

原创 并发编程之可见性、原子性、有序性

并发编程可以总结为三个核心问题:分工、同步、互斥所谓分工指的是如何高效地拆解任务并分配给线程,而同步指的是线程之间如何协作,互斥则是保证同一时刻只允许一个线程访问共享资源。Java SDK 并发包很大部分内容都是按照这三个维度组织的,例如 Fork/Join 框架就是一种分工模式,CountDownLatch 就是一种典型的同步方式,而可重入锁则是一种互斥手段。分工所谓分工,类似于现实中一个组织完成一个项目,项目经理要拆分任务,安排合适的成员去完成。在并发编程领域,你就是项目经理,线程就是项目

2021-11-17 23:34:52 626 1

原创 微服务(一)

单体应用各大互联网公司的应用技术栈大致可分为 LAMP(Linux + Apache + MySQL + PHP)和 MVC(Spring + iBatis/Hibernate + Tomcat)两大流派。无论是 LAMP 还是 MVC,都是为单体应用架构设计的,其优点是学习成本低,开发上手快,测试、部署、运维也比较方便,甚至一个人就可以完成一个网站的开发与部署。存在问题1、部署效率低下当单体应用的代码越来越多,依赖的资源越来越多时,应用编译打包、部署测试一次,甚至需要 10 分钟以上。这也经常被新

2021-11-09 17:27:08 453

原创 Dubbo的调用过程

注册服务:resources/dubbo/dubbo_registry.xml#id:标识需要在zookeeper上注册的服务的ID,方便下面暴露服务时引用。#protocol:协议名称#address:注册中心地址#register:是否向此注册中心注册服务,如果设为false,将只订阅,不注册。#check:注册中心不存在时,是否报错。#group:Dubbo提供服务分组,用于当一个接口有多种实现时,可使用group分组。即暴露的服务接口通过group来区分不同的实现类。#inte

2021-09-08 20:00:08 152

原创 Dubbo服务调用过程分析

简单的想想大致流程在分析Dubbo 的服务调用过程前我们先来思考一下如果让我们自己实现的话一次调用过程需要经历哪些步骤?首先我们已经知晓了远程服务的地址,然后我们要做的就是把我们要调用的方法具体信息告知远程服务,让远程服务解析这些信息。然后根据这些信息找到对应的实现类,然后进行调用,调用完了之后再原路返回,然后客户端解析响应再返回即可。调用具体的信息那客户端告知服务端的具体信息应该包含哪些呢?首先客户端肯定要告知要调用是服务端的哪个接口,当然还需要方法名、方法的参数类型、方法的参数值,还有可能

2021-08-24 18:54:57 248

原创 Spring Security

什么是Spring SecuritySpring Security 是基于Spring AOP和Servlet过滤器的安全框架,它提供全面的安全解决方案,同时在Web请求级别和方法调用级别处理身份确认和授权Spring Security 核心功能1、认证(你是谁,用户/设备/系统)2、验证(你能干什么,也叫权限控制/授权,允许执行的操作)3、攻击防护(防止伪造身份)Spring Security原理技术Filter、Servlet、Spring DI、Spring AOP常用的安全框架目前

2021-01-21 20:46:56 100

原创 Nginx(负载均衡、反向代理)

安装配置NginxLinux下Nginx的安装1、下载nginx安装包2、进入对应目录输入命令./configure 回车make 回车makeinstall 回车 安装完毕3、启动

2021-01-20 15:45:32 79

原创 HTTP协议

什么是URI、什么是HTML、什么是HTTP?1、URI:即统一资源标识符,作为互联网上资源的唯一身份;2、HTML(HyperText Transfer Protocol):即超文本标记语言,描述超文本文档;3、HTTP:即超文本传输协议,用来传输超文本。HTTP各版本之间的差异(0.9、1.0、1.1、2.0、3.0)HTTP/1.0 版本在 1996 年正式发布。它在多方面增强了 0.9 版,形式上已经和我们现在的 HTTP 差别不大了,例如:1、增加了 HEAD、POST 等新方法;2

2021-01-18 15:15:54 1748

原创 Mysql实践篇

1、普通索引和唯一索引,应该怎么选择?假设,执行查询的语句是 select id from T where k=5。这个查询语句在索引树上查找的过程,先是通过 B+ 树从树根开始,按层搜索到叶子节点,也就是图中右下角的这个数据页,然后可以认为数据页内部通过二分法来定位记录。对于普通索引来说,查找到满足条件的第一个记录 (5,500) 后,需要查找下一个记录,直到碰到第一个不满足 k=5 条件的记录。对于唯一索引来说,由于索引定义了唯一性,查找到第一个满足条件的记录后,就会停止继续检索。InnoDB

2021-01-15 15:24:02 111

原创 锁和表锁及MVCC

MySQL 里面的锁大致可以分成全局锁、表级锁和行锁三类全局锁命令是 Flush tables with read lock (FTWRL)全局锁的典型使用场景是,做全库逻辑备份。也就是把整库每个表都 select 出来存成文本。表级锁表锁的语法是 lock tables … read/write在 InnoDB 事务中,行锁是在需要的时候才加上的,但并不是不需要了就立刻释放,而是要等到事务结束时才释放。这个就是两阶段锁协议。死锁和死锁检测一种策略是,直接进入等待,直到超时。这个超时时间可以

2021-01-15 11:38:48 93

原创 索引

隔离性与隔离级别提到事务,你肯定会想到 ACID(Atomicity、Consistency、Isolation、Durability,即原子性、一致性、隔离性、持久性),今天我们就来说说其中 I,也就是“隔离性”。当数据库上有多个事务同时执行的时候,就可能出现脏读(dirty read)、不可重复读(non-repeatable read)、幻读(phantom read)的问题,为了解决这些问题,就有了“隔离级别”的概念。在谈隔离级别之前,你首先要知道,你隔离得越严实,效率就会越低。因此很多时候,我们

2021-01-15 11:10:39 65

原创 一条SQL 查询、跟更新语句是如何执行的

Server 层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。而存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持 InnoDB、MyISAM、Memory 等多个存储引擎。现在最常用的存储引擎是 InnoDB,它从 MySQL 5.5.5 版本开始成为了默认存储引擎。查询语句连接器第一步,你会先连接到这个数据库上,这时候接待你的就.

2021-01-14 20:21:50 158

原创 消息队列之RibbitMQ

eeeee

2020-07-19 22:25:10 249

原创 分布式理论之问题

一、访问一个网站的全过程DNS先尝试从host文件读取域名对应的IP地址,如果找到,则完毕;如果为找找到,则使用DNS进行查找TCP三次握手建立连接负载均衡服务器Nginx?应用服务器Tomcat?浏览器渲染缓存?二、大型网站架构演进1、单机2、单机负载告警,数据库与应用分离3、应用服务器负载告警,让应用服务器走向集群(1)引入负载均衡设备(2)分布式SessionSession Sticky 回话粘滞这个方案本身非常简单,对于web服务器来说,该方案和单机情况是一

2020-07-16 03:39:51 202

原创 Java实现链表的创建、删除、修改、查询以及用链表实现一个Stack、Quque

一、什么是链表链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,操作复杂。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而线性表和顺序表相应的时间复杂度分别是O(lo

2020-06-22 05:07:19 158

原创 JWT与加密算法(RSA)实现Token以及Zuul实现鉴权

JWT1、简介JWT,全称json Web Token,是JSON风格轻量级的授权和身份认证规范可以实现无状态、分布式的Web应用授权;官网:https://jwt.io2、JWT数据格式:JWT包含三部分:Header :头部,通常头部有两部分信息Payload :载荷,就是有效数据,一般包含用户身份信息、注册声明Signature:签名是整个数据的认证信息。一般根据前两步的数据,再加上服务的秘钥(secret)3、JWT交互流程(1)用户登录(一般POST方式保证安全)(2)服务认

2020-06-19 22:05:32 914

原创 集合相关数据结构、栈、队列、数组、链表、红黑树

一、栈栈 :stack又称堆栈,它是运算受限的线性表,其限制是仅仅允许在栈的一端进行插入和删除操作,不允许在其他任何位置进行添加、查找、删除等操作先进后出:如:子弹压进弹夹 栈的入口、出口都是在栈的顶端位置二、队列队列:queue 简称队,它同堆栈一样,是一种受限制的线性表,其限制仅允许在表的一端进行插入,而在另一端进行删除先进先出、对垒的入口出口各自占一侧三、数组数组 :Array 是有序的元素序列,数组是在内存中开辟的一段连续的空间,并在此空间存放元素。就像一排出租屋,有以100个房间

2020-06-15 07:33:12 125

原创 RibbitMQ

一、消息队列1、什么是消息队列,即MQ,Message QueueMQ全称为MQ,Message Queue消息队列(MQ)是一种应用程序得通信方法,应用程序通过读写出入队列得消息来通信,而无需要专用得连接来链接他们。消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常用于诸如远程过程调用技术。排队指的是应用程序通过队列来存储通信,队列得使用除去了接受和发送应用程序同时执行的要求消息队列是典型的:生产者、消费者模型。生产者不断向消息队列中生产消息,消费者的从

2020-06-15 05:01:27 218 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除