<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[学习]]></title><description><![CDATA[越努力，越幸运]]></description><link>https://blog.youkuaiyun.com/java_collect</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; java_collect]]></copyright><item><title><![CDATA[线程池解析]]></title><link>https://blog.youkuaiyun.com/java_collect/article/details/119415529</link><guid>https://blog.youkuaiyun.com/java_collect/article/details/119415529</guid><author>java_collect</author><pubDate>Thu, 05 Aug 2021 12:54:38 +0800</pubDate><description><![CDATA[线程池解析
java线程对应内核线程，创建与销毁需要切换到内核态，是系统开销较大的操作，因此需要设法复用线程。线程池就是一个线程缓存，负责对线程统一分配，调优与监控，线程池的优势：
提高性能：重用线程减少线程创建消亡的开销
提高响应速度：任务到达时可以立即执行，不需要再去创建线程
方便管理线程：便于统一分配、调控和监控
执行Runnable任务流程
简单说处理任务的优先级为：核心线程、任务队列、最大线程，如果三者都满了，使用handler处理被拒绝的任务。

具体如何实现的呢？
/**
* 在将来某个时间执]]></description><category></category></item><item><title><![CDATA[spring-boot-maven-plugin插件找不到含有main的主类]]></title><link>https://blog.youkuaiyun.com/java_collect/article/details/109206228</link><guid>https://blog.youkuaiyun.com/java_collect/article/details/109206228</guid><author>java_collect</author><pubDate>Wed, 21 Oct 2020 18:03:05 +0800</pubDate><description><![CDATA[【背景】
spring-boot项目执行mvn clean package打包时遇到一个问题，报错如下：
[ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:2.3.4.RELEASE:repackage (default) on project behavior-data: Execution default of goal org.springframework.boot:spring-boot]]></description><category></category></item><item><title><![CDATA[重要的基础注解@import]]></title><link>https://blog.youkuaiyun.com/java_collect/article/details/109168221</link><guid>https://blog.youkuaiyun.com/java_collect/article/details/109168221</guid><author>java_collect</author><pubDate>Mon, 19 Oct 2020 20:23:48 +0800</pubDate><description><![CDATA[@import的作用很简单，就是导入一个或多个bean，通常用于配置类。


导入@Configuration修饰的配置bean


导入ImportBeanDefinitionRegistrar的实现类


导入ImportSelector的实现类


可以导入一个普通的java对象，spring4.2版本之后才支持


使用举例
@Data
public class A {
    private String name = "a";
}

@Data
public class Boy {
    pr]]></description><category></category></item><item><title><![CDATA[java探针之修改类字节码文件]]></title><link>https://blog.youkuaiyun.com/java_collect/article/details/109007902</link><guid>https://blog.youkuaiyun.com/java_collect/article/details/109007902</guid><author>java_collect</author><pubDate>Sun, 11 Oct 2020 11:10:19 +0800</pubDate><description><![CDATA[java探针利用了javaAgent + ASM字节码注入工具实现了动态修改类文件的功能。像skywalking和arthas都使用到了这个技术。
具体原理为：

jdk1.5以后引入了javaAgent技术，javaAgent是运行方法之前的拦截器。我们利用javaAgent和ASM字节码技术，在JVM加载class二进制文件的时候，利用ASM动态的修改加载的class文件，在监控的方法前后添加计时器功能，用于计算监控方法耗时，同时将方法耗时及内部调用情况放入处理器，处理器利用栈先进后出的特点对方法调用先]]></description><category></category></item><item><title><![CDATA[Java探针之JavaAgent揭秘]]></title><link>https://blog.youkuaiyun.com/java_collect/article/details/109007931</link><guid>https://blog.youkuaiyun.com/java_collect/article/details/109007931</guid><author>java_collect</author><pubDate>Sun, 11 Oct 2020 11:03:57 +0800</pubDate><description><![CDATA[java探针利用了javaAgent + ASM字节码注入工具实现了动态修改类文件的功能。
javaAgent

JavaAgent 是JDK 1.5 以后引入的，也可以叫做Java代理。JavaAgent 是运行在 main方法之前的拦截器，它内定的方法名叫 premain ，在JVM启动的时候，会从agent包中找到MAINIFEST.MF中配置的Class，执行其实现的premain方法，而且这一步是在main方法之前执行的。这样就可以在JVM启动执行main方法之前做一些其他而外的操作了。
agen]]></description><category></category></item><item><title><![CDATA[Spring Bean 全生命周期全景图]]></title><link>https://blog.youkuaiyun.com/java_collect/article/details/108986433</link><guid>https://blog.youkuaiyun.com/java_collect/article/details/108986433</guid><author>java_collect</author><pubDate>Fri, 09 Oct 2020 21:12:57 +0800</pubDate><description><![CDATA[本文从几个spring提供的关键的PostProcessor处理器，来帮助理解spring创建bean的过程：
下面是按方法执行的前后顺序排列

BeanFactoryPostProcessor.postProcessBeanFactory()
用来在所有的bean definitions加载后，但是还没有实例化bean之前调用本方法，所以本方法非常超前执行
可以修改bean的定义，如是否是单例，是否lazy init，DependsOn，FactoryBeanName等等等等，一般用来修改属性值，一个典型]]></description><category></category></item><item><title><![CDATA[Fork/Join框架]]></title><link>https://blog.youkuaiyun.com/java_collect/article/details/108650206</link><guid>https://blog.youkuaiyun.com/java_collect/article/details/108650206</guid><author>java_collect</author><pubDate>Thu, 17 Sep 2020 19:07:36 +0800</pubDate><description><![CDATA[一、引言
算法领域有一种基本思想叫做“分治”，所谓“分治”就是将一个难以直接解决的大问题，分割成一些规模较小的子问题，以便各个击破，分而治之。
比如：对于一个规模为N的问题，若该问题可以容易地解决，则直接解决；否则将其分解为K个规模较小的子问题，这些子问题互相独立且与原问题性质相同，递归地解这些子问题，然后将各子问题的解合并得到原问题的解，这种算法设计策略叫做分治法。
许多基础算法都运用了“分治”的思想，比如二分查找、快速排序等等。
基于“分治”的思想，J.U.C在JDK1.7时引入了一套Fork/Join]]></description><category></category></item><item><title><![CDATA[建造者模式]]></title><link>https://blog.youkuaiyun.com/java_collect/article/details/108517346</link><guid>https://blog.youkuaiyun.com/java_collect/article/details/108517346</guid><author>java_collect</author><pubDate>Thu, 10 Sep 2020 16:25:37 +0800</pubDate><description><![CDATA[建造者模式是将对象的构建封装起来，对象本身和创建解耦，方便调用者创建复杂的对象，无需知道构建的细节。常见的使用场景就是一些复杂的连接对象，有非常多的配置，用户不可能清楚每一个属性，所以一般会通过建造者模式来提供属性的设置和对象的创建，方便调用者使用
下面根据nacos源码里的一个例子说明建造者模式
@Data
public class RestResult&lt;T&gt; implements Serializable {

    private static final long serialVers]]></description><category></category></item><item><title><![CDATA[nginx实现http服务配置]]></title><link>https://blog.youkuaiyun.com/java_collect/article/details/108288564</link><guid>https://blog.youkuaiyun.com/java_collect/article/details/108288564</guid><author>java_collect</author><pubDate>Sat, 29 Aug 2020 11:13:18 +0800</pubDate><description><![CDATA[静态代理
即实现nginx代理指向静态文件，实现动静分离
主要配置如下：
worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    server {
        listen       8081;
        server_name  localhost;

]]></description><category></category></item><item><title><![CDATA[spring-security-oauth2实现OAuth2.0服务]]></title><link>https://blog.youkuaiyun.com/java_collect/article/details/107896661</link><guid>https://blog.youkuaiyun.com/java_collect/article/details/107896661</guid><author>java_collect</author><pubDate>Sun, 09 Aug 2020 21:03:22 +0800</pubDate><description><![CDATA[关于OAuth的介绍查看我的另一篇文章OAuth的4种授权方式，spring-security-oauth2是实现OAuth2.0的框架，配置稍微有些繁琐，因此本文记录下大概的思路，加深印象。
OAuth 2.0中主要有Authorization Service授权服务和Resource Service资源服务，他们可以在同一个应用程序中，也可以在两个应用程序中，甚至多个资源服务共享一个授权服务。
spring-security提供了相应的endpoints来管理token的请求，/oauth/author]]></description><category></category></item><item><title><![CDATA[自动化测试注册接口,如何生成大量临时邮箱和获取邮箱验证码]]></title><link>https://blog.youkuaiyun.com/java_collect/article/details/107836975</link><guid>https://blog.youkuaiyun.com/java_collect/article/details/107836975</guid><author>java_collect</author><pubDate>Thu, 06 Aug 2020 12:57:51 +0800</pubDate><description><![CDATA[自动化测试服务接口,其中注册接口需要使用邮箱来注册,并填入邮箱验证码,这应该如何实现
from pytest import mark
import logging
from retrying import retry
import requests, re, json
from lxml import etree

email_address_url = 'http://24mail.chacuo.net/'


class TestRegister:
    def setup_method(self, ]]></description><category></category></item><item><title><![CDATA[OAuth2.0的四种授权方式]]></title><link>https://blog.youkuaiyun.com/java_collect/article/details/107597732</link><guid>https://blog.youkuaiyun.com/java_collect/article/details/107597732</guid><author>java_collect</author><pubDate>Sun, 26 Jul 2020 20:05:00 +0800</pubDate><description><![CDATA[互联网应用中，OAuth 是一种授权机制。数据的所有者Owner告诉系统，同意授权第三方应用Client进入系统获取这些数据。系统产生一个短期的进入令牌token，用来代替密码，供第三方应用使用。令牌相较与密码，有这些优势，1.令牌是短期的，到期会自动失效 2.令牌可以被数据所有者撤销，会立即失效 3.令牌有权限范围（scope）。
关于OAuth可以关注 阮一峰讲OAuth和江南一点雨讲解OAuth
OAuth非常好的一点就是考虑了实际应用中的复杂场景，总结了四种授权方式（authorization gr]]></description><category></category></item><item><title><![CDATA[主要垃圾回收器和垃圾回收算法]]></title><link>https://blog.youkuaiyun.com/java_collect/article/details/107424729</link><guid>https://blog.youkuaiyun.com/java_collect/article/details/107424729</guid><author>java_collect</author><pubDate>Sat, 18 Jul 2020 10:41:57 +0800</pubDate><description><![CDATA[垃圾回收算法：
标记清除算法 mark-sweep
复制算法 copying 主要用于年轻代的垃圾回收,分为Eden区和两个survivor区
标记整理算法  mark-compact  compact紧凑使压实的意思，即标记后不是清除而是将仍存活的对象移向内存的一端，清理掉端界外的垃圾对象，主要用于老年代的垃圾回收
分代收集算法：是现在大多JVM采用的方法，即根据对象生存周期的不同把堆分为年轻代和年老代，采用不同的垃圾回收算法
分区收集算法：G1引入的回收算法，将整个堆空间划分为连续的小区间，每个小区间独]]></description><category></category></item><item><title><![CDATA[redis 小功能大用处]]></title><link>https://blog.youkuaiyun.com/java_collect/article/details/107128269</link><guid>https://blog.youkuaiyun.com/java_collect/article/details/107128269</guid><author>java_collect</author><pubDate>Sat, 04 Jul 2020 18:55:58 +0800</pubDate><description><![CDATA[慢查询分析
redis提供了慢查询日志功能，会计算每条命令的执行时间，超过阈值后记录下来，注意计算的是命令的执行时间，不包含网络传输和排队时间。
config get slowlog-log-slower-than获取操作超时的阈值，我的版本默认是10 000微秒，即10毫秒
config get slowlog-max-len 获取慢查询日志最多存储条数，默认128条，超过会循环覆盖
通过slowlog get n来获取慢查询日志，返回日志id，时间戳，命令耗时，命令详情，可以定时存储到持久化数据库制作可]]></description><category></category></item><item><title><![CDATA[JWT-基于token的认证方式]]></title><link>https://blog.youkuaiyun.com/java_collect/article/details/106868611</link><guid>https://blog.youkuaiyun.com/java_collect/article/details/106868611</guid><author>java_collect</author><pubDate>Sat, 20 Jun 2020 10:39:48 +0800</pubDate><description><![CDATA[什么是JWT

Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准（(RFC 7519).该token被设计为紧凑且安全的，特别适用于分布式站点的单点登录（SSO）场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息，以便于从资源服务器获取资源，也可以增加一些额外的其它业务逻辑所必须的声明信息，该token也可直接被用于认证，也可被加密。

起源
认证是用来判断用户身份。
为了避免每次都要重新认证，可以在认证成功后创建会话，]]></description><category></category></item><item><title><![CDATA[spring-security认证授权]]></title><link>https://blog.youkuaiyun.com/java_collect/article/details/106862704</link><guid>https://blog.youkuaiyun.com/java_collect/article/details/106862704</guid><author>java_collect</author><pubDate>Fri, 19 Jun 2020 19:46:07 +0800</pubDate><description><![CDATA[客户端必须得到用户的授权（authorization grant），才能获得令牌（access token）。OAuth 2.0定义了四种授权方式。
授权码模式（authorization code）
简化模式（implicit）
密码模式（resource owner password credentials）
客户端模式（client credentials）
阮一峰讲OAuth 2.0
spring-security-oauth2实现了oauth的框架,后来迁移到了spring-security5.X]]></description><category></category></item><item><title><![CDATA[工作中必须要知道的git高级用法]]></title><link>https://blog.youkuaiyun.com/java_collect/article/details/106770951</link><guid>https://blog.youkuaiyun.com/java_collect/article/details/106770951</guid><author>java_collect</author><pubDate>Mon, 15 Jun 2020 20:44:49 +0800</pubDate><description><![CDATA[rebase,直接翻译过来就是变基，而这个命令就是这么人如其名。通过rebase命令，我们可以改变一串commits的基点(父commit)。首先我们先来操作一遍这个命令，看看效果就知道这个命令是干啥的了。
假设我们的git结构是这样子的。我们在commit3这个地方开出了一个分支branch1,然后在branch1分支上开发并提交了两个commit(6和7)。同时其他分支合并到master分支导致master分支多了两个提交(4和5)。
这时我们执行以下命令： (注: 此时的活动分支是branch1)
(]]></description><category></category></item><item><title><![CDATA[docker基础知识]]></title><link>https://blog.youkuaiyun.com/java_collect/article/details/106295514</link><guid>https://blog.youkuaiyun.com/java_collect/article/details/106295514</guid><author>java_collect</author><pubDate>Sat, 23 May 2020 11:52:39 +0800</pubDate><description><![CDATA[Docker 是一个能够把开发应用程序自动部署到容器的开源引擎。Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案。 Docker 的基础是 Linux 容器（LXC）等技术，它提供了一个简单、轻量的建模方式，使开发生命周期更高效快速，鼓励了面向服务的架构设计。在 LXC 的基础上 Docker 进行了进一步的封装，让用户不需要去关心容器的管理，使得操作更为简便。用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机一样简单。：
Docker 容器本质上是宿主机上的一个进程。Docker 通]]></description><category></category></item><item><title><![CDATA[emqx—mqtt消息服务器]]></title><link>https://blog.youkuaiyun.com/java_collect/article/details/106156072</link><guid>https://blog.youkuaiyun.com/java_collect/article/details/106156072</guid><author>java_collect</author><pubDate>Sat, 16 May 2020 11:58:46 +0800</pubDate><description><![CDATA[EMQ X  是基于 Erlang/OTP 平台开发的开源物联网 MQTT 消息服务器，重点是专业支持MQTT协议，（MQTT 是轻量的 (Lightweight)、发布订阅模式 (PubSub) 的物联网消息协议），在物联网领域非常适合，类似的产品还有vernemq，HiveMQ等。
EMQ X 支持承载海量物联网终端的MQTT连接，支持在海量物联网设备间低延时消息路由:

稳定承载大规模的 MQTT 客户端连接，单服务器节点支持50万到100万连接。
分布式节点集群，快速低延时的消息路由，单集群支持10]]></description><category></category></item><item><title><![CDATA[五大数据存储模型]]></title><link>https://blog.youkuaiyun.com/java_collect/article/details/105840025</link><guid>https://blog.youkuaiyun.com/java_collect/article/details/105840025</guid><author>java_collect</author><pubDate>Wed, 29 Apr 2020 15:08:06 +0800</pubDate><description><![CDATA[今天和同事聊起列式存储ClickHouse数据库，原来存储模型的家族这么大。
关系型数据库(行式数据库)
就是传统的数据库，如mySql，Oracle， postgresql。
相比较与列式存储，最明显的特点就是把一行中的数据值串在一起存储起来，然后再存储下一行的数据。
列式存储 Sybase IQ, ClickHouse，Hbase
列式存储是相对于传统的行式存储来说的，最大区别就是数据时是按照...]]></description><category></category></item></channel></rss>