<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Bballchen的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/Bballchen</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Bballchen]]></copyright><item><title><![CDATA[《深入理解Kafka核心设计与实践原理》读书笔记]]></title><link>https://blog.youkuaiyun.com/Bballchen/article/details/120383052</link><guid>https://blog.youkuaiyun.com/Bballchen/article/details/120383052</guid><author>Bballchen</author><pubDate>Sun, 19 Sep 2021 18:39:36 +0800</pubDate><description><![CDATA[Kafka为什么不支持减少分区

代码逻辑是可以实现，但是比较复杂，而且使用场景很少，完全可以新建一个topic去替代

第一，如果不保留原来分区的消息，可靠性得不到保障。

第二，把消息移到其他分区的话，如果直接存储到尾部则会破坏消息的时间戳排序，如果要做时间排序则会移动队列消息，消息很大的话，内部复制会占用很大资源。同时事务性，分区和副本问题都要考虑。



删除主题方式

第一，使用kafka.topics.sh脚本，会在zk生成一个标记节点，标记主题删除状态，然后kafka去删除。

第二，手动删除]]></description><category></category></item><item><title><![CDATA[《Redis深度历险：核心原理与应用实践》读书笔记]]></title><link>https://blog.youkuaiyun.com/Bballchen/article/details/119814692</link><guid>https://blog.youkuaiyun.com/Bballchen/article/details/119814692</guid><author>Bballchen</author><pubDate>Fri, 20 Aug 2021 01:29:29 +0800</pubDate><description><![CDATA[5种基础数据结构（还有其他高级结构）

需要再研究数据类型内部的结构-ziplist，int数组。

1.string（字符串）：可以存int，string，byte[]。相当于ArrayList，数组保存字符，有数据冗余，长度小于1M时扩容是扩一倍，长度大于1M时，扩容最多是1M，最多是512M。刚创建是len和capacity一样大，因为大部分情况不会append。如果保存的是整数，那么可以做累计，set age 30， incr age。最大最小是long的最大最小值。

redis存字符串的最大长度]]></description><category></category></item><item><title><![CDATA[《从Paxos到ZooKeeper分布式一致性原理与实践》读书笔记]]></title><link>https://blog.youkuaiyun.com/Bballchen/article/details/119396301</link><guid>https://blog.youkuaiyun.com/Bballchen/article/details/119396301</guid><author>Bballchen</author><pubDate>Thu, 05 Aug 2021 00:18:59 +0800</pubDate><description><![CDATA[目录

ZK原生API

ZkClient

叶子节点的监听和限制

Curator客户端

ZK的典型应用场景

ZK两个特性

ZK加锁和master选举原理

各个服务器角色介绍

数据与存储

ZK初始化

ZK原生API

1. api是异步连接，但可以同步创建节点

2. 保存字节数组

3. 不能递归创建节点，只能在父节点下面创建子节点

4. 只能删除叶子节点

5. 事件通知要反复注册Watcher，客户端需要反复调用方法去注册（因为服务端保存Watcher在列表里，每次触发会做清理，如果]]></description><category></category></item><item><title><![CDATA[《深入理解Dubbo原理与实践》读书笔记]]></title><link>https://blog.youkuaiyun.com/Bballchen/article/details/119306854</link><guid>https://blog.youkuaiyun.com/Bballchen/article/details/119306854</guid><author>Bballchen</author><pubDate>Mon, 02 Aug 2021 00:40:22 +0800</pubDate><description><![CDATA[目录

第1章 Dubbo-高性能RPC通信框架

第2章 开发第一款Dubbo应用程序

第4章 Dubbo扩展点加载机制

第5章 Dubbo启停原理解析

第6章 Dubbo远程调用

第7章 Dubbo集群容错

第8章 Dubbo扩展点

第9章 Dubbo高级特性

第10章 Dubbo过滤器

第11章 Dubbo注册中心扩展实践

第13章 Dubbo未来展望

第1章 Dubbo-高性能RPC通信框架

1.1 应用架构演进过程：EJB单体 --&gt; 垂直化服务（ MVC ）--&gt]]></description><category></category></item><item><title><![CDATA[《深入理解Java虚拟机》读书笔记]]></title><link>https://blog.youkuaiyun.com/Bballchen/article/details/118286373</link><guid>https://blog.youkuaiyun.com/Bballchen/article/details/118286373</guid><author>Bballchen</author><pubDate>Mon, 28 Jun 2021 03:21:41 +0800</pubDate><description><![CDATA[中心主题
第1章 走进Java
虚拟机介绍

