Java反射

Student类:

Main方法:

输出结果:

Java四类八种基本数据类型

1.整型

数据类型 位数
byte 8
short 16
int 32
long 64

 

2.浮点型

数据类型 位数
float 32
double 64

 

3.布尔型

数据类型 位数
boolean 8

 

4.字符型

数据类型 位数
char 16

 

 

 

JavaBean、EJB和POJO

来历:

  • 在java1996年发布,当年12月即发布了java bean1.00-A。通过统一的规范可以设置对象的值(get,set方法),这是最初的java bean;
  • 在实际企业开发中,需要实现事务,安全,分布式,javabean就不好用了.sun公司就开始往上面堆功能,这里java bean就复杂为EJB(Enterprise Bean);
  • EJB功能强大,但是太重了.此时出现DI(依赖注入),AOP(面向切面)技术,通过简单的java bean也能完成EJB的事情,这里的java bean简化为简单的Java对象POJO(Plain Old Java Object);
  • Spring诞生了.

参考:https://www.zhihu.com/question/19773379/answer/18307751

 

开启多个线程的几种方法

 

输出结果:

注意以上打印顺序并不一定是固定的。因为是多个线程。

分库分表(二)

 

分库分表第二次

课程内容

  1. 上节课回顾
  2. Mycat是什么
  3. Mycat中的核心概念及配置文件分析
  4. 水平分表实战(单库、跨库)
  5. Mycat读写分离实战
  6. Mycat 全局序列号
  7. Mycat常用分片规则

课程笔记

关系型数据库和NoSQL

非关系型数据库: key-value: redis 、memcache ; 面向文档: mongoDB ;面向列: HBase

 

数据切分

 

mycat、 TDDL、 Sharding-JDBC、cobar

 

 

实战演示

单库大表拆分

数据库操作

跨库分表

读写分离

双主:

分库分表(一)

 

课程目标

  1. 对于存储层的压力知道如何去提供解决方案和思路
  2. 对分库分表的常用手段有全面了解
  3. 了解Mysql的主从及binlog
  4. 知道Mycat及其他相似的中间件

 

课程安排

为什么要分库分表、

超大容量问题

性能问题

如何去做到

垂直切分、 水平切分

  1. 垂直分库; 解决的是表过多的问题
  2. 垂直分表; 解决单表列过多的问题

 

水平切分; 大数据表拆成小表(一张一亿数据的表,拆分成十张表)

常见的拆分策略

垂直拆分(er分片)

 

水平拆分

一致性hash(hash%10,分散到不同的表上)

范围切分 可以按照ID(1-1000万在第一张表,1000万-2000万数据在另外一张表)

日期拆分

拆分以后带来的问题

跨库join的问题

1.设计的时候考虑到应用层的join问题。

写javaService的时候join

2.在服务层去做调用;

A服务里查询到一个list

for(list){

}

//如果循环查找 会比较消耗性能  所以用list一次查出来

bservice.select(list);

3.全局表

数据变更比较少的基于全局应用的表(可能每个库里面都有一个相同的表)

4.做字段冗余(空间换时间的做法,减少join操作)

订单表。 商家id  商家名称

商家名称变更- 定时任务、任务通知

跨分片数据排序分页

唯一主键问题

用自增id做主键(水平拆分每一个表都有一个id,所以需要考虑主键重复的问题)

UUID 性能比较低

snowflake(雪花算法):相比36位的uuid,雪花算法产生的id按时间有序,最长好像是19位

mongoDB(使用mongoDB或者Redis保存一个id的表)

zookeeper(利用唯一主键)

数据库表

分布式事务问题

多个数据库表之间保证原子性  性能问题; 互联网公司用强一致性分布式事务比较少(一个库的表的数据更新失败了,其他库的表的数据也回滚)

 

分库分表最难的在于业务的复杂度;

前提: 水平分表的前提是已经存在大量的业务数据。而这个业务数据已经渗透到了各个应用节点

 

如何权衡当前公司的存储需要优化

  • 提前规划(主键问题解决、 join问题)
  • 当前数据单表超过1000W、每天的增长量持续上升

 

Mysql的主从

数据库的版本5.7版本

安装以后文件对应的目录

mysql的数据文件和二进制文件: /var/lib/mysql/

mysql的配置文件: /etc/my.cnf

mysql的日志文件: /var/log/mysql.log

 

140 为master

