<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[KIMTOU的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/KIMTOU</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; KIMTOU]]></copyright><item><title><![CDATA[Aviator 表达式求值引擎——使用自定义函数应对复杂的业务场景]]></title><link>https://blog.youkuaiyun.com/KIMTOU/article/details/129237396</link><guid>https://blog.youkuaiyun.com/KIMTOU/article/details/129237396</guid><author>KIMTOU</author><pubDate>Mon, 27 Feb 2023 11:52:53 +0800</pubDate><description><![CDATA[自定义函数只需要实现接口，并注册到 AviatorEvaluator 即可使用。AviatorFunction 接口十分庞大，通常来说你并不需要实现所有的方法，只要根据你的方法的参数个数，继承AbstractFunction类并重写相应方法即可。]]></description><category></category></item><item><title><![CDATA[前端学习笔记（Vue、TypeScript、JavaScript）]]></title><link>https://blog.youkuaiyun.com/KIMTOU/article/details/128580731</link><guid>https://blog.youkuaiyun.com/KIMTOU/article/details/128580731</guid><author>KIMTOU</author><pubDate>Fri, 06 Jan 2023 16:30:21 +0800</pubDate><description><![CDATA[function 函数名(参数) {// 函数体 return 结果;js 中的函数调用特点：对参数的类型和个数都没有限制，例如// 返回 ab add(4 , 5 , 6);// 返回 9, 第三个参数没有被用到, 不会报错 add(1);// 返回 NaN, 这时 b 没有定义是 undefined, undefined 做数学运算结果就是 NaN再新建 store 目录来管理共享数据，下面是 /src/store/UserInfo.tsreturn {${return {]]></description><category></category></item><item><title><![CDATA[Dubbo入门实战（SpringBoot + Nacos）]]></title><link>https://blog.youkuaiyun.com/KIMTOU/article/details/127996138</link><guid>https://blog.youkuaiyun.com/KIMTOU/article/details/127996138</guid><author>KIMTOU</author><pubDate>Wed, 23 Nov 2022 22:25:12 +0800</pubDate><description><![CDATA[本文主要介绍 Dubbo 3.0 整合 SpringBoot 的样例，这里使用 Nacos 作为注册中心，读者也可以使用 Zookeeper，项目结构为：

接口服务 interface-service

一、定义实体类
注意要实现  接口。
二、定义接口

UserService



OrderService



服务提供者 user-service-provider

一、application.yml

二、UserService实现类
核心注解  用于暴露 Dubbo 服务。
三、启动类
注解 ]]></description><category></category></item><item><title><![CDATA[Sentinel 滑动窗口实现原理（源码分析）]]></title><link>https://blog.youkuaiyun.com/KIMTOU/article/details/126290068</link><guid>https://blog.youkuaiyun.com/KIMTOU/article/details/126290068</guid><author>KIMTOU</author><pubDate>Thu, 11 Aug 2022 18:06:00 +0800</pubDate><description><![CDATA[我们知道，Sentinel 可以用来帮助我们实现流量控制、服务降级、服务熔断，而这些功能的实现都离不开接口被调用的实时指标数据，本文便是关于 Sentinel 是如何实现指标数据统计的。上图中的右上角就是滑动窗口的示意图，是 StatisticSlot 的具体实现。StatisticSlot 是 Sentinel 的核心功能插槽之一，用于统计实时的调用数据。，底层采用高性能的滑动窗口数据结构 LeapArray 来统计实时的秒级指标数据，可以很好地支撑写多于读的高并发场景。...]]></description><category></category></item><item><title><![CDATA[SpringCloud学习——SpringCloud Alibaba Sentinel]]></title><link>https://blog.youkuaiyun.com/KIMTOU/article/details/125360056</link><guid>https://blog.youkuaiyun.com/KIMTOU/article/details/125360056</guid><author>KIMTOU</author><pubDate>Sun, 19 Jun 2022 17:30:34 +0800</pubDate><description><![CDATA[随着微服务的流行，服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点，从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。是分布式系统的流量防卫兵。Sentinel 的主要特性：jar 包启动：。



