自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

nimo10050的博客

菜鸟成长日志

  • 博客(90)
  • 收藏
  • 关注

原创 画图分析 xxl-job 执行器原理

声明阅读本文前, 需要对 xxl-job 的使用有所了解。正文回顾一下如何定义一个任务@Componentpublic class SampleXxlJob { /** * 1、简单任务示例(Bean模式) */ @XxlJob("demoJobHandler") public ReturnT<String> demoJobHandler(String param) throws Exception { // doSometh

2021-02-03 23:22:45 2626

原创 阅读了 redis 的源码,我终于明白为什么说 redis 是单线程!

开篇本文主要来探讨一下 redis 的单线程模型,文章前半部分会先引用某网络课程讲解的内容(图片+语言描述),后半部分是本人粗略阅读 redis 源码后整理出来的一份伪代码,用来验证文中前半部分的内容。本文对标的 redis 版本是 5.x。正文redis 涉及的知识点有很多,展开来讲能聊到操作系统,因此为了方便理解,文中做了很多抽象描述。文件事件处理器redis 内部使用了一个叫 文件事件处理器( file event handler)的东西,这个文件事件处理器是 单线程 的,所以才有了 re

2020-11-24 14:18:54 499 1

原创 Dubbo 底层原理剖析

阅读指南本文会通过 图文+案例+源码,对 Dubbo 的底层原理进行剖析。阅读之前,要求对 Dubbo 有所了解,并且会简单使用。正文先来看一张摘自官网的 令人头大 的 Dubbo 框架设计图,另外还有几张图,就不一一贴出了,详细请参考 Dubbo 框架设计其实 Dubbo 官网关于框架设计的部分已经讲得很详细了,但是对于我们这种没工作多久的菜鸟,仍然需要花费大量的时间去理解。框架设...

2020-04-12 22:46:34 561

转载 (转载)LRU 和 LFU 的区别

What is the difference between LRU and LFU

2023-02-16 10:26:49 299

原创 Spring Cloud 总结 - 调用远程服务的三种方式及原理分析

然后这些 自定义注解 就可以反过来为我们注入 Bean 时, 起到限定的作用(上面已经讲过它限定了什么).于是我们再回过头看下。

2022-12-18 17:10:43 3491

原创 [go 语言学习笔记] 7天用Go从零实现GeeRPC 「持续更新中」

举例, 如果服务端拿到消息长度, 就能拿到消息内容, 但是此时的消息内容还是字节数组类型, 我们需要把内容转成对应的 json 或者 xml 等对象(也就是反序列化过程). 所以我们还需要客户端在。, 它的缺点是我们需要自定义双方的信息协议,优点是传输效率高(直接这样讲可能不太严谨, 关于 http 和 rpc 的比较可以自行了解.).去处理, 根据我们前面讲的, 信息的格式可以是多样的.所以我们的编解码器抽象成一个接口, 如果是 json 格式的信息, 就需要定义一个。

2022-12-17 19:53:42 857

原创 本地运行好好的 Java 程序, 一发布到线上就报错的灵异事件终于让我碰到了

Caused by: org.apache.ibatis.binding.BindingException:Parameter 'id' not found. Available parameters are [arg1, arg0, param1, param2]

2022-12-15 23:50:30 814

原创 [go 语言学习笔记] 7天用Go从零实现分布式缓存GeeCache 「已完结」

当我们设计缓存时, 我们需要考虑到一个问题, 我们缓存容量一定要是可控的, 不能无限量存储, 因此需要定义一个最大存储容量, 这个我们定义为maxBytes,为了和最大存储容量进行比较, 我们还需要计算已占用的字节大小, 我们定义为nbytes.当我们定义完最大容量后, 我们要考虑到, 如果存储容量达到设定的最大值时, 想要继续存储数据时, 改怎么办?有如下两种办法:抛异常提示, 容量达到上限, 让管理员自己去清理.这个我们通过对外暴露接口, 让客户端调用对应增删改查的 API 就能实现.

2022-12-13 21:11:07 1318

原创 突然想总结下自己阅读源码的经验

1. 带着疑问或者程序里出现的 bug 去阅读源码, 会更使人更兴奋2. 读框架源码要先抓主干, 由粗到细3. 一定要亲自 debug 一遍源码, 不要光看文字或视频教程4. 一定要画图, 特别是时序图, 流程图, 哪怕不会画图, 也要先用其他形式记录下源码的主要流程5. 不管是 debug 源码, 还是画图, 一定要有耐心, 不要急于求成, 不要把读源码当作面试突击6. 善于利用和挖掘 IDEA 提供的各种工具7. 市面上的框架都是大同小异, 互相模仿, 尤其是基于 Springboot 的源

2022-11-24 09:08:08 188

原创 基于源码搭建运行 RocketMQ 主从架构

上一篇基于 IDEA 搭建 RocketMQ-4.6 源码环境我们搭建并跑通了rocketmq的源码环境 .本文我们紧接上文, 继续基于源码搭建并运行broker主从架构.1 个 NameServer 节点 (与前文一样)2 个 Broker 节点, 一个作为 Master, 一个作为 Slave1 个 Producer 生产者 (与前文一样)1 个 Consumer 消费者 (与前文一样)broker 主从架构只需要修改 broker.conf 文件即可, 其他地方与单节点没有差异.

2022-11-16 20:25:35 1133

原创 基于 IDEA 搭建 RocketMQ-4.6 源码环境

Broker部署相对复杂,Broker分为Master与Slave,一个Master可以对应多个Slave,但是一个Slave只能对应一个Master,Master与Slave 的对应关系通过指定相同的BrokerName,不同的BrokerId 来定义,BrokerId为0表示Master,非0表示Slave。Master也可以部署多个。每个Broker与NameServer集群中的所有节点建立长连接,定时注册Topic信息到所有NameServer。 注意:当前RocketMQ版本在部署架构上支持一Ma

2022-11-16 20:20:15 807

原创 Mybatis 报错: Parameter ‘xxx‘ not found. Available parameters are [collection, list]

org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause: org.apache.ibatis.binding.BindingException: Parameter 'ids' not found. Available parameters are [collection, list]### Cause: org.apache.ibatis.binding.BindingExcepti

2022-11-14 11:09:46 3101 1

原创 细到不能再细的 Spring Cloud Gateway 原理分析(内含多张图片讲解)

通过绘制多图讲解 Spring Cloud Gateway 的原理。层层递进!!Spring Cloud Gateway 使用了 Spring WebFlux 非阻塞网络框架,底层网络通信默认使用了高性能非阻塞的 Netty ,解决了 Spring Cloud Zuul 因为阻塞的线程模型带来的性能下降的问题。

2022-10-22 18:53:04 14598

原创 研究了 Spring Security 的源码后, 我仿写了一个 “乞丐版” 的 Security 框架

开篇Spring Security 入门 - 01 将 Spring security 引入到工程Spring security 入门 - 02 自定义用户登录页面和登录处理逻辑Spring security 入门 - 03 自定义登录成功后的处理逻辑Spring security 入门 - 04整合 jwt通过上述 4 篇实战文章的讲解, 我们了解了 Spring Security 的基本用法.本文我会基于对 Spring Security 内部实现原理的理解, 来实现一个

2021-09-23 22:41:45 335

转载 [转载] Spring IOC 容器源码分析

Spring 最重要的概念是 IOC 和 AOP,本篇文章其实就是要带领大家来分析下 Spring 的 IOC 容器。既然大家平时都要用到 Spring,怎么可以不好好了解 Spring 呢?阅读本文并不能让你成为 Spring 专家,不过一定有助于大家理解 Spring 的很多概念,帮助大家排查应用中和 Spring 相关的一些问题。本文采用的源码版本是 4.3.11.RELEASE,算是 5.0.x 前比较新的版本了。为了降低难度,本文所说的所有的内容都是基于 xml 的配置的方式,实际使用已经很少人

2021-07-07 14:28:22 171 1

原创 什么? 就只是加了一个 Spring Security 依赖, 所有接口都无法访问了?

开篇前面我们写了 4 篇 Spring Security 的实战教程, 全部基于 Springboot 搭建的.Spring Security 入门 - 01 将 Spring security 引入到工程Spring security 入门 - 02 自定义用户登录页面和登录处理逻辑Spring security 入门 - 03 自定义登录成功后的处理逻辑Spring security 入门 - 04整合 jwt虽然我们学会了怎么用, 但是里面的原理还没搞清楚.因此, 从本文开始, 我们

2021-05-15 20:46:58 4317 2

原创 基于 ShardingSphere5.0.0-alpha 实现 mysql 读写分离

声明本文会基于 Springboot + mybatis + shardingsphere + mysql5.6 + druid 进行实战讲解本文的实战内容为根据前文搭建的 mysql 主从复制架构 实现 mysql 的读写分离本文的内容只涉及 读写分离, 并没有跟前面文章中的分库分表的内容串起来.本文采用的 shardingsphere 版本是 5.0.0-alpha, 具体见 pom 文件本文涉及的源码请参考 读写分离如果看官方文档时, 请选择对应的版本, 并且官网也有坑 !!!文中贴出

2021-05-09 22:27:26 1749 17

原创 基于 docker 搭建 mysql 主从复制架构

说明本文会基于 docker 来搭建一套 一主两从 的 mysql 主从架构.阅读本文之前, 需要对 docker 的相关知识有一定了解.名称对外端口对内端口容器名称Mysql 版本master33063306mymysql5.6slave0133403306mymysql-slave5.6slave0233413306mymysql-slave25.6搭建过程1. 拉取镜像本文使用的 mysql 版本是 5.6, 当然你也可以

2021-05-07 15:39:05 293 2

原创 基于 ShardingSphere5.0.0-alpha 实现 mysql 分库

声明本文会基于 Springboot + mybatis + shardingsphere + mysql5.6 + druid 进行实战讲解本文在上一篇文章[数据分表]的基础上增加了 分库 的功能本文不会介绍 shardingsphere 以及分库分表的相关概念本文采用的 shardingsphere 版本是 5.0.0-alpha, 具体见 pom 文件本文涉及的源码请参考 分库如果看官方文档时, 请选择对应的版本 !!!文中涉及的源码可能会有误, 请以上传到

2021-04-30 10:06:12 278

原创 基于 ShardingSphere5.0.0-alpha 实现 mysql 数据分片

声明本文会基于 Springboot + mybatis + shardingsphere + mysql5.6 + druid 进行实战讲解本文的实战内容为分表、以及数据分片, 不涉及分库, 读写分离之类的本文不会介绍 shardingsphere 的历史、概念以及分库分表的相关理论本文采用的 shardingsphere 版本是 5.0.0-alpha, 具体见 pom 文件本文涉及的源码请参考 码云地址如果看 官方文档 时, 请选对版本 !!!正文实现目标

2021-04-29 18:52:37 953

原创 mysql 查询一天中每个小时的数据量

需求查询某一天中每个小时的订单数量, 如果某个时间段没有数据, 就填充 0. 效果如下:建表语句-- 一张简化过的 xx 订单表CREATE TABLE `mod_work_order` ( `id` int(11) NOT NULL, `create_time` datetime NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;模拟2021年3月22日当天的数据INSERT INTO `m

2021-03-22 16:06:43 7390 1

原创 ConcurrentHashMap 源码分析 - JDK1.7

声明本文对 java.util.concurrent.ConcurrentHashMap的相关讨论全部基于 JDK1.7 源码, 另外, 在阅读本文前,需要读者对 java.util.HashMap有一定程度的了解, 比如基于 K-V 存储, 底层数据结构(jdk1.7/jdk1.8)等.正文阅读大纲ConcurrentHashMap 的相关介绍ConcurrentHashMap 的构造函数ConcurrentHashMap 的 put 方法ConcurrentHashMap

2021-03-12 16:31:30 167

原创 说完了 xxl-job 的执行器原理,再来聊聊调度中心是如何调度任务的

前言在上一篇 xxl-job 执行器原理分析 一文中,我们提到了 xxl-job 框架中包含了两个核心模块:调度中心 和 执行器, 其中调度中心主要负责 任务的调度 , 而执行器负责 任务的执行, 两者各司其职。 紧接着我们通过画图的方式对 执行器 的内部构造进行了分析,并且还对 Job 的执行流程进行了梳理。本文我们继续围绕任务的调度流程对 调度中心 进行剖析, 内容依然参照 xx-job v2.x 版本的源码。正文再看一遍 xxl-job 架构图:调度中心主要提供了两个功能: 系统管理 和

2021-02-06 21:12:16 4658

原创 SpringBoot 官方推荐我们这样放置 Application 启动类

下面是新建的一个 Springboot 项目, 包名为com.demo.example, 初始化项目结构如下所示:从图中可以看出, IDE 还在 demo 包下面创建了一个启动类.根据我们的编码习惯会继续在 demo 包下面创建子包或者一些类.比如下面这样:这样就导致你后续新增的类和包最多和启动类是目录平级的. 因此不会造成后面会提到的意外.用过 Spring 的都知道, 当我们用注解方式配置 Bean 时, 一般都需要在Spring 配置文件中配置包扫描:<context:compon

2021-01-30 00:44:18 1148 2

原创 因为我不知道 Spring 的 depends-on 用法, 半天没看懂源码

声明本文的主要目的不是来讲解 Spring 的 depends-on 的相关概念和如何使用的, 更不是来分析源码的,而是想借助本文的案例说明两点关于阅读源码的体会:要想读通框架源码, 首先你得先玩儿通.阅读源码过程中或者看了他人对源码的分析见解后, 自己也要去 debug 验证一下.正文自己用 Spring 做业务开发两年了, 但是从来没有接触或用到过它的 depends-on 特性.因此当在源码中看到这个词汇时, 很容易把它跟我们常用的 依赖注入 扯在一起, 最终导致自己对框架源码的理解产

2021-01-19 14:43:58 567 4

原创 通过抓包分析 redis 通信协议, 我也能实现一个 redis 客户端

概述redis 客户端与服务端通信的本质就是基于 socket 的网络编程, 通过字节流来传输数据, 在将数据转成字节流之前, 客户端需要将待传输的数据按照具体的通信协议格式组装一下, 本文主要来分析的是 redis 客户端是通过什么样的数据格式从服务端 读写数据 的.插入一条数据如果往 redis 中插入一条 key=username, value=zhangsan的数据, 命令如下:SET USERNAME ZHANGSAN实际的通信数据(转为字节之前), 如下所示:// 原始字符串*

2021-01-03 21:35:49 1273 3

原创 后台管理系统很简单? 就是CRUD? 快进来看看你忽视了多少细节!

前言今年下半年负责了一个前后端分离的管理系统, 用的是 Springboot + Spring data jpa + Vue + mysql, 个人负责的是后端接口开发, 这也算是我第一次从 0 到 1 完成的一个管理系统.受制于平时看的视频教程, 亦或者是一些开源项目, 以及平时养成的坏习惯, 导致在真正上手去做这些 平时看不起 的管理系统时, 踩了很多坑, 忽略了很多细节, 希望这篇文章不仅能让自己得到反思, 也能帮助其他人一起脱坑!!!正文下面会通过管理系统几个必备的功能, 必要时还会给出 案

2020-12-12 19:31:10 1368 1

原创 手把手教你如何在 Centos 7 上安装 elasticsearch7.x

声明本文记录了整个安装过程,出现一个错误,就解决一个。因此建议阅读完全文后,再自行安装。另外,不同版本 的 es,不同版本的操作系统,安装过程中出现的错误可能存在差异,需要读者见招拆招。一、安装环境一台 Centos7 虚拟机2个单核 CPU 、4GB 内存、100G 硬盘容量elasticsearch-7.5.1二、安装过程Elasticsearch 是一个 Java 应用程序,因此需要机器上安装有 jdk。为了帮助用户更快地使用上 Elasticsearch,Elasticsearc

2020-11-25 21:29:17 514

原创 Dubbo 实战 - Mock 调用

前言Dubbo 的 mock 特性既可以用作服务降级处理, 即当服务提供者出错时(抛出 RpcException),进行 mock 调用;同时也可以用于本地测试,用服务消费者端配置的 mock 服务替代要调用的远程服务,亦或者是对某个服务消费者屏蔽服务提供者,不让其进行远程调用。下面通过举例说明 mock 的作用和使用方式,文中测试代码所使用的 Dubbo 版本为 2.7.7。本文会通过 xml 的方式进行配置。另外,早期 dubbo 版本的 mock 功能可能有bug,或者功能不够完善。正文要使

2020-11-15 20:47:50 4590

原创 作为一名后端,我经常使用这几个 Linux 命令

开篇本文来简单介绍下作为一名后端开发, 要在 linux 服务器上进行简单的运维,需要用到的常用命令。几点声明:本文不会涉及 cd 、cp、mv 这些相当入门级的命令文中命令涉及的参数都有很多,这里不会展开讲,只要不涉及到写复杂脚本,文中给出的参数基本够用很多命令会有 N 多个替代品,这个主要看个人习惯个人实践操作的系统版本是 Centos7.x正文1. 查看网络端口占用情况netstat : 用于显示 tcp,udp 的端口和进程等相关情况。常用参数:-t (

2020-11-02 21:46:36 267 1

原创 基于 Spring Security 搭建用户权限系统(二) - 自定义配置

说明本文的目的是如何基于 Spring Security 去扩展实现一个基本的用户权限模块, 内容会覆盖到 Spring Security 常用的配置.文中涉及到的业务代码是不完善的, 甚至会存在逻辑上的漏洞, 业务部分请自行思考完善.一、脱离框架实现认证和鉴权Spring Security、Shiro 这种所谓的安全框架, 其核心作用就是 认证 和 鉴权, 当不使用这些框架时, 比较常规的实现方式如下:定义一个登录接口用于验证用户身份 (认证)定义一个过滤器验证用户的访问权限 (鉴权)

2020-08-08 13:33:16 614

原创 基于 Spring Security 搭建用户权限系统(一)-工程搭建

前言前面用了 4 篇文章, 讲解了 Spring Security 的入门使用, 但是关于 Spring Security 的部分使用配置讲解的还是不够清楚.Spring Security 入门 - 01 将 Spring security 引入到工程Spring security 入门 - 02 自定义用户登录页面和登录处理逻辑Spring security 入门 - 03 自定义登录成功后的处理逻辑Spring security 入门 - 04整合 jwt接下来会通过两篇文章来基于 S

2020-08-08 13:26:15 403

原创 Spring Security OAuth2 - 自定义 OAuth2.0 令牌发放接口地址

登录实现拿浏览器网页登录举例:基于 OAuth2.0-密码模式 实现网页登录的本质就是浏览器通过 /oauth/token 接口将 用户名 和 密码 等信息传给后台, 然后后台验证通过后返回一个有效的 token 给浏览器.通过 curl 命令发送请求请求头 Authorization 存放的是 clientId 和 secret 经过 Base64 编码后的结果请求参数包括用户名(username)、密码(password)、授权模式(grant_type).curl --loca

2020-06-30 11:14:42 2793 14

原创 源码分析 - Spring Security OAuth2 生成 token 的执行流程

前言本文内容基于 Spring Security OAuth2(2.3.5.RELEASE) 源码进行分析.正文获取 token 的默认请求路径是 /oauth/token获取 token 的入口是 TokenEndpoint 类该请求接收的参数有两个Principal principalMap<String, String> parameters详细流程当一个请求打到 oauth/token 时:调用 ClientDetailsService 类的 loadClie

2020-06-29 22:50:37 7087 2

原创 在拦截器中获取 url 路径里面 @PathVariable 的参数值

解决办法Map pathVariables = (Map) request.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);String classId = (String)pathVariables.get("classId");示例接口 // 获取某个班级下面的学生列表 @RequestMapping("/classes/{classId}/students") public String l

2020-05-25 22:59:48 10369 1

原创 spring security oauth2 实战(仿微博第三方登录) - 工程搭建及登陆流程

前言N 多月前写了以下 4 篇关于 spring security 的入门文章(完全站在只会用的角度)Spring Security 入门 - 01 将 Spring security 引入到工程Spring security 入门 - 02 自定义用户登录页面和登录处理逻辑Spring security 入门 - 03 自定义登录成功后的处理逻辑Spring security 入门 ...

2020-05-15 15:32:18 1148

原创 结合第三方登录案例理解 OAuth2.0 授权码方式

前言最近在学习 Spring-Security-Oauth2 ,在此之前必然要研究下 oauth2.0 协议规范。关于 oauth2.0 的相关概念及理解,这里推荐阅读以下文章:oauth2.0 入门文章阮一峰 - OAuth 2.0 的一个简单解释阮一峰 - OAuth 2.0 的四种方式​ 需要声明的是这 2 篇文章中有些错误,主要是关于 redirect_uri 部分,评论区有人已经指出了错误,所以阅读时,请结合评论区内容。(是的,你没看错,即使有错误

2020-05-15 12:18:55 1205

原创 ThreadPoolExecutor 源码分析 - execute() 方法

知识回顾线程池的几种状态 RUNNING 、SHUTDOWN 等线程池的核心参数 corePoolSize 和 maximumPoolSize 等线程池的工作原理 核心线程 -> 阻塞队列 -> 非核心线程 -> 拒绝策略如何判断线程池的状态和线程数量:通过 AtomicInteger ctl 变量的高低位判断Worker 对象的介绍(对一个线程任务的包装)ThreadPoolExecutor#workers 属性线程池中有一个 workers 集合,里面记录了所有的工作

2020-05-14 22:51:49 757

原创 线程池 ThreadPoolExecutor 源码分析基础 - 线程池工作原理

前言本文主要内容为分析 ThreadPoolExecutor 线程池的执行原理,然后这前后会穿插一些其他线程池的内容(构造方法,线程池状态等等),本文最终目的是为分析 ThreadPoolExecutor 源码打基础。阅读前请对线程池的概念及作用有所了解。另外,本文主要内容基于 jdk1.8 来说明。正文大纲线程池的构造方法线程池的创建方式线程池的工作状态线程池的工作原理线程池 Worker 内部类ThreadPoolExecutor 的构造方法ThreadPoolExecut

2020-05-09 18:34:24 386

原创 Java 线程池 ThreadPoolExecutor 中的位运算操作

前言翻阅 Java 线程池的源码,可以看到用到了大量的位运算操作,本文来分析下这些位运算是如何计算的,以及最后算出的结果是什么。正文阅读之前,必须熟悉一下内容& 与运算| 或运算~ 取反<< 左移负数的二进制表示方式(先取对应 正数 的二进制,然后对每一位 取反,最后加 1)java 中 位运算的优先级(取反 优先级大于 与运算)ThreadPoolE...

2020-04-29 11:33:50 1562 1

空空如也

空空如也

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

TA关注的人

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