Graal VM：在HotSpot的基础上增强的全栈虚拟机。
HotSpot：热点检测，运行时间越长性能越好。第一次运行慢。版本升级：支持模块化，可以裁剪功能，重构垃圾收集器接口
Substrate VM：提前编译，启动时间和内存占用少

Java技术体系

JRE：基础类库，Java虚拟机，集成库，用户界面API
JKD=JRE+Java语言+工具及工具API

第2章 Java内存区域与内存溢出异常
运行时内存数据区域


线程共享

1.堆。几乎所有对象实]]></description><category></category></item><item><title><![CDATA[《高性能MySQL》读书笔记]]></title><link>https://blog.youkuaiyun.com/Bballchen/article/details/117404989</link><guid>https://blog.youkuaiyun.com/Bballchen/article/details/117404989</guid><author>Bballchen</author><pubDate>Sun, 30 May 2021 20:28:45 +0800</pubDate><description><![CDATA[高性能MySQL
存储引擎和事务
InnoDB引擎


MySQL5.5（包括）默认引擎，行级锁，支持事务


事务隔离级别：默认是可重复读（RR）


MVCC


多版本并发控制


基于undo来实现，每条记录都有隐藏的事务id字段，回滚指针字段，删除flag字段，以及构建聚族索引的rowid。


快照读

基于read view，第一次查询的时候才会生效，相当于框定了查询记录的版本号范围。select是快照读，不加锁



当前读

读取数据的最新版本，插入/更新/删除操作，都是当前读，需要加锁
]]></description><category></category></item><item><title><![CDATA[SpringCloudGateway注册发现源码分析]]></title><link>https://blog.youkuaiyun.com/Bballchen/article/details/115409535</link><guid>https://blog.youkuaiyun.com/Bballchen/article/details/115409535</guid><author>Bballchen</author><pubDate>Fri, 02 Apr 2021 23:33:44 +0800</pubDate><description><![CDATA[上一篇文章简单地介绍了SpringCloudGateway配合Eureka来实现服务的注册与发现，本篇我们进入的SCG的源码来看看它是如何实现的。
首先来弄明白，服务发现是何时启动的，其实在SCG的启动文件里有服务发现的引导类：

进入到GatewayDiscoveryClientAutoConfiguration，可以发现如下代码，看到配置就明白了，只要我们在配置文件中设置这spring.cloud.gateway.discovery.locator.enabled=true，则服务注册发现就会注入Dis]]></description><category></category></item><item><title><![CDATA[SpringCloudGateway配合注册中心的使用]]></title><link>https://blog.youkuaiyun.com/Bballchen/article/details/115388518</link><guid>https://blog.youkuaiyun.com/Bballchen/article/details/115388518</guid><author>Bballchen</author><pubDate>Fri, 02 Apr 2021 00:53:17 +0800</pubDate><description><![CDATA[SpringCloudGateway是微服务中的一员，其结合注册中心的使用场景是比较常见的，比如在统一鉴权方面，一般是向网关发起访问某个服务的请求，网关校验客户端是否登录，验证通过才向目标服务发起调用，目标服务的地址是从注册中心获取，而不是通过配置文件或者java类配置了。

