java 学习笔记

第一部分 Java基础知识

第1章 Java简介

  1. Java简介

  2. JDK的安装与配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    //解压到指定目录
    [root@dev app]# tar xzf jdk-8u131-linux-x64.tar.gz
    [root@dev app]# mv jdk1.8.0_131 /mnt/app/java

    //对程序设置用户权限
    [root@dev app]# chown -R root.root /mnt/app/java

    //将java加入系统环境变量
    [root@dev app]# echo 'JAVA_HOME=/mnt/app/java' | tee /etc/profile.d/java.sh
    JAVA_HOME=/mnt/app/java
    [root@dev app]# echo 'JRE_HOME=${JAVA_HOME}/jre' | tee -a /etc/profile.d/java.sh
    JRE_HOME=${JAVA_HOME}/jre
    [root@dev app]# echo 'CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib' | tee -a /etc/profile.d/java.sh
    CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
    [root@dev app]# echo 'export PATH=${JAVA_HOME}/bin:$PATH' | tee -a /etc/profile.d/java.sh
    export PATH=${JAVA_HOME}/bin:$PATH
    [root@dev app]# source /etc/profile

    //验证
    [root@dev app]# java -version
    java version "1.8.0_131"
    Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
    Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)
  3. 第一个Java程序:永远的”Hello World !”

    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
    //编写java代码
    [root@dev java]# vim HelloWorld.java
    public class HelloWorld {
    public static void main(String[] args) {
    System.out.println("Hello world!");
    }
    }

    //编译执行文件
    [root@dev java]# javac HelloWorld.java
    [root@dev java]# ls
    HelloWorld.class HelloWorld.java

    //执行编译后文件
    [root@dev java]# java HelloWorld
    Hello world!

    注意:
    1.public class HelloWorld
    定义了一个类,类是"public"公共类型的,类名为"HelloWorld"
    2.Java中主类名应该和要保存的Java文件名相同,也就是说,这里定义的类名是"HelloWorld",则文件应该保存为"HelloWorld.java"
    3.public static void main(String[] args)
    Java中的主运行方法,它和C/C++中的main()作用是一样的,就是所有的程序都从"main()"中开始执行.要执行Java程序,必须有一个包括主运行方法的类.
    4.System.out.println("Hello world");
    System.out.println()是Java.lang包的一个方法,用来将字串"Hello world"输出到命令行窗口
  4. CLASSPATH

    1
    2
    3
    4
    5
    6
    1.PATH
    PATH环境变量: 作用是指定命令搜索路径,在命令行下面执行命令(如javac编译java程序时),它会到PATH变量所指定的路径中查找看是否能找到相应的命令程序.我们需要把jdk安装目录下的bin目录增加到现有的PATH变量中,bin目录中包含经常要用到的可执行文件(如javac/java/javadoc等),设置好PATH变量后,就可以在任何目录下执行javac/java等工具了
    2.CLASSPATH
    CLASSPATH是javac编译器的一个环境变量.作用是指定类搜索路径,要使用已经编写好的类,前提是能够找到它们,JVM就是通过CLASSPATH来寻找类的.我们需要把jdk安装目录下的lib子目录中的dt.jar和tools.jar设置到CLASSPATH中,当然,当前目录"."也必须加入到该变量中
    3.JAVA_HOME
    JAVA_HOME环境变量: 它指向jdk的安装目录,Eclipse/NetBeans/Tomcat等软件就是通过搜索JAVA_HOME变量来找到并使用安装好的jdk

第2章 程序基本概念

2.1 Java的注释 17
2.2 标识符与关键字 19
2.3 数据类型划分 20
2.3.1 整型 22
2.3.2 浮点数 27
2.3.3 字符型 29
2.3.4 布尔型 31
2.3.5 String型数据 31
2.4 运算符 33
2.4.1 关系运算符 36
2.4.2 数学运算符 37
2.4.3 三目运算 40
2.4.4 逻辑运算 41
2.4.5 位运算 44
2.5 程序逻辑控制 46
2.5.1 分支结构 47
2.5.2 循环结构 52
2.5.3 循环控制 58
2.6 方法的定义及使用 59
2.6.1 方法的基本概念 59
2.6.2 方法的重载 63
2.6.3 方法的递归调用 65