流量控制


资源名：唯一名称，默认请求路径。针对来源：Sentinel可以针对调用者进行限流，填写微服务名，默认default（不区分来源）。阈值类型/单机阈值：是否集群：不需要集群。流控模式：流控效果/手段：现代微服务架构都是分布式的，由非常多的服务组成。不同服务之间相互调]]></description><category></category></item><item><title><![CDATA[SpringCloud学习——Histrix服务限流、降级、熔断]]></title><link>https://blog.youkuaiyun.com/KIMTOU/article/details/125359690</link><guid>https://blog.youkuaiyun.com/KIMTOU/article/details/125359690</guid><author>KIMTOU</author><pubDate>Sun, 19 Jun 2022 17:01:34 +0800</pubDate><description><![CDATA[服务降级指的是当服务器压力剧增的情况下，为了保证核心功能的可用性 ，而选择性的降低一些功能的可用性，或者直接关闭该功能。服务降级是从整个系统的负荷情况出发和考虑的，对某些负荷会比较高的情况，为了预防某些功能（业务场景）出现负荷过载或者响应慢的情况，在其内部暂时舍弃对一些非核心的接口和数据的请求，而直接返回一个提前准备好的 fallback 兜底处理。这样，虽然提供的是一个有损的服务，但却保证了整个系统的稳定性和可用性。现代微服务架构都是分布式的，由非常多的服务组成。不同服务之间相互调用，组成复杂的调用链路。]]></description><category></category></item><item><title><![CDATA[SpringCloud学习——配置中心]]></title><link>https://blog.youkuaiyun.com/KIMTOU/article/details/125358836</link><guid>https://blog.youkuaiyun.com/KIMTOU/article/details/125358836</guid><author>KIMTOU</author><pubDate>Sun, 19 Jun 2022 16:05:36 +0800</pubDate><description><![CDATA[在分布式微服务系统中，几乎所有服务的运行都离不开配置文件的支持，这些配置文件通常由各个服务自行管理，以 properties 或 yml 格式保存在各个微服务的类路径下，例如 application.properties 或 application.yml 等。这种将配置文件散落在各个服务中的管理方式，存在以下问题：SpringCloud Config 为微服务架构中的微服务提供集中化的外部配置支持，配置服务器为各个不同微服务应用的所有环境提供了一个中心化的外部配置。SpringCloud Config 分]]></description><category></category></item><item><title><![CDATA[SpringCloud学习——服务网关Gateway]]></title><link>https://blog.youkuaiyun.com/KIMTOU/article/details/125358415</link><guid>https://blog.youkuaiyun.com/KIMTOU/article/details/125358415</guid><author>KIMTOU</author><pubDate>Sun, 19 Jun 2022 15:36:06 +0800</pubDate><description><![CDATA[在微服务架构中，一个系统往往由多个微服务组成，而这些服务可能部署在不同机房、不同地区、不同域名下。这种情况下，客户端（例如浏览器、手机、软件工具等）想要直接请求这些服务，就需要知道它们具体的地址信息，例如 IP 地址、端口号等。这种客户端直接请求服务的方式存在以下问题：API 网关是一个搭建在客户端和微服务之间的服务，我们可以在 API 网关中处理一些非业务功能的逻辑，例如权限验证、监控、缓存、请求路由等。API 网关就像整个微服务系统的门面一样，是系统对外的唯一入口。有了它，客户端会先将请求发送到 API]]></description><category></category></item><item><title><![CDATA[SpringCloud学习——服务调用与负载均衡（Ribbon、OpenFeign）]]></title><link>https://blog.youkuaiyun.com/KIMTOU/article/details/125358337</link><guid>https://blog.youkuaiyun.com/KIMTOU/article/details/125358337</guid><author>KIMTOU</author><pubDate>Sun, 19 Jun 2022 15:32:27 +0800</pubDate><description><![CDATA[Spring Cloud Ribbon 是一套基于 Netflix Ribbon 实现的客户端负载均衡和服务调用工具。Ribbon 会从服务注册中心（如 Eureka Server）中获取服务端列表，然后通过某种负载均衡策略（如简单轮询、随机连接等）将请求分摊给多个服务提供者，从而达到负载均衡的目的。负载均衡（Load Balance） ，简单点说就是将用户的请求平摊分配到多个服务器上运行，以达到扩展服务器带宽、增强数据处理能力、增加吞吐量、提高网络的可用性和灵活性的目的。常见的负载均衡方式有两种：服务端负]]></description><category></category></item><item><title><![CDATA[MySQL主从延迟的解决方案]]></title><link>https://blog.youkuaiyun.com/KIMTOU/article/details/125033199</link><guid>https://blog.youkuaiyun.com/KIMTOU/article/details/125033199</guid><author>KIMTOU</author><pubDate>Sun, 29 May 2022 17:29:51 +0800</pubDate><description><![CDATA[之前项目中基于 MySQL 主从复制以及 AOP 的方式实现了读写分离，也写了博客记录了这个实现过程，《SpringBoot实现MySQL读写分离》。
既然配置了 MySQL 主从复制，那么自然会存在主从延迟，如何尽可能减小主从延迟对应用系统的影响是很有必要的思考点，我个人认为主从延迟的解决方案正是实现读写分离、MySQL 主从复制的精髓。
关于这个话题其实我之前就想着写篇博客分享一下，但一直没有提上日程。最近有读者在《SpringBoot实现MySQL读写分离》 这篇博客中留言问到了这个问题，这也激励我写]]></description><category></category></item><item><title><![CDATA[SpringCloud学习——服务注册中心（Eureka、ZooKeeper、Nacos）]]></title><link>https://blog.youkuaiyun.com/KIMTOU/article/details/125012576</link><guid>https://blog.youkuaiyun.com/KIMTOU/article/details/125012576</guid><author>KIMTOU</author><pubDate>Fri, 27 May 2022 23:20:41 +0800</pubDate><description><![CDATA[文章目录服务注册中心Eureka架构设计服务注册与发现的流程环境配置Eureka ServerEureka Client集群搭建Eureka 自我保护模式ZooKeeperNacosNacos 的特性基本架构服务注册与发现 Discovery服务提供者注册服务消费者注册和负载均衡Nacos 支持 AP 和 CP 模式的切换

