环境

[root@node1 ~]# cat /etc/redhat-release
CentOS Linux release 7.1. (Core)
[root@node1 ~]# uname -r
3.10.-.el7.x86_64
10.0.0.20 node1 ram节点  (rabbitmq )
10.0.0.21 node2 disc节点 (rabbitmq + haproxy + keepalived )
10.0.0.22 node3 ram节点 (rabbitmq + haproxy + keepalived )

搭建(在所有节点执行)

添加EPEL源

[root@node1 ~]# rpm -Uvh https://dl.Fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

添加Erlang

[root@node1 ~]# rpm -Uvh http://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm

安装RabbitMQ

[root@node1 ~]# wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.6/rabbitmq-server-3.6.6-1.el7.noarch.rpm
[root@node1 ~]# rpm --import https://www.rabbitmq.com/rabbitmq-signing-key-public.asc
[root@node1 ~]# yum install -y rabbitmq-server-3.6.-.el7.noarch.rpm

启动服务

[root@node1 ~]# systemctl enable rabbitmq-server.service
[root@node1 ~]# systemctl start rabbitmq-server.service

查看服务状态

[root@node1 ~]# systemctl status rabbitmq-server 

查看端口监听状态 5672为集群间通信端口,15672为web端管理端口

[root@node1 ~]# netstat -lnutp

查看配置路径

[root@node1 ~]# cd /var/log/rabbitmq/
[root@node1 rabbitmq]# vim rabbit\@node2.log

=INFO REPORT==== -Aug-:::: ===
Starting RabbitMQ 3.6. on Erlang R16B03-
Copyright (C) - Pivotal Software, Inc.
Licensed under the MPL. See http://www.rabbitmq.com/ =INFO REPORT==== -Aug-:::: ===
node : rabbit@node2
home dir : /var/lib/rabbitmq
config file(s) : /etc/rabbitmq/rabbitmq.config (not found)
cookie hash : vNIydXbvZSku+QwtRGImSQ==
log : /var/log/rabbitmq/rabbit@node2.log
sasl log : /var/log/rabbitmq/rabbit@node2-sasl.log
database dir : /var/lib/rabbitmq/mnesia/rabbit@node2

根据上面的提示发现没有 rabbitmq.config 文件,可以自己创建

[root@node1 rabbitmq]# cd /etc/rabbitmq/
[root@node1 rabbitmq]# vim rabbitmq.config

编辑内容如下

[{rabbit, [{loopback_users, []}]}].

这里的意思是开放使用,rabbitmq默认创建的用户guest,密码也是guest,这个用户默认只能是本机访问,localhost或者127.0.0.1,从外部访问需要添加上面的配置 

保存配置后重启服务

[root@node1 rabbitmq]# systemctl restart rabbitmq-server

此时就可以从外部访问了,但此时再看log文件,发现内容还是原来的,还是显示没有找到配置文件

[root@node1 rabbitmq]# vim rabbit\@node2.log

=INFO REPORT==== -Aug-:::: ===
Starting RabbitMQ 3.6. on Erlang R16B03-
Copyright (C) - Pivotal Software, Inc.
Licensed under the MPL. See http://www.rabbitmq.com/ =INFO REPORT==== 20-Aug-2017::08:03:11 ===
node : rabbit@node2
home dir : /var/lib/rabbitmq
config file(s) : /etc/rabbitmq/rabbitmq.config (not found)
cookie hash : vNIydXbvZSku+QwtRGImSQ==
log : /var/log/rabbitmq/rabbit@node2.log
sasl log : /var/log/rabbitmq/rabbit@node2-sasl.log
database dir : /var/lib/rabbitmq/mnesia/rabbit@node2

手动删除这个文件再重启服务,不过这不影响使用

[root@node1 rabbitmq]# rm rabbit\@node2.log
[root@node1 rabbitmq]# systemctl restart rabbitmq-server

在此查看log文件,OK了

[root@node1 rabbitmq]# vim rabbit\@node2.log

