<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[诗与远方的博客]]></title><description><![CDATA[更多好文请关注公众号”慕容千语“]]></description><link>https://blog.youkuaiyun.com/Java_Caiyo</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Java_Caiyo]]></copyright><item><title><![CDATA[利用Spring的aop原理实现系统级日志管理]]></title><link>https://blog.youkuaiyun.com/Java_Caiyo/article/details/119055378</link><guid>https://blog.youkuaiyun.com/Java_Caiyo/article/details/119055378</guid><author>Java_Caiyo</author><pubDate>Sat, 24 Jul 2021 11:23:44 +0800</pubDate><description><![CDATA[日常开发中，我们常用的日志有两种，一种是业务日志，该类型主要用于记录系统中某些业务的变化或属性的改变，比如业务流转过程中记录状态的变化或对象属性的变化，此类型主要用于查询业务轨迹使用；另一种是系统日志，主要记录方法的调用信息，比如方法名称，参数以及调用者的名称、ip、调用时间等信息。本文结合项目中的实际情况，介绍下如何使用Spring的aop原理实现系统级日志管理。
核心代码
1.声明系统日志切面类并交给Spring容器管理
代码如下：
@Aspect
@Component
public class Sys]]></description><category></category></item><item><title><![CDATA[Redis之父实名认证“Redis实战文档”，你拥有了嘛？]]></title><link>https://blog.youkuaiyun.com/Java_Caiyo/article/details/119032114</link><guid>https://blog.youkuaiyun.com/Java_Caiyo/article/details/119032114</guid><author>Java_Caiyo</author><pubDate>Fri, 23 Jul 2021 15:12:49 +0800</pubDate><description><![CDATA[《Redis实战文档》将是一份把读者带入Redis世界、向读者指明正确方向从而避免常见陷阱的文档。我认为《Redis实战文档》对于Redis的生态系统非常有帮助，Redis 的用户应该都会喜欢这份文档。——Salvatore Sanfilippo，“Redis之父”]]></description><category></category></item><item><title><![CDATA[拿来吧你！原来我们之前都搞错了，Tomcat就该这么学才对！]]></title><link>https://blog.youkuaiyun.com/Java_Caiyo/article/details/118960856</link><guid>https://blog.youkuaiyun.com/Java_Caiyo/article/details/118960856</guid><author>Java_Caiyo</author><pubDate>Wed, 21 Jul 2021 14:37:49 +0800</pubDate><description><![CDATA[Apache Tomcat作为著名的Servlet容器实现以及轻量级Java应用服务器，是Apache软件基金会的顶级项目。

它开源、轻量，与JBoss、Weblogic 等企业级应用服务器相比，占用资源小，扩展性好，深受Java研发人员喜爱，尤其是在当前主流的基于POJO ( Without EJB )的轻量级编程方式下构建应用系统。
除此之外，Apache Tomcat还可以很容易与Apache Http Server、Nginx等知名的Web服务器集成，以实现负载均衡和集群化部署。所有这些特性都使.]]></description><category></category></item><item><title><![CDATA[浅析分布式主从架构下数据一致性问题]]></title><link>https://blog.youkuaiyun.com/Java_Caiyo/article/details/118862435</link><guid>https://blog.youkuaiyun.com/Java_Caiyo/article/details/118862435</guid><author>Java_Caiyo</author><pubDate>Sun, 18 Jul 2021 23:08:38 +0800</pubDate><description><![CDATA[主从架构
常见的主从架构，即为一主多从，常见的读写策略为写主读从，并由主节点写日志并通过网络传输来维护从节点的数据库状态，但是这个常见的策略会产生一系列的分布式数据一致性问题。
通常我们使用主从架构，主要是处于以下几个目的：

提高服务的容错性，即使一个节点崩溃了，还存在多个节点可以对外提供服务；
提高服务的响应速度与QPS，存在多个冗余节点可以对外提供服务，自然会降低响应的延迟与提高服务的承受能力；常见的使用策略为CDN，通过在全国各地部署服务器，使得用户可以通过请求最靠近自身的服务器而无需跨较远距离访问]]></description><category></category></item><item><title><![CDATA[面试官：浅析微服务下保证事务数据一致性的几种方案]]></title><link>https://blog.youkuaiyun.com/Java_Caiyo/article/details/118862252</link><guid>https://blog.youkuaiyun.com/Java_Caiyo/article/details/118862252</guid><author>Java_Caiyo</author><pubDate>Sat, 17 Jul 2021 20:43:51 +0800</pubDate><description><![CDATA[1. 从本地事务到分布式事务的演变
如依赖mysql的传统的单体式应用可以通过mysql基于锁+MVCC实现本地事务的ACID特性对上层应用提供一致的数据视图，而不会因为多个事务并发读写而产生脏读、脏写、更新丢失等问题；
本文会贯穿一个相对简单的创建订单的业务场景进行讨论：