第二部分 面向对象
第3章 面向对象基本概念 70
(视频898分钟,例题135个,提示37个,注意12个,问答10个,技术穿越17个,面试题3个)
3.1 面向对象简介 70
3.2 类与对象 72
3.2.1 类与对象的基本概念 72
3.2.2 类与对象的基本定义 73
3.2.3 引用数据的初步分析 78
3.3 封装性初步分析 82
3.4 构造方法 85
3.5 匿名对象 90
3.6 简单Java类 91
3.7 数组 93
3.7.1 数组的基本概念 93
3.7.2 二维数组 97
3.7.3 数组与方法参数的传递 98
3.7.4 数组操作方法 108
3.7.5 对象数组 109
3.8 String类的基本概念 111
3.8.1 String类的两种实例化方式 111
3.8.2 字符串的比较1 112
3.8.3 字符串常量就是String的匿名
对象 114
3.8.4 两种实例化方式的区别 115
3.8.5 字符串一旦定义则不可改变 118
3.9 String类的常用方法 120
3.9.1 字符与字符串 122
3.9.2 字节与字符串 125
3.9.3 字符串的比较2 126
3.9.4 字符串的查找 127
3.9.5 字符串的替换 129
3.9.6 字符串的截取 130
3.9.7 字符串的拆分 130
3.9.8 其他方法 133
3.10 this关键字 136
3.10.1 调用本类属性 136
3.10.2 调用本类方法 138
3.10.3 表示当前对象 143
3.11 引用传递 144
3.11.1 引用传递基本概念 144
3.11.2 引用传递实际应用 148
3.12 数据表与简单Java类映射 153
3.13 对象比较 156
3.14 static关键字 160
3.14.1 static定义属性 160
3.14.2 static定义方法 162
3.14.3 主方法 164
3.14.4 static的实际应用 165
3.15 代码块 167
3.15.1 普通代码块 167
3.15.2 构造块 168
3.15.3 静态块 168
3.16 内部类 170
3.16.1 基本概念 170
3.16.2 使用static定义内部类 174
3.16.3 在方法中定义内部类 175
3.17 链表 177
3.17.1 链表的基本形式 178
3.17.2 链表的基本雏形 181
3.17.3 开发可用链表 184
3.17.4 使用链表 194
本章小结 200
课后习题 201
第4章 面向对象高级知识 204
(视频373分钟,例题96个,提示23个,注意9个,问答9个,技术穿越6个,面试题4个)
4.1 继承性 204
4.1.1 继承问题的引出 204
4.1.2 继承的实现 205
4.1.3 继承的限制 207
4.2 覆写 211
4.2.1 方法的覆写 211
4.2.2 属性的覆盖 217
4.3 继承案例 218
4.3.1 开发数组的父类 219
4.3.2 开发排序类 221
4.3.3 开发反转类 222
4.4 final关键字 223
4.5 多态性 224
4.6 抽象类 230
4.6.1 抽象类定义 230
4.6.2 抽象类的相关限制 232
4.6.3 抽象类应用——模板设计模式 236
4.7 接口 240
4.7.1 接口的基本定义 240
4.7.2 接口的实际应用——标准 245
4.7.3 接口的应用——工厂设计模式(Factory) 247
4.7.4 接口的应用——代理设计模式(Proxy) 250
4.7.5 抽象类与接口的区别 252
4.8 Object类 254
4.8.1 Object类的基本定义 254
4.8.2 取得对象信息:toString() 255
4.8.3 对象比较:equals() 256
4.8.4 Object类与引用数据类型 257
4.8.5 修改链表 259
4.9 综合练习:宠物商店 264
4.10 匿名内部类 269
4.11 基本数据类型的包装类 270
4.11.1 装箱与拆箱操作 271
4.11.2 数据类型转换 274
本章小结 277
课后习题 278
第5章 包及访问控制权限 282
(视频89分钟,例题22个,提示8个,注意2个,问答2个,技术穿越1个,面试题1个)
5.1 包的定义 282
5.2 包的导入 283
5.3 系统常见包 287
5.4 jar命令 288
5.5 访问控制权限 289
5.6 命名规范 291
5.7 单例设计模式(Singleton) 291
5.8 多例设计模式 295
本章小结 297
课后习题 297
第6章 异常的捕获及处理 298
(视频83分钟,例题18个,提示5个,注意1个,问答4个,技术穿越2个,面试题2个)
6.1 认识异常 299
6.2 处理异常 300
6.3 异常的处理流程 304
6.4 throws关键字 308
6.5 throw关键字 309
6.6 异常处理的标准格式 310
6.7 RuntimeException类 312
6.8 assert关键字 313
6.9 自定义异常 314
本章小结 315
课后习题 315
第7章 Eclipse开发工具 317
(视频75分钟,例题5个,提示6个,注意1个)
7.1 Eclipse简介 317
7.2 JDT的使用 319
7.3 JUnit的使用 329
本章小结 331
第8章 Java新特性 332
(视频175分钟,例题56个,提示13个,注意1个,问答2个,技术穿越5个,面试题1个)
8.1 可变参数 333
8.2 foreach循环 335
8.3 静态导入 335
8.4 泛型 337
8.4.1 泛型的引出 337
8.4.2 通配符 342
8.4.3 泛型接口 346
8.4.4 泛型方法 347
8.5 枚举 348
8.5.1 认识枚举 348
8.5.2 定义其他结构 351
8.5.3 枚举的实际作用 354
8.6 Annotation 356
8.6.1 准确的覆写:@Override 357
8.6.2 声明过期操作:@Deprecated 358
8.6.3 压制警告:@Suppress Warnings 359
8.7 接口定义加强 359
8.8 Lambda表达式 361
8.9 方法引用 365
8.10 内建函数式接口 368
本章小结 370
课后习题 371
第三部分 Java高级编程
第9章 多线程 373
(视频167分钟,例题24个,提示10个,注意2个,问答2个,技术穿越1个,面试题6个)
9.1 线程与进程 373
9.2 多线程实现 374
9.2.1 继承Thread类 374
9.2.2 实现Runnable接口 377
9.2.3 多线程两种实现方式的区别 378
9.2.4 利用Callable接口实现多线程 382
9.2.5 线程的操作状态 384
9.3 多线程常用操作方法 385
9.3.1 线程的命名与取得 385
9.3.2 线程的休眠 387
9.3.3 线程优先级 388
9.4 线程的同步与死锁 390
9.4.1 同步问题的引出 390
9.4.2 同步操作 392
9.4.3 死锁 395
9.5 线程间的经典操作案例——生产者与消费者案例 397
9.5.1 问题的引出 397
9.5.2 解决数据错乱问题 399
9.5.3 解决数据重复问题 401
9.6 线程的生命周期 403
本章小结 405
课后习题 405
第10章 Java常用类库 407
(视频364分钟,例题60个,提示25个,注意6个,问答8个,技术穿越2个,面试题4个)
10.1 StringBuffer类 407
10.2 Runtime类 412
10.3 System类 416
10.4 对象克隆 419
10.5 数字操作类 420
10.5.1 Math类 420
10.5.2 Random类 421
10.5.3 大数字操作类 423
10.6 日期处理类 425
10.6.1 Date类 426
10.6.2 日期格式化:SimpleDateFormat 427
10.6.3 Calendar类 429
10.7 比较器 430
10.7.1 Arrays类 430
10.7.2 比较器:Comparable 432
10.7.3 数据结构——BinaryTree 434
10.7.4 挽救的比较器:Comparator 437
10.8 正则表达式 440
10.8.1 问题引出 440
10.8.2 正则标记 442
10.8.3 String类对正则的支持 443
10.8.4 java.util.regex包支持 447
10.9 反射机制 449
10.9.1 认识反射 449
10.9.2 Class类对象实例化 450
10.9.3 反射实例化对象 451
10.9.4 使用反射调用构造 454
10.9.5 反射调用方法 457
10.9.6 反射调用成员 459
10.10 国际化 461
10.10.1 使用Locale类定义语言环境 462
10.10.2 利用ResourceBundle读取资源文件 463
10.10.3 多资源读取 465
本章小结 466
课后习题 467
第11章 Java IO编程 469
(视频307分钟,例题42个,提示27个,注意2个,问答4个,技术穿越4个)
11.1 文件操作类:File 469
11.2 字节流与字符流 474
11.2.1 字节输出流:OutputStream 475
11.2.2 字节输入流:InputStream 479
11.2.3 字符输出流:Writer 484
11.2.4 字符输入流:Reader 486
11.2.5 字节流与字符流的区别 488
11.3 转换流 489
11.4 案例:文件复制 491
11.5 字符编码 493
11.6 内存流 495
11.7 打印流 498
11.7.1 打印流设计思想 499
11.7.2 打印流 501
11.7.3 PrintStream类的改进 502
11.8 System类对IO的支持 503
11.8.1 错误输出:System.err 504
11.8.2 信息输出:System.out 505
11.8.3 系统输入:System.in 506
11.9 字符缓冲流:BufferedReader 508
11.10 扫描流:Scanner 511
11.11 对象序列化 514
11.11.1 序列化接口:Serializable 515
11.11.2 实现序列化与反序列化 515
11.11.3 transient关键字 517
本章小结 518
课后习题 519
第12章 Java网络编程 521
(视频43分钟,例题5个,提示1个,技术穿越1个)
12.1 网络编程 521
12.2 开发第一个网络程序 522
12.3 网络开发的经典模型——Echo程序 524
本章小结 527
课后习题 528
第13章 Java类集框架 529
(视频204分钟,例题34个,提示15个,注意3个,问答3个,技术穿越2个,面试题5个)
13.1 类集框架简介 529
13.2 单对象保存父接口:Collection 530
13.3 List子接口 531
13.3.1 新的子类:ArrayList 532
13.3.2 旧的子类:Vector 535
13.4 Set子接口 536
13.4.1 关于数据排序的说明 537
13.4.2 关于重复元素的说明 539
13.5 集合输出 541
13.5.1 迭代输出:Iterator 541
13.5.2 双向迭代:ListIterator 544
13.5.3 foreach输出 545
13.5.4 Enumeration输出 546
13.6 偶对象保存:Map接口 547
13.6.1 利用Iterator输出Map集合 550
13.6.2 自定义Map集合的key类型 551
13.7 Stack子类 553
13.8 Properties子类 554
13.9 Collections工具类 556
13.10 数据流 557
13.10.1 数据流基础操作 557
13.10.2 MapReduce 564
本章小结 567
课后习题 568
第14章 Java数据库编程 569
(视频121分钟,例题15个,提示3个,注意3个)
14.1 JDBC简介 569
14.2 连接Oracle数据库 570
14.3 Statement接口 572
14.3.1 数据更新操作 573
14.3.2 数据查询 576
14.4 PreparedStatement接口 578
14.4.1 Statement接口问题 578
14.4.2 PreparedStatement操作 579
14.5 批处理与事务处理 585
本章小结 587
课后习题 587
第四部分 设计开发
第15章 DAO设计模式 590
(视频163分钟,例题11个,提示10个,技术穿越1个)
15.1 程序设计分层 590
15.2 实例分析 592
15.3 项目准备 593
15.3.1 数据库连接类 594
15.3.2 开发Value Object 596
15.4 开发数据层 598
15.4.1 开发数据层操作标准 598
15.4.2 数据层实现类 601
15.4.3 定义数据层工厂类——DAOFactory 605
15.5 开发业务层 606
15.5.1 开发业务层标准——IEmpService 606
15.5.2 业务层实现类 609
15.5.3 定义业务层工厂类——ServiceFactory 612
15.6 代码测试 613
15.6.1 调用测试 613
15.6.2 利用JUnit进行测试 614
本章小结 617
附录 综合测试 618
测试试卷一 618
测试试卷二 623
测试试卷三 631

