- 博客(46)
- 资源 (1)
- 收藏
- 关注
原创 (WebFlux)004、WebFilter踩坑记录
1、遇到问题,还是要多看看呀,细细思考一下2、多看代码,发现问题,实现完美的解决方案。
2022-09-28 21:53:24 1766 1
原创 (WebFlux)003、多数据源R2dbc事务失效分析
在使用新东西的时候,还是要多实验,验证结果!遇到问题,不要慌,一步步来,就是干!如有问题,欢迎指正,交流。
2022-08-27 20:48:45 1883 2
原创 如何在Java中直接使用Hystrix?
最近由于一些背景原因,需要在项目中需要对接口进行限流。所以就考虑到了直接使用Hystrix。但是呢,又不想直接使用SpringCloud,而是直接引入原生,现在发现挺好用的,所以记录下来,分享出来。...
2022-06-04 15:45:01 616
原创 SpringDataRedis序列化带有双引号
1. 背景在使用Spring Data Redis的hash存数据的时发现,如果存值的泛型和取出来的泛型对象不同时,可能存在值不相等。记录下过程与解决方案,避免大家重复踩坑。2. 问题说明情况如下,用图说明。2.1 RedisOpts操作RedisOpts是对RedisTemplate<String,?>进行了一层封装,在用hash操作时,存入的key是test-hash,value是RedisUtils.class.getName(), 取值得时候有两种方式,分别是转化成了Stri
2022-03-02 20:07:29 2125 2
原创 Spring是如何自动注入多类型
抓住10月月末的小尾巴, 一探SpringBean内部字段是如何注入多类型的时常有个小问题围绕着我,Spring是如何给字段字符装盘,为何支持Collection、List、Map、String等这么多类型的呢?在Spring注入的过程中,有没有什么小技巧值得我们学习呢?带着这个疑惑,我们来一探究竟。本文基于SpringBoot V2.5.6, Spring V5.3.12。不同版本可能会有不同,请注意哈想要弄懂上面的问题,有一个小小的要求,那就是要弄懂SpringBean的生命周期(如和Get
2021-10-31 21:12:45 310 1
原创 高峰应对分享
一、背景最近这个点9月中旬了,快到双十一了,公司开始对一些较为重要的系统开始进行压测。在这个过程中,需要保证系统的稳定性,以及高吞吐量。所以记录这次的压测过程,自己遇到的各种问题以及自己的思考。二、 过程记录2.1 工作流程梳理在确定系统被确定为高峰系统后,就需要对系统有一个完整的梳理,并对接下来的工作有一个梳理规划。其中主要有几个方面。如下:系统功能的完整梳理系统调用链路,以及上下游系统调用链路系统现有监控梳理。如:业务监控、请求调用、重要接口日志监控等系统应急预案。如:系统层面的容灾、
2021-09-20 17:10:47 144
原创 有迹可循之CheckList
一. 背景我们经常在Code Review的时候经常不知道怎么CodeReview,或者说写代码的时候怎么写出很棒的代码,更多的是靠我们的经验和感觉。通过自己积累的知识,来看代码是否符合自己心中的直觉。但是,很迷茫,因为自己也不能说出所以然。今天捡了个漏,看了别人的CheckList,觉得很棒,让自己的思考、行为有迹可循,知其然,知其所以然。所以记录下来,分享给大家。二. Check List2.1 如何发现代码问题如何发现代码中现有哪些问题?主要由以下几种情况。分别是:目录设置是否合理、模块
2021-09-01 09:31:24 213
原创 高可用架构(下)
上次说到了理论,接口层面,数据库层面如何实现高可用,但是,这远远是不够得。为了面对更大的灾害,如:洪水,地震等,还要在机房层面做出高可用。当然,也不仅仅是为了面对自然灾害,也可以是用于备份等,接下来就让我们从存储方式,机房层面说一下高可用架构。一. 数据存储方式在我们用集群存储数据的时候,有多种的存储方式,有时候会把数据存在一个节点上,有时候又会把数据分散存储。如Redis集群,将数据存储在不同的节点上。这样就带来了两次数据存储的讨论。分别是:数据集中式存储集群和数据分区存储集群。1.1 数据集中存储
2021-08-17 21:03:20 151 1
原创 高可用架构(上)
1. 背景在学习完各种高性能发实现方案后,就需要对三大复杂度一直的高可用进行开刀了,在高可用方面主要有哪些东西是我们需要考虑的呢?接下来将从三个方面逐一分析。2. 理论在设计高可用架构理论方面,我们主要有2个方向选择,分别是CAP理论和BASE理论,那什么是CAP,什么是BASE呢? 这个还是要好好分析一下。2.1 CAPC(Consistence):一致性A(Availability):可用性P(Partition Tolerance):分区容错性一致性:指的是从所有节点获取的数据都是
2021-08-10 19:41:11 132
原创 高性能架构
上一篇文章初识架构让我们对架构设计的复杂度考虑有了一定了解,主要有个高可用、高性能、可扩展。但仅仅知道是不够用的,接下来,将从高性能来进行详细分享1. 高性能数据库从数据库分享高性能,主要是两个方面分别是:1.1 读写分离读写分离的主要原理是将读和写分散到不同的节点上1.1.1 实现方式数据库搭建主从模式,一主多从或一主一从。主服务器负责写, 从服务器负责读。从服务器通过复制的方式从主服务器同步数据。在业务域实现分别有两种方式:从代码层面实现。主要是代码封装,通过将读写请求分离出,请求不同
2021-07-11 18:37:17 97
原创 RestTemplate打印日志的正确姿势
背景现在随着微服务的逐渐发展,越来越多的公司开始采用微服务架构,但随之而来的问题是,服务间如何调用,如何还能负载均衡,还必须开箱即用?答案就是Spring的RestTemplate啦(并不一定要使用RestTemplate,也不一定要是微服务架构,涉及到Http调用的服务,方式都可以,我这个是为了引出主题),但伴随而来的是一个问题,如何打印好日志,留下现场(防止扯皮),这才是我们关心的。这也是我们这篇文章的主题-RestTemplate打印日志的正确姿势。好了,不凑字数了,接下来进入正文。1. 老实人干
2021-06-22 20:15:08 3425 4
原创 架构设计初识
由于各种原因,好久没有写文章了。最近学习了一下架构设计方面的知识,拿来和大家分享一下。1. 架构是什么架构是什么,大家能都说出一二,每个人对架构的理解又不尽相同。但对于架构,我们有几个模糊相似的概念需要知道,分别是:系统与子系统,模块与组件,框架与架构。来说说这几种概念的区别。1. 系统与子系统1. 系统维基百科的解释是:系统泛指由一群有关联的个体组成,根据某种规则运作,能完成个别元件不能单独完成的工作的群体。抽象成三部分,分别为:关联(有关联的个体),规则(根据某种规则运作),能力(完成
2021-06-14 11:42:45 1161
原创 如何定义错误码
好久没有写文章了,搞得不知道写啥,最近遇到了一个问题,决定把东西总结一下,记录下来。1. 背景最近开发,发现遇到了一个问题,那就是关于如何定义错误码。写代码写着写着迷糊了,突然发现不知道如何定义错误码,错误码对我们来说,到底有什么用?今天我结合自己的实现,来说一下如何定义错误码2. 处理错误的方式在Spring时代,spring提供的ControllerAdvice,RestControllerAdvice给我们集中处理异常提供了一种很好的解决方案。我们也经常用这样的方式来解决方案。但是,结合我们一
2021-03-24 21:54:33 2590
原创 OpenFeign和Consul爱恨交织的两天
1. 背景在公司对项目进行拆分,用consul做注册中心。既然弄注册中心了, 那就得远程调用,那就得整上OpenFeign进行远程调用,你说是不? 不能说就搞个RestTemplate+服务名调用吧?想法有了,说动就动,就对项目就行拆分,在拆分的过程中,就把我学到的拿出来和大家分享分享。(我也是第一次用consul,没啥经验)2. 爱与恨2.1 恨2.1.1 远程调用失败在信息远程接口调用时,一直抛出异常:Load balancer does not have available server f
2020-11-19 22:35:38 705
原创 Nacos如何实现服务自动注册
1. 背景接着上次的说,Nacos问题的分析。这次就来分享一下自己的分析方法。以及如何利用Spring事件完成服务注册。2. 分析一下2.1 问题分析过程问题是这样的,我以为是Nacos服务注册不上吗? 那就肯定是注册有问题了, 那就去找是服务是如何注册的。关键是从哪找呢?具体步骤:知道服务启动方式。如Nacos,就是通过properties,那就找哪有用到启动的属性文件项目用SpringBoot集成,那核心类的加载就在Spring.factories中。(这个文件会被springSPI加载
2020-09-19 22:52:56 3201
原创 Spring事件执行流程源码分析
1. 背景为啥突然想到写这个?起因就是看到了Nacos的#3757 ISSUE,理解错误, 以为是服务启动,没有注册上服务,实际namespace不同,导致服务无法注册。 但这丝毫不影响再去研究了一波代码,顺便也看到了Nacos是如何利用Spring的事件来进行服务注册的。分享一波,欢迎大家学习指正!2. 娓娓道来 - Spring事件2.1 怎么发布事件我们大家应该都知道,在Spring中,是通过实现org.springframework.context.ApplicationEventPubli
2020-09-13 22:35:06 171
原创 Rust特征与泛型区别点
1. Rust的特征与泛型1.1 先上特征代码:use std::boxed::Box;// 定义一个特征pub trait Animal{ fn bark(&self);}pub struct Dog{ pub name: String,}pub struct Chicken{ pub name: String,}// 实现一个特征impl Animal for Dog{ fn bark(&self){ printl
2020-08-16 14:10:25 389
原创 CompletableFuture运行流程源码详解
1. 背景CompletableFuture用起来着实舒服,代码一写,异步跑起来,时间缩短了不少(一个IO任务单线程40多分钟,用上多线程CompletableFuture,直接变成7分钟了)。代码是用起来了, 很舒服,但是里面的原理,想必有些大兄弟还不怎么清楚。今天就来一步步分析一下运行流程。2. 上代码CompletableFuture可以通过构造函数或者提供的方法构造一个CompletableFuture对象。我们今天就以CompletableFuture#supplyAsync方法来讲解。直接
2020-07-29 14:38:19 626
原创 Rust多线程数据共享
1. 怎么创建线程我们都知道Java中通过实现Runnable接口或继承Thread类,来完成一个线程的创建,那么在Rust中是如何实现一个线程的呢?代码如下。fn how_to_create_a_thread(){ // 创建一个线程 let thread_handle = thread::spawn(|| { println!("Thread inner"); }); // 阻塞线程,并等待其自己执行完毕 thread_handle.join().u
2020-07-17 21:32:38 1483
原创 Mybatis 缓存 源码分析
文章目录1. 结论2. Show code2.1 SimpleExecutor2.2 CacheExecutor3 细说1. 结论老规矩,先说结论。给各位大兄弟来点总结。mybatis有两级缓存,分别是:SqlSession级别Mapper级别想必大家都对这个结论不陌生,但是有许多人其实并不明白具体原因。所以今天就和各位大兄弟一起来探讨一下具体代码。2. Show code这个缓存就得从创建执行器开始,org.apache.ibatis.session.Configuration#new
2020-07-05 14:26:44 189
原创 mybatis执行过程源码分析
1 总结代码有些多,怕有的大兄弟耐不下心, 就先写一个总结。mybatis的的大概流程是这样的:通过解析配置文件分析mapper文件和接口,生成代理对象。根据配置文件,创建会话通过会话拿到代理对象通过代理对象,执行具体方法,将接口和sql关联,并执行。Note: mybatis version --3.4.62 代码示例public void howToUseMybatis() throws Exception { String confLocation = "myb
2020-06-30 22:49:22 123
原创 springbean的生命周期
1. 背景有的大兄弟目前还停留在使用spring的过程,对spring的核心Bean还没有什么了解。今天就和大家从springBean的生命周期入手。2. 什么是生命周期生命周期就是指一个对象的生老病死。 嗯, 解释的很生动,形象。springBean的生命周期也就是一个Bean从出生,到死亡的过程。3. Show code3.1 入口入口: org.springframework.beans.factory.BeanFactory#getBean, 有时候,我们看代码并不是难事, 难的是如
2020-06-27 12:10:48 935
原创 01 AutoConfigurationImportSelector到底怎么初始化
1. 前言我们知道,在spring中,一般的实现ImportSelector接口,然后重写selectImports方法,就可以使用到spring的SPI技术,加载spring.factories中配置的org.springframework.boot.autoconfigure.EnableAutoConfiguration.EnableAutoConfiguration的类。抱着测试的心态,给@SpringBootApplication的注解上实现的SelectorAutoConfiguration
2020-05-27 11:35:14 3858 4
原创 Java开发工具与HelloWorld
环境装好了,那接下来就进入开发啦。在开发过程中,为了加快我们的开发速度,我们就要选择一款合适的IDE,接下来我们将介绍开发中使用到的IDE。(喜欢用txt直接开撸的老铁,可以直接跳过本文)1. IDE介绍1.1 IntelliJ Idea(以后使用)IntelliJ Idea 简称idea, 又jetbrain开发的一款集成工具。分为收费版、免费版以及教育版。教育版顾名思义,是用来教学的,也是学校使用的,可以发邮件申请教育版。 免费版和收费版功能有一些差别,就目前的我们来说,免费版就够用。差别如下图。
2020-05-25 21:45:45 205
原创 Java环境搭建
学习了java简介,接下来是如入门了。写代码我们需要工具,运行代码我们需要环境。那么,本文就从安装JAVA环境说起来。(用的名词从简介文章看一下)1. JDK的下载sun公司被oracle收购,我们从Oracle官方网站下载jdk,我们往下拉,找到JDK8版本。点进去,找到自己电脑对应的版本,进行下载。2. 安装JDK2.1 Windows双击压缩包进行安装,路径可以自己选择,一般我们直接装在C盘,例如。C:\Program Files\jdk\jdk8在安装完后,这个上面这个就是
2020-05-23 18:10:45 211
原创 Java简介
1. Java是什么 不要想得复杂, Java就是一种高级编程语言,让我们可以与计算机进行交流。啥叫高级?就是浅显易懂,和我们人的语言类似呗。 入门的我们,不需要考虑那么多。只要记住,Java是一门让我们和计算机沟通的一种语言。搞的复杂了,不利于记忆。2. 版本介绍 历史由来我们就不写在这,我们直接从版本开始介绍。 天下的大多数东西,一生出来,并都完美,都需要慢慢修修改改,缝缝补补,才能向完美进化。Java语言也也是这样。所以我们就介绍一下当前的版本信息。(14年以前,即1.8版本以
2020-05-22 15:47:14 203 2
原创 记一次线上事故
1. 事故发生某天晚上,收到系统CPU占用过高报警,立刻登录服务器查看cpu信息(top,命令即可),此时CPU占用率高达750%+, 查看GC日志,频繁的发生Full GC, 并且一次Full GC市场可达到6s,立刻使用jmap命令dump文件(命令:jmap -dump:file=heap.bin )。立刻重启服务,恢复一部分机器,保证服务可用。重启后,系统恢复正常。2. 堆栈分析把dump的文件从服务器弄下来,然后使用MAT工具分析(dump的文件有点大,注意调整MAT内存大小,对MAT不熟悉
2020-05-14 23:25:53 216
原创 用jdk8的stream来实现斐波那契数列
1. 为什么jdk8用着越来越舒服,各种API, 一顿操作,代码从上到下一气呵成,爽! 突然想到,怎么用stream来实现斐波那契数列?2. 说干就干斐波那契数列就是后一个数是前两个数的和,即 n = (n-1) + (n-2) [n >2],那我们去Stream的API中查询,有没有生成这种规则的stream呢?3. 查看API翻看API,有两个API是有可能的, 分别是:...
2020-04-29 12:15:16 564
原创 Nacos配置中心源码分析
1. 什么是Nacos ?Nacos主要用做注册中心和配置中心。Nacos介绍,Nacos用法, Nacos源码下载 etc… 请查看Nacos官方文档, 本文基于nacos版本1.2.0进行分析。2. Nacos代码入口从官方文档给的JAVA SDK 入手, 这样可以知道使用流程,也可以通过入口,分析代码。官方给的代码如下:try { String serverAddr = "...
2020-04-13 15:56:42 1164
原创 SPI简要分析
一、背景介绍 在看spring源码和dubbo源码的时候,发现两者都用采用了JDK中spi的技术,发现都有大作用,所以就来分析下JDK中的SPI的使用方式及源码实现。二、什么是SPI SPI的全称是 Service Provider Interface。 一种从特定路径下,将实现了某些特定接口的类加载到内存中的方式(为什么会如此说,请看后面分析)。提供了另外一种方式加载实现类,也降...
2020-03-26 23:25:46 225
原创 ReentrantReadWriteLock之读写锁判断
一. 读写锁是怎么实现的? 继承AQS,然后通过将AQS中的state转化为二进制,分为高16位和低16位来区分。高16位表示读状态,低16位为写状态。二. 解析表示方式(高低16位) 假设此时state是数值S a.写锁 在判断写锁时,通过 K=S&0X0000FFFF, 将高位全部抹掉,此时只有低16位,然后判断K是否大于0,K>0,表示有写锁,反...
2019-09-30 21:07:20 300
原创 Spring之byte[]传输
事出原因 某些原因,需要在在服务之间传输文件,想到只有通过Byte数组,或者是Stream传递,遂定下两方法,一个byte,一个inpustream,老样子,upload(@RequestParam("id")Integer id, (@RequestParam("filename")String filename,(@RequestParam("data") byte[] data),up...
2019-08-04 18:48:37 1159
原创 SpringBoot之Feign调用方式比较
一:事发原因 两个东家都使用SpringCloud,巴拉巴拉用上了Spring全家桶,从eureka到ribbon,从ribbon到feign,从feign到hystrix,然后在使用feign的时候发现使用方式不同,仔细一看这种调用方式,唉,麻烦,我怎么要自己定义DTO,自己定义Fallback, 自己定义方法呢?用上之后,其实发现各有各的好处,今天就来一一记录一下。二:方式1介绍...
2019-07-14 22:20:34 1373 2
原创 多线程分析之Semaphore
Semaphore分析由来 网上看了许多讲解Semaphore的,用Semaphore来实现顺序打印字母,但是可能大家都没有清楚具体的原因,所以来给大家分析下为什么可以使用Semaphore来实现顺序打印字母顺序。Semaphore源码分析 先打开JDK8源码中的Semaphore,可以看到Semaphore是通过继承AQS来现实功能(AQS,Doug Lea大神重写并发包的核心,...
2019-06-30 17:40:40 161
原创 HashMap1.8之节点删除分析
HashMap之节点删除 大家一直关注的都是HashMap如何添加节点,当节点数量大于8的时候转化为红黑树,否则使用链表等等,但大家是否有看过删除节点的处理逻辑呢? 今天来看看HashMap删除节点的神来之笔问题来源 在查看HashMap源码时,有个以下字段,在删除的时候,判断节点数量,最多在小于6的时候,会untreeifying(树转化为链表),在点击这个字段时发现,只有...
2019-06-16 21:44:16 887 3
原创 程序员记录之人性弱点
有感之人性的弱点 最近读了人性的弱点这本书,吾觉十分有意思,遂记录部分笔记,分享给在座的各位。 别人骑马我骑驴,看看后面推车汉,比上不足,比下有余。 别人在推车,而我已经可以骑驴,别人依旧对生活充满向往,充满希望,为什么我还要沮丧,还要懊恼? 我应该更加积极,阳光,向上,努力,奋斗。1. 批评我不愿意说任何人的坏话,我只说我所认识的每一个人的一切优点。 任何傻子都会批评、...
2019-06-08 14:38:27 459
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人