存在一个订单服务-OrderService，通过createOrder()对外提供创建订单的功能；
依赖ConsumerService的consumerVerify()进行消费者信用额度的扣除，如果余额&gt;订单金额，则创建成功，否]]></description><category></category></item><item><title><![CDATA[什么是真正的架构设计？十年Java经验让我总结出了这些，不愧是我]]></title><link>https://blog.youkuaiyun.com/Java_Caiyo/article/details/118703682</link><guid>https://blog.youkuaiyun.com/Java_Caiyo/article/details/118703682</guid><author>Java_Caiyo</author><pubDate>Tue, 13 Jul 2021 16:31:18 +0800</pubDate><description><![CDATA[一. 什么是架构和架构本质
在软件行业，对于什么是架构，都有很多的争论，每个人都有自己的理解。 此君说的架构和彼君理解的架构未必是一回事。因此我们在讨论架构之前，我们先讨论架构的概念定义，概念是人认识这个世界的基础，并用来沟通的手段，如果对架构概念理解不一样，那沟通起来自然不顺畅。
Linux有架构，MySQL有架构，JVM也有架构，使用Java开发、MySQL存储、跑在Linux上的业务系统也有架构，应该关注哪一个？想要清楚以上问题需要梳理几个有关系又相似的概念：系统与子系统、模块与组建、框架与架构:
1]]></description><category></category></item><item><title><![CDATA[手把手教你，从零开始实战搭建SpringCloud Alibaba！这份笔记太牛了！]]></title><link>https://blog.youkuaiyun.com/Java_Caiyo/article/details/118673442</link><guid>https://blog.youkuaiyun.com/Java_Caiyo/article/details/118673442</guid><author>Java_Caiyo</author><pubDate>Mon, 12 Jul 2021 14:11:59 +0800</pubDate><description><![CDATA[Spring Cloud Alibaba 是阿里巴巴提供的微服务开发一站式解决方案，是阿里巴巴开源中间件与 Spring Cloud 体系的融合。]]></description><category></category></item><item><title><![CDATA[SpringCloudGateway手动编写路由规则对请求进行转发]]></title><link>https://blog.youkuaiyun.com/Java_Caiyo/article/details/118659568</link><guid>https://blog.youkuaiyun.com/Java_Caiyo/article/details/118659568</guid><author>Java_Caiyo</author><pubDate>Sun, 11 Jul 2021 20:44:21 +0800</pubDate><description><![CDATA[SpringCloudGateway手动编写路由规则对请求进行转发
这篇文章主要是提供一种转发路由的代码实现方式，之前说的gateway都是使用配置文件来对请求进行路由，这样虽然很简单，但是不够灵活，如果后端对应很多服务实例，网关想要根据自己的规则来转发请求，比如编写不同的负载均衡策略，做一些特别的权重，以及在运行过程中动态的变更转发地址，这些用配置文件来做都不够灵活，没法自由的定义规则。
涉及的gateway版本
     &lt;dependency&gt;
            &lt;groupI]]></description><category></category></item><item><title><![CDATA[关于Spring Cloud Gateway与下游服务器的连接分析]]></title><link>https://blog.youkuaiyun.com/Java_Caiyo/article/details/118640486</link><guid>https://blog.youkuaiyun.com/Java_Caiyo/article/details/118640486</guid><author>Java_Caiyo</author><pubDate>Sat, 10 Jul 2021 20:52:14 +0800</pubDate><description><![CDATA[最近面试了不少同学，有很大一部分简历上会提到网关，我一般都会顺着往下问他们的网关是怎么做的。基本上都是说直接使用的Spring Cloud Gateway或者基于Spring Cloud Gateway二次开发。这种时候我会继续问一个比较基础的问题：Spring Cloud Gateway作为网关，会把接收到的请求转发给下游服务，那么Spring Cloud Gateway跟下游的服务之间保持的是长连还是短连？还是说每次转发的时候都会新建立一个连接吗?]]></description><category></category></item><item><title><![CDATA[领略设计模式的魅力，谈谈组合模式搭配访问者模式]]></title><link>https://blog.youkuaiyun.com/Java_Caiyo/article/details/118580773</link><guid>https://blog.youkuaiyun.com/Java_Caiyo/article/details/118580773</guid><author>Java_Caiyo</author><pubDate>Thu, 08 Jul 2021 19:39:25 +0800</pubDate><description><![CDATA[组合模式（composite）
我们都知道文件和文件夹的概念，并且文件是可以存放在文件夹中，文件夹中也可以存放其他文件夹。需要设计一个简单的程序来实现文件夹和文件的关系。
实现思路