服务注册中心
在微服务架构中，一个系统通常被拆分为多个模块 / 服务，此时就涉及到模块之间的服务调用问题。
在服务是单实例情况下，可以采用点对点的 HTTP 直接调用，即 IP + .]]></description><category></category></item><item><title><![CDATA[Zookeeper实战——分布式锁实现以及原理]]></title><link>https://blog.youkuaiyun.com/KIMTOU/article/details/124846719</link><guid>https://blog.youkuaiyun.com/KIMTOU/article/details/124846719</guid><author>KIMTOU</author><pubDate>Wed, 18 May 2022 17:15:44 +0800</pubDate><description><![CDATA[文章目录Zookeeper 分布式锁实现原理具体流程代码实现客户端创建工厂类创建 Lock 锁接口Lock 实现类（ZkLock）自定义 ZK 分布式锁测试独占锁 &amp; 共享锁Curator 实现分布式锁ZooKeeper 分布式锁的优缺点

分布式锁是控制分布式系统之间同步访问共享资源的一种方式。分布式锁的实现方式有很多种，比如 Redis 、数据库 、zookeeper 等。这篇文章主要介绍用 Zookeeper 实现分布式锁。
Zookeeper 分布式锁实现原理
先说结论：Zookeeper.]]></description><category></category></item><item><title><![CDATA[哈夫曼树 & 哈夫曼编码]]></title><link>https://blog.youkuaiyun.com/KIMTOU/article/details/124712277</link><guid>https://blog.youkuaiyun.com/KIMTOU/article/details/124712277</guid><author>KIMTOU</author><pubDate>Wed, 11 May 2022 16:01:59 +0800</pubDate><description><![CDATA[哈夫曼树
哈夫曼树的定义：设二叉树具有 n 个带权值的叶节点，那么从根节点到各个叶节点的路径长度与相应叶节点权值的乘积的和，叫作二叉树的带权路径长度 WPL (Weighted Path Length)。具有最小带权路径长度的二叉树称为哈夫曼树 (Huffman Tree)，也称为最优二叉树。权值较大的结点离根较近。
构造哈夫曼树的原则（贪心思想）：