...]]></description><category></category></item><item><title><![CDATA[Spring Cloud Gateway各种路由的配置与用途]]></title><link>https://blog.youkuaiyun.com/Bballchen/article/details/115365330</link><guid>https://blog.youkuaiyun.com/Bballchen/article/details/115365330</guid><author>Bballchen</author><pubDate>Thu, 01 Apr 2021 02:46:11 +0800</pubDate><description><![CDATA[Spring Cloud Gateway有多种方式配置路由

]]></description><category></category></item><item><title><![CDATA[Spring Cloud Gateway自定义Filter]]></title><link>https://blog.youkuaiyun.com/Bballchen/article/details/115340209</link><guid>https://blog.youkuaiyun.com/Bballchen/article/details/115340209</guid><author>Bballchen</author><pubDate>Wed, 31 Mar 2021 06:40:37 +0800</pubDate><description><![CDATA[今天我们来研究自定义Filter

]]></description><category></category></item><item><title><![CDATA[Spring Cloud Gateway源码分析：GatewayFilter的加载机制]]></title><link>https://blog.youkuaiyun.com/Bballchen/article/details/115315610</link><guid>https://blog.youkuaiyun.com/Bballchen/article/details/115315610</guid><author>Bballchen</author><pubDate>Tue, 30 Mar 2021 02:22:53 +0800</pubDate><description><![CDATA[要搞清楚GatewayFilter的加载流程得用剥洋葱方式，要一层一层深入进去，总感觉特别绕。其实我只是想看看GatewayFilterFactory是如何生成GatewayFilter的，正常逻辑是加载完配置就立刻生成GatewayFilter以备后面使用，但是SCG为了延迟加载route和缓存route，硬生生的把GatewayFilter的生成放在了第一次路由转发的时候。下面我们从读取配置文件的方式来理解GatewayFilter的加载。
1. GatewayProperties加载配置文件
在这里插]]></description><category></category></item><item><title><![CDATA[Spring Cloud Gateway：GlobalFilter和GatewayFilter的区别与联系]]></title><link>https://blog.youkuaiyun.com/Bballchen/article/details/115291695</link><guid>https://blog.youkuaiyun.com/Bballchen/article/details/115291695</guid><author>Bballchen</author><pubDate>Mon, 29 Mar 2021 02:10:46 +0800</pubDate><description><![CDATA[通过前面的学习，我们知道

]]></description><category></category></item><item><title><![CDATA[Spring Cloud Gateway学习笔记：DispatcherHandler的调用，filter链]]></title><link>https://blog.youkuaiyun.com/Bballchen/article/details/115258794</link><guid>https://blog.youkuaiyun.com/Bballchen/article/details/115258794</guid><author>Bballchen</author><pubDate>Sat, 27 Mar 2021 03:22:11 +0800</pubDate><description><![CDATA[今天的文章内容比较散，本来想搞明白请求是如何调到DispatcherHandler的，debug一通发现里面逻辑也太复杂了，全是Netty Reactor编程，这就无法啃了，留着后面去研究了。
这篇文章解答下昨天留的两个下问题，最后再添加一个Flux的相关使用方法。
1. DispatcherHandler上层调用
从debug的调试来看，可以确认DispatcherHandler是在HttpWebHandlerAdapter#handle方法中调用的，因此我们可以进一步总结出SCG的调用链路：HttpWe]]></description><category></category></item><item><title><![CDATA[Spring Cloud Gateway源码分析：请求是如何路由的]]></title><link>https://blog.youkuaiyun.com/Bballchen/article/details/115223074</link><guid>https://blog.youkuaiyun.com/Bballchen/article/details/115223074</guid><author>Bballchen</author><pubDate>Fri, 26 Mar 2021 02:28:04 +0800</pubDate><description><![CDATA[上一篇文章分析了route、predicate和filter的自动装配，但是还不清楚SCG（Spring Cloud Gateway简称）是如何把三个组件联系起来的，也不知道predicate和filter是如何做选择的，今天带着这些疑问，我们一起从源码中找出答案。
1. 请求分发
SCG是通过DispatcherHandler来做请求分发的，所有的请求会被拦截到这个类的handle方法做处理，其调用链大概是：
DispatcherHandler --&gt;RoutePredicateHandlerMap]]></description><category></category></item><item><title><![CDATA[Spring Cloud Gateway路由加载分析]]></title><link>https://blog.youkuaiyun.com/Bballchen/article/details/115192257</link><guid>https://blog.youkuaiyun.com/Bballchen/article/details/115192257</guid><author>Bballchen</author><pubDate>Thu, 25 Mar 2021 04:40:29 +0800</pubDate><description><![CDATA[1. 请求流程
前面分析过Spring Cloud Gateway由三个组件来完成请求的分发和增强，predicate判定走哪个路由route，然后经过各个过滤器的处理，大致的类图流程如下：

