首先介绍一下Keepalived,它是一个高性能的服务器高可用或热备解决方案,Keepalived主要来防止服务器单点故障的发生问题,可以通过其与Nginx的配合实现web服务端的高可用。

Keepalived以VRRP协议为实现基础,用VRRP协议来实现高可用性(HA).VRRP (Virtual Router Redundancy Protocol)协议是用于实现路由器冗余的协议,VRRP协议将两台或多台路由器设备虚拟成一个设备,对外提供虚拟路由器IP(一个或多个),如下图所示:

这张图的意思是,我们使用keepalived来管理两台设备的Nginx,并虚拟出一个IP,我们现在两台装有Nginx的设备分别是192.168.156.11和192.168.156.12,那么我们可以虚拟出一个192.168.156.xx的IP,外界请求直接访问虚拟IP而不是真正的Nginx,让虚拟IP去访问提供服务的Nginx(注意:高可用是指同一时间提供服务的只有一台设备,提供服务的设备挂掉之后,备份服务器便开始提供服务),然后再由Nginx去访问tomcat。

我们拿两台虚拟机来搭建nginx高可用环境,这两台设备分别是192.168.156.11(主机名是nginx1)和192.168.156.12(主机名是nginx2)。

如果是最小化安装的两台虚拟机,在搭建环境前需要做如下准备操作:

1.给虚拟机配置静态IP并要能上网,大家可以参考:http://blog.csdn.net/u012453843/article/details/52839105这篇博客进行学习

2.安装vim命令,使用命令:yum install vim-enhanced

3.安装gcc,使用命令:yum install make cmake gcc gcc-c++

4.安装依赖,如下所示。

yum install pcre  
yum install pcre-devel  
yum install zlib  
yum install zlib-devel

做完了以上准备操作,我们可以安装nginx了,关于nginx的安装,大家可以参考:http://blog.csdn.net/u012453843/article/details/69396434这篇博客进行学习。
     下面我们在192.168.156.11和192.168.156.12两台设备上都安装下keepalived。大家可以到http://download.csdn.net/detail/u012453843/9808913这个地址下载keepalived-1.2.18.tar.gz。

1、两台设备都进入到/usr/local/software目录下,方法是在XShell下面的输入框中输入命令cd /usr/local/software,回车,如下图所示。注意:下图输入框左边的图标要是多窗口图标,如果当前不是多窗口图标,可以点击输入框后面的那个图标,选择“全部XShell(X)”。

2、解压,我们在下面的输入框中输入tar -zxvf keepalived-1.2.18.tar.gz -C /usr/local/并按回车即可在两台设备同时进行解压操作。

3、安装一个软件包,在下面的输入框中输入:yum install -y openssl openssl-devel并按回车即可在两台设备同时安装软件包openssl。

解压完之后,我们可以到/usr/local目录下查看一下,发现已经有解压好的keepalived-1.2.18了。

4、对keepalived进行配置,我们在下面的输入框中输入cd keepalived-1.2.18/ && ./configure --prefix=/usr/local/keepalived并按回车即可在两台设备同时进行配置。

5、进行编译安装,我们在下面的输入框中输入make && make install并按回车,即可在两台设备同时进行编译安装。

安装完nginx之后,我们把keepalived做成一个服务,这样可以做到开机自动启动,步骤如下:

1、创建/etc/keepalived目录,我们在下面的输入框中输入mkdir /etc/keepalived并按回车,即可同时在两台设备上创建/etc/keepalived。

2、复制几个文件到指定目录

先复制第一个文件,我们在下面的输入框中输入cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/并按回车,即可在两台设备同时完成复制操作。

下面复制第二个文件,我们在下面的输入框中输入cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/并按回车,即可同时在两台设备上完成复制该文件操作。

下面复制第三个文件,我们在输入框中输入cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/并按回车,即可在两台设备同时执行复制文件操作。

3、创建两个软链接

首先创建第一个软链接,我们在下面的输入框中输入ln -s /usr/local/sbin/keepalived /usr/sbin/并按回车即可完成在两台设备上同时创建软链接。

