大象(Gradle)的故事:一见如故

小码哥:“与大象(Gradle)一见如故?你就是 Gradle?” 大象:“对,我就是那个用来构建 Java 项目的 Gradle 大象。 ” 小码哥:“我好像天天都在用你啊。看,我的项目都是用你构建的。” 大象:“但你不一定真的认识我,你每次修改点构建代码时是不是都要问下谷哥哥(Google)或溢栈哥哥(StackOverflow)?” 小码哥:“额。。。” 大象:“我是你的老朋友了,不要天天如初见哦,咱们得多聊聊,我爸妈给我写了传记(文档),估计你也懒得细看,不如我给你做个自我介绍吧。” 小码哥:“👌ok” 大象:“你有用 InteliJ IDEA 吗? ” 小码哥:“对,用的社区版。” 大象:“那我就用 InteliJ IDEA CE 版来给你介绍自己”。 你好,我是 Gradle! Gradle 是一个用来自动化构建项目的的工具,可以用来构建你常用的 Java、Kotlin 等 JVM 语言开发的项目。我的配置文件可以使用 Gvoovy 或者 Kotlin 来编写,不像隔壁前辈 Maven 那样,要写一大段 XML,你可以很开心的像写代码一样来调整我的配置。 其实我就是你的代码自动化产线,产线有几个工序(Task),你负责喂我代码,我负责打包(Jar/War/JavaDoc/Test)。是不是觉得与科幻片里面的工厂很像? 创建项目 请打开你的 InteliJ IDEA CE,使用 idea 可以很方便的创建一个由我构建的项目(File > New > Project…)。 这里在对话框的左边栏选择 Gradle,右边选择 Java 项目。 输入好项目名之后点击 Finish 就可以啦。 探索项目 idea 帮我们创建了一个 Java 项目,浏览项目很容易发现两个以 gradle 为结尾的文件: build.gradle 和 settings.gradle。我们来看一下它们俩的内容。 settings.gradle...

February 22, 2020 · 3 min

Java 进阶要点

自己学习 Java 和用 Java 过程中的理解和备忘的知识点。 JDK 11 Oracle 不在免费提供 LTS 版本了,包括 JDK 8 ZGC, 可伸缩的、低延迟的垃圾收集器,STW 时间不超过 10ms Nashorn 标记为 Deprecate 了 JDK 9 module try-catch 简化 _ 为保留关键字 var 将在 JDK 10 中作为关键字, 作为本地变量类型推断关键字 字符串相关,主要是 Compact String, 用 byte[] 替换了 char[], char 在 Java 中占两个字节 G1 作为默认垃圾回收器 JVM 启动 JVM 相关的命令行参数 G1 垃圾回收器 内存 JVM(Hotspot) 内存结构 制造各种 OutOfMemery 和 StackOverflow 各种 JVM 相关工具(jstat/jmap/jstack/jps 等) 解决 FullGC 的问题 引用:WeakRefrence/PhantomReference/SoftRefrence/FinalRefrence 等 ClassLoader/URLClassLoader Spring Boot 的 ClassLoader 自定义 ClassLoader 多线程和并发 JVM 的线程模型 1:1 协程 创建线程的方法 线程同步 synchronzied/对象锁/类锁/锁方法/锁锁代码块 线程池 锁相关(Lock 接口和实现类) Condition volatile ThreadLocal 用途和实现 并发(CAS/乐观锁/无锁/无等待/无阻塞) 字节码 基本结构 操作字节码的工具 Javassist/ASM AOP 集合 Collection,List,ArrayList,Vector,LinkedList, SkipList, Stack Queue HashMap/HashTable HashMap 扩容死循环问题 LinkedHashMap TreeMap HashSet,TreeSet WeakHashMap 并发相关的集合 ConcurrentHashMap CopyOnWriteArrayList IO IO 模型 NIO Non-blocking IO Java 8 IO 相关的接口和类 Netty Vert....

March 6, 2019 · 1 min

日志收集和分析系统架构

背景 微服务,日志分散且种类多(php/java/python),用 docker 起应用,日志通过卷放在宿主机器指定目录下,服务有众多实例,metrics 数据也不仅相同,无论是日志还是 metrics 数据,都可以看作是时间序列数据 分散主要表现为: 多个主机 多个目录下多个文件 应用开发所使用的技术栈不同日志格式不同 web log(主要是 nginx) 各类事件 一些其它事务性的日志 日志为时间序列数据,包括: 系统日志: 各类系统产生的跟业务有关的日志或者与业务无关的日志 web 服务器日志:如 access.log/error.log 等有固定格式的日志 性能监控日志:打点记录各类服务的 metrics(全部为数值类型 long/double/bool) 系统日志 由时间戳、一些枚举值以及日志内容(变长字符串)组成 日志时间颗粒度:支持毫秒/秒 枚举值包括: [必选]主机名/host [必选]服务名/service [必选]实例编号/instance [必选]日记级别/level:info/debug/warn/trace/error 等 [可选]异常名/exception: 如果是异常,把异常名作为枚举值记录 [可选]线程名/thread: [可选]方法名/method: [可选]文件名/file: [可选]行号/line: 日志内容(变长字符串): 为实际记录的内容以及异常堆栈信息 web 服务器日志 access log(nginx) 日志内容:主要是文本(string)或者一些系统 metrics 数据(数值类型 long/double) 日志存储和处理: 数据磁带(1 周):kafka 提供热数据检索(1 个月):solr(or lucence based on cassandra) 日志存储(永久): kariosdb/cassandra: 支持 double/long/string 类型,kariosdb 相当于在 cassandra 上面套了一个壳,这样简化了很多时间序列数据处理的操作 数据展示:grafana,官方支持 kariosdb 扩展:数据深度挖掘分析 系统架构 特点:...

July 23, 2017 · 1 min

Log4j2 快速入门

背景 Java 生态下的日志库太多,配置也不同,大多数情况下会使用 SLF4j (又引入了一个库)来抽象日志接口。在使用 Log4j2 后,发现可以不使用 SLF4j 了,并且配置变得更简单,可以使用 lombok 的 log4j2 注解等。 需要搞清楚 如何设置哪些日志要记录下来 日志记录到哪里去 LEVEL 日志级别: 内置(有 Fatal):All < Trace < Debug < Info < Warn < Error < Fatal < OFF 还可以自定义: https://logging.apache.org/log4j/2.0/manual/customloglevels.html Appender: 日志输出的目的地 内置的目的地有: console, files(FIle/RollingFile), remote socket servers, Apache Flume, JMS, remote UNIX Syslog daemons, various database APIs … Appender 在接受到日志以后,可以通过级别过滤选择记录日志,具体配置: https://logging.apache.org/log4j/2.0/manual/appenders.html Logger 负责决定哪些日志要记录和发配日志 哪些需要记日志,设置什么级别,并且配置日志输出到哪些个 Appender 中去都在 Logger 中配置。Logger 有类似继承的关系,名为 Root 的的 Logger 为所有 Logger 的根,也就是说没有做特殊设置(additivity=false), 那么这个 Logger 的日志将会记录到自己指定的 Appender,并且也都会记录到自己所有“父” Logger 设置的 Appender 中去...

July 15, 2017 · 1 min