2. 源码分析
我们从源码中来看看上面三个类是如何加载的，基于Spring Boot的加载套路，我们可以从spring-cloud-gateway-server组件中找到META-INF/spring.factories文件，从配置的类里找出答案。进入GatewayAutoConfiguration类，可以发现这几个]]></description><category></category></item><item><title><![CDATA[Spring Cloud Gateway的应用场景]]></title><link>https://blog.youkuaiyun.com/Bballchen/article/details/115156800</link><guid>https://blog.youkuaiyun.com/Bballchen/article/details/115156800</guid><author>Bballchen</author><pubDate>Wed, 24 Mar 2021 01:56:14 +0800</pubDate><description><![CDATA[网关在微服务架构里相当于是客户端请求的一个总入口，有解耦和隐藏后端服务作用。除此之外，网关还有多种功能，本篇文章我们用SCG来模拟实现网关的各种应用场景
1. 流控（金丝雀发布，蓝绿发布）
目前很多公司都实现了生产不停机发布版本，在生产中同时存在新老版本代码，很多是通过ngnix来做流量的分流。发版时让流量都往老版本的服务走，等新版本发布完后再把流量慢慢切到新版本去验证，这就是所谓的金丝雀发布，也叫做蓝绿发布。下面我们用Spring Cloud Gateway来模拟实现这种分流
    @Bean
	pub]]></description><category></category></item><item><title><![CDATA[Spring Cloud Gateway源码分析-环境搭建以及入门使用]]></title><link>https://blog.youkuaiyun.com/Bballchen/article/details/115107669</link><guid>https://blog.youkuaiyun.com/Bballchen/article/details/115107669</guid><author>Bballchen</author><pubDate>Tue, 23 Mar 2021 04:14:19 +0800</pubDate><description><![CDATA[1、初次认识
Spring Cloud Gateway是Spring官方推荐使用一个代理网关，以后可能会替代掉Zuul。其基于Spring Boot 2.x，Spring WebFlux，Reactor之上来构建运行，但在使用时我们可以不用太关心底层的网络协议，只要熟悉它的配置规则就可以上手。总的来说，Spring Cloud Gateway跟其他网关类似，能够提供如下功能：

权限控制；
限流；
路由转发；
负载均衡；
黑白名单控制

Route、Predicate、Filter组成的三件套是我们学习Sp]]></description><category></category></item><item><title><![CDATA[Mockito单元测试的使用]]></title><link>https://blog.youkuaiyun.com/Bballchen/article/details/105211083</link><guid>https://blog.youkuaiyun.com/Bballchen/article/details/105211083</guid><author>Bballchen</author><pubDate>Wed, 22 Apr 2020 07:04:54 +0800</pubDate><description><![CDATA[作为一个java开发，如果不会用mock工具做单元测试是不合格的。mock可以理解为一个模拟对象，即一个替代者，可以替换掉依赖的对象，这样一来我们就可以把注意力集中在我们本省的业务代码逻辑，从而自我验证代码正确性。如下图所示，A类依赖了B类和C类

假如我们要测试A类，于是我们就需要Mock B和C，也就是用模拟的对象替换B和C

Mockito是一款优秀的mock工具，也可以叫做mocking框...]]></description><category></category></item><item><title><![CDATA[excel文件上传下载问题总结]]></title><link>https://blog.youkuaiyun.com/Bballchen/article/details/105183613</link><guid>https://blog.youkuaiyun.com/Bballchen/article/details/105183613</guid><author>Bballchen</author><pubDate>Sun, 29 Mar 2020 22:36:57 +0800</pubDate><description><![CDATA[最近做项目跟excel打交道比较多，很多业务需求涉及到excel文件的上传、解析和下载，在这个过程中，我们难免会遇到一些棘手的问题。下面我将对这些问题做一个描述，提供出我的解决方案以及思考和总结。
一、斜线的问题
考虑到要用poi来开发如下带有斜线的表格，我之前也没遇过这样的需求，在网上也苦苦找寻了许久，一直没答案。后来突然来了灵感，为何不用读取模板的方式呢，我们可以直接在模板上把这个斜线给画好。...]]></description><category></category></item><item><title><![CDATA[ThreadLocal的使用及原理]]></title><link>https://blog.youkuaiyun.com/Bballchen/article/details/104190714</link><guid>https://blog.youkuaiyun.com/Bballchen/article/details/104190714</guid><author>Bballchen</author><pubDate>Thu, 06 Feb 2020 14:53:00 +0800</pubDate><description><![CDATA[一、概述
ThreadLocal简单理解就是针对一个线程做资源的共享，通过set方法把某些资源放到线程中保存，然后通过get方法获取这个资源。它的出现解决了同一个线程中，不同类的方法中可以共享同一个对象或者变量。注意他不是为解决并发中多线程的资源共享（这种场景一般需要加锁），而是为了在多线程之间维护每个线程单独持有的资源（不需要加锁）。
可以想象ThreadLocal的使用场景是在一个线程中共享数...]]></description><category></category></item></channel></rss>