前言
TCP和UDP同属于传输层协议;一般TCP多用于数据安全性及稳定性要求比较高的场景,而UDP则多用于IM即时通讯中。
一般我们把环境分为:开发环境,测试环境,灰度环境以及生产环境;其中,灰度环境相当于准生产环境,当有改动比较大的特性上线之前(例如:网站改版等),往往会先上到灰度环境,将一部分生产环境的流量引到灰度环境,进行一个小范围的公测;以此搜集用户的反馈,即时改进。避免直接部署到生产环境,如果出现问题,影响会很大;下面将介绍haproxy如何根据cookie进行分流。
tcp四元组:源IP,源端口,目标IP,目标端口;用于唯一标识一条tcp连接。目标IP(服务器IP)和目标端口(例如:80)都是固定的,当建立连接的时候,客户端操作系统都会随机的分配一个未使用的端口,用于建立tcp连接,众所周知,一个tcp报文头使用2个字节来传输源端口(也就是说端口的最大范围0-65535);去掉常用的端口,对于客户端操作系统可随机分配的端口大概只有64K左右,当然也要看操作系统的限制(可通过调整内核参数进行修改)。那么,基于这一理论,代理服务器是如何做到动不动就号称并发几十万的呢?(如:F5硬件负载均衡机等),明显代理机可用端口最大也只有65535。要突破端口的限制,就必须为代理机分配多个内网IP,这样通过扩展绑定到代理机IP的个数,来扩大客户端可分配端口数(比如:基于tcp四元组唯一性原则,代理机上绑定了两个Lan Ip,那么端口数就有130K左右了)。所以,F5负载均衡服务器一般都是绑定了多个内网IP的,同样,我们也可以让部署haproxy的软负载均衡机绑定多个内网IP,提升并发连接数。
在剖析Set,Map,List等集合类,序列化及反序列化的原理之前,先介绍一下transient关键字的作用,java提供了transient关键字,用于修饰变量,标明该变量不用序列化到字节流中。同时,java也提供了Serializable这样一个标志性接口(不含任何方法,仅仅只是标明该对象可以被序列化)
在生产环境中,通常使用haproxy做tcp四层代理,例如:代理mysql服务器,rabbitmq集群等,起到负载均衡,失效转发的作用。一般情况下,为防止其他服务器恶意的访问,我们会希望指定的应用服务器可以连上haproxy,其他服务器的连接操作,一律拒绝;要达到这个效果,我们可以使用haproxy自带的白名单功能进行连接限定。
生产环境中的nginx服务器,由于访问日志文件增长快速,这样access_log日志文件过大,会严重影响日志记录性能;同时为了方便对访问日志进行分析,需要对日志进行定时切割。定时切割的方式主要有:按月切割,按天切割,按小时切割等方案,具体切割方案可根据线上服务器访问量来定,一般为按天进行定时切割。
在jdk中提供了一些java.util.concurrent.atomic原子操作类。对于原子类变量的操作是不会存在并发性问题的,不需要使用synchronized关键字进行并发控制。它底层自身的实现即可保证变量的可见性以及操作的原子性,一般我们可以使用AtomicInteger,AtomicLong等实现计数器等功能,利用AtomicBoolean实现标志位等功能。
hexo(官网地址)是一个基于Node.js的静态博客程序,可以方便的生成静态网页托管在github和Heroku上。以下是基于next主题,客户端win10系统,服务端ubuntu系统搭建的,总体的架构图如下:
1.包名:包名全部小写,连续的单词只是简单地连接起来,不使用下划线; |