容器服务
#
tomcat
#
## 介绍
tomcat从7开始默认就是nio的
## 配置
bin/startup.bat
set JAVA_HOME=
# 设置tomcat运行jdk
context.xml
<Loader delegate="true"/>
# true表示使用java加载器的代理模式
## false代表永远先在Web应用程序中寻找
web.xml
Content-Type: text/x-zim-wiki
Wiki-Format: zim 0.4
Creation-Date: 2013-08-04T19:40:08+08:00
====== web.xml文件 ======
Created Sunday 04 August 2013
<servlet>
<servlet-name>
<servlet-class>
<load-on-startup>1
<init-param>
<param-name>
<param-value>
<servlet-mapping>
<servlet-name>
<url-pattern>
<welcome-file-list>
<welcome-file>
<filter>
<filter-name>
<filter-class>
<init-param>
<filter-mapping>
<filter-name>
<url-pattern>
<mime-mapping>
<extension>bmp
<mime-type>image/bmp
<error-page>
<exception-type>异常类的完全限定名 /<error-code>错误码
<location>以“/”开头的错误处理页面路径
## 启动顺序
web.xml中配置的启动顺序
监听器
过滤器
servlet
load-on-startup属性值越小越先启动
tomcat的加载过程: # 分析启动日志得到
启动http协议
启动catalina
启动servlet引擎
加载xml配置文件
初始化日志配置
初始化ContextListener
初始化SessionListener
部署web项目
spring监听器,加载xml配置(开始spring自己的日志记录)
实例化bean
初始化c3p0连接池的记录显示
初始化LocalSessionFactoryBean的记录显示
application监听器(监听器按配置顺序启动)
struts过滤器,加载xml配置(开始struts自己的日志记录)
struts-default.xml
根据其中配置的bean属性加载类,并记录了日志
struts-plugin.xml # 里面有加载spring-struts-plugin包
初始化struts-spring 集成
struts.xml
## 目录
LICENSE
NOTICE
RELEASE-NOTES
RUNNING.txt
bin
bootstrap.jar
commons-daemon.jar
tomcat-juli.jar
tomcat-native.tar.gz
commons-daemon-native.tar.gz
catalina.bat
shutdown.bat
startup.bat
cpappend.bat
digest.bat
setclasspath.bat
tool-wrapper.bat
version.bat
catalina.sh
shutdown.sh
startup.sh
digest.sh
setclasspath.sh
tool-wrapper.sh
version.sh
catalina-tasks.xml
conf
catalina.policy
catalina.properties
logging.properties
context.xml
server.xml
tomcat-users.xml
web.xml
Catalina
localhost
host-manager.xml
manager.xml
lib
annotations-api.jar
catalina.jar
catalina-ant.jar
catalina-ha.jar
catalina-tribes.jar
el-api.jar
jasper.jar
jasper-el.jar
jasper-jdt.jar
jsp-api.jar
servlet-api.jar
tomcat-coyote.jar
tomcat-dbcp.jar
tomcat-i18n-es.jar
tomcat-i18n-fr.jar
tomcat-i18n-ja.jar
log
catalina.2013-07-28.log等等
webapps
ROOT
WEB-INF
web.xml
docs
examples
manager
host-manager
tmp
work
发布
conf/server.xml 中8080端口 位置
<Context path="/bbs" reloadable="true" docBase="E:\workspace\bbs" workDir="E:\workspace\bbs\work" />
发布war文件:
localhost:8080 -> tomcat manager -> WAR file to deploy
netty
#
介绍
JBOSS提供,由Trustin Lee开发,比mina晚
java开源框架
对比java nio
java原生nio有bug(epoll bug)且编写困难, 网络可靠性自己处理
netty设计优雅,使用方便,高性能、稳定
原理
基于socket的数据流处理
# socket数据流不是a queue of packets , 而是a queue of bytes, 所以分次传输的数据会成为a bunch of bytes
例子
Handler
ChannelHandler
ChannelOutboundHandler
ChannelOutboundHandlerAdapter # 可作Encoder
MessageToByteEncoder
ChannelInboundHandler # 提供可重写的事件
ChannelInboundHandlerAdapter
ByteToMessageDecoder # easy to deal with fragmentation issue
事件
decode(ctx, in, out) # 内部处理过数据,堆积到了buffer(in)
## out中add了数据, 表示decode成功,则执行后抛弃in中数据
# decode会被循环调用直到有一次out中没有add东西
ReplayingDecoder
事件
channelRead() # 从client接收到数据时调用,数据的类型是ByteBuf
## ByteBuf是 reference-counted object
## 必须用ReferenceCountUtil.release(msg)或((ByteBuf) msg).release()来明确释放
exceptionCaught() # 当抛出Throwable对象时调用
channelActive() # as soon as a connection is established
方法
handlerAdded()
handlerRemoved()
ByteBuf
方法
buf.writeBytes(m) # 将m[ByteBuf]中的数据 cumulate into buf[ 定长的ByteBuf, 如ctx.alloc().buffer(4) ]
isReadable() # 返回ByteBuf中data的长度
ChannelHandlerContext # 用于触发一些i/o事件
方法
write(msg) # msg在flush后自动realease
write(msg, promise) # promise是ChannelPromise的对象,用来标记msg是否确切地写入到管道中
flush()
writeAndFlush(msg) # 返回ChannelFuture
alloc() # 分配缓冲区来包含数据
ByteBufAllocator
buffer(4) # 返回存放32-bit Integer的ByteBuf
Server
EventLoopGroup
NioEventLoopGroup # 多线程 i/o eventloop
方法
shutdownGracefully() # 返回Funture类来通知group是否完全关闭并且所有group的channels都关闭
ServerBootstrap # 建server的帮助类,链式编程
## 可以直接用Channel来建server
方法
group(bossGroup, workerGroup) # boss接收连接,worker处理boss中的连接
group(workerGroup) # 只有一个参数时,该group即作boss也作worker
channel(NioServerSocketChannel.class) # 用来接收连接的channel的类型
channel(NioSocketChannel.class) # create client-side channel
childHandler(channelInitializer) # 新接收的channel总执行本handler
## 只有workerGroup时不用
option(ChannelOption.SO_BACKLOG, 128) # channel实现的参数
childOption(channelOption.SO_KEEPALIVE, true) # option设置boss, childOption设置worker
## 在只有workerGroup时不用childOption,因为它没有parent
bind(port) # 开始接收连接,返回的是ChannelFuture
## 绑定网卡上的所有port端口,可以bind多次到不同的端口
ChannelInitializer # 帮助设置channel, 如设置channel的pipeline中的handler
实例
new ChannelInitializer<SocketChannel>(){
@Override
public void initChannel(SocketChannel ch) throws Exception{
ch.pipeline().addLast(new DiyHandler());
}
}
ChannelFuture
方法
sync()
channel() # 返回Channel
addListener(channelFutureListener)
Channel
closeFuture() # 返回ChannelFuture
ChannelFutureListener
实例
new ChannelFutureListener(){
// 当请求结束时通知
@Override
public void operationComplete(ChannelFuture future){
assert f == future;
ctx.close();
}
}
client
Bootstrap # for non-server channels such as a client-side or connectionless channel
connect(host, port)
netty-tcnative
#
介绍
tomcat native 的分支
特点
简化本地库的分配和连接
可以maven配置dependency
提供openssl的支持
jetty
#
# 是开源的servlet容器,基于java, 可以给jsp和servlet提供运行环境
# jetty容器可以实例化成一个对象,迅速为一些独立运行(stand-alone)的java应用提供网络和web连接
apache
#
# http容器,可容纳php, python。一请求一线程
安装
pacman -S apache
mkdir /srv/http
chown http:http /srv/http
编译安装
./configure
--prefix=/全路径/install_path
--with-apxs2=/全路径/apxs # 模块
make
make install
命令
httpd
-f # 指定配置
-t # 配置检查
-k
start
restart
graceful
stop
graceful-stop
apachectl
graceful # 重载配置
-f /全路径/httpd.conf # 指定配置
-t # 配置检查
配置
/etc/httpd/conf/httpd.conf
DocumentRoot "/srv/http" # 项目路径
Listen # 端口
案例
php
docker解决
lighttpd
#
meteor
#
# 包装node
ringojs
#
# jvm上commonJs规范的服务器
mina
#
apache提供, 由Trustin Lee开发,比netty更早
tomcat native
#
# 基于apr(apache portable runtime)技术,让tomcat在操作系统级别的交互上做的更好
tinyHttpd
#
resin
#
# 收费, 类似tomcat的java容器,性能提升
uwsgi
#
# 一个web服务器,实现了wsgi, uwsgi, http等协议
weblogic
#
# oracle
was
#
# ibm服务器
gunicon
#
# python wsgi http server
node.js
#
OpenResty
#
# 基于Nginx扩展
Tengine
#
# 基于Nginx扩展
数据库访问
#
Druid
#
Sharding JDBC
#
缓存
#
缓存失效策略
FIFO(First Input First Output)
LRU(Least Recently Used)
LFU(Least Frequently Used)
客户端缓存
#
Header
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Vary: Accept-Encoding
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
本地缓存
#
Ehcache
堆内、堆外、磁盘三级缓存,可按容量制定缓存策略
可按时间、次数制定过期策略
Guava Cache
堆内缓存
Nginx本地缓存
Nginx PageSpeed插件
缓存服务
#
HTTP
Nuster
基于HAProxy的HTTP缓存服务器
Varnish
3台Varnish代替12台Squid
Squid
Memcached
Redis
Tair
配置、服务发现
#
Apollo
#
# 支持推、拉模式更新
Eureka
#
Nacos
#
RPC
#
Dubbo
#
Thrift
#
gRPC
#
消息队列
#
消息重发
状态表记录消息状态
pulsar
#
# 雅虎开源, 存储和服务分离,高可用存储, 支持流
rabbitMQ
#
介绍
erlang开发, 重量级
支持协议多,AMQP、XMPP、SMTP、STOMP
Broker构架 # 消息在中心队列排队
install
yum install rabbitmq-server
命令
添加用户:
rabbitmqctl add_user rainbird password
添加权限:
rabbitmqctl set_permissions -p "/" rainbird ".*" ".*" ".*"
删除测试用户:
rabbitmqctl delete_user guest
原理
虚拟主机 virtual host: 用户通过虚拟主机进行权限控制(如禁止A组访问B组的交换机)
# 默认虚拟主机为"/"
队列 queue: 由生产者(producers)通过程序建立,再通过消费者(consuming)连接取走
消息:
路由键 routing key
交换机 exchange: 负责把消息放入队列
绑定 binding(路由规则): 如指明交换机中具有路由键"X"的消息要到名为"Y"的队列中去
# 如果同一个键对应多个队列,则复制后分别发送
功能
持久化
队列和交换机创建时指定标志durable,指定队列和交换机重启生重建
# 如果绑定了durable的队列和durable的交换机,该绑定自动保留
# non-durable的交换机与durable的队列不能绑定
# 一但创建durable标志,不能修改
消息发布到交换机时,指定标志Delivery Mode=2,这样消息会持久化
使用(原文http://adamlu.net/rabbitmq/tutorial-one-python)
安装python 与插件支持
pip
python-pip git
python-pika
rabbitmq-server start
send.py
#!/usr/bin/env python
import pika
connection = pika.BlockingConnection(pika.ConnectionParameters(
host='localhost'))
channel = connection.channel()
channel.queue_declare(queue='hello')
channel.basic_publish(exchange='',
routing_key='hello',
body='Hello World!')
print " [x] Sent 'Hello World!'"
connection.close()
receive.py
#!/usr/bin/env python
import pika
connection = pika.BlockingConnection(pika.ConnectionParameters(
host='localhost'))
channel = connection.channel()
channel.queue_declare(queue='hello')
print ' [*] Waiting for messages. To exit press CTRL+C'
def callback(ch, method, properties, body):
print " [x] Received %r" % (body,)
channel.basic_consume(callback,
queue='hello',
no_ack=True)
channel.start_consuming()
jafka
#
介绍
基于kafka, 快速持久化(O(1)时间开销)
高吞吐,一台普通服务器 100k/s
完全分布式,Broker, Producer, Consumer原生支持分布式,自动负载均衡
支持hadoop并行加载
kafka
#
介绍
apache子项目,scala语言编写, 发布订阅队列
相对activeMQ轻量
特点
push/pull队列架构,适合异构集群
分布式, 高吞吐率, 易扩展
支持数据并行到hadoop
分区有序
批量压缩, 零拷贝, 内存缓冲, 磁盘顺序写入
可持久化
工具
manager # 监控
nsq
#
介绍
go
工具
admin # 监控
memcacheQ
#
zeroMQ
#
activeMQ
#
介绍
apache子项目, 类似zeroMQ
通信方式
点到点
不成功时保存在服务端
发布订阅
不成功消息丢失
beanstalkd
#
mqtt
#
# 最早由ibm提供的,二进制消息的mq
emqttd
#
介绍
mqtt broker
apollo
#
介绍
apache mqtt broker
# 阿里mq
定时任务
#
Cron
#
XXL Job
#
quartz
#
# java作业调度
配置applicationContext_job.xml
job # 任务内容
jobDetail # 调度方案
trigger # 时间
scheduler # jobDetail和trigger的容器
状态监控
# 用日志表记录
运行中
JobListener监听器
暂停中
scheduler.pauseTrigger()
等待中
创建job时
celery
#
# python
rundeck
#
# java
存储服务
#
存储的概念和术语
scsi: 小型计算机系统接口(Small Computer System Interface)
fc: 光纤通道(Fibre channel)
das: 直连式存储(Direct-Attached Storage)
nas: 网络接入存储(Network-Attached Storage)
san: 存储区域网络(Storage Area Network)
连接设备: 路由, 光纤交换机, 集线器(hub)
接口: scsi fc
通信协议: ip scsi
iscsi
#
# internet scsi
优点
可以网络传输
服务器数量无限
在线扩容.动态部署
架构
控制器架构: 专用数据传输芯片.专用RAID数据校验芯片.专用高性能cache缓存和专用嵌入式系统平台
iscsi连接桥架构:
前端协议转换设备(硬件)
后端存储(scsi磁盘阵列.fc存储设备)
pc架构
存储设备搭建在pc服务器上,通过软件管理成iscsi, 通过网卡传输数据
实现
以太网卡 + initiator软件
toe网卡 + initiator软件
iscsi HBA卡
iscsi系统组成
iscsi initiator 或 iscsi hba
iscsi target
以太网交换机
一台或多台服务器
fastdfs
#
# 开源分布式文件系统
cdn
#
介绍
流量不大时带宽比cdn便宜, 流量大时cdn便宜。
界限为250Mbps左右,价格在9k/month
价格 50TB/月 100TB/月
阿里云 3.8w/月 6.9w/月
盛大云 9k/月 1.7w/月
网宿
蓝汛
AWS S3
#
命令
aws
s3
cp --recursive bin s3://meiqia/crm-module/search/bin
# 级联复制
sync s3://meiqia/crm-module/search/bin bin
# 下载
rm --recursive s3://meiqia/crm-module/search
# 级联删除
网关
#
Zuul
#
Spring Cloud Gateway
#
Kong
#
# 基于OpenResty
日志
#
ELK
#
# elasticsearch, logstash, kibana
FileBeat
命令
filebeat --environment systemd -c /etc/filebeat/filebeat.yml --path.home /usr/share/filebeat --path.config /etc/filebeat --path.data /var/lib/filebeat --path.logs /var/log/filebeat
log.io
#
DNS服务
#
Nscd
#
DNS本地缓存
实时计算
#
阿里云Flink
集群
计算单元
vertex拓扑
名词
DataHub源表
RDS维表
RDS结果表