下面我们创建第二个软链接,我们在下面的输入框中输入ln -s /usr/local/keepalived/sbin/keepalived /sbin/并按回车即可同时在两台设备上创建该软链接。

4、设置成开机启动,我们在下面的输入框中输入chkconfig keepalived on并按回车即可完成对两台设备同时设置keepalived服务开机启动。

既然设置成了系统服务,那么我们便尝试使用service keepalived start来启动该服务。如下图所示,发现两台设备都可以正常启动keepalived服务,说明我们设置是成功的。

我们可以重启服务也可以关闭服务,如下所示。我们先关闭两个节点的keepalived服务。

[root@nginx2 usr]# service keepalived restart
停止 keepalived:                                          [确定]
正在启动 keepalived:                                      [确定]
[root@nginx2 usr]# ps -ef | grep keepalived
root       3131      1  0 00:38 ?        00:00:00 keepalived -D
root       3133   3131  0 00:38 ?        00:00:00 keepalived -D
root       3134   3131  0 00:38 ?        00:00:00 keepalived -D
root       3136   1373  0 00:38 pts/0    00:00:00 grep keepalived
[root@nginx2 usr]# service keepalived stop
停止 keepalived:                                          [确定]
[root@nginx2 usr]# ps -ef | grep keepalived
root       3157   1373  0 00:38 pts/0    00:00:00 grep keepalived
[root@nginx2 usr]# 

下面我们便使用keepalived来实现nginx的高可用
1、我们需要修改下/etc/keepalived/keepalived.conf文件,首先修改192.168.156.11上的这个文件,修改后的配置内容如下

! Configuration File for keepalived
 
global_defs {
   router_id nginx1
}
 
vrrp_script chk_nginx {
   script "/etc/keepalived/nginx_check.sh"
   interval 2
   weight -20
}
 
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 11
    mcast_src_ip 192.168.156.11
    priority 100
    nopreempt
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    track_script {
       chk_nginx
    }
    virtual_ipaddress {
        192.168.156.110
    }
}

下面我们来具体学习下配置的意思,首先global_defs当中配置的是主机名,我的192.168.156.11的主机名是nginx1,因此这里配置的router_id的值是nginx1。

global_defs {
   router_id nginx1
}

接着看下面这段配置,这段配置的意思是,每隔2秒中去执行/etc/keepalived/nginx_check.sh脚本一次,这项检查从开始便一直进行,interval表示间隔时间,weight -20的意思是,脚本执行成功后把192.168.156.11这个节点的优先级降低20。

vrrp_script chk_nginx {
   script "/etc/keepalived/nginx_check.sh"
   interval 2
   weight -20
}

接着看下面这段配置,state MASTER表示该节点角色定义为MASTER,interface eth0是指虚拟机的网卡是eth0。virtual_router_id 11这项配置非常重要,两个节点的这项配置的值必须一样,否则会出现乱七八糟的问题,这里我把virtual_router_id的值设置为11是取自192.168.156.11的最后两位数字。mcast_src_ip 192.168.156.11这项配置是指定当前节点的真实IP。priority 100的意思是优先级,这里暂且设置为100,当然也可以是其它值。优先级在keepalived实现高可用方面起着至关重要的作用,keepalived服务器就是根据优先级来选择当前提供服务的设备的,192.168.156.11刚开始设置的优先级是100,192.168.156.12刚开始设置的优先级是90,这样keepalived一开始去检查优先级,发现192.168.156.11这台设备的优先级高,于是便让该设备对外提供服务,当192.168.156.11这台设备的nginx挂掉后,由于nginx_check.sh脚本每两秒执行一次,发现192.168.156.11这个节点没有nginx进程后便尝试进行重新启动nginx,如果重新启动还是不行的话,就杀掉所有的keepalived进程,并告诉keepalived服务器192.168.156.11这个节点的nginx挂掉了同时会把这个节点的优先级减20,从而优先级变为了80,这样下次keepalived来检查优先级发现192.168.156.12这个节点的优先级比较高(90),于是便让192.168.156.12这个节点对外提供服务,同理,这个节点发生故障的话,也会再去让另外一个节点来提供服务,这就实现了高可用。

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 11
    mcast_src_ip 192.168.156.11
    priority 100
    nopreempt
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    track_script {
       chk_nginx
    }
    virtual_ipaddress {
        192.168.156.110
    }

