ES 安装 search-guard-6
安装插件
☞ 官方网站
在ES目录下执行命令
bin/elasticsearch-plugin install -b com.floragunn:search-guard-6:6.4.2-23.1
注: 安装版本需要和Elasticsearch版本相对应. 查看版本
这里不使用官方的快速构建方法
生成证书
下载脚本
git clone https://github.com/floragunncom/search-guard-ssl.git
证书配置
路径
**/elasticsearch-6.4.2/search-guard-ssl/example-pki-scripts
目录内容 etc下可对证书进行配置
修改example.sh
1234567891011121314151617181920212223242526272829#!/bin/bashOPENSSL_VER="$(openssl version)"if [[ $OPENSSL_VER == *"0.9"* ]]; t ...
issue
未读1. top 命令找到占用cpu最高的进程
123456789top - 14:37:14 up 34 days, 13:27, 2 users, load average: 0.21, 0.29, 0.29Tasks: 151 total, 1 running, 150 sleeping, 0 stopped, 0 zombieCpu(s): 4.4%us, 2.7%sy, 0.0%ni, 90.9%id, 0.5%wa, 0.0%hi, 0.2%si, 1.3%stMem: 16334064k total, 16171240k used, 162824k free, 16716k buffersSwap: 16383996k total, 4470816k used, 11913180k free, 539788k cachedPID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND1818 tomcat 20 0 3643m 983m 7548 S ...
final
final为java关键字, 可以作用于成员变量、方法、类上
1.作用于成员变量上, 基本类型则值不可修改, 如果成员变量为对象, 则该对象的引用不可修改.
2.作用于方法, 该方法不可被重写
3.作用于类, 该类不可继承
finally
异常处理的关键字, 无论异常是否发生, finally内逻辑总会执行.
finally 和 return 的执行顺序
1.一般使用逻辑, return在try-catch-finally之后, 证明, 无论是否异常, finally都会执行
1234567891011121314151617181920public class MainTest { public static void main(String[] args) { System.out.println(finallyTest()); } private static String finallyTest() { try { System.out.print ...
并发和锁
未读线程池处理流程
判断核心线程池是否已满, 不满则创建新线程执行任务
等待队列如果有界, 判断等待队列是否已满, 不满, 则添加任务到等待队列
判断最大线程数是否已满, 不满则创建新线程执行任务
最大线程数已满, 按照既定策略处理新任务
全参构造及各参数含义
123456789101112131415161718192021222324252627public class ThreadPoolExecutor extends AbstractExecutorService { public ThreadPoolExecutor(int corePoolSize, // 核心线程数 int maximumPoolSize, // 最大线程数 long keepAliveTime, // 核心线程外线程的存活时间 TimeUnit unit, // 存活时间的单位 ...
多线程
多个线程同时或交替运行, 单核CPU为顺序执行(交替执行), 多核情况下, 每个CPU有自己的运算器, 所以在多个CPU中可以同时运行.
创建线程的方式
1.继承Thread
12345678public class MyThread extends Thread { @Override public void run() { super.run(); System.out.println(Thread.currentThread().getName() + "执行完毕"); }}
1234567891011public class ThreadTest { public static void main(String[] args) { MyThread myThread = new MyThread(); myThread.setName("测试"); myThread.start ...
源码学习
未读介绍
主要介绍通过反射的方式获取单例对象, 验证单例模式的安全性.
主要从以下几个角度来介绍反射下的单例
饿汉式
双重锁检查
枚举单例
饿汉式
饿汉式直接使用反射即可破解单例模式
12345678910111213141516171819202122232425262728public class ReflectTest { public static void main(String[] args) { try { HungerPattern hungerPattern = HungerPattern.getHungerPattern(); Class<HungerPattern> hungerPatternClass = HungerPattern.class; Constructor<HungerPattern> conA = hungerPatternClass.getDeclaredConstructor(); C ...
介绍
java反射可以在运行时获取对象的成员和属性, 并且可以动态的创建对象并调用对象的属性.
反射一般编程中很少使用,但是在很多框架中都使用了反射, 比如配置Spring的Xml配置文件中, 就使用全类名配置方式, 其实就是反射的一种使用方式.
同时反射对单例模式有一定的影响, 可以参考反射获取单例对象
获取反射对象
获取反射Class对象一共三种方式
1234567// 1. 使用实例获取User user = new User();Class<? extends User> aClass = user.getClass();// 2. 使用类获取Class<User> userClass = User.class;// 3. 全类名获取, 可能会抛出 ClassNotFoundException 异常Class<?> aClass1 = Class.forName("com.liuzhihang.tool.reflect.User");
获取属性
获取字段
12345678// 获取所有公有字段 (public)Fie ...
介绍
LinkList也是工作中常见的集合, 底层使用双向链表结构
比较适合新增和删除, 查询和修改需要遍历相对ArrayList比较消耗性能
内部类 Node
1234567891011121314private static class Node<E> { // 元素值 E item; // 下一个节点 Node<E> next; // 上一个几点 Node<E> prev; // 构造一个新节点 指向上一个节点和下一个节点 Node(Node<E> prev, E element, Node<E> next) { this.item = element; this.next = next; this.prev = prev; }}
add 新增
通过代码可以看出, 在新增元素时只需要创建一个新节点 Node, 并将原始链表最后一个Node的next指向新Node
123456789 ...
ArrayList是工作中常用的集合, 基于数组实现, 可以插入空数据, 也支持随机访问.
ArrayList比较适合 get/set操作, 因为 add/remove需要移动数据, 相对来说比较消耗性能.
默认初始长度
1.默认初始长度为 10
2.底层结构为Object[] 数组
1234567891011private static final int DEFAULT_CAPACITY = 10;private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};/** * 构造一个初始容量为10的空列表 */public ArrayList() { this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;}
添加方法 add()
向数组中添加元素, 流程如下
12345678910/** * 将指定的元素追加到此列表的末尾. */public boolean add(E e) { // 扩 ...
issue
未读@Value注入属性
工作中一些公共属性, 一般通过@Value注入的对象的属性中, 使用方式如下
12345678910@Configurationpublic class WeChatConfig { /** * 微信支付参数 */ @Value("${wx.appId}") public String WX_APP_ID;}
通过@Value注解, 将配置文件中的值注入到对象属性中, 在使用时只需要注入WeChatConfig对象然后调用即可, 而实际工作中, 往往用静态属性, 方便使用, 于是可以写成如下方式
12345678910@Configurationpublic class WeChatConfig { /** * 微信支付参数 */ @Value("${wx.appId}") public static String WX_APP_ID;}
使用此方式不会报错, 但是却取不到属性值, 并 ...
简介
介绍使用枚举的方式创建单例, 其他方式可以参考单例模式
代码
12345678910111213141516171819202122232425262728293031323334353637/** * 使用枚举单例 * * @author liuzhihang * @date 2018/8/17 17:34 */public class SingletonPattern { private SingletonPattern() { } public static SingletonPattern getInstance() { return SingleEnum.INSTANCE.getSingletonPattern(); } private enum SingleEnum { /** * 单例 */ INSTANCE; private SingletonPattern singletonPatte ...