查看集群
1. 查看集群健康
1curl -X GET "localhost:9200/_cat/health?v"
2. 查看集群节点
1curl -X GET "localhost:9200/_cat/nodes?v"
3. 查看集群所有索引
1curl -X GET "localhost:9200/_cat/indices?v"
get 获取指定数据
1. 直接获取数据
1curl -X GET "localhost:9200/monitor_log_mch_order_out/logs/AWSudIFgTuj3oZBEhyxK?pretty"
格式为 /{index}/{type}/{id}
字段
含义
monitor_log_mch_order_out
索引 (_index)
logs
索引的类型 (_type), 不知道类型可以用 _all 匹配
AWSudIFgTuj3oZBEhyxK
id (_id)
pretty
json格式显示数据, 可省略
2. 屏蔽 ...
ELK
未读输入
12345input { beats { port => "5043" }}
配置日志输入方式为 filebeat, 并配置端口
过滤
1234567891011121314151617181920212223filter { grok { match => { "message" => "\[%{DATA:time}\]-\[%{DATA:method}\] - \[%{DATA:catalina}\] -\[%{DATA:logLevel}\] - \[%{DATA:index_prefix}\|%{WORD:logType}\|%{WORD:sysNo}\|%{WORD:objType}\|%{DATA:fun ...
ELK
未读filebeat配置
12345678910111213141516171819202122232425262728filebeat.prospectors:- input_type: log#读取日志的路径 paths: - /opt/export/log/info-xxx.log fields: log_type: "monitor_log" fields_under_root: true#过滤部分日志 include_lines: ['Monitor_log']#----------------------------- Logstash output --------------------------------output.logstash: # The Logstash hosts hosts: ["xxx.xxx.xxx.xxx:5043","xxx.xxx.xxx.xxx:5043"] loadbalance: true#===================== ...
线程的生命周期
图解析
1.一般情况下线程主要经历: 准备, 就绪, 运行, 死亡四种状态.
2.准备:即创建线程, 包括集成Thread, 线程池, spring方式等等
3.就绪:线程创建并调用start()方法并不代表线程将立即获得资源, 而是进入到就绪状态进行资源分配
4.运行:抢占到资源的线程将执行, 执行过程可能会含有一些别的操作
1).线程等待, 直到调用 notify()或notifyAll()方法被唤醒, 这里唤醒后不会立即继续执行线程, 而是进入就绪状态重新抢占资源
2).线程休眠, 直到休眠时间结束, 同样结束后不会立即继续执行线程, 而是进入就绪状态重新抢占资源
3).线程阻塞, IO资源阻塞, 锁等方式使线程进入阻塞队列, 释放锁将继续执行
5.死亡: 调用~~stop()~~方法, 线程中断, 或线程执行完毕则线程死亡
synchronized锁的使用
synchronized可以使用在方法和代码块中, 使用的方式不同锁代表的含义不同, 下面将从几个方面进行介绍.
普通方法
静态方法
代码块synchronized(this)
代码块synchronized(*.class)
结论
在使用synchronized关键字中锁主要分为两类, 一种是对象锁, 另一种类锁
普通加锁方法和synchronized(this)都是对象锁, 静态加锁方法和synchronized(*.class)都是类锁
对象锁: 同一对象持有锁, 相同对象等待, 其他对象不受影响; 不同对象持有锁, 互不影响.
类锁: 类锁时, 只要该类的对象持有锁, 无论是否为同一对象访问静态同步方法时都等待, 访问非静态同步方法不受影响.
对象锁和类锁互相不影响
测试代码及过程
12345678910111213141516171819202122232425262728293031323334353637383940414243package com.liuzhihang.tool.sync;/** * @author liuz ...
介绍
在多线程操作中volatile关键字可以保证共享变量的内存可见性, 但是并不能保证操作的原子性, 这时候就需要用到锁, synchronized同步锁是java关键字, 是内置的语言实现.
synchronized加锁和线程结束或异常锁的释放过程由JVM进行控制
synchronized关键字可以使用在方法和同步代码块中, 不同的使用方式, 锁的结果是不同的
重量级锁 + 可重入
synchronized底层原理
1.代码示例
1234567891011121314151617181920212223242526package com.liuzhihang.tool.java;/** * @author liuzhihang * @date 2018/06/11 16:05 */public class SynchronizedTest { private int i; private int j; public void syncTest1() { synchronized (this) { i++; ...
并发和锁
未读介绍
在多线程操作共享变量时, 会使用volatile修饰共享变量, 比如单例模式的双重锁检查中, 并且在concurrent包下也大量使用了volatile关键字;
volatile可以对类属性进行修饰, 从而确保线程每次都是从主存中获取属性, 操作完毕后写回主存.
java内存模型
在多线程同时对共享变量进行操作过程中, 每个线程会拷贝一份共享变量到自己的工作内存中进行相关操作, 操作完毕后会将结果写入到主存中.
而volatile关键字可以保证操作的可见性和有序性, 但是却不能保证原子性.
扩展
原子性
指一个操作或者多个操作要么全部执行要么全部都不执行, 操作过程整体是一个原子, 不被分割打断.
可见性
当多个线程访问同一个变量时, 一个线程修改了这个变量的值, 其他线程能够立即看得到修改的值.
有序性
即程序执行的顺序按照代码的先后顺序执行
主要原因是因为处理器在处理程序时会进行指令重排, 对代码进行优化, 指令重排在单线程中得到的结果是一致的, 但是在多线程中就会造成各种错误.
volatile关键字作用
1.使用volatile关键字修饰的变量,会强制将修改的值写入到 ...
Spring
未读介绍
Spring动态创建bean过程, 是如何进行选择使用 jdk还是cglib进行代理的, 可以通过源码进行解析
执行过程
通过断点进行跟踪主要执行过程在 DefaultAopProxyFactory, 通过判断条件是使用Cglib还是Jdk
相关源码解析
123456789101112131415161718192021222324252627282930313233public class DefaultAopProxyFactory implements AopProxyFactory, Serializable { @Override public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException { //判断条件 是否优化, 返回是否直接代理目标类以及任何接口或者没有用户提供的代理接口 if (config.isOptimize() || config.isProxyTargetClass() || hasNoUserSuppliedProxyI ...
介绍
Spring动态代理可以选择使用jdk动态代理, 或者cglib动态代理, cglib动态代理位于 net.sf.cglib.proxy 包下.
使用时涉及
接口: net.sf.cglib.proxy.MethodInterceptor
用来生成动态子类的类类: net.sf.cglib.proxy.Enhancer
注意: cglib 动态代理是基于类的代理, 是通过对指定的业务类生成一个子类, 并覆盖其中业务方法实现代理. 因为使用继承, 所以被代理类不能使 final 修饰
使用步骤
1.创建MethodInterceptor接口的实现类, 并编写intercept方法的实现
2.通过methodProxy.invokeSuper(o, objects);调用父类的方法
3.创建Enhancer, 通过 setSuperclass(Class superclass)方法指定父类(被代理类), 通过 setCallback(final Callback callback)方法指定代理
4.enhancer.create() 生成代理, 调用被代理类的方法
代码演示
按照 ...
Spring
未读介绍
Spring动态代理可以选择使用jdk动态代理, 或者cglib动态代理, jdk动态代理位于 java.lang.reflect 包下.
使用时涉及
接口: java.lang.reflect.InvocationHandler
动态代理类: java.lang.reflect.Proxy
注意: JDK 动态代理是基于接口的代理, 只能对实现接口的类生成代理, 不能对类进行代理
使用步骤
1.创建InvocationHandler接口的实现类, 并编写invoke方法的实现
2.创建被代理类的接口及实现类
3.使用动态代理类Proxy的静态方法生成代理类实例
4.使用实例调用方法
代码演示
按照步骤编写简易逻辑代码.
创建InvocationHandler接口的实现类
123456789101112131415161718192021222324252627282930/** * JDK 动态代理 * 基于接口的代理, 只能对实现接口的类生成代理, 不能对类进行代理 * * @author liuzhihang * @date 2018/5/17 10:36 */publ ...
设计模式
未读
一个类中只有一个实例, 且能够自行实例化提供这个实例, 同时提供全局访问的方法.
结构
1.构造私有化: 确保外部不能使用new直接创建对象
2.内部静态属性创建实例
3.对外公共静态获取对象方法
demo
1234567891011121314151617181920212223242526/** * 单例模式 * 1. 构造私有化: 确保外部不能使用new直接创建对象 * 2. 内部静态属性创建实例 * 3. 对外公共静态获取对象方法 * * @author liuzhihang * @date 2018/3/27 17:45 */public class SingletonPattern { private SingletonPattern() { } private static SingletonPattern singletonPattern = null; public static SingletonPattern getSingletonPattern() { if (singleto ...