那么怎么查看虚拟机的网卡是什么呢?我们使用命令ip a来查看,如下图所示,可以看到192.168.156.11这台虚拟机的网卡是eth0。而且现在可以看到这台设备只有一个IP地址,等一会儿配置好之后,会有虚拟IP的信息。

下面我们来看如下配置,这段配置两个节点要一样,表明它们属于一个组,keepalived会同一组中去做检查并保持高可用。

authentication {
        auth_type PASS
        auth_pass 1111
    }

下面再看这段配置,这段配置中的"chk_nginx"与我们在上面定义的定时执行脚本配置(vrrp_script chk_nginx)的名称要一样。

track_script {
       chk_nginx
    }

下面再来看下面这段配置,这段配置的意思是对外提供的虚拟IP,这里可以是一个也可以是多个。

virtual_ipaddress {
        192.168.156.110
    }

看完了配置文件,我们再来看下定时检查nginx的脚本文件nginx_check.sh(需要确保脚本格式是unix格式,方法是vim进入编辑模式,然后输入:set ff并按回车即可看到格式)。,如下所示(注意:wc -l的"l"是小写的L而不是1)。

#!/bin/sh
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ];then
    /usr/local/nginx/sbin/nginx
    sleep 2
    if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
        killall keepalived
    fi
fi

我们来学习下这个脚本的意思,下面这行的意思是,使用ps -C nginx --no-header |wc -l命令去检查当前nginx的进程数量并把查询到的进程数量赋值给变量A。

A=`ps -C nginx --no-header |wc -l`

下面这行脚本的意思是,如果查询到的nginx的进程数量是0的话,就执行if条件里的内容。

if [ $A -eq 0 ];then

下面这行代码的意思是由于检查到当前没有nginx进程,因此尝试去启动nginx。

/usr/local/nginx/sbin/nginx

下面这行脚本的意思是启动nginx之后休眠2秒。

sleep 2

下面这段脚本的医生说是如果nginx的进程数还是0的话,就认为nginx已经挂掉了,需要杀掉这个节点上所有的keepalived进程。

if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
        killall keepalived
    fi

两个文件所在的目录是/etc/keepalived,如下所示。

[root@nginx1 keepalived]# pwd
/etc/keepalived
[root@nginx1 keepalived]# ll
总用量 8
-rw-r--r--. 1 root root 554 4月   9 01:51 keepalived.conf
-rw-r--r--. 1 root root 180 4月   9 03:30 nginx_check.sh
[root@nginx1 keepalived]# 

以上便是192.168.156.11节点上的配置文件和脚本的内容。我们在192.168.156.12这个节点上也需要有这两个文件,192.168.156.12这个节点上keepalived.conf文件的内容如下:注意virtual_router_id的值要与192.168.156.11这个节点配置的值要一致。

! Configuration File for keepalived
 
global_defs {
   router_id nginx2
}
 
vrrp_script chk_nginx {
   script "/etc/keepalived/nginx_check.sh"
   interval 2
   weight -20
}
 
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 11
    mcast_src_ip 192.168.156.12
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    track_script {
       chk_nginx
    }
    virtual_ipaddress {
        192.168.156.110
    }
}

nginx_check.sh脚本文件在两个节点上内容一样,192.168.156.12节点上两个文件目录与192.168.156.11一样,如下所示。

[root@nginx2 keepalived]# pwd
/etc/keepalived
[root@nginx2 keepalived]# ll
总用量 8
-rw-r--r--. 1 root root 553 4月   9 02:35 keepalived.conf
-rw-r--r--. 1 root root 180 4月   9 02:41 nginx_check.sh
[root@nginx2 keepalived]# 