linux history info setting

linux历史信息设置

  1. history命令使用

    1
    2
    3
    4
    5
    6
    history      //显示所有历史信息
    history 10 //显示最新10条信息
    !{num} //执行历史信息中的第几条命令
    !! //重复执行上一条命令
    !rpm //执行最后一次以rpm开头的命令
    history -c //清空历史消息
  2. 修改history配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    export HISTTIMEFORMAT='%F %T'    //显示执行命令时间

    export HISTSIZE=450 //设置历史记录保留条数(控制台输出)
    export HISTFILESIZE=450 //设置历史记录保留条数(文件保存)
    export HISTFILE=~/.bash_history //设置历史记录保存位置

    export HISTCONTROL=ignoredups //剔除连续的重复条目
    export HISTCONTROL=erasedups //剔除整个命令历史中的重复条目
    export HISTCONTROL=ignorespace //强制history不记住特定的命令,在不想被记住的命令前面输入一个空格

    export HISTSIZE=0 //禁用 history

    export HISTIGNORE="pwd:ls:ls -ltr:" //忽略pwd,ls,ls -ltr等命令
  3. 详细history信息

    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
    [root@dev ~]# cat > /etc/profile.d/history.sh <<EOF
    #!/bin/bash
    HISDIR="/tmp/history"
    if [ ! -d $HISDIR ];then
    mkdir -p $HISDIR && chmod 777 $HISDIR
    fi

    LOGTM_1=$(date +"%Y%m%d")
    LOGTM_2=$(date +"%Y%m%d" -d '30 days ago')
    LOGTM_3=$(date +"%H%M%S")
    if [ ! -d $HISDIR/$LOGTM_1 ];then
    mkdir -p $HISDIR/$LOGTM_1 && chmod 777 $HISDIR/$LOGTM_1
    fi
    if [ -d $HISDIR/$LOGTM_2 ];then
    rm -rf $HISDIR/$LOGTM_2
    fi

    LOGUSER=$(who -u am i 2>/dev/null| awk '{print $1}')
    LOGIPAR=$(who -u am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g')
    [ ! $LOGUSER ] && LOGUSER=$(whoami)
    [ ! $LOGIPAR ] && LOGIPAR=$(hostname)

    export HISTTIMEFORMAT="[%F %T][$LOGUSER][$LOGIPAR] "
    export HISTSIZE=100000
    export HISTFILE="$HISDIR/$LOGTM_1/$LOGTM_3-$LOGUSER-$LOGIPAR"
    EOF
    [root@dev ~]# source /etc/profile
  4. 通过history保留用户操作信息

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    [root@dev ~]# vim /etc/profile.d/history.users.sh
    #PS1="`whoami`@`hostname`:"'[$PWD]' //线上使用的话,建议去掉这一行。即采用默认的终端显示方式。
    history
    USER_IP=`who -u am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g'`
    if [ "$USER_IP" = "" ];then
    USER_IP=`hostname`
    fi
    if [ ! -d /tmp/history ];then
    mkdir /tmp/history
    chmod 777 /tmp/history
    fi
    if [ ! -d /tmp/history/${LOGNAME} ];then
    mkdir /tmp/history/${LOGNAME}
    chmod 300 /tmp/history/${LOGNAME}
    fi
    export HISTSIZE=10000
    DT=`date +"%Y%m%d_%H%M%S"`
    export HISTFILE="/tmp/history/${LOGNAME}/${USER_IP}.history.$DT"
    chmod 600 /tmp/history/${LOGNAME}/*history* 2>/dev/null
    [root@dev ~]# source /etc/profile

linux login info

linux系统登录信息

  1. /etc/motd

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    登陆信息显示数据(只有登录成功了才会显示)

    /etc/motd:
    [root@dev ~]# cat /etc/motd

    Welecome to Dev environment!

    Happy development!!!

    退出重新登录,即可显示
  2. /etc/issue

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    登陆信息显示数据(无论登录成功与否都会显示)

    /etc/issue:
    [root@dev ~]# cat /etc/issue
    \S
    Kernel \r on an \m

    \d 本地端时间的日期
    \l 显示第几个终端机的接口;
    \m 显示硬件的等级(i386/i486/i586/i686....)
    \n 显示主机的网络名称
    \o 显示 domain name
    \r 操作系统的版本(类似 uname-r)
    \t 显示本地端时间的时间
    \s 操作系统的名称
    \v 操作系统的版本

WeChat enterprise

微信企业号

  1. 通过API获取access_token
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    [root@wechat]# cat access_token.ops.py
    #!/usr/bin/env python
    #-*-coding:utf-8-*-
    import urllib
    import urllib2
    import json
    import os
    url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={微信ID号,唯一}&corpsecret={应用秘钥}"
    req = urllib2.Request(url)
    res_data = urllib2.urlopen(req)
    res = res_data.read()
    print(json.dumps(json.loads(res),indent=2,sort_keys=False,ensure_ascii=False))

    [root@cmdb wechat]# python access_token.ops.py
    {
    "access_token": "ZAyxiNS0-PIWLkDEqLFx1_-wXxJXJQYzjYt3fl8XxwEMGiQVixEsn2xKVc9ZLiJ_u6K6iN2IxFbxiV4jJi_nxyhS2l6a8TfvS7lMGvFBcwA_m4wlAQs0URSwaisGGEmlpRumUtQ-8LN8wKo9NTvpLv-o3kbteVdOadsfadfadsfafdadfasdfadf",
    "expires_in": 7200,
    "errcode": 0,
    "errmsg": "ok"
    }

openssl certificate

openssl创建证书

  1. openssl创建证书

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    root@192:~# mkdir -p /opt/nginx/ssl
    root@192:~# cd /opt/nginx/ssl/
    root@192:/opt/nginx/ssl# openssl req -newkey rsa:4096 -nodes -sha256 -keyout domain.key -x509 -days 365 -out domain.crt
    Generating a 4096 bit RSA private key
    ........++
    .........................................................................................................................................................................................................................................++
    writing new private key to \'domain.key\'
    \-----
    You are about to be asked to enter information that will be incorporated
    into your certificate request.
    What you are about to enter is what is called a Distinguished Name or a DN.
    There are quite a few fields but you can leave some blank
    For some fields there will be a default value,
    If you enter '.', the field will be left blank.
    \-----
    Country Name (2 letter code) [AU]:CN
    State or Province Name (full name) [Some-State]:BJ
    Locality Name (eg, city) []:bj
    Organization Name (eg, company) [Internet Widgits Pty Ltd]:zhonghui
    Organizational Unit Name (eg, section) []:
    Common Name (e.g. server FQDN or YOUR name) []:d.hub.io
    Email Address []:pengliu@brandwisdom.cn
  2. openssl 将证书crt转换为cer

    1
    root@192:~# openssl x509 -in domain.crt -out domain.cer -outform der

alicloud API

阿里云 python SDK 环境搭建

  1. 申请账号(这里是只读)

    1
    2
    3
    4
    5
    6
    阿里云RAM账号申请,步骤如下:
    * 先登录到阿里云控制台
    * 选择"访问控制"
    * 选择"策略管理",自定义一个新的策略
    * 选择"群组管理",创建一个新的组,并对该组授权"自定义策略"
    * 选择"用户管理",创建一个新的用户,将用户加入到组.选择"用户详情",创建"用户AccessKey",注意一定要保存好key.禁止"启用控制台登录",我们不需要控制台登录,没必要打开.
  2. 阿里云 Python SDK 环境部署

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    * 安装pyenv和python虚拟化环境(安装步骤忽略)
    * 安装python版本
    [root@cmdb ~]# pyenv install 2.7.13
    * 创建python虚拟化环境
    [root@cmdb ~]# pyenv virtualenv 2.7.13 cloud
    * 安装python sdk
    [root@cmdb ~]# pyenv activate cloud
    (cloud) [root@cmdb ~]# pip install aliyun-python-sdk-core
    (cloud) [root@cmdb ~]# pip install aliyun-python-sdk-ecs
    (cloud) [root@cmdb ~]# pip install aliyun-python-sdk-rds

disk iostat

磁盘IO状态查看

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
1.安装
yum install sysstat

2.iostat查看IO性能
[root@zabbix-proxy-company ~]# iostat -x 1 1
Linux 3.10.0-123.el7.x86_64 (zabbix-proxy-company) 06/13/2017 _x86_64_ (4 CPU)

avg-cpu: %user %nice %system %iowait %steal %idle
1.73 0.00 1.31 0.70 0.00 96.26

Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
vda 0.00 0.00 0.00 0.10 0.06 0.76 15.72 0.00 3.17 0.91 3.25 1.98 0.02
vdb 0.00 0.02 0.00 43.64 0.00 702.61 32.20 0.10 2.19 0.36 2.19 0.81 3.53
dm-0 0.00 0.00 0.00 0.00 0.00 0.00 8.00 0.00 0.37 0.37 0.00 0.23 0.00
dm-1 0.00 0.00 0.00 0.08 0.06 0.76 20.10 0.00 4.40 0.94 4.55 2.56 0.02

说明:
svctm参数代表平均每次设备I/O操作的服务时间(毫秒),反应了磁盘的负载情况,如果该项大于15ms,并且util%接近100%,那就说明,磁盘现在是整个系统性能的瓶颈了
await参数代表平均每次设备I/O操作的等待时间(毫秒),也要多和svctm来参考.差的过高就一定有IO的问题.
如果svctm比较接近await,说明I/O几乎没有等待时间;如果await远大于svctm,说明I/O队列太长,应用得到的响应时间变慢

正常情况下svctm应该是小于await值的,而svctm的大小和磁盘性能有关,CPU,内存的负荷也会对svctm值造成影响,过多的请求也会间接的导致svctm值的增加.
await值的大小一般取决与svctm的值和I/O队列长度以及I/O请求模式,如果svctm的值与await很接近,表示几乎没有I/O等待,磁盘性能很好;如果await的值远高于svctm的值,则表示I/O队列等待太长,系统上运行的应用程序将变慢,此时可以通过更换更快的硬盘来解决问题.
%util项的值也是衡量磁盘I/O的一个重要指标,如果%util接近100%,表示磁盘产生的I/O请求太多,I/O系统已经满负荷的在工作,该磁盘可能存在瓶颈.长期下去,势必影响系统的性能,可以通过优化程序或者通过更换更高,更快的磁盘来解决此问题

svctm一项正常时间在20ms左右,原因:
高速cpu会造成很高的iowait值,但这并不代表磁盘是系统的瓶颈.唯一能说明磁盘是系统瓶颈的方法,就是很高的read/write时间,一般来说超过20ms,就代表了不太正常的磁盘性能.为什么是20ms呢?一般来说,一次读写就是一次寻到+一次旋转延迟+数据传输的时间.由于,现代硬盘数据传输就是几微秒或者几十微秒的事情,远远小于寻道时间2~20ms和旋转延迟4~8ms,所以只计算这两个时间就差不多了,也就是15~20ms.只要大于20ms,就必须考虑是否交给磁盘读写的次数太多,导致磁盘性能降低了

iowait实际测量的是cpu时间:
%iowait = (cpu idle time)/(all cpu time)


注解:
cpu属性值说明:
%user: CPU处在用户模式下的时间百分比
%nice: CPU处在带NICE值的用户模式下的时间百分比
%system:CPU处在系统模式下的时间百分比
%iowait:CPU等待输入输出完成时间的百分比
%steal: 管理程序维护另一个虚拟处理器时,虚拟CPU的无意识等待时间百分比
%idle: CPU空闲时间百分比

disk属性值说明:
rrqm/s:每秒这个设备相关的读取请求有多少被Merge了(当系统调用需要读取数据的时候,VFS将请求发到各个FS,如果FS发现不同的读取请求读取的是相同Block的数据,FS会将这个请求合并Merge)
wrqm/s:每秒这个设备相关的写入请求有多少被Merge了

rsec/s:每秒读取的扇区数
wsec/s:每秒写入的扇区数

r/s:每秒完成的读I/O设备次数.即rio/s
w/s:每秒完成的写I/O设备次数.即wio/s

rkB/s:每秒读K字节数.是rsect/s的一半,因为每扇区大小为512字节
wkB/s:每秒写K字节数.是wsect/s的一半,因为每扇区大小为512字节

avgrq-sz:均每次设备I/O操作的数据大小(扇区)
avgqu-sz:平均I/O队列长度

await:每一个IO请求的处理的平均时间(单位是微秒毫秒).这里可以理解为IO的响应时间,一般地系统IO响应时间应该低于5ms,如果大于10ms就比较大了.

svctm:平均每次设备I/O操作的服务时间(毫秒)

%util:在统计时间内所有处理IO时间,除以总共统计时间.例如,如果统计间隔1秒,该设备有0.8秒在处理IO,而0.2秒闲置,那么该设备的%util = 0.8/1 = 80%,所以该参数暗示了设备的繁忙程度.一般地,如果该参数是100%表示设备已经接近满负荷运行了(当然如果是多磁盘,即使%util是100%,因为磁盘的并发能力,所以磁盘使用未必就到了瓶颈)

zabbix server support chinese

zabbix server支持中文显示

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
1.在windows系统下找到simkai.ttf(楷体)字体
C:Windows\Fonts\simkai.ttf

2.将simkai.ttf文件上传到zabbix-server服务器
[root@zabbix-server-company ~]# mkdir /etc/zabbix/zabbix_fonts
[root@zabbix-server-company ~]# ls -l /etc/zabbix/zabbix_fonts/simkai.ttf
-rw-r--r-- 1 root root 11785184 Jul 17 2016 /etc/zabbix/zabbix_fonts/simkai.ttf
/etc/zabbix/zabbix_fonts/simkai.ttf

3.检查zabbix-server字体存放位置
[root@zabbix-server-company zabbix]# ls -l /usr/share/zabbix/fonts/graphfont.ttf
lrwxrwxrwx 1 root root 33 May 9 17:28 /usr/share/zabbix/fonts/graphfont.ttf -> /etc/alternatives/zabbix-web-font
[root@zabbix-server-company zabbix]# ls -l /etc/alternatives/zabbix-web-font
lrwxrwxrwx 1 root root 38 May 9 17:28 /etc/alternatives/zabbix-web-font -> /usr/share/fonts/dejavu/DejaVuSans.ttf
[root@zabbix-server-company zabbix]# ls -l /usr/share/fonts/dejavu/DejaVuSans.ttf
-rw-r--r-- 1 root root 720012 Feb 27 2011 /usr/share/fonts/dejavu/DejaVuSans.ttf

4.重新进行软连接
[root@zabbix-server-company ~]# ln -sf /etc/zabbix/zabbix_fonts/simkai.ttf /usr/share/zabbix/fonts/graphfont.ttf
[root@zabbix-server-company ~]# ls -l /usr/share/zabbix/fonts/graphfont.ttf
lrwxrwxrwx 1 root root 35 Jun 12 18:08 /usr/share/zabbix/fonts/graphfont.ttf -> /etc/zabbix/zabbix_fonts/simkai.ttf

5.或者修改配置文件
[root@zabbix-server-company ~]# vim /usr/share/zabbix/include/defines.inc.php
将graphfont.ttf更改为simkai.ttf

zabbix item and tigger

zabbix item

  1. net.tcp.listen[port]
    检测端口是否开启:
    0 – 未监听
    1 – 监听中

zabbix tigger

  1. zabbix避免瞬时触发频繁报警

    1
    2
    3
    4
    5
    6
    7
    {HOST:ITEM.count(600,100,"ge")}>3 and {HOST:ITEM.last(0)}>100
    说明: 在600秒内大于100 3次 且 当前大于100,就会触发报警

    count(时间,监控值,判断参数,延时时间)>次数
    and 逻辑与

    判断参数:{eq:相等 ne:不相等 gt:大于 ge:大于等于 lt:小于 le:小于等于 like:内容匹配}
  2. Tigger last()

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    {HOST:system.cpu.load[all,avg1].last(0)}>5
    解释: 如果cpu.load最新值大于5则触发报警

    {HOST:system.cpu.load[all,avg1].last(1)}>5
    解释: 如果cpu.load最近1秒值大于5则触发报警

    {HOST:cpu.load[cpu.avg1].last(#2)}>3
    解释: cpu.load上上一个值负载大于3则触发

    {HOST:cpu.load[cpu.avg1].last(,1d)}>3
    解释: 此时cpu.load负载 大于 昨日此时cpu.load负载 3则触发
    即: {此时cpu.load负载} - {昨日此时cpu.load负载} > 3

    {HOST:system.cpu.load[all,avg1].last(0)}>5 | {HOST:system.cpu.load[all,avg1].min(10m)}>2
    解释: 如果cpu.load大于5或者最后十分钟内cpu.load最小值大于2则触发报警

    {HOST:zabbix.ping.last(#5,3m)}=0
    解释: 如果最近3分钟内第5次取值结果为0,则触发报警
  3. Tigger max()

    1
    2
    3
    4
    5
    6
    7
    8
    {HOST:system.cpu.load.max(30m)}>5
    解释: 30分钟内cpu负载最大值如果大于5则触发

    {HOST:system.cpu.load.max(#5)}>10
    解释: cup的最近5个返回值里面,如果最大值超过10,则触发

    {HOST:vfs.fs.size[/,free].max(5m)}<1G
    解释: 最近5分钟内剩余磁盘空间小于1G则触发
  4. Tigger min()

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    {HOST:if.in[eth0,bytes].min(5m)}>20M
    解释: eth0的input网卡在5分钟内获取的最小值持续超过20M则触发

    {HOST:system.cpu.load[all,avg1].last(0)}>5 | {{HOST:system.cpu.load[all,avg1].min(10m)}>2
    解释: 最新的load值如果超过5 或 在10分钟内最小load值一直持续超过2则触发

    {HOST:system.cpu.load[all,avg1].min(5m)}>10 & \
    {HOST:system.cpu.load[all,avg1].time(0)}>000000 & \
    {HOST:system.cpu.load[all,avg1].time(0)}<060000
    解释: 在晚上0-6点这段时间内如果主机在5分钟内获取load的最小值一直持续大于10则报警

    {HOST.cpu.load.min(#30)}>7
    解释: cpu负载最近三十个返回值最小值大于7则触发
  5. Tigger nodata()

    1
    2
    3
    4
    5
    {HOST.tick.nodata(5m)}=1
    解释: 如果5分钟内部等于1(没有收到数据)则触发

    {HOST.agent.ping.nodata(5m)}=1
    解释: agent.ping在最近5分钟内都没有接收到数据,则触发
  6. Tigger count()

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    这里可以为s(秒),也可以为m(分钟):
    * count(10m) 最后10分钟值的数量
    * count(600) 最后10分钟值的数量
    * count(600,12) 最后十分钟拿到的值等于12
    * count(10m,12) 最后十分钟拿到的值等于12
    * count(600,12,"gt") 最后十分钟拿到的值大于12
    * count(#10,12,"gt") 最近10个值中,值大于12的个数
    * count(600,12,"gt",86400) 24小时之前的10分钟内值大于12的个数
    * count(600,,,86400) 24小时之前的10分钟数据值的个数

    例如:
    {HOST:ITEM.count(2m,0)}>3
    解释: 如果2分钟内拿到的值为0,且大于3次则触发报警

    {HOST:icmpping.count(5m,0)}>2
    解释: 最近分5钟内有2次ping不通就触发报警(假设30秒ping一次,5分之可以ping 10次)

    {HOST:redis[,avg1].count(10m,10,"gt")}>2
    解释: 最近10分钟内的平均值大于10的次数超过2次则触发报警

    {HOST:redis.count(#10,5,"gt",86400)}>2
    解释: 24小时之前,最近10个值中,值大于5的个数,大于2次则触发报警
  7. tigger delta()

    1
    2
    3
    4
    #定义的评价期间内的最大和最小值之间的差异(max()-min())

    {HOST:net.if.in[eth1].delta(300)}>100M
    解释: eth1流量在300秒内,最大值和最小值之间差如果大于100M,则触发

nexus proxy maven

nexus代理maven仓库]

使用nexus代理maven仓库更新索引的方法:

  1. 下载更新包
    Download maven repository
    [root@192 app]# wget http://repo1.maven.org/maven2/.index/nexus-maven-repository-index.gz
    [root@192 app]# wget http://repo1.maven.org/maven2/.index/nexus-maven-repository-index.properties

    Download indexer-cli
    [root@192 app]# wget http://central.maven.org/maven2/org/apache/maven/indexer/indexer-cli/5.1.1/indexer-cli-5.1.1.jar

  2. 停止nexus
    [root@192 app]# /mnt/app/nexus/bin/nexus stop

  3. 将nexus-maven-repository-index.gz,nexus-maven-repository-index.properties,indexer-cli-5.1.1.jar放在同一目录下,解压nexus-maven-repository-index.gz
    [root@192 app]# java -jar indexer-cli-5.1.1.jar -u nexus-maven-repository-index.gz -d indexer

  4. 创建indexer/central-ctx目录
    [root@192 app]# grep karaf.data /mnt/app/nexus/bin/nexus.vmoptions
    -Dkaraf.data=/mnt/data/nexus
    [root@192 app]# mkdir -p /mnt/data/nexus/indexer/central-ctx
    [root@192 app]# chown -R wisdom.wisdom /mnt/data/nexus/indexer

  5. 拷贝indexer目录下的内容到indexer/central-ctx
    [root@192 app]# cp indexer/* /mnt/data/nexus/indexer/central-ctx/
    [root@192 app]# chown -R wisdom.wisdom /mnt/data/nexus/indexer

  6. 重启nexus
    [root@192 app]# /mnt/app/nexus/bin/nexus start