1.创建一个用户’repl’,并且允许其他服务器可以通过该用户远程访问master,通过该用户去读取二进制数据,实现数据同步

Create user repl identified by ‘repl; repl用户必须具有REPLICATION SLAVE权限,除此之外其他权限都不需要

GRANT REPLICATION SLAVE ON *.* TO ‘repl’@’%’ IDENTIFIED BY ‘repl’ ;

2.修改140 my.cnf配置文件,在[mysqld] 下添加如下配置

log-bin=mysql-bin //启用二进制日志文件

server-id=130 服务器唯一ID

3.重启数据库 systemctl restart mysqld

4.登录到数据库,通过show master status 查看master的状态信息

142 为slave

1.修改142 my.cnf配置文件, 在[mysqld]下增加如下配置

server-id=132  服务器id,唯一

relay-log=slave-relay-bin

relay-log-index=slave-relay-bin.index

read_only=1

2.重启数据库: systemctl restart mysqld

3.连接到数据库客户端,通过如下命令建立同步连接

change master to master_host=’192.168.11.140’, master_port=3306,master_user=’repl’,master_password=’repl’,master_log_file=’mysql-bin.000001’,master_log_pos=0;

红色部分从master的show master status可以找到对应的值,不能随便写。

4.执行 start slave

5.show slave status\G;查看slave服务器状态,当如下两个线程状态为yes,表示主从复制配置成功

Slave_IO_Running=Yes

Slave_SQL_Running=Yes

主从同步的原理

  1.   master记录二进制日志。在每个事务更新数据完成之前,master在二日志记录这些改变。MySQL将事务串行的写入二进制日志,即使事务中的语句都是交叉执行的。在事件写入二进制日志完成后,master通知存储引擎提交事务

2.   slave将master的binary log拷贝到它自己的中继日志。首先,slave开始一个工作线程——I/O线程。I/O线程在master上打开一个普通的连接,然后开始binlog dump process。Binlog dump process从master的二进制日志中读取事件,如果已经跟上master,它会睡眠并等待master产生新的事件。I/O线程将这些事件写入中继日志

3.   SQL线程从中继日志读取事件,并重放其中的事件而更新slave的数据,使其与master中的数据一致

 

 

binlog: 用来记录mysql的数据更新或者潜在更新(update xxx where id=x effect row 0);

文件内容存储:/var/lib/mysql

 

mysqlbinlog –base64-output=decode-rows -v mysql-bin.000001  查看binlog的内容

 

binlog的格式

statement : 基于sql语句的模式。update table set name =””; effect row 1000; uuid、now() other function   (默认模式)(如果对于now()函数这种问题,statement模式可能导致主从对应字段的值不一致)

row: 基于行模式; 存在1000条数据变更;  记录修改以后每一条记录变化的值(可以保证每一条数据一致,但是记录数据太多)

mixed: 混合模式,由mysql自动判断处理

修改binlog_formater,通过在mysql客户端输入如下命令可以修改

set global binlog_format=’row/mixed/statement’;

或者在vim /etc/my.cnf  的[mysqld]下增加binlog_format=‘mixed’

 

主从同步的延时问题

主从同步延迟是怎么产生的

  1. 当master库tps比较高的时候,产生的DDL数量超过slave一个sql线程所能承受的范围,或者slave的大型query语句产生锁等待
  2. 网络传输: bin文件的传输延迟
  3. 磁盘的读写耗时:文件通知更新、磁盘读取延迟、磁盘写入延迟

解决方案

1.在数据库和应用层增加缓存处理,优先从缓存中读取数据(应用层在master写入数据的时候,把新数据缓存,等到缓存失效的时候,可能从库已经同步了数据)

2.减少slave同步延迟,可以修改slave库sync_binlog属性;

sync_binlog=0  文件系统来调度把binlog_cache刷新到磁盘

sync_binlog=n

3.增加延时监控

Nagios做网络监控

mk-heartbeat

 

4.Mysql的主从配置

5.了解binlog及主从复制原理

 

Nginx(二)

  1. Rewrite的使用
  2. 缓存配置及Gzip配置
  3. Nginx反向代理实战
  4. 负载均衡配置说明
  5. Nginx的进程模型
  6. Nginx产线配置
  7. Nginx+keepalived实现高可用

课程笔记

rewrite的使用

Rewrite通过ngx_http_rewrite_module模块支持url重写、支持if判断,但不支持else