文件夹需要存放文件夹和文件，首先想到的是在文件夹中设计两个集合分别来存放文件夹和文件。
有展示文件路径需求时，不清楚在最里层是文件夹还是文件，所以需要把文件夹和文件当做一个对象来处理会更好，都是条目。所以需要创建一个他们共同的父类。
对文件夹的设计优化，创建一个集合容器，容器类型是父类，即解决了既要存放文件夹又要存放文件的问题]]></description><category></category></item><item><title><![CDATA[前方高能预警！阿里大佬出品“Spring实战学习笔记”震撼来袭！]]></title><link>https://blog.youkuaiyun.com/Java_Caiyo/article/details/118489178</link><guid>https://blog.youkuaiyun.com/Java_Caiyo/article/details/118489178</guid><author>Java_Caiyo</author><pubDate>Mon, 05 Jul 2021 15:42:25 +0800</pubDate><description><![CDATA[Spring框架已经成为Java开发人员的必备知识，而且Spring 3引入了强大的新特性，例如SpEL、Spring 表达式语言、loC 容器的新注解以及用户急需的对REST的支持。无论你是刚刚接触Spring还是被 Spring 3.0的新特性所吸引，这份笔记都是掌握Spring的最佳选择。]]></description><category></category></item><item><title><![CDATA[注意，不能错过的CAS+volatile实现同步代码块]]></title><link>https://blog.youkuaiyun.com/Java_Caiyo/article/details/118444774</link><guid>https://blog.youkuaiyun.com/Java_Caiyo/article/details/118444774</guid><author>Java_Caiyo</author><pubDate>Sat, 03 Jul 2021 20:36:14 +0800</pubDate><description><![CDATA[前言：

最近看到有人说可以使用 CAS + volatile 实现同步代码块。