由于目前nginx_check.sh脚本只有读权限,因此我们需要把两个节点上这个文件的权限放开,如下图所示。


       上面做好了铺垫之后,我们现在启动nginx,不过在启动nginx之前要保持两个节点nginx.conf配置一致,我们就都采用最原始的配置吧。如下所示。

#user  nobody;
worker_processes  1;
 
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
 
#pid        logs/nginx.pid;
 
 
events {
    worker_connections  1024;
}
 
 
http {
    include       mime.types;
    default_type  application/octet-stream;
 
    #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  logs/access.log  main;
 
    sendfile        on;
    #tcp_nopush     on;
 
    #keepalive_timeout  0;
    keepalive_timeout  65;
 
    #gzip  on;
 
    server {
        listen       80;
        server_name  localhost;
 
        #charset koi8-r;
 
        #access_log  logs/host.access.log  main;
 
        location / {
            root   html;
            index  index.html index.htm;
        }
 
        #error_page  404              /404.html;
 
        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
 
        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}
 
        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}
 
        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }
 
 
    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;
 
    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}
 
 
    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;
 
    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;
 
    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;
 
    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;
 
    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}
 
}

为了能够区分欢迎页是哪个节点的欢迎页,我们修改下欢迎页的信息,如下图所示。

下面我们来重新启动启动两个节点的nginx,如下所示。

[root@nginx1 html]# /usr/local/nginx/sbin/nginx -s reload
[root@nginx1 html]#  [root@nginx2 html]# /usr/local/nginx/sbin/nginx -s reload
[root@nginx2 html]#


       启动nginx之后,我们首先直接访问192.168.156.11的nginx首页,如下图所示。


        下面我们再直接访问192.168.156.12的nginx首页,如下图所示

下面我们启动两个节点上的keepalived,如下图所示。

启动keepalived之后,我们可以在两个节点上看到共同的虚拟IP192.168.156.110,如下图所示,我们发现在两个节点上都看到了虚拟IP192.168.156.110,这是不合理的,正确情况应该是只在Master角色的节点上有虚拟IP。

造成上图这种情况的原因是防火墙,为了避免因防火墙引起的各种问题,我们把两个节点的防火墙都关闭,而且可以设置开机也不启动防火墙,关闭防火墙的命令是:service iptables stop,设置不让防火墙开机重启的命令是chkconfig iptables off。关闭防火墙之后,我们再在两个节点查看IP信息,如下图所示,可以看到主节点192.168.156.11上有虚拟IP的信息,而备节点192.168.156.12上没有虚拟IP。这样才是正确的。


       这时我们便可以通过使用虚拟IP:192.168.156.110来访问nginx了,如下图所示,可以看到我们这时访问到的是192.168.156.11这台设备上的nginx。之所以会看到这台设备上的nginx是因为我们给这台设备keepalived赋予的优先级是100,而另一台设备192.168.156.12上keepalived赋予的优先级是90,显然192.168.156.11的优先级要高于192.168.156.12,因此keepalived服务器会选择192.168.156.11这个节点上的nginx对外提供服务。

既然要达到高可用的目的,我们便来测试一下假如我们把192.168.156.11上的keepalived服务关掉之后,看keepalived服务器会不会自动帮我们切换到另一个节点192.168.156.12让其对外提供服务。

[root@nginx1 keepalived]# service keepalived stop
停止 keepalived:                                          [确定]
[root@nginx1 keepalived]# 

关闭192.168.156.11的keepalived服务之后,我们再刷新http://192.168.156.110/,等一小会儿便可以看到提供nginx服务的自动变为nginx12了(也就是192.168.156.12),如下图所示。

等我们的192.168.156.11设备故障修复之后,我们重启keepalived,如下图所示。

[root@nginx1 keepalived]# service keepalived start
正在启动 keepalived:                                      [确定]
[root@nginx1 keepalived]# 

这时我们再刷新http://192.168.156.110/就会看到如下图所示界面,可以看到这时提供nginx服务的又自动切换为192.168.156.11这个节点了。说明我们已经实现了高可用性。

由于我们把keepalived配置成了服务,并且设置成了开机自启动,下面我们把两台设备都重启,重启的命令是reboot。