rewrite功能就是,使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标志位实现url重写以及重定向

rewrite只能放在server{},location{},if{}中,并且只能对域名后边的除去传递的参数外的字符串起作用

常用指令

If 空格 (条件) {设定条件进行重写}

条件的语法:

  1. “=” 来判断相等,用于字符比较
  2. “~” 用正则来匹配(表示区分大小写),“~*” 不区分大小写
  3. “-f -d -e” 来判断是否为文件、目录、是否存在

 

return 指令

语法:return code;

停止处理并返回指定状态码给客户端。

if ($request_uri ~ *\.sh ){

return 403

}

set指令

set variable value;

定义一个变量并复制,值可以是文本、变量或者文本变量混合体

rewrite指令

语法:rewrite regex replacement [flag]{last / break/ redirect 返回临时302/ permant  返回永久302}

last: 停止处理后续的rewrite指令集、 然后对当前重写的uri在rewrite指令集上重新查找

break; 停止处理后续的rewrite指令集 ,并不会重新查找

综合实例

如上配置对于: /images/ttt/test.png 会重写到/mic?file=test.png, 于是匹配到 location /mic ; 通过try_files获取存在的文件进行返回。最后由于文件不存在所以直接

返回404错误

rewrite匹配规则

表面看rewrite和location功能有点像,都能实现跳转,主要区别在于rewrite是在同一域名内更改获取资源的路径,而location是对一类路径做控制访问或反向代理,可以proxy_pass到其他机器。很多情况下rewrite也会写在location里,它们的执行顺序是:

  • 执行server块的rewrite指令
  • 执行location匹配
  • 执行选定的location中的rewrite指令

如果其中某步URI被重写,则重新循环执行1-3,直到找到真实存在的文件;循环超过10次,则返回500 Internal Server Error错误

 

浏览器本地缓存配置及动静分离

语法: expires 60s|m|h|d

操作步骤

  • 在html目录下创建一个images文件,在该文件中放一张图片
  • 修改html, 增加<img src=”图片”/>
  • 修改conf配置。配置两个location实现动静分离,并且在静态文件中增加expires的缓存期限

Gzip压缩策略

浏览器请求 -> 告诉服务端当前浏览器可以支持压缩类型->服务端会把内容根据浏览器所支持的压缩策略去进行压缩返回

->浏览器拿到数据以后解码;  常见的压缩方式:gzip、deflate 、sdch

  Gzip on|off 是否开启gzip压缩

Gzip_buffers 4 16k #设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流。4 16k代表以16k为单位,安装原始数据大小以16k为单位的4倍申请内存。

Gzip_comp_level[1-9] 压缩级别, 级别越高,压缩越小,但是会占用CPU资源

Gzip_disable #正则匹配UA 表示什么样的浏览器不进行gzip

Gzip_min_length #开始压缩的最小长度(小于多少就不做压缩)

Gzip_http_version 1.0|1.1 表示开始压缩的http协议版本

Gzip_proxied  (nginx 做前端代理时启用该选项,表示无论后端服务器的headers头返回什么信息,都无条件启用压缩)

Gzip_type text/pliain,application/xml  对那些类型的文件做压缩 (conf/mime.conf)

Gzip_vary on|off  是否传输gzip压缩标识

 

 

注意点

  1. 图片、mp3这样的二进制文件,没必要做压缩处理,因为这类文件压缩比很小,压缩过程会耗费CPU资源
  2. 太小的文件没必要压缩,因为压缩以后会增加一些头信息,反而导致文件变大
  3. Nginx默认只对text/html进行压缩 ,如果要对html之外的内容进行压缩传输,我们需要手动来配置

Nginx反向代理

Proxy_pass

通过反向代理把请求转发到百度

Proxy_pass 既可以是ip地址,也可以是域名,同时还可以指定端口

Proxy_pass指定的地址携带了URI,看我们前面的配置【/s】,那么这里的URI将会替换请求URI中匹配location参数部分;如上代码将会访问到http://www.baidu.com/s

interface_version

 

负载均衡

upstream是Nginx的HTTP Upstream模块,这个模块通过一个简单的调度算法来实现客户端IP到后端服务器的负载均衡

Upstream常用参数介绍

语法:server address [parameters]

其中关键字server必选。
address也必选,可以是主机名、域名、ip或unix socket,也可以指定端口号。
parameters是可选参数,可以是如下参数:

down:表示当前server已停用