=INFO REPORT==== -Aug-:::: ===
Starting RabbitMQ 3.6. on Erlang R16B03-
Copyright (C) - Pivotal Software, Inc.
Licensed under the MPL. See http://www.rabbitmq.com/ =INFO REPORT==== 20-Aug-2017::08:26:56 ===
node : rabbit@node2
home dir : /var/lib/rabbitmq
config file(s) : /etc/rabbitmq/rabbitmq.config
cookie hash : vNIydXbvZSku+QwtRGImSQ==
log : /var/log/rabbitmq/rabbit@node2.log
sasl log : /var/log/rabbitmq/rabbit@node2-sasl.log
database dir : /var/lib/rabbitmq/mnesia/rabbit@node2

启用RabbitMQ Web插件

[root@node1 ~]# rabbitmq-plugins enable rabbitmq_management

关闭Rabbitmq Web管理接口

[root@node1 rabbitmq]# rabbitmq-plugins disable rabbitmq_management

RabbitMQ用户管理

添加用户为:root ,密码为:admin)

[root@node1 ~]# rabbitmqctl add_user admin admin

设置用户角色(设置admin用户为管理员角色)

[root@node1 ~]# rabbitmqctl set_user_tags admin administrator

设置用户权限(设置admin用户配置、写、读的权限)

[root@node1 ~]# rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"

删除用户(删除guest用户)

[root@node1 ~]# rabbitmqctl delete_user guest

如果配置防火墙,开启端口

[root@node2 rabbitmq]# firewall-cmd --zone=public --add-port=/tcp --permanent
[root@node2 rabbitmq]# firewall-cmd --reload

在Web输入服务器IP:端口

http://IP:15672

RabbitMQ集群配置

设置hosts解析,所有节点配置相同

[root@node1 ~]# vim /etc/hosts
10.0.0.20 node1
10.0.0.21 node2
10.0.0.22 node3

设置Erlang Cookie

RabbitMQ节点之间和命令行工具 (e.g. rabbitmqctl)是使用Cookie互通的,Cookie是一组随机的数字+字母的字符串。当RabbitMQ服务器启动的时候,Erlang VM会自动创建一个随机内容的Cookie文件。如果是通过源安装RabbitMQ的话,Erlang Cookie 文件在/var/lib/rabbitmq/.erlang.cookie。如果是通过源码安装的RabbitMQ,Erlang Cookie文件$HOME/.erlang.cookie。

修改node1改文件的权限

[root@node1 ~]# chmod 777 /var/lib/rabbitmq/.erlang.cookie

然后将文件复制到node2、node3上面

  node2

[root@node2 ~]# cd /var/lib/rabbitmq
[root@node2 rabbitmq ~]# chmod 777 .erlang.cookie
[root@node2 rabbitmq ~]# scp -r 10.0.0.20:/var/lib/rabbitmq/.erlang.cookie .
[root@node2 rabbitmq ~]# chmod 400 .erlang.cookie

  node3

[root@node3 ~]# cd /var/lib/rabbitmq
[root@node3 rabbitmq ~]# chmod 777 .erlang.cookie
[root@node3 rabbitmq ~]# scp -r 10.0.0.20:/var/lib/rabbitmq/.erlang.cookie .
[root@node3 rabbitmq ~]# chmod .erlang.cookie

将node1的文件权限恢复过来

[root@node1 ~]# chmod 400 /var/lib/rabbitmq/.erlang.cookie

查看三台机器上的 .erlang.cookie的值是一致的

[root@node1 ~]# cat /var/lib/rabbitmq/.erlang.cookie
CAWVPZYTTTUGFZTYNUHG
[root@node2 ~]# cat /var/lib/rabbitmq/.erlang.cookie
CAWVPZYTTTUGFZTYNUHG
[root@node3 ~]# cat /var/lib/rabbitmq/.erlang.cookie
CAWVPZYTTTUGFZTYNUHG

使用detached参数,在后台启动Rabbit Node,要先停止现有的Rabbitmq-server,再重新在后台执行

node1