重启后,我们使用命令service keepalived status查看keepalived是否自己启动了,而且我们在nginx_check.sh脚本中会自动开启nginx,如下所示,发现都自动开启了。

[root@nginx1 ~]# service keepalived status
keepalived (pid  1197) 正在运行...
[root@nginx1 ~]# ps -ef|grep nginx
root       1233      1  0 22:10 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
nobody     1235   1233  0 22:10 ?        00:00:00 nginx: worker process      
root       1628   1524  0 22:12 pts/0    00:00:00 grep nginx
[root@nginx1 ~]# 
[root@nginx2 ~]# service keepalived status
keepalived (pid  1198) 正在运行...
[root@nginx2 ~]# ps -ef|grep nginx
root       1234      1  0 22:10 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
nobody     1236   1234  0 22:10 ?        00:00:00 nginx: worker process      
root       1670   1531  0 22:12 pts/0    00:00:00 grep nginx
[root@nginx2 ~]#

下面我还可以人为让nginx的配置文件出错,这样nginx_check.sh脚本文件在去尝试启动nginx时发现启动不成功,便会将keepalived也都杀掉。比如我们把192.168.156.11这台设备的nginx的配置文件人为修改出错,我们只需少写一个";"即可,如下图所示,我们把"worker_connections  1024"后面的那个";"去掉。


       下面我们重启192.168.156.11这台虚拟机,重启之后,我们查看keepalived的状态,发现keepalived已经被杀掉了,nginx也没启动。出现这种情况的原因是,当192.168.156.11启动后,keepalived会自动启动,启动会每隔2秒去执行nginx_check.sh脚本文件,该脚本文件通过检查nginx的进程数量是0,于是去尝试启动nginx,由于我们把nginx.conf文件人为修改错了,因此无法正常启动脚本,在尝试了无法启动nginx之后,脚本便把keepalived的所有进程都杀掉了,于是便会看到我们下面的结果。

[root@nginx1 ~]# service keepalived status
keepalived 已死,但是 subsys 被锁
[root@nginx1 ~]# ps -ef|grep nginx
root       1430   1398  0 22:27 pts/0    00:00:00 grep nginx
[root@nginx1 ~]#
        我们这时访问虚拟IP的话,便只能看到192.168.156.12对外提供nginx服务了,如下图所示。


       至此,我们使用keepalived搭建nginx高可用便搭建完了。需要说明的是,keepalived不仅可以用于nginx的高可用,还可以用于redis、mysql等等所有服务的高可用。

原文链接:https://blog.csdn.net/u012453843/article/details/69668663

感谢博主分享

