<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[zjy_love_java的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/zjy_love_java</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; zjy_love_java]]></copyright><item><title><![CDATA[java突发内存和CPU同时100%排查解决]]></title><link>https://blog.youkuaiyun.com/zjy_love_java/article/details/128452390</link><guid>https://blog.youkuaiyun.com/zjy_love_java/article/details/128452390</guid><author>zjy_love_java</author><pubDate>Tue, 27 Dec 2022 13:30:23 +0800</pubDate><description><![CDATA[mat工具找到占用内存的入口堆栈和具体对象，最后就是根据业务去优化了。]]></description><category></category></item><item><title><![CDATA[k8s nginx ingress原理解读]]></title><link>https://blog.youkuaiyun.com/zjy_love_java/article/details/123108971</link><guid>https://blog.youkuaiyun.com/zjy_love_java/article/details/123108971</guid><author>zjy_love_java</author><pubDate>Thu, 24 Feb 2022 23:52:11 +0800</pubDate><description><![CDATA[阅读本文需要以下知识为前提

了解k8s基本架构，k8s基本资源清单
用自己的k8s实验环境

首先了解ingress解决了什么问题

k8s内部项目暴露外部访问，只用一个固定端口,暴露多个服务。相对于：LoadBlancer Service、NodePort Service更灵活更方便。
pod漂移后的ip变化，自动识别pod ip
修改nginx配置不用reload加载
实现灰度发布（根据流量或者http请求头进行灰度）

架构介绍


ingress controller
入口流量控制器。Kubern]]></description><category></category></item><item><title><![CDATA[阿里巴巴P3C java编程规范（最新版github下载）]]></title><link>https://blog.youkuaiyun.com/zjy_love_java/article/details/123105073</link><guid>https://blog.youkuaiyun.com/zjy_love_java/article/details/123105073</guid><author>zjy_love_java</author><pubDate>Thu, 24 Feb 2022 09:59:15 +0800</pubDate><description><![CDATA[阿里java编程规范推荐，以及最新版下载方法]]></description><category></category></item><item><title><![CDATA[深拷贝(clone)最佳实践 -- 考虑拷贝消耗的cpu和拷贝速度]]></title><link>https://blog.youkuaiyun.com/zjy_love_java/article/details/119465427</link><guid>https://blog.youkuaiyun.com/zjy_love_java/article/details/119465427</guid><author>zjy_love_java</author><pubDate>Sat, 07 Aug 2021 09:49:53 +0800</pubDate><description><![CDATA[深拷贝(clone)是java开发过程中经常遇到问题，有人用io流、有人用json序列化、有人循环拷贝属性等等，网上文章都能实现功能。
问题：
clone是计算操作，消耗cpu如果速度慢（高并发场景几十ms也是非常慢的）会导致程序卡顿，qps降低。网上解决方案都没有提到性能问题，我实际使用后对性能进行了优化，最后推荐：FastClone
FastClone介绍
FastClone是一款非常好用，支持大部分场景深克隆和浅克隆的工具。被推荐的不多，被埋没了。
&lt;dependency&gt;
	&lt;gr]]></description><category></category></item><item><title><![CDATA[Arthas jvm诊断工具入门到精通]]></title><link>https://blog.youkuaiyun.com/zjy_love_java/article/details/119464785</link><guid>https://blog.youkuaiyun.com/zjy_love_java/article/details/119464785</guid><author>zjy_love_java</author><pubDate>Fri, 06 Aug 2021 23:34:46 +0800</pubDate><description><![CDATA[我举个常见场景，你有没有遇到有没有觉得难搞，熟练使用Arthas会让以下问题非常简单：

生产环境慢接口分析，不知道接口耗时的原因  (trace命令)
生成环境断点，查看某个方法入参返回值（watch命令）
觉得运维发版的代码和我本地代码不一样，需要反编译 （Decompile Class Jad 命令）
查看内存中，变量的值 （OGNl表达式）
cpu高时，分析造成cpu高的代码 (thread命令)
拦截某个方法，并且以同样的入参进行重试调用 (TT命令)
调用代码中任意方法 （OGNl表达式）

a]]></description><category></category></item><item><title><![CDATA[TIDB和mysql优缺点对比]]></title><link>https://blog.youkuaiyun.com/zjy_love_java/article/details/119463310</link><guid>https://blog.youkuaiyun.com/zjy_love_java/article/details/119463310</guid><author>zjy_love_java</author><pubDate>Fri, 06 Aug 2021 21:10:50 +0800</pubDate><description><![CDATA[最近这几年，公司一直在使用mysql，数据量在千万级以下时，mysql有着非常优秀的性能和稳定性。随着数据增长，单表无法满足业务需求，我们需要使用mycat、shading-jdbc等中间件去实现分库分表。
分库分表的缺点：