心想，确实是可以实现的呀！因为 AbstractQueuedSynchronizer（简称 AQS）内部就是通过 CAS + volatile（修饰同步标志位state） 实现的同步代码块。
并且ReentrantLock就是基于AQS原理来实现同步代码块的；ReentrantLock源码学习和了解AQS原理可以参考：带你探索ReentrantLock源码的快乐
今天，咱们就通过 CAS + volatile 实现一个 迷你]]></description><category></category></item><item><title><![CDATA[一张图，理顺 Spring Boot应用在启动阶段执行代码的几种方式]]></title><link>https://blog.youkuaiyun.com/Java_Caiyo/article/details/118444747</link><guid>https://blog.youkuaiyun.com/Java_Caiyo/article/details/118444747</guid><author>Java_Caiyo</author><pubDate>Sat, 03 Jul 2021 20:34:09 +0800</pubDate><description><![CDATA[前言
有时候我们需要在应用启动时执行一些代码片段，这些片段可能是仅仅是为了记录 log，也可能是在启动时检查与安装证书 ，诸如上述业务要求我们可能会经常碰到
Spring Boot 提供了至少 5 种方式用于在应用启动时执行代码。我们应该如何选择？本文将会逐步解释与分析这几种不同方式
CommandLineRunner
CommandLineRunner 是一个接口，通过实现它，我们可以在 Spring 应用成功启动之后 执行一些代码片段
@Slf4j
@Component
@Order(2)
public]]></description><category></category></item><item><title><![CDATA[跳槽神器！阿里巴巴内部出品“Spring全线笔记”，不止是全家桶，理论与实战结合]]></title><link>https://blog.youkuaiyun.com/Java_Caiyo/article/details/118385403</link><guid>https://blog.youkuaiyun.com/Java_Caiyo/article/details/118385403</guid><author>Java_Caiyo</author><pubDate>Thu, 01 Jul 2021 14:07:34 +0800</pubDate><description><![CDATA[对于每一位Java开发人员来说，提起Spring定是不陌生的，实际上自Spring框架诞生以来，就备受开发者的青睐，基本上现在的互联网公司都要使用到Spring框架。Spring框架中又包含了SpringMVC、SpringBoot、SpringCloud等，被开发者称呼为Spring全家桶。]]></description><category></category></item><item><title><![CDATA[面试又被问懵了吗？不如把ThreadLocal拆开了揉碎看看]]></title><link>https://blog.youkuaiyun.com/Java_Caiyo/article/details/118363657</link><guid>https://blog.youkuaiyun.com/Java_Caiyo/article/details/118363657</guid><author>Java_Caiyo</author><pubDate>Wed, 30 Jun 2021 16:16:47 +0800</pubDate><description><![CDATA[前言
1.为什么用 ThreadLocal？
所谓并发，就是有限资源需要应对远超资源的访问。解决问题的方法，要么增加资源应对访问；要么增加资源的利用率。 所以，相信这年头做开发的多多少少，都会那么几个“线程二三招”、“用锁五六式”。 那所带来的就是多线程访问下的并发安全问题。 共享变量的访问域跨越了原始的单线程，进入了千家万户的线程眼里。谁都可以用，谁都可以改，那不就打起来了吗？ 因此，防止并发问题的最好办法，就是不要多线程访问（这科技水平倒退二十年~）。ThreadLocal 顾名思义，将一个变量限制为“]]></description><category></category></item><item><title><![CDATA[Docker 环境运行 Mysql 和开启 Binlog 配置主从同步]]></title><link>https://blog.youkuaiyun.com/Java_Caiyo/article/details/118359300</link><guid>https://blog.youkuaiyun.com/Java_Caiyo/article/details/118359300</guid><author>Java_Caiyo</author><pubDate>Wed, 30 Jun 2021 13:47:08 +0800</pubDate><description><![CDATA[同一服务器模拟利用 Docker 模拟 Mysql 设置的主从同步设置。
1、运行起来两个 Mysql ：masterMysql（主库）、slaveMysql（从库）,数据库版本 5.7。
#拉取镜像
docker pull mysql:5.7
#y运行主、从容器
docker run -p 13306:3306 --name slavemysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
docker run -p 13307:3306 --name maste]]></description><category></category></item><item><title><![CDATA[凡人修仙传！大专毕业3年，我从月薪3k的码农变成大厂的Java架构师！]]></title><link>https://blog.youkuaiyun.com/Java_Caiyo/article/details/118328505</link><guid>https://blog.youkuaiyun.com/Java_Caiyo/article/details/118328505</guid><author>Java_Caiyo</author><pubDate>Tue, 29 Jun 2021 10:53:22 +0800</pubDate><description><![CDATA[三年前我从一所大专毕业，成绩不上不下，专升本失败，出去面试处处碰壁，在学长的帮助下进入了一家小公司，月薪3k，觉得前途无望，即将回老家进厂！]]></description><category></category></item><item><title><![CDATA[亲自动手绘图——红黑树，我不信还手撕不清楚]]></title><link>https://blog.youkuaiyun.com/Java_Caiyo/article/details/118252335</link><guid>https://blog.youkuaiyun.com/Java_Caiyo/article/details/118252335</guid><author>Java_Caiyo</author><pubDate>Sun, 27 Jun 2021 23:11:46 +0800</pubDate><description><![CDATA[前言
红黑树是自平衡的二叉查找树，在许多地方都有实际应用比如JAVA的HashMap，在链表长度大于8就会转化为红黑树；在linux经典的epoll中也使用了红黑树来保存文件描述符的插入删除操作。如果频繁地对数据进行插入删除，还要保证效率，使用红黑树是比较好的选择。
红黑树在实际表现上，还是一颗二叉树。在许多性质上和二叉树一样，所以要从二叉树查找开始讲起。
二叉查找树
二叉查找树是最简单的实现，规定左子节点一定小于右子节点。
插入情况只需要对当前节点比大小，不断的递归直到遇到空节点插入。
查询和插入相同，不]]></description><category></category></item><item><title><![CDATA[一文带你玩转 Redis 的 RESP 协议 ！]]></title><link>https://blog.youkuaiyun.com/Java_Caiyo/article/details/118243529</link><guid>https://blog.youkuaiyun.com/Java_Caiyo/article/details/118243529</guid><author>Java_Caiyo</author><pubDate>Sat, 26 Jun 2021 10:55:14 +0800</pubDate><description><![CDATA[RESP 是 Redis 客户端与 Redis 服务器相互通信时使用的一个协议， 全称 REdis Serialization Protocol ，即 redis 串行协议，通俗易懂，也表明了 redis 的特点，串行化(单线程)]]></description><category></category></item><item><title><![CDATA[Java十九个技术栈常见面试题分享（附答案解析）]]></title><link>https://blog.youkuaiyun.com/Java_Caiyo/article/details/118179612</link><guid>https://blog.youkuaiyun.com/Java_Caiyo/article/details/118179612</guid><author>Java_Caiyo</author><pubDate>Thu, 24 Jun 2021 10:33:12 +0800</pubDate><description><![CDATA[Java 基础： 两个对象的 hashCode()相同，则 equals()也一定为 true，对吗？
不对，两个对象的 hashCode()相同，equals()不一定 true。
代码示例：
String str1 = "通话"; 
String str2 = "重地"; 
System.out.println(String.format("str1：%d | str2：%d", str1.hashCode(),str2.hashCode())); System.out.println(str1.equ]]></description><category></category></item></channel></rss>