关于本文

 虽然接触 Java 已经 8 年之久,可惜学习之初的笔记文档没能很好地保存下来。本文是近几年工作学习中遇到的一些零散的知识点,包括了 基础概念、实用的编程技巧、代码可读性、设计模式、性能优化(工具 & 编码)、测试相关、JVM 相关、常用的工具和常见问题。本着好记性不如烂笔头的初衷,在不断地踩坑和爬坑的过程中,慢慢地记录成文。期待着本文能起到抛砖引玉的作用,以看到大家的真知灼见。

基础知识

注解

GuardedBy

 @GuardedBy 注解可以作用于某一个属性或者方法,约定在访问这些被注解标记的资源时,能被同步代码块保护着。简单的使用案例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
@GuardedBy("obj")
private ConcurrentMap<String, String> map = new ConcurrentHashMap<>();
private final Object obj = new Object();

public void put(String k, String v) {
synchronized (obj) {
map.put(k, v);
}
}

/**
* If you use `error prone` tool to check this, this annotation should be `@SuppressWarnings("GuardedBy")`
* {@see https://errorprone.info/bugpattern/GuardedBy}
* {@see https://github.com/apache/druid/pull/6868#discussion_r249639199}
*/
@SuppressWarnings("FieldAccessNotGuarded")
public void remove(String k) {
map.remove(k);
}

@Override
public String toString() {
synchronized (obj) {
return "GuardedByExample{" +
"map=" + map +
'}';
}
}

Tips: Code Example from Apache Druid;另外,error-prone 工具支持对多种版本@GuardedBy 进行检查

阅读全文 »

ElasticSearch 是什么?

 ElasticSearch™ 是一款基于 Lucene 的搜索引擎,不但稳定、可靠、快速,同时具备良好的水平扩展能力

特性

  • 功能丰富,且开箱即用
  • 横向可扩展性
  • 分片机制更好地解决热点问题
  • 多副本有效保证了高可用
  • 精确的熔断器机制
  • 社区庞大,生态完善

主要概念

Cluster 集群

 在一个分布式系统里面,可以通过多个 ElasticSearch 节点组成一个集群。集群中会动态选举出一个主节点,保证了 ElasticSearch 集群不存在单点故障
 在同一子网内,只需要将进程设置为相同的集群名,ElasticSearch 就会把这些集群名相同的进程自动组成一个集群。集群中各节点间的通讯和数据负载均衡,全部都由 ElasticSearch 自动管理

Node 节点

 每一个 ElasticSearch 进程称为一个 Node 节点。在测试环境中,可以在一台服务器上运行多个 ElasticSearch 进程;但生产环境中,则建议每台服务器只运行一个 ElasticSearch 进程

Index 索引

 ElasticSearch 中的索引是文档数据存储的地方,相当于是传统关系数据库中的 DataBase 概念。更多逻辑上的对应关系,如下表所示:

Relational DB HBase ElasticSearch 说明
Database NameSpace Template 一组索引的模板配置
Table Table Index 索引
Row RowKey Document 文档,和 Lucene 概念一致
Column + Value Cell Field 如果将文档理解为 JSON,那么 Field 就是字段和值
- - Term 检索的基本单位,相当于是文本中的一个词
- - Token Term 内容、类型,以及 Term 在文本中的起始及偏移
目前最新的 ElasticSearch 7.x 版本里面已经废弃了 Type 的概念
阅读全文 »

Git 相关的使用技巧、常见的坑 和 Github 社区中高频的缩写。

阅读全文 »

Netty 是什么?

Netty™ is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients.

基本概念

Channel

 代表一个到实体(硬件设备、文件、网络 Socket 等)的开放连接,如读操作或写操作

Callback

 代表一个在处理完某个事件之后,被调用的方法

Future

 代表一个异步操作结果的占位符

Event

 代表一个可能会触发相应动作的事件连接被激活、用户事件等

ChannelHandler

 代表一个响应特定事件而被执行的回调

阅读全文 »

Nginx 是什么?

Nginx™ [engine x] is an HTTP and reverse proxy server, a mail proxy server, and a generic TCP/UDP proxy server

环境搭建

下载

 在 Nginx Archive 下载页面,下载 nginx-1.13.12.tar.gz 安装包

安装依赖

1
2
$ yum -y install openssl openssl-devel
$ yum -y install pcre-devel

编译安装

1
2
3
4
5
$ tar zxvf nginx-1.13.12.tar.gz
# 必须要跳转到 nginx 安装目录下
$ cd nginx-1.13.12
$ ./configure --prefix=/usr/local/nginx --conf-path=/usr/local/nginx/nginx.conf
$ make -j4 && make -j4 install

启动

1
2
$ cd /usr/local/nginx/
$ sbin/nginx -c /usr/local/nginx/nginx.conf
1
$ ps -ef | grep nginx
1
2
3
4
root     107034      1  0 Oct31 ?        00:00:00 nginx: master process sbin/nginx
nobody 107036 107034 0 Oct31 ? 00:00:00 nginx: worker process
nobody 107266 107265 0 Oct31 ? 00:00:00 tsar --check --apache --cpu --mem --load --io --traffic --tcp --partition --nginx --swap
root 107270 97588 0 Oct31 pts/1 00:00:00 grep nginx
阅读全文 »