分页查询性能不好，需求聚合多库数据，多次io，内存消耗大。
分布式事务问题
分库之后，想二次扩容，数据迁移等会更复杂
跨库join很难实现

随着newsql数据库出现，分库分表这些问题都得到解决，
newsql特性如下：

SQL支持 （TiDB 是 MySQL 兼容的）
水平线性]]></description><category></category></item><item><title><![CDATA[Junit5 + Jenkins + Allure 继承单元测试报告]]></title><link>https://blog.youkuaiyun.com/zjy_love_java/article/details/119450982</link><guid>https://blog.youkuaiyun.com/zjy_love_java/article/details/119450982</guid><author>zjy_love_java</author><pubDate>Fri, 06 Aug 2021 11:58:39 +0800</pubDate><description><![CDATA[关于这三个组件的安装网上文档很多，官方文档也很详细，这里就不演示了，本文主要讲解使用工程的的坑和解决方案。
这里给几个友情链接：

spring-boot 继承Allure ：Allure Junit5
jenkins 安装Allure插件 ：Allure Jenkins
Allure本地图表没有历史趋势图解决：Allure 本地生成趋势图

看看效果：

采坑记录

spring-boot版本和Junit5兼容问题
我们公司spring-boot版本2.15，默认支持junit4。如果使用Junit5，本]]></description><category></category></item><item><title><![CDATA[创业公司单元测试落地问题和解决方案]]></title><link>https://blog.youkuaiyun.com/zjy_love_java/article/details/119448736</link><guid>https://blog.youkuaiyun.com/zjy_love_java/article/details/119448736</guid><author>zjy_love_java</author><pubDate>Fri, 06 Aug 2021 11:18:53 +0800</pubDate><description><![CDATA[创业公司单元测试落地问题和解决方案一. 为什么需要单元测试？二. 创业公司软件开发维护现状三. 一套可行的技术方案四. 落实实施需要跨越的坎
一. 为什么需要单元测试？
单元测试对软件开发好处多多，我总结为一下几点：
1. 提升软件质量

提前发现问题，减少代码提测和线上bug，和集成测试互补。
防止业务迭代过程的bug，比如经常出现，改A问题，出现B、C业务bug。
黑盒测试做不到零bug，对应代码中隐藏逻辑，可以通过单元测试发现。

2. 提升开发效率

联调、集成、回归测试过程中，问题少、易修复。虽然]]></description><category></category></item><item><title><![CDATA[查看MetaMask发起的节点请求]]></title><link>https://blog.youkuaiyun.com/zjy_love_java/article/details/118382263</link><guid>https://blog.youkuaiyun.com/zjy_love_java/article/details/118382263</guid><author>zjy_love_java</author><pubDate>Thu, 01 Jul 2021 11:47:01 +0800</pubDate><description><![CDATA[背景
&nbsp;&nbsp;&nbsp;&nbsp;在调研一个defi项目时，经常需要抓取eth节点上请求的数据。节点请求数据和restful的http请求数据不一样，完全看不懂。本文主要教大家如何看懂区块链节点请求
请求举例
前提：有eth MetaMask钱包操作经验
举例项目：借贷项目compound
看如下请求：


入参和返回值
入参说明：