【Nginx】使用keepalive和nginx搭载高可用的更多相关文章

  1. Nginx(七):keepalived实现Nginx负载均衡服务器的双机高可用

    前言 之前咱们通过 Nginx(六):Nginx HTTP负载均衡和反向代理的配置与优化 和 Nginx+tomcat组合实现高并发场景的动静分离和负载均衡方案 这两篇文章了解了Nginx对高并发应用 ...

  2. Nginx(haproxy)+keepalived+Tomcat双主高可用负载均衡

    周末的时候一个正在学Linux的朋友问我,高可用怎么玩?我和他微信了将近三个小时,把Nginx和haproxy双主高可用教给他了,今天突然想把这个给写进博客里,供给那些正在学习Linux系统的朋友们, ...

  3. nginx和keeplive实现负载均衡高可用

    一. Keeplive服务介绍 Keeplive期初是专门为LVS设计的,专门用来监控LVS集群系统中各个服务节点的状态,后来又加入VRRP的功能,因此除了配合LVS服务以外,也可以作为其他服务(ng ...

  4. Nginx+Keepalived(双机热备)搭建高可用负载均衡环境(HA)

    原文:https://my.oschina.net/xshuai/blog/917097 摘要: Nginx+Keepalived搭建高可用负载均衡环境(HA) http://blog.csdn.ne ...

  5. Nginx+Keepalived(双机热备)搭建高可用负载均衡环境(HA)-转帖篇

    原文:https://my.oschina.net/xshuai/blog/917097 摘要: Nginx+Keepalived搭建高可用负载均衡环境(HA) http://blog.csdn.ne ...

  6. 【工具-Nginx】从入门安装到高可用集群搭建

    文章已收录至https://lichong.work,转载请注明原文链接. ps:欢迎关注公众号"Fun肆编程"或添加我的私人微信交流经验 一.Nginx安装配置及常用命令 1.环 ...

  7. 搭建 docker + nginx + keepalived 实现Web应用的高可用(亲测)

    1. 环境准备     下载 VMware : https://www.vmware.com/go/getplayer-win        下载 Centos : https://mirrors.a ...

  8. Nginx+Keepalived+VIP漂移实现HA高可用技术之详细教程

    https://www.cnblogs.com/zcc666/p/13141626.html  这个是nginx安装教程地址 https://www.cnblogs.com/zcc666/p/1313 ...

  9. nginx实现集群高可用

    大家知道NGINX作为反向代理服务器可以实现负载均衡,同时也可以作为静态文件服务器,它的特点就是并发支持大,单机可同时支持3万并发,现在很多网站都把NGINX作为网关入口来统一调度分配后端资源.但是如 ...

随机推荐

  1. uniapp-vuex实现tabbar提示点

    底部入口栏的红点提示是app中常见的功能,或者说是必要功能,通常用来提醒用户去查看或操作某个模块内容. 看项目性质如果需要比较多并且灵活的提示,则需要用到长连接技术. 1.红点提示是根据接口返回的数据 ...

  2. STL—— 容器(vector)数据插入insert()方法 的返回值

    vector 容器下的 insert() 方法拥有返回值,由于insert() 方法拥有4种重载函数,他的返回值不尽相同. 第一种,插入单个元素后的返回值: 1 #include <iostre ...

  3. js下 Day08、DOM案例

    一.摇一摇 效果图:

  4. [日常摸鱼]bzoj2463 [中山市选2009]谁能赢呢?

    题意:两个人在$n*n$的棋盘上玩游戏,一开始棋子在左上角,可以上下左右的走到没有走过的地方,最后不能走的那个输,两个人都采取最优决策问哪个赢 猜结论!$n$为偶数则先手赢,否则后手赢. 考虑用$1* ...

  5. Jmeter二次开发——基于Java请求

    简述 这近几年,越来越多非http的协议需要进行性能测试,包括不仅限于各类rpc.mq.缓存等.对于这些协议,市面上可能没有现成的工具可以直接使用,这个时候,我们可以自己动手,通过编写相应的JavaS ...

  6. 算法(Java实现)—— 动态规划算法

    动态规划算法 应用场景-0-1背包问题 背包问题:有一个背包,容量为4磅,现有物品如下 物品 重量 价格 吉他(G) 1 1500 音响(S) 4 3000 电脑(L) 3 2000 要求: 达到目标 ...

  7. Python高级语法-对象实例对象属性-Property总结(4.6.2)

    @ 目录 1.说明 2.代码 关于作者 1.说明 property属性,返回的是值 不是callable的,也就是不能使用方法来调用 只能传入self,不能传入其他 用处,能返回局部数据,比如当分页的 ...

  8. 蒲公英 · JELLY技术周刊 Vol.35: Flash 四宗罪?

    蒲公英 · JELLY技术周刊 Vol.35 Flash 曾是 Web 迈向新世代的福音书,它为这个世界带来了缤纷色彩,但也如伊甸园的苹果,闪耀着智慧的光芒,却四灾随行.诞生 1995 年至今 25 ...

  9. JS C# 正则表达式去除html字符中所有的标签(img em标签除外)

    js去除em标签 $(this).html().replace(/<(?!em|\/em).*?>/g, '') C#去除 System.Text.RegularExpressions.R ...

  10. React组件的state和props

    React组件的state和props React的数据是自顶向下单向流动的,即从父组件到子组件中,组件的数据存储在props和state中.实际上在任何应用中,数据都是必不可少的,我们需要直接的改变 ...