Java
文章平均质量分 74
hellboy0621
怕什么真理无穷,进一寸有一寸的欢喜。
展开
-
【Druid源码阅读】11. 小结
今天总结下,前几天分析的 Druid 源码。由于每天可投入的有效时间有限,只把 Druid 最基本的流程大概看了下,但还是有些疑惑点的。最重要的就是获取连接方法中的初始化方法 init(),连接对象保存在3个数组中,后续创建和销毁线层都是通过操作这3个数组来完成的。再有就是可重入锁 lock,以及可重入锁上的2个条件empty 和notEmpty。用来控制线程池中如果连接数已经达到最大连接数时,线程阻塞,不再创建新的连接; 如果连接池中没有可用连接时,阻塞,并且通知创建线程恢复,...原创 2022-05-21 01:43:59 · 205 阅读 · 0 评论 -
【Druid源码阅读】10. 过滤器工作原理
昨天以 StatFilter 分析了责任链模式,今天还以 StatFilter 来举例。StatFilter 就是用来统计数据,用来支撑 Druid 监控的。其实大概看一下 StatFilter 的结构,可以看到有很多 public 方法,第一个参数是 FilterChain,并且代码实现都是使用调用过滤器的同名方法,过滤方法有很多,除了昨天介绍的 dataSource_getConnection,再举个例子:@Overridepublic void connection_commi原创 2022-05-19 23:59:28 · 414 阅读 · 0 评论 -
【Druid源码阅读】9. 过滤器
在前面几天获取连接的代码中,经常会看到 filters 这个属性,今天一起来看下过滤器是如何工作的。找一个单侧,把里面连接串和用户名密码改成自己的:src/test/java/com/alibaba/druid/pool/Case0.java设置 stat 过滤器里面有一行代码,就是设置过滤器的:dataSource.setFilters("stat");public void setFilters(String filters) throws SQLException {原创 2022-05-19 00:45:10 · 1204 阅读 · 0 评论 -
【Druid源码阅读】8. 对于连接的管理
目录testOnBorrowtestWhileIdletestOnReturn结论第6篇中,分析了如何获取连接,那获取连接后,Druid 是如何管理这些连接的呢?可以先给结论,是通过几个关键参数来控制的testOnBorrowtestOnReturntestWhileIdletestOnBorrow首先看 testOnBorrow,从字面理解,是从连接池中获取连接时,要测试连接是否可用。下面是代码中使用这个属性的几处地方:1179 和 1193 行,原创 2022-05-19 22:20:43 · 532 阅读 · 0 评论 -
【Druid源码阅读】7. 驱动加载
在初始化 init() 方法中,可以看到2处关于 java.sql.Driver 驱动的方法:// bug fixed for dead lock, for issue #2980DruidDriver.getInstance();resolveDriver();先来看第1处,看注释是为了解决一个bug而增加的,主要解决了多线程死锁的问题,issue 链接:https://github.com/alibaba/druid/issues/2980DruidDriver 类的 static原创 2022-05-17 01:47:17 · 464 阅读 · 0 评论 -
【Druid源码阅读】5. 创建并运行销毁连接线程:createAndStartDestroyThread()
上一篇分析了创建连接线程,今天来看下销毁连接线程。1. 2种方式执行destroyTask 中封装的逻辑分2种情况,取决于使用者有没有在初始化连接池前设置destroyScheduler:protected void createAndStartDestroyThread() { // 这里创建真正销毁连接的任务 destroyTask = new DestroyTask(); // 如果在初始化连接池之前设置了销毁连接的定时执行器 destroySchedule..原创 2022-05-15 01:00:55 · 381 阅读 · 0 评论 -
【Druid源码阅读】6. 初始化后获取连接
前几天把 init 初始化方法大概分析了下,今天继续,把获取连接的部分分析完。public DruidPooledConnection getConnection(long maxWaitMillis) throws SQLException { init(); if (filters.size() > 0) { FilterChainImpl filterChain = new FilterChainImpl(this); return fil原创 2022-05-14 00:09:59 · 297 阅读 · 0 评论 -
【Druid源码阅读】4. 创建并运行创建连接线程:createAndStartCreatorThread()
现在我们来一起看下 创建并运行创建连接线程:createAndStartCreatorThread();protected void createAndStartCreatorThread() { // 只有在创建执行器没有设置时,才会创建创建连接线程 if (createScheduler == null) { String threadName = "Druid-ConnectionPool-Create-" + System.identityHashCode(..原创 2022-05-13 00:36:24 · 593 阅读 · 0 评论 -
【Druid源码阅读】3. 初始化连接之同步创建连接
书接上文,异步创建连接需要设置参数,如果不设置参数,使用默认配置,会进到同步创建连接的分支。if (createScheduler != null && asyncInit) { // 异步 for (int i = 0; i < initialSize; ++i) { submitCreateTask(true); }} else if (!asyncInit) { // 同步 // init connections..原创 2022-05-12 23:22:10 · 195 阅读 · 0 评论 -
【Druid源码阅读】2. 初始化连接之异步创建连接
今天就连着昨天的思路,来看下连接到底是如何初始化的。第14步: 初始化连接,数量为设置的初始连接数,并存放到数组中;(真正创建连接在这一步中)if (createScheduler != null && asyncInit) { // 异步 for (int i = 0; i < initialSize; ++i) { submitCreateTask(true); }} else if (!asyncInit) { //..原创 2022-05-12 01:04:07 · 1507 阅读 · 0 评论 -
【Druid源码阅读】1. 初识Druid
Druid源码阅读原创 2022-05-11 01:38:55 · 1325 阅读 · 0 评论 -
AOP之 AspectJ
AOP之jac编译器原创 2022-04-16 21:46:06 · 275 阅读 · 0 评论 -
Java 不同 String 相同 hashCode
快速找到 hashCode 相同的两个字符串:查看 String 的 hashCode() 方法,源码如下:public int hashCode() { int h = hash; if (h == 0 && value.length > 0) { char val[] = value; for (int i = 0; i < value.length; i++) {原创 2021-06-05 22:15:33 · 849 阅读 · 0 评论 -
【Soul源码阅读】21.插件之大体流程
插件的接口 SoulPlugin 有很多实现,我们先关注以下这些,从名字上能看出来,这些就是 soul-admin 管理页面上插件列表里的代码实现。下面,以DividePlugin 为例,详细看看这优雅的设计。...原创 2021-02-06 03:05:00 · 228 阅读 · 0 评论 -
【Soul源码阅读】20.插件灵魂之选择器和规则
目录1.灵魂2.数据结构3.选择器4.规则1.灵魂这几天一直在看插件相关的功能,一直把核心概念忽略了,那就是所有的插件都有的:selector 和 rule。在看看官网文档https://dromara.org/zh/projects/soul/selector-and-rule/,里面第一句就是:选择器和规则是 soul 网关中最灵魂的东西。掌握好它,你可以对任何流量进行管理。都这么多天过去了,眼睛里净盯着具体对接的协议和同步功能,还有插件的具体使用,就没有关心过.原创 2021-02-05 01:09:49 · 442 阅读 · 0 评论 -
【Soul源码阅读】19.插件之 divide
目录1.启动2.开启 divide 插件3.添加选择器和规则4.验证4.1 负载均衡4.2 IP 端口探活官网文档https://dromara.org/zh/projects/soul/divide-plugin/divide插件是网关处理 http协议请求的核心处理插件。1.启动在网关的 pom.xml 文件中添加 starter 依赖,当然,divide 插件是默认支持的。(application-local.yml) <!--if .原创 2021-02-04 00:27:58 · 333 阅读 · 1 评论 -
【Soul源码阅读】18.插件之 sentinel
目录1.启动2.开启 sentinel 插件3.添加选择器和规则4.验证官网文档 https://dromara.org/zh/projects/soul/sentinel-plugin/sentinel 插件是网关用来对流量进行限流与熔断的可选选择之一。1.启动在网关的 pom.xml 文件中添加 sentinel的支持。 <!-- soul sentinel plugin start--> <dependency>原创 2021-02-01 22:27:56 · 123 阅读 · 0 评论 -
【Soul源码阅读】17.插件之 hystrix
官网文档https://dromara.org/zh/projects/soul/hystrix-plugin/hystrix插件是网关用来对流量进行熔断的核心实现。1.启动在网关的 pom.xml 文件中添加 hystrix starter 依赖 <!-- soul hystrix plugin start--> <dependency> <groupId>org.dromara</g...原创 2021-02-01 21:47:37 · 138 阅读 · 1 评论 -
【Soul源码阅读】16.启动多台admin,多个网关,形成一个集群
目录1.启动多台 soul-admin2.启动多台 soul-bootstrap3.启动多台业务系统4.验证同步4.1 负载均衡4.2 数据同步1.启动多台 soul-admin修改配置文件,把可以开启允许并行执行的复选框。application.ymlserver: port: 9095server: port: 9096启动后状态:2.启动多台 soul-bootstrap跟上面的一样,修改配置文件,打开并行执行的开关。.原创 2021-01-31 04:19:14 · 464 阅读 · 0 评论 -
【Soul源码阅读】15.soul-admin 与 soul-bootstrap 同步机制之 nacos 解析(下)
目录1.准备2.页面操作3.跟踪源码3.1 soul-admin 端3.2 soul-bootstrap 端上一篇讲到使用 nacos 同步策略,在项目启动时的同步机制,今天来看下在页面操作时,是怎么同步的。1.准备按照昨天的帖子(【Soul源码阅读】14.soul-admin 与 soul-bootstrap 同步机制之 nacos 解析(上)),把项目启动起来,soul-admin、soul-bootstrap 和 soul-examples-http 三个项目,当然还有原创 2021-01-30 01:11:14 · 1030 阅读 · 4 评论 -
【Soul源码阅读】14.soul-admin 与 soul-bootstrap 同步机制之 nacos 解析(上)
目录1.准备配套设施2.配置2.1 soul-admin 配置2.2 soul-bootstrap 配置3.启动服务4.源码分析1.准备配套设施启动 MySQL、Nacos。使用 docker 启动 Nacos(详情见官网github https://github.com/nacos-group/nacos-docker)。Clone projectgit clone --depth 1 https://github.com/nacos-group/nacos-原创 2021-01-29 03:18:46 · 346 阅读 · 0 评论 -
【Soul源码阅读】13.soul-admin 与 soul-bootstrap 同步机制之 http 长轮询解析(下)
目录1.前情回顾2.soul-bootstrap 长轮询任务3.soul-admin 中 /configs/listener 接口3.1比对数据是否有变化3.2阻塞并监听变化1.前情回顾书接上文,昨天的文章【Soul源码阅读】12.soul-admin 与 soul-bootstrap 同步机制之 http 长轮询解析(上) 4.2小节的坑(不开 zk 网关不能启动的错误),没研究明白,最后放弃了,把 soul-admin 和 soul-bootstrap 都关掉,把 soul原创 2021-01-28 02:16:27 · 230 阅读 · 0 评论 -
【Soul源码阅读】12.soul-admin 与 soul-bootstrap 同步机制之 http 长轮询解析(上)
1.前情回顾紧接着前两天的 zookeeper,今天来看下 http 长轮询。2.配置数据同步策略官网链接https://dromara.org/zh-cn/docs/soul/user-dataSync.html2.1 soul-admin修改application.yml 配置文件,打开注释的代码:soul: sync: http: enabled: true对应 Bean,默认 enabled 就是 true,只要配置 soul.s...原创 2021-01-27 04:03:19 · 976 阅读 · 3 评论 -
【Soul源码阅读】11.soul-admin 与 soul-bootstrap 同步机制之 zookeeper 解析(下)
目录3.3 启动 soul-bootstrap接上篇【Soul源码阅读】10.soul-admin 与 soul-bootstrap 同步机制之 zookeeper 解析(上)3.3 启动 soul-bootstrap在上篇 2.2 小节中,提到了ZookeeperConfig 配置类,在代码中搜索使用的地方,找到ZookeeperSyncDataConfiguration,源码如下:/** * The type Zookeeper configuration. * * @...原创 2021-01-25 23:53:18 · 229 阅读 · 0 评论 -
【Soul源码阅读】10.soul-admin 与 soul-bootstrap 同步机制之 zookeeper 解析(上)
1.前情回顾紧接着昨天的 websocket,今天来看下 zookeeper。想知道websocket 相关的出门左转【Soul源码阅读】9.soul-admin 与 soul-bootstrap 同步机制之 websocket 解析2.配置因为数据同步方式是双方规定的,必须保持一致,所以修改配置也是 soul-admin 和 soul-bootstrap 都要改。其实配置都是类似的,之前默认是 websocket,需要把 websocket 相关的配置注释掉,打开zookeeper .原创 2021-01-24 03:39:38 · 314 阅读 · 0 评论 -
【Soul源码阅读】9.soul-admin 与 soul-bootstrap 同步机制之 websocket 解析
1.前情回顾在第4篇中,我们分析了 HTTP 用户业务系统接入 Soul 网关后,会调用 soul-admin 的注册接口,把需要网关代理的接口信息全部注册到 soul-admin 上,在最后,会通过 websocket 长连接,将soul-admin 接收到的接口信息同步给 Soul 网关(即 soul-bootstrap),今天就来接着继续分析,数据是怎么同步到 soul-bootstrap 的。不清楚流程的可以出门左转看下第4篇文章【Soul源码阅读】4.HTTP 用户接入 Soul 调用 .原创 2021-01-23 00:44:29 · 971 阅读 · 0 评论 -
【Soul源码阅读】番外1.WebFlux服务器启动流程
WebFlux 服务器启动流程结合 Spring Boot 的启动流程讲解 WebFlux 服务启动流程,首先看一下启动时序图:1.run // SpringApplication.java /** * Static helper that can be used to run a {@link SpringApplication} from the * specified sources using default settings and user supplie...原创 2021-01-22 17:06:34 · 560 阅读 · 5 评论 -
【Soul源码阅读】8. Spring Cloud 用户接入 Soul 网关流程解析
官网文档中有详细的接入流程,地址:https://dromara.org/zh-cn/docs/soul/user-springcloud.html1.前置条件接入前,请正确的启动soul-admin(如有疑问,出门左转【Soul源码阅读】2.单机部署 Soul或官网文档-搭建Soul网关环境)2.引入网关对 Spring Cloud 的插件支持2.1 公共依赖在 soul-bootstrap 的 pom.xml 文件中,找到了被注释掉的3个依赖,打开注释:<!--so...原创 2021-01-21 16:54:17 · 371 阅读 · 1 评论 -
【Soul源码阅读】7. sofa 用户接入 Soul 网关流程解析
官网文档中有详细的接入流程,地址:https://dromara.org/zh-cn/docs/soul/user-sofa.html之前一直没接触过 sofa,官网的介绍如下:SOFARPC is a high-performance, high-extensibility, production-level Java RPC framework. In Ant Financial, SOFARPC has been used for more than ten years and develo原创 2021-01-21 00:33:29 · 449 阅读 · 0 评论 -
【Soul源码阅读】6. Dubbo 用户接入 Soul 网关流程解析
OK,前面几天把 HTTP 用户 接入 Soul 网关大概了解了下,尤其是昨天 debug 到底层,发现里面配置了很多 plugin 插件,默认只开启了一个 divide 插件,用来转发 HTTP 请求的。今天不搞那么复杂的,要劳逸结合嘛,毕竟一口吃个胖子只存在于幻想中,还是一口口慢慢消化吧。来一起看下 dubbo 插件吧。根据官网文档操作这年头,各种帖子层出不穷,甚至还有内容农场,相信你也遇到过很多帖子,内容明明一样,各种错误也是直接 copy,对于需要解决问题的我,真的是恨之入骨。即使原创 2021-01-19 20:00:02 · 346 阅读 · 0 评论 -
【Soul源码阅读】5.GET 请求在 Soul 网关中流转的简单分析
前几天一直在外围转悠,试用了一下默认的 divide 插件,今天来研究下一个请求是如何通过 Soul 网关分发到真实服务节点的。通过浏览器或 postman 发送一个 GET 请求。http://localhost:9195/http/order/findById?id=95selector 和 rule 默认都打开日志了,可以在 SoulBootstrapApplication 的 console 控制台看到如下日志如下:2021-01-18 18:35:05.357 INFO 20836 -原创 2021-01-19 01:38:47 · 292 阅读 · 1 评论 -
【Soul源码阅读】4.HTTP 用户接入 Soul 调用 /soul-client/springmvc-register 接口逻辑分析
今天我们紧接着昨天分析继续,如果想知道昨天分析了点儿啥,出门左转【Soul源码阅读】3.HTTP 用户接入 Soul 流程解析。1. 前情回顾好的,言归正传,昨天分析到我们自己的业务系统,会调用 soul-admin 一个接口,把需要 Soul 网关管理的接口注册,今天就具体看看到底干了点儿啥。先看下调用的接口信息如下:/** * Instantiates a new Soul client bean post processor. * * @param soulSpringMvcC原创 2021-01-17 02:20:23 · 1945 阅读 · 1 评论 -
【Soul源码阅读】3.HTTP 用户接入 Soul 流程解析
昨天只是极简入门,关于网关是怎么感知到我们的应用的,相信小伙伴们一定有疑问,今天先来看下 HTTP 用户如何接入 Soul,以及接入的流程是怎样的。这是官网对于 HTTP 用户的文档,https://dromara.org/zh-cn/docs/soul/user-http.html。官网文档明确指出,Soul 网关使用 divide 插件来处理http请求,我们在 soul-admin 页面中看到,第一个就是 divide 插件,而且是默认开启的。Http请求接入网关,分2种情况,1种是 sp原创 2021-01-16 00:42:29 · 1306 阅读 · 4 评论 -
【Soul源码阅读】2.单机部署 Soul
上一篇中,我们对 Soul 有了一个简单的认识。在学习一项新技术时,我们先按照官网上的 Demo 把环境搭建起来。今天先搭建一个单机版测试环境。1.下载源码soul 的 github 地址:https://github.com/dromara/soul这里有2个选择:如果只是用来阅读 soul 源码,不会改动,不提交 PR的,直接 git clone 的地址。 如果学习源码后,希望参与到 soul 开源项目中,fork 到自己账号下,再 clone 自己账号下的 soul 项目。这.原创 2021-01-14 17:49:45 · 433 阅读 · 0 评论 -
【Soul源码阅读】1.初识 Soul
无论我们学习什么东西之前,都要先搞清楚我们要学习的是什么,就像一些哲学思考先要给出清晰的定义,否则后面的一切都无从谈起。从今天开始,我来和大家一起,学习一款非常优秀的开源网关项目 Soul。Soul 是什么呢?先来看下官网作者的定义:这是一个异步的,高性能的,跨语言的,响应式的API网关。我希望能够有一样东西像灵魂一样,保护您的微服务。参考了Kong,Spring-Cloud-Gateway等优秀的网关后,站在巨人的肩膀上,Soul由此诞生!里面提到了几个关键字,“异步”、“高性能”、“原创 2021-01-14 16:03:34 · 1181 阅读 · 1 评论 -
记录Java有意思的代码 持续更新~
1.局部变量对象引用public static void main(String[] args) { List<String> list1 = new ArrayList(); list1.add("a"); list1.add("b"); list1.add("c"); List<String> list2 = new ArrayList(); list2.add("x"); list2.add("y"); li原创 2020-05-21 20:37:18 · 169 阅读 · 0 评论 -
线程安全之原子操作 待续~
原子操作,可以是一个步骤,也可以是多个操作步骤,但是其顺序不可以被打乱,也不可以被切割而只执行其中一部分(不可中断性),将整个操作视为一个整体,资源在该次操作中保持一致,这是原子性的核心特征。CAS机制compare and swap,属于硬件同步原语,处理器提供了基本内存操作的原子性保证。CAS操作,需要输入两个数值,一个旧值一个新值,在操作期间先比较下旧值有没有发生变化,如果没有发生变化,才交换成新值;如果发生了变化,则不交换。使用Java中Unsafe类实现CAS机制:impor原创 2020-05-19 08:01:03 · 137 阅读 · 0 评论 -
获取线程信息
// 获取 Java 线程管理 MXBeanThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();// 不需要获取同步的 monitor 和 synchronizer 信息,仅获取线程和线程堆栈信息ThreadInfo[] threadInfos = threadMXBean.dumpAllThreads(false, false);// 遍历线程信息,仅打印线程 ID 和线程名称信息for (ThreadInfo thr.原创 2020-05-19 07:31:19 · 395 阅读 · 0 评论 -
线程安全之可见性问题
1、线程安全概念临界区:无法被多个线程同时访问的公共资源。 竞态条件:可能发生在临界区内的特殊条件。 共享资源:被多个线程读取或修改的资源。 线程安全: 如果一段代码是线程安全的,则不包含竞态条件。 只有当多个线程更新共享资源时,才会发生竞态条件。 栈封闭时,不会在线程间共享的变量,都是线程安全的。 局部变量引用本身不共享,但是引用的对象存储在共享堆中。 如果方法内创建的对象,只是在方法中传递,并且不对其他线程可用,也是线程安全的。 判定规则:如果创建、使用和处理资源,永远不原创 2020-05-16 12:47:08 · 373 阅读 · 0 评论 -
线程封闭之ThreadLocal
多线程访问共享可变数据时,涉及到线程间数据同步问题。数据都被封闭在各自的线程之中,就不需要同步,这种通过将数据封闭在线程中,而避免使同步的技术,称为线程封闭。ThreadLocal线程级别变量 每个线程都有一个ThreadLocal 每个线程都拥有了自己独立的一个变量 竞争条件被彻底消除了 在并发模式下是绝对安全的变量1.示例import java.text.SimpleDateFormat;import java.util.Random;import java.util.c原创 2020-05-16 01:03:35 · 162 阅读 · 0 评论