“to” 表示需要请求的合约地址：0xa1bd4a10185f30932c78185f86641f11902e873f 可以到区块链浏览器查询合约源码：h]]></description><category></category></item><item><title><![CDATA[ETH(以太坊)交易日志解读 -- 智能合约开发必备知识]]></title><link>https://blog.youkuaiyun.com/zjy_love_java/article/details/118381012</link><guid>https://blog.youkuaiyun.com/zjy_love_java/article/details/118381012</guid><author>zjy_love_java</author><pubDate>Thu, 01 Jul 2021 11:01:11 +0800</pubDate><description><![CDATA[背景介绍
&nbsp;&nbsp;&nbsp;&nbsp;很多人都在使用区块链浏览器查询交易记录，对于一个研发人员，我们需要更深入的了解交易调用的方法和请求参数。
&nbsp;&nbsp;&nbsp;&nbsp;今天待大家看看浏览器上的交易究竟什么意思，智能合约开发人员必备知识。
交易举例
随便找了一笔交易：https://etherscan.io/tx/0x25b53f45d8712c0d58d1797f1040189921bb1174598bbde42e7bf9c6fca00c04
下面对交易主体和事件]]></description><category></category></item><item><title><![CDATA[git 命令修改代码提交人]]></title><link>https://blog.youkuaiyun.com/zjy_love_java/article/details/113284685</link><guid>https://blog.youkuaiyun.com/zjy_love_java/article/details/113284685</guid><author>zjy_love_java</author><pubDate>Thu, 28 Jan 2021 00:10:26 +0800</pubDate><description><![CDATA[git 命令修改代码提交人1. git log 查看提交记录2. 设置全局提交人和提交邮箱3. 设置项目提交人和提交邮箱4. 修改历史记录提交人
关于git提交人知识点：
1. git log 查看提交记录
-- git log
commit c486034812cac1538007240dacc6be5 
Merge: ffbde9fc cc2306de
Author: zhongjingyun &lt;zhongjingyun@163.com&gt;
Date:   Wed Jan 27 23:54:3]]></description><category></category></item><item><title><![CDATA[什么是真正的云原生 -- 应用视角]]></title><link>https://blog.youkuaiyun.com/zjy_love_java/article/details/112987321</link><guid>https://blog.youkuaiyun.com/zjy_love_java/article/details/112987321</guid><author>zjy_love_java</author><pubDate>Fri, 22 Jan 2021 17:18:06 +0800</pubDate><description><![CDATA[什么是正在的云原生 -- 应用视角2020云原生落地之年什么是云原生？云原生时代企业如何落地云原生系统
2020云原生落地之年
  2020年之前，各个公司都在落地微服务。随着微服务落地，容器技术得到广泛应用，Kubernetes，Docker swarm，Marathon等开源容器编排引擎广为流传。Kubernetes在竞争中脱颖而出，奠定了云原生的基础，形成了容器编码的标准。过去的2020年，大部分公司都引入了云原生相关技术架构。
什么是云原生？
百度百科：云原生是基于分布部署和统一运管的云端服务，以容]]></description><category></category></item><item><title><![CDATA[一条sql造成死锁]]></title><link>https://blog.youkuaiyun.com/zjy_love_java/article/details/110947115</link><guid>https://blog.youkuaiyun.com/zjy_love_java/article/details/110947115</guid><author>zjy_love_java</author><pubDate>Thu, 10 Dec 2020 10:12:33 +0800</pubDate><description><![CDATA[问题背景
 访问量增加，突然大量死锁报警，看日志是一条这样sql：
insert into tableName (uid,name) select ?,? from dual where not exists (select 1 from tableName where uid=? and name=?)；
  uid,name有唯一索引。
知识点
这个问题有几个知识点：

insert后面的select会当前读，隐式加锁
查询不存在，会降级为间隙锁
间隙锁查询不是互斥的，会造成死锁

案例分析
间隙锁死锁]]></description><category></category></item><item><title><![CDATA[MybatisPlus动态修改表名或增加库名]]></title><link>https://blog.youkuaiyun.com/zjy_love_java/article/details/110762841</link><guid>https://blog.youkuaiyun.com/zjy_love_java/article/details/110762841</guid><author>zjy_love_java</author><pubDate>Sun, 06 Dec 2020 21:22:11 +0800</pubDate><description><![CDATA[背景
 在数据库操作过程中，经常有修改表名的需求，例如：分表时，修改表名加上分表前后缀；多数据库一个实例，表名前面加上库名，实现本地跨库事务等等。
 我用到的场景是后者，动态加库名。由于使用了MybatisPlus，整个开发过程中不会自己写sql，也没办法通过硬编码修改表名。
解决方案
 MybatisPlus中只需要一个配置类即可自定义，动态修改表名，代码如下：
@Configuration
public class MybatisPlusConfig {
    List&lt;String&gt; t]]></description><category></category></item><item><title><![CDATA[线程池正确用法]]></title><link>https://blog.youkuaiyun.com/zjy_love_java/article/details/108565637</link><guid>https://blog.youkuaiyun.com/zjy_love_java/article/details/108565637</guid><author>zjy_love_java</author><pubDate>Sun, 13 Sep 2020 20:34:54 +0800</pubDate><description><![CDATA[背景
 对于java开发从业人员来说，并发编程是绕不开的话题，juc并发包下提供了一系列多线程场景解决方案。
 随着jdk1.8的普及，多线程处理问题，除了使用使用线程池(ExecutorService)，很多人选择了parallelStream() 并行流，底层使用forkjoin实现并行处理。
 那么并行和并发又有什么区别？究竟改如何选择？滥用时又会有什么影响？
  这些问题我分以下几篇文章进行详细说明：
  1. 多线程并发和并行的区别
  2. parallelStream()并行滥用的后果
  3]]></description><category></category></item><item><title><![CDATA[forkjoin和forkjoinpool讲解]]></title><link>https://blog.youkuaiyun.com/zjy_love_java/article/details/108564497</link><guid>https://blog.youkuaiyun.com/zjy_love_java/article/details/108564497</guid><author>zjy_love_java</author><pubDate>Sun, 13 Sep 2020 17:20:37 +0800</pubDate><description><![CDATA[forkjoin和forkjoinpool讲解背景为什么需要forkjoin先看代码结合多线程理解forkjoin代码forkjoin主要的类forkjoin常用方法forkjoin设计原理forkjoin整体工作流程工作队列和线程池
