「造个轮子」——cicada 源码分析
前言
两天前写了文章《「造个轮子」——cicada(轻量级 WEB 框架)》
向大家介绍了 cicada
之后收到很多反馈,也有许多不错的建议。
同时在 GitHub 也收获了 100 多颗 小♥♥(绝对不是刷的。。)
也有朋友希望能出一个源码介绍,本文就目前的 v1.0.1
版本来一起分析分析。
没有看错,刚发布就修复了一个 bug,想要试用的请升级到
1.0.1
吧。
两天前写了文章《「造个轮子」——cicada(轻量级 WEB 框架)》
向大家介绍了 cicada
之后收到很多反馈,也有许多不错的建议。
同时在 GitHub 也收获了 100 多颗 小♥♥(绝对不是刷的。。)
也有朋友希望能出一个源码介绍,本文就目前的 v1.0.1
版本来一起分析分析。
没有看错,刚发布就修复了一个 bug,想要试用的请升级到
1.0.1
吧。
俗话说 「不要重复造轮子」,关于是否有必要不再本次讨论范围。
创建这个项目的主要目的还是提升自己,看看和知名类开源项目的差距以及学习优秀的开源方式。
好了,现在着重来谈谈 cicada 这个项目的核心功能。
我把他定义为一个快速、轻量级 WEB 框架;没有过多的依赖,核心 jar 包仅 30KB。
也仅需要一行代码即可启动一个 HTTP
服务。
最近在做分布式相关的工作,由于人手不够只能我一个人来怼;看着这段时间的加班表想想就是够惨的。
不过其中也有遇到的不少有意思的事情今后再拿来分享,今天重点来讨论服务的注册与发现。
我的业务比较简单,只是需要知道现在有哪些服务实例可供使用就可以了(并不是做远程调用,只需要拿到信息即可)。
要实现这一功能最简单的方式可以在应用中配置所有的服务节点,这样每次在使用时只需要通过某种算法从配置列表中选择一个就可以了。
但这样会有一个非常严重的问题:
由于应用需要根据应用负载情况来灵活的调整服务节点的数量,这样我的配置就不能写死。
不然就会出现要么新增的节点没有访问或者是已经 down 掉的节点却有请求,这样肯定是不行的。
往往要解决这类分布式问题都需要一个公共的区域来保存这些信息,比如是否可以利用 Redis?
每个节点启动之后都向 Redis 注册信息,关闭时也删除数据。
其实就是存放节点的 ip + port
,然后在需要知道服务节点信息时候只需要去 Redis 中获取即可。
平时接触过多线程开发的童鞋应该都或多或少了解过线程池,之前发布的《阿里巴巴 Java 手册》里也有一条:
可见线程池的重要性。
简单来说使用线程池有以下几个目的:
谈到线程池就会想到池化技术,其中最核心的思想就是把宝贵的资源放到一个池子中;每次使用都从里面获取,用完之后又放回池子供其他人使用,有点吃大锅饭的意思。
那在 Java 中又是如何实现的呢?
在 JDK 1.5 之后推出了相关的 api,常见的创建线程池方式有以下几种:
Executors.newCachedThreadPool()
:无限线程池。Executors.newFixedThreadPool(nThreads)
:创建固定大小的线程池。Executors.newSingleThreadExecutor()
:创建单个线程的线程池。