[root@node1 ~]# rabbitmqctl stop
[root@node1 ~]# rabbitmq-server -detached
[root@node1 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@node1 ...
[{nodes,[{disc,[rabbit@node1]}]},
{running_nodes,[rabbit@node1]},
{cluster_name,<<"rabbit@node1">>},
{partitions,[]},
{alarms,[{rabbit@node1,[]}]}]

node2

[root@node2 ~]# rabbitmqctl stop
[root@node2 ~]# rabbitmq-server -detached
[root@node2 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@node2 ...
[{nodes,[{disc,[rabbit@node2]}]},
{running_nodes,[rabbit@node2]},
{cluster_name,<<"rabbit@node2">>},
{partitions,[]},
{alarms,[{rabbit@node2,[]}]}]

node3

[root@node2 ~]# rabbitmqctl stop
[root@node2 ~]# rabbitmq-server -detached
[root@node2 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@node2 ...
[{nodes,[{disc,[rabbit@node2]}]},
{running_nodes,[rabbit@node2]},
{cluster_name,<<"rabbit@node2">>},
{partitions,[]},
{alarms,[{rabbit@node2,[]}]}]

将node1、node2、node3组成集群

因为rabbitmq-server启动时,会一起启动节点和应用,它预先设置RabbitMQ应用为standalone模式。要将一个节点加入到现有的集群中,你需要停止这个应用并将节点设置为原始状态,然后就为加入集群准备好了。如果使用./rabbitmqctl stop,应用和节点都将被关闭。所以使用rabbitmqctl stop_app仅仅关闭应用。

node1

[root@node1 ~]# rabbitmqctl stop_app
Stopping node rabbit@node1 ...
[root@node1 ~]# rabbitmqctl join_cluster --rm rabbit@node2
Clustering node rabbit@node2 with rabbit@node1 ...
[root@node1 ~]# rabbitmqctl start_app
Starting node rabbit@node2 ...

   node3

[root@node3 ~]# rabbitmqctl stop_app
Stopping node rabbit@node3 ...
[root@node3 ~]# rabbitmqctl join_cluster --rm rabbit@node2
Clustering node rabbit@node3 with rabbit@node1 ...
[root@node3 ~]# rabbitmqctl start_app
Starting node rabbit@node3 ...

此时 node1 与 node3 也会自动建立连接

如果要使用内存节点,则可以使用以下命令

[root@node2 ~]# rabbitmqctl join_cluster --ram rabbit@node1

集群配置好后,可以在 RabbitMQ 任意节点上执行 rabbitmqctl cluster_status 来查看是否集群配置成功

[root@node1 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@node1 ...
[{nodes,[{disc,[rabbit@node2]},{{ram,[rabbit@node1,rabbit@node3]}]},
{running_nodes,[rabbit@node1,rabbit@node2,rabbit@node3]},
{cluster_name,<<"rabbit@node1">>},
{partitions,[]},
{alarms,[{rabbit@node1,[]},{rabbit@node2,[]},{rabbit@node3,[]}]}]

RabbitMQ镜像功能(所有节点执行)

设置policy,以所有队列被镜像到集群其他所有节点,一个节点挂掉然后重启后会自动同步队列消息(我们生产环境采用这个方式)

[root@node1 ~]# rabbitmqctl set_policy ha-all-queue "^" '{"ha-mode":"all","ha-sync-mode":"automatic"}'

安装软件负载均衡器HAProxy(node3相同操作)

安装haproxy

[root@node2 ~]# yum install -y haproxy

安装完以后,配置文件的目录在/etc/haproxy/haproxy.cfg,以下是我修改后的配置文件

[root@node2 ~]# cd /etc/haproxy/
[root@node2 haproxy]# vim haproxy.cfg
###########全局配置#########
global
log /dev/log local0
log /dev/log local1 notice
# chroot /var/lib/haproxy # 改变当前工作目录
# stats socket /run/haproxy/admin.sock mode 660 level admin # 创建监控所用的套接字目录
# stats socket /var/lib/haproxy/stats
pidfile /var/run/haproxy.pid # haproxy的pid存放路径,启动进程的用户必须有权限访问此文件
maxconn 4000 # 最大连接数,默认4000
user haproxy # 默认用户
group haproxy # 默认用户组
daemon # 创建1个进程进入deamon模式运行。此参数要求将运行模式设置为"daemon ###########默认配置#########
defaults
log global
mode http
# option dontlognull
option httplog
timeout connect 5000 # 连接超时时间
timeout client 50000 # 客户端连接超时时间
timeout server 50000 # 服务器端连接超时时间
option httpclose # 每次请求完毕后主动关闭http通道
option httplog # 日志类别http日志格式
option forwardfor # 如果后端服务器需要获得客户端真实ip需要配置的参数,可以从Http Header中获得客户端ip
option redispatch # serverId对应的服务器挂掉后,强制定向到其他健康的服务器
timeout connect 10000 # default 10 second timeout if a backend is not found
maxconn 60000 # 最大连接数
retries # 3次连接失败就认为服务不可用,也可以通过后面设置
# errorfile /etc/haproxy/errors/.http
# errorfile /etc/haproxy/errors/.http
# errorfile /etc/haproxy/errors/.http
# errorfile /etc/haproxy/errors/.http
# errorfile /etc/haproxy/errors/.http
# errorfile /etc/haproxy/errors/.http
# errorfile /etc/haproxy/errors/.http
####################################################################
listen http_front
bind 0.0.0.0: #监听端口
stats refresh 30s #统计页面自动刷新时间
stats uri /haproxy?stats #统计页面url
stats realm Haproxy Manager #统计页面密码框上提示文本
stats auth admin:admin #统计页面用户名和密码设置
#stats hide-version #隐藏统计页面上HAProxy的版本信息 #####################我把RabbitMQ的管理界面也放在HAProxy后面了###############################
listen rabbitmq_admin
bind 0.0.0.0:
server node1 10.0.0.20:
server node2 10.0.0.21:
server node3 10.0.0.22: #################################################################### listen rabbitmq_cluster
bind 0.0.0.0:
option tcplog
mode tcp
timeout client 3h
timeout server 3h
option clitcpka
balance roundrobin #负载均衡算法(#banlance roundrobin 轮询,balance source 保存session值,支持static-rr,leastconn,first,uri等参数)
#balance url_param userid
#balance url_param session_id check_post
#balance hdr(User-Agent)
#balance hdr(host)
#balance hdr(Host) use_domain_only
#balance rdp-cookie
#balance leastconn
#balance source //ip
server node1 10.0.0.20: check inter 5s rise fall
#check inter 是检测心跳频率,rise 2是2次正确认为服务器可用,fall 3是3次失败认为服务器不可用
server node2 10.0.0.21: check inter 5s rise fall
server node3 10.0.0.22: check inter 5s rise fall

启动

[root@node2 ~]# systemctl haproxy start

关闭

[root@node2 ~]# service haproxy stop

重启

[root@node2 ~]# service haproxy restart

加入开机启动

[root@node2 ~]# systemctl enable haproxy

查看开机启动的程序

[root@node2 ~]# ls /etc/systemd/system/multi-user.target.wants/

Web访问

http://10.0.0.21:1080/haproxy?stats

配置Haproxy增加日志记录功能(node3相同操作)

创建日志文件/var/log/haproxy/haproxy.log

[root@node2 ~]# cd /var/log/
[root@node2 log]# mkdir haproxy
[root@node2 log]# cd haproxy
[root@node2 haproxy]# touch haproxy.log
[root@node2 haproxy]# chmod a+w haproxy.log

开启rsyslog的haproxy日志记录功能,编辑/etc/rsyslog.conf文件,将下列两句开头的 # 注释去掉

[root@node2 ~]# vim /etc/rsyslog.conf
#$ModLoad imudp
#$UDPServerRun
$ModLoad imudp
$UDPServerRun

# Save boot messages also to boot.log
local7.* /var/log/boot.log

之后添加

# Save haproxy log
local0.* /var/log/haproxy/haproxy.log

修改/etc/sysconfig/rsyslog 文件

[root@node2 ~]# vim /etc/sysconfig/rsyslog

SYSLOGD_OPTIONS=""  

改为

SYSLOGD_OPTIONS="-r -m 0 -c 2"  

修改/etc/haproxy/haproxy.cfg文件,在global区段添加

log         127.0.0.1 local0 

重启rsyslog和haproxy服务

[root@node2 ~]# service haproxy restart
[root@node2 ~]# service rsyslog restart

查看日志

[root@node2 ~]# tail -f /var/log/haproxy/haproxy.log 

安装keepalived(node3相同操作 keepalived.conf 配置不同)

 

安装

[root@node2 ~]# yum -y install keepalived

查看版本

[root@node2 ~]# keepalived -v

配置 keepalived.conf  (10.0.0.21)

[root@node2 ~]# vim /etc/keepalived/keepalived.conf 

! Configuration File for keepalived

global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id rabbitmq #集群名称,相同集群名称必须相同
} vrrp_instance VI_1 {
state MASTER #主从设置,这里设置为主
interface eth0
virtual_router_id 51
priority 150 #定义访问优先级,数值越大优先级越高
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.30 #置虚拟IP,需在相同网段
}
}
 

配置 10.0.0.22(备)

[root@node4 ~]# vim /etc/keepalived/keepalived.conf 

! Configuration File for keepalived

global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id rabbitmq #集群名称,必须和web01设置相同
} vrrp_instance VI_1 {
state BACKUP #主从设置,这里设置为从
interface eth0
virtual_router_id 51
priority 100 #定义访问优先级,从要比主的数值小
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.30 #设置虚拟IP,必须相同
}
}
 

重启服务查看node2(10.0.0.21)网卡上是否有 10.0.0.30 IP

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:e6:36:7b brd ff:ff:ff:ff:ff:ff
inet 10.0.0.21/24 brd 10.0.0.255 scope global eth0
valid_lft forever preferred_lft forever
inet 10.0.0.30/32 scope global eth0

而此是node3(10.0.0.22)的网卡上是没有10.0.0.30 IP

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:15:ba:84 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.22/24 brd 10.0.0.255 scope global eth0
valid_lft forever preferred_lft forever

可以关闭node2(10.0.0.21)的keepalived 服务,查看IP是否转移到了node3(10.0.0.22)上

node2(10.0.0.21)上已经没有了10.0.0.30

[root@node1 ~]# systemctl stop  keepalived

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:e6:36:7b brd ff:ff:ff:ff:ff:ff
inet 10.0.0.21/24 brd 10.0.0.255 scope global eth0
valid_lft forever preferred_lft forever
 

查看node3(10.0.0.22)

 
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:15:ba:84 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.22/24 brd 10.0.0.255 scope global eth0
valid_lft forever preferred_lft forever
inet 10.0.0.30/32 scope global eth0
valid_lft forever preferred_lft forever
 

此时10.0.0.30 已经转移到了 10.0.0.22上

启动keepalived即可,10.0.0.30是对外提供的统一地址。

通过10.0.0.30:5672就可以访问rabbitmq服务

注意:keepalived可能运行多个实例,比如redis和haproxy共存,在这种情况下,必须注意几点:

一、VIP必须各实例不同
二、virtual_router_id必须各实例不同
 

centos7 rabbitmq集群搭建+高可用的更多相关文章

  1. RabbitMQ 集群与高可用配置

    集群概述 通过 Erlang 的分布式特性(通过 magic cookie 认证节点)进行 RabbitMQ 集群,各 RabbitMQ 服务为对等节点,即每个节点都提供服务给客户端连接,进行消息发送 ...

  2. (转)RabbitMQ 集群与高可用配置

    集群概述 环境 配置步骤 集群概述 通过 Erlang 的分布式特性(通过 magic cookie 认证节点)进行 RabbitMQ 集群,各 RabbitMQ 服务为对等节点,即每个节点都提供服务 ...

  3. RabbitMQ集群和高可用配置

    概述 RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python.Ruby..NET.Java.JMS.C.PHP.ActionScript.XMPP. ...

  4. 消息中间件-RabbitMQ集群和高可用

    多机多节点集群部署 一. 环境准备 准备三台安装好RabbitMQ 的机器,安装方法见 安装步骤 10.10.1.41 10.10.1.42 10.10.1.43 提示:如果使用虚拟机,可以在一台VM ...

  5. Rabbitmq安装、集群与高可用配置

    历史: RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现.AMQP 的出现其实也是应了广大人民群众的需求,虽然在同步消息通讯的世界里有很多 ...

  6. hadoop 集群HA高可用搭建以及问题解决方案

    hadoop 集群HA高可用搭建 目录大纲 1. hadoop HA原理 2. hadoop HA特点 3. Zookeeper 配置 4. 安装Hadoop集群 5. Hadoop HA配置 搭建环 ...

  7. RabbitMQ集群搭建和使用

    一.环境准备 1.选择RabbitMQ的版本 http://www.rabbitmq.com/changelog.html 注: 不同版本的Linux选择的RabbitMQ版本也不同,参照 http: ...

  8. Nginx+Zuul集群实现高可用网关

    代码参考:https://github.com/HCJ-shadow/Zuul-Gateway-Cluster-Nginx Zuul的路由转发功能 前期准备 搭建Eureka服务注册中心 服务提供者m ...

  9. Dubbo入门到精通学习笔记(十五):Redis集群的安装(Redis3+CentOS)、Redis集群的高可用测试(含Jedis客户端的使用)、Redis集群的扩展测试

    文章目录 Redis集群的安装(Redis3+CentOS) 参考文档 Redis 集群介绍.特性.规范等(可看提供的参考文档+视频解说) Redis 集群的安装(Redis3.0.3 + CentO ...

随机推荐

  1. 在Asp.Net Core中使用中间件保护非公开文件

    在企业开发中,我们经常会遇到由用户上传文件的场景,比如某OA系统中,由用户填写某表单并上传身份证,由身份管理员审查,超级管理员可以查看. 就这样一个场景,用户上传的文件只能有三种人看得见(能够访问) ...

  2. centos6.5环境自动化运维之puppet实现nginx反向代理功能及puppet安装配置详解

    puppet是一种Linux.Unix.windows平台的集中配置管理系统,使用自有的puppet描述语言,可管理配置文件.用户.cron任务.软件包.系统服务等.puppet把这些系统实体称之为资 ...

  3. Oracle数据库操作基本语法

    创建表 SQL>create table classes(        classId number(2),        cname varchar2(40),        birthda ...

  4. ajax返回json对象的两种写法

    1. 前言 dataType: 要求为String类型的参数,预期服务器返回的数据类型.如果不指定,JQuery将自动根据http包mime信息返回responseXML或responseText,并 ...

  5. Webpack中的css-loader 和style-loader

    传统上我们会在html文件中引入CSS代码,借助webpack style-loader和css-loader我们可以在.js文件中引入css文件并让样式生效. style-loader和css-lo ...

  6. 性能测试十八:jmeter分布式

    一台压力机产生得压力是有限的,尤其是jmeter,java本来性能就不是很好,并发特别多的时候,jmeter的性能会急剧下降,正常的接口,若单台压力机,超过1000并发以后,jmeter的性能就不怎么 ...

  7. 在.NET环境下使用KAFKA

    近日基于项目的解耦与削峰需求,决定在项目中引入消息队列.因为同时项目部分业务已经迁移到Java上,所以消息队列组件又要兼顾Java环境下的使用,选来选去对比了RabbitMQ.RocketMQ和Kaf ...

  8. AOJ 2224 Save your cats (Kruskal)

    题意:给出一个图,去除每条边的花费为边的长度,求用最少的花费去除部分边使得图中无圈. 思路:先将所有的边长加起来,然后减去最大生成树,即得出最小需要破坏的篱笆长度. #include <cstd ...

  9. thinkphp搭建后台品字形框架页面

    页面分为三个部分 head,left,right共同组成了index 在indexController中 function Index(){ $this->display(); } //展现后腰 ...

  10. C# Winform将控件作为参数传递

    最近做个Winform 的程序设计,需要将窗体的控件作为参数传递到另外一个类的函数中去使用,每次都会忘记,简单的记下来,以备即时查看. 1. 设置控件的modifier属性设置为public 2. 以 ...