背景
 对于java开发从业人员来说，并发编程是绕不开的话题，juc并发包下提供了一系列多线程场景解决方案。
 随着jdk1.8的普及，多线程处理问题，除了使用使用线程池(ExecutorService)，很多人选择了parallelStream() 并行流，底层使用fork]]></description><category></category></item><item><title><![CDATA[parallelStream()并行滥用的后果]]></title><link>https://blog.youkuaiyun.com/zjy_love_java/article/details/108562433</link><guid>https://blog.youkuaiyun.com/zjy_love_java/article/details/108562433</guid><author>zjy_love_java</author><pubDate>Sun, 13 Sep 2020 16:52:11 +0800</pubDate><description><![CDATA[背景
 对于java开发从业人员来说，并发编程是绕不开的话题，juc并发包下提供了一系列多线程场景解决方案。
 随着jdk1.8的普及，多线程处理问题，除了使用使用线程池(ExecutorService)，很多人选择了parallelStream() 并行流，底层使用forkjoin实现并行处理。
 那么并行和并发又有什么区别？究竟改如何选择？滥用时又会有什么影响？
  这些问题我分以下几篇文章进行详细说明：
  1. 多线程并发和并行的区别
  2. parallelStream()并行滥用的后果 (本文]]></description><category></category></item><item><title><![CDATA[多线程并发和并行的区别]]></title><link>https://blog.youkuaiyun.com/zjy_love_java/article/details/108559365</link><guid>https://blog.youkuaiyun.com/zjy_love_java/article/details/108559365</guid><author>zjy_love_java</author><pubDate>Sun, 13 Sep 2020 14:35:34 +0800</pubDate><description><![CDATA[背景
 对于java开发从业人员来说，并发编程是绕不开的话题，juc并发包下提供了一系列多线程场景解决方案。
 随着jdk1.8的普及，多线程处理问题，除了使用使用线程池(ExecutorService)，很多人选择了parallelStream() 并行流，底层使用forkjoin实现并行处理。
 那么并行和并发又有什么区别？究竟改如何选择？滥用时又会有什么影响？
  这些问题我分以下几篇文章进行详细说明：
  1. 多线程并发和并行的区别
  2. parallelStream()并行滥用的后果
  3]]></description><category></category></item><item><title><![CDATA[@Value(“${}“) 采坑记录]]></title><link>https://blog.youkuaiyun.com/zjy_love_java/article/details/107805254</link><guid>https://blog.youkuaiyun.com/zjy_love_java/article/details/107805254</guid><author>zjy_love_java</author><pubDate>Wed, 05 Aug 2020 00:47:20 +0800</pubDate><description><![CDATA[背景
今天排查一个老代码bug，最终定位到是配置文件使用@Value注解获取，实际使用时值为null。对@value进行一下用法总结
问题详细说明
我们是一个加密盐存放在application.yml中，工具类中使用如下注解获取，结果为null，大家能看出问题吗？
	@Value("${md5_salt}")
    private static String md5Salt;

问题就在static上，使用static修饰，会在spring初始化之前完成初始，无法注入。
错误用法总结

使用static或]]></description><category></category></item><item><title><![CDATA[java正则表达式类用法]]></title><link>https://blog.youkuaiyun.com/zjy_love_java/article/details/107731877</link><guid>https://blog.youkuaiyun.com/zjy_love_java/article/details/107731877</guid><author>zjy_love_java</author><pubDate>Sat, 01 Aug 2020 16:00:40 +0800</pubDate><description><![CDATA[背景
关于正则表达式的语法随处可见，java中正则的常用类究竟有哪些用法，应该如何使用呢？本文给出详细例子
正则类说明
import java.util.regex.Matcher;
import java.util.regex.Pattern;

最常用的两个工具类：

Pattern类用于创建一个正则表达式
Matcher类用于处理字符串。构造方法是私有的,不能随意创建,只能通过Pattern.matcher(CharSequence input)方法得到该类的实例

方法说明

Pattern.com]]></description><category></category></item></channel></rss>