backup:表示当前server是备用服务器,只有其它非backup后端服务器都挂掉了或者很忙才会分配到请求

weight:表示当前server负载权重,权重越大被请求几率越大。默认是1

max_failsfail_timeout一般会关联使用,如果某台server在fail_timeout时间内出现了max_fails次连接失败,那么Nginx会认为其已经挂掉了,从而在fail_timeout时间内不再去请求它,fail_timeout默认是10s,max_fails默认是1,即默认情况是只要发生错误就认为服务器挂掉了,如果将max_fails设置为0,则表示取消这项检查。

ups支持的调度算法

ip_hash  根据ip的hash值来做转发

默认是轮询机制

权重 weight=x

fair 根据服务器的响应时间来分配请求

url_hash

Nginx(一)

 

 

  1. 关于反向代理和正向代理
  2. 常用Web服务器介绍
  3. Nginx、Apache、Tomcat之间的联系
  4. Nginx安装部署
  5. Nginx核心配置分析
  6. 虚拟主机的配置
  7. Location匹配规则剖析
  8. 关于Nginx日志配置和及切割处理

 

课程内容笔记

 

关于反向代理和正向代理

正向代理

正向代理的对象是客户端

反向代理

反向代理代理的是服务端

 

常用Web服务器介绍

apache、Nginx、tomcat、weblogic、iis、jboss、websphere、jetty、netty、lighttpd、glassfish、resin

Apache

Apache仍然是时长占用量最高的web服务器,据最新数据统计,市场占有率目前是50%左右。主要优势在于一个是比较早出现的一个Http静态资源服务器,同时又是开源的。所以在技术上的支持以及市面上的各种解决方案都比较成熟。Apache支持的模块非常丰富。

Lighttpd

Lighttpd其设计目标是提供一个专门针对高性能网站、安全、快速、兼容性好并且灵活的web server环境。特点是:内存开销低、CPU占用率低、性能好、模块丰富。Lighttpd跟Nginx一样,是一款轻量级的Web服务器。跟Nginx的定位类似

Tomcat

Tomcat大家都比较熟悉,是一个开源的JSP Servlet容器。

Nginx

Nginx是俄罗斯人编写的一款高性能的HTTP和反向代理服务器,在高连接并发的情况下,它能够支持高达50000个并发连接数的响应,但是内存、CPU等系统资源消耗却很低,运行很稳定。目前Nginx在国内很多大型企业都有应用,据最新统计,Nginx的市场占有率已经到33%左右了。而Apache的市场占有率虽然仍然是最高的,但是是呈下降趋势。而Nginx的势头很明显。选择Nginx的理由也很简单:第一,它可以支持5W高并发连接;第二,内存消耗少;第三,成本低,如果采用F5、NetScaler等硬件负载均衡设备的话,需要大几十万。而Nginx是开源的,可以免费使用并且能用于商业用途

Nginx服务器、Apache Http Server、Tomcat之间的关系

HTTP服务器本质上也是一种应用程序——它通常运行在服务器之上,绑定服务器的IP地址并监听某一个tcp端口来接收并处理HTTP请求,这样客户端(一般来说是IE, Firefox,Chrome这样的浏览器)就能够通过HTTP协议来获取服务器上的网页(HTML格式)、文档(PDF格式)、音频(MP4格式)、视频(MOV格式)等等资源

Apache Tomcat是Apache基金会下的一款开源项目,Tomcat能够动态的生成资源并返回到客户端。

Apache HTTP server 和Nginx都能够将某一个文本文件的内容通过HTTP协议返回到客户端,但是这些文本文件的内容是固定的,也就是说什么情况下访问该文本的内容都是完全一样的,这样的资源我们称之为静态资源。动态资源则相反,不同时间、不同客户端所得到的内容是不同的 ; (虽然apache和nginx本身不支持动态页面,但是他们可以集成模块来支持,比如PHP、Python)

如果想要使用java程序来动态生成资源内容,使用apache server和nginx这一类的http服务器是基本做不到。而Java Servlet技术以及衍生出来的(jsp)Java Server Pages技术可以让Java程序也具有处理HTTP请求并且返回内容的能力,而Apache Tomcat正是支持运行Servlet/JSP应用程序的容器