权值越大的叶节点越靠近根节点
权值越小的叶节点越远离根节点

哈夫曼编码
哈夫曼编码就是规定哈夫曼树中的左分支为 0，右分支为 1，从根节点到每个叶节点所经]]></description><category></category></item><item><title><![CDATA[从 Reactor 模式看 Netty、Redis 线程模型]]></title><link>https://blog.youkuaiyun.com/KIMTOU/article/details/124623327</link><guid>https://blog.youkuaiyun.com/KIMTOU/article/details/124623327</guid><author>KIMTOU</author><pubDate>Sat, 07 May 2022 09:56:05 +0800</pubDate><description><![CDATA[Reactor 模式
目前存在的线程模型有：传统阻塞 I/O 服务模型 和 Reactor 模式。
Reactor 模式是基于事件驱动开发的，核心组成部分包括 Reactor 和线程池，其中 Reactor 负责监听和分发事件，线程池负责处理事件。Reactor 分为三种模型：

单线程模型 (单 Reactor 单线程)
多线程模型 (单 Reactor 多线程)
主从多线程模型 (多 Reactor 多线程)

单 Reactor 单线程
Reactor 和 Handler 都在同一个线程中执行，即 s]]></description><category></category></item><item><title><![CDATA[Netty 基本概念以及核心组件]]></title><link>https://blog.youkuaiyun.com/KIMTOU/article/details/124623245</link><guid>https://blog.youkuaiyun.com/KIMTOU/article/details/124623245</guid><author>KIMTOU</author><pubDate>Sat, 07 May 2022 08:57:41 +0800</pubDate><description><![CDATA[Netty 概述
Netty 是一个异步事件驱动的网络应用程序框架，用于快速开发高性能、高可靠的网络 IO 程序。Netty 是基于 NIO 的，它封装了 jdk 的 NIO，让我们使用起来更加方法灵活。

Netty 是一个异步的、基于事件驱动的网络应用框架，用以快速开发高性能、高可靠性的网络 IO 程序。
Netty 本质是一个基于 Java NIO 的框架，适用于服务器通讯相关的多种应用场景。
Netty 主要针对在 TCP 协议下，面向客户端的高并发应用，或者 Peer-to-Peer 场景下的大量]]></description><category></category></item><item><title><![CDATA[Netty入门实战——TCP服务、群聊系统的实现]]></title><link>https://blog.youkuaiyun.com/KIMTOU/article/details/124561420</link><guid>https://blog.youkuaiyun.com/KIMTOU/article/details/124561420</guid><author>KIMTOU</author><pubDate>Tue, 03 May 2022 21:05:14 +0800</pubDate><description><![CDATA[TCP 服务
Netty 服务器在 6667 端口监听，客户端上线后发送消息给服务器，服务器接收并回复消息给客户端。总的来说就是一来一回。
NettyServer 服务器启动类
public class NettyServer {

    private static final int PORT = 6667;

    public static void main(String[] args) {
        //1.创建两个线程组 BossGroup、WorkerGroup
        E]]></description><category></category></item><item><title><![CDATA[NIO 网络编程——群聊系统实现]]></title><link>https://blog.youkuaiyun.com/KIMTOU/article/details/124518260</link><guid>https://blog.youkuaiyun.com/KIMTOU/article/details/124518260</guid><author>KIMTOU</author><pubDate>Sat, 30 Apr 2022 20:42:56 +0800</pubDate><description><![CDATA[在使用 NIO 之前，我们先来看一下传统 BIO 阻塞 IO 的实现。