Tomcat运行在JVM之上,它和HTTP服务器一样,绑定IP地址并监听TCP端口,同时还包含以下职责:

  • 管理Servlet程序的生命周期
  • 将URL映射到指定的Servlet进行处理
  • 与Servlet程序合作处理HTTP请求——根据HTTP请求生成HttpServletResponse对象并传递给Servlet进行处理,将Servlet中的HttpServletResponse对象生成的内容返回给浏览器

虽然Tomcat也可以认为是HTTP服务器,但通常它仍然会和Nginx配合在一起使用:

  • 动静态资源分离——运用Nginx的反向代理功能分发请求:所有动态资源的请求交给Tomcat,而静态资源的请求(例如图片、视频、CSS、JavaScript文件等)则直接由Nginx返回到浏览器,这样能大大减轻Tomcat的压力。
  • 负载均衡,当业务压力增大时,可能一个Tomcat的实例不足以处理,那么这时可以启动多个Tomcat实例进行水平扩展,而Nginx的负载均衡功能可以把请求通过算法分发到各个不同的实例进行处理

Apache HTTP Server和Nginx的关系

Apache Http Server是使用比较广泛也是资格最老的web服务器,是Apache基金会下第一个开源的WEB服务器。在Nginx出现之前,大部分企业使用的都是Apache。

在互联网发展初期,流量不是特别大的时候,使用Apache完全满足需求。但是随着互联网的飞速发展,网站的流量以指数及增长,这个时候除了提升硬件性能以外,Apache Http server也开始遇到瓶颈了,于是这个时候Nginx的出现,就是为了解决大型网站高并发设计的,所以对于高并发来说,Nginx有先天的优势。因此Nginx也在慢慢取代Apache Http server。 而Nginx另一个强大的功能就是反向代理,现在大型网站分工详细,哪些服务器处理数据流,哪些处理静态文件,这些谁指挥,一般都是用nginx反向代理到内网服务器,这样就起到了负载均衡分流的作用。再次nginx高度模块化的设计,编写模块相对简单。

 

 

Nginx的安装

nginx安装

  1. tar -zxvf 安装包
  2. ./configure –prefix=/mic/data/program/nginx 默认安装到/usr/local/nginx
  3. make & make install

启动停止

./nginx -c /mic/data/program/nginx/conf/nginx.conf 启动nginx   -c表示指定nginx.conf的文件。如果不指定,默认为NGINX_HOME/conf/nginx.conf

发送信号的方式

kill -QUIT  进程号

kil -TERM  进程号

停止nginx

./nginx -s stop  停止

./nginx -s quit   退出

./nginx -s reload  重新加载nginx.conf

 

安装过程中可能会出现的问题

缺少pcre的依赖

缺少openssl的依赖

yum install pcre-devel

yum install openssl-devel

yum install zlib-devel

Nginx核心配置分析

nginx的核心配置文件,主要包括三个段

Main、 Event 、 Http

虚拟主机配置

基于域名的虚拟主机

修改windows/system32/drivers/etc/hosts

 

修改nginx.conf文件,在http段中增加如下内容

基于端口的虚拟主机

基于ip的虚拟主机

Nginx的日志配置

通过access_log进行日志记录

nginx中有两条是配置日志的:一条是log_format 来设置日志格式 ; 另外一条是access_log

 

#log_format  main  ‘$remote_addr – $remote_user [$time_local] “$request” ‘

#                  ‘$status $body_bytes_sent “$http_referer” ‘

#                  ‘”$http_user_agent” “$http_x_forwarded_for”‘;

 

access_log  格式

#error_log  logs/error.log  notice;

logo声明   路径及文件名 日志标识

 

nginx日志切割

crontab

mv access.log access.log.20171206

kill -USR1 Nginx 主进程号  让nginx重新生成一个日志文件access.log

location的语法和匹配规则

location [~|=|^~|~*] /uri {

 

}

location的匹配规则

精准匹配

location=/uri{}

优先级最高的匹配规则

 

一般匹配

location /uri{

}

普通匹配的优先级要高于正则匹配

如果存在多个相同的前缀的一般匹配,那么最终会按照最大长度来做匹配

正则匹配

 

 

 

 

 

浏览器输入url到返回经历了什么

1.输入网址

2.根据网址进行域名解析,访问到对应的httpServer

3.访问到服务器之后,根据服务器上的虚拟主机目录,访问到具体信息

4.将html/图片等返回到客户端,客户端浏览器做个简析和渲染,展示给用户

 

两个nginx服务器用来做热备,其中只有一个工作,当一个挂掉的时候,使用另外一个。