Java BIO 工作机制
Java BIO 就是传统的 Java I/O 编程，其相关的类和接口在 java.io。
BIO(BlockingI/O)：同步阻塞，服务器实现模式为一个连接一个线程，即客户端有连接请求时服务器端就需要启动一个线程进行处理，如果这个连接不做任何事情会造成不必要的线程开销，可以通过线程池机制改善（实现多个客户连接服务器）。Java BIO 工作流程：

服务器端启动一个 ServerSocket。
客户端启动]]></description><category></category></item><item><title><![CDATA[Java NIO 基本原理以及三大核心组件]]></title><link>https://blog.youkuaiyun.com/KIMTOU/article/details/124517889</link><guid>https://blog.youkuaiyun.com/KIMTOU/article/details/124517889</guid><author>KIMTOU</author><pubDate>Sat, 30 Apr 2022 20:34:33 +0800</pubDate><description><![CDATA[NIO 非阻塞I/O
Java NIO 基本介绍

Java NIO 全称 Java non-blocking IO，是指 JDK 提供的新 API。从 JDK1.4 开始，Java 提供了一系列改进的输入/输出的新特性，被统称为 NIO（即 NewIO），是同步非阻塞的。
NIO 有三大核心部分：Channel（通道）、Buffer（缓冲区）、Selector（选择器） 。
NIO 是面向缓冲区/块编程的。数据读取到一个它稍后处理的缓冲区，需要时可在缓冲区中前后移动，这就增加了处理过程中的灵活性，使用它可]]></description><category></category></item><item><title><![CDATA[回顾我的第一次实习——少年的逐梦之旅]]></title><link>https://blog.youkuaiyun.com/KIMTOU/article/details/124427227</link><guid>https://blog.youkuaiyun.com/KIMTOU/article/details/124427227</guid><author>KIMTOU</author><pubDate>Tue, 26 Apr 2022 14:43:18 +0800</pubDate><description><![CDATA[前记
四月底了，暑期实习招聘也渐入尾声，这次春招获得的机会其实挺少的，但至少最心仪的公司都给了面试机会。可惜的是，虽然能够走到流程的最后，却还是因为各种原因与 offer 失之交臂。最终接了之前从未考虑过的公司的 offer。虽然挺可惜的，但人生还是要向前看，坚定地向未来奔跑，付出终究能获得回报。
其实这次拿到的 offer 是我的第二份实习了，在去年 7 月开始，也就是大二暑假，我拿到了虎牙 Java 开发实习生的日常实习 offer，也开启了我的第一次实习之旅。现在也过去有半年了，之前一直没有写篇博客总]]></description><category></category></item><item><title><![CDATA[Redis高可用的基石——主从复制]]></title><link>https://blog.youkuaiyun.com/KIMTOU/article/details/121734296</link><guid>https://blog.youkuaiyun.com/KIMTOU/article/details/121734296</guid><author>KIMTOU</author><pubDate>Sun, 05 Dec 2021 19:59:38 +0800</pubDate><description><![CDATA[Redis 支持主从同步，提供 Cluster 集群部署模式，通过 Sentinel 哨兵来监控 Redis 主服务器的状态。以此来保证 Redis 的高可用，则主从复制正是高可用的基石。
一主多从，主负责写，并且将数据复制到其它的 slave 节点，从节点负责读。所有的读请求全部走从节点。这样也可以很轻松实现水平扩容，支撑读高并发。从节点的数据来自主节点，实现原理就是主从复制机制。
主从复制过程
主从复制过程大体可以分为3个阶段：连接建立阶段（即准备阶段）、数据同步阶段、命令传播阶段。
连接建立阶段

保]]></description><category></category></item></channel></rss>