实现LVS的1 + 2 模式 & 2 + 2 模式

lvs介绍

libnet下载地址: http://search.cpan.org/dist/libnet/

ipvsadm下载地址: http://www.linuxvirtualserver.org/software/ipvs.html#kernel-2.6

从Linux内核版本2.6起,ip_vs code已经被整合进了内核中,因此,只要在编译内核的时候选择了ipvs的功能,您的Linux即能支持LVS。Linux 2.4.23以后的内核版本也整合了ip_vs code,但如果是更旧的内核版本,您得自己手动将ip_vs code整合进内核原码中,并重新编译内核方可使用lvs。

一、关于ipvsadm:

ipvsadm是运行于用户空间、用来与ipvs交互的命令行工具,它的作用表现在:

1、定义在Director上进行dispatching的服务(service),以及哪此服务器(server)用来提供此服务;

2、为每台同时提供某一种服务的服务器定义其权重(即概据服务器性能确定的其承担负载的能力);

注:权重用整数来表示,有时候也可以将其设置为atomic_t;其有效表示值范围为24bit整数空间,即(2^24-1);

因此,ipvsadm命令的主要作用表现在以下方面:

1、添加服务(通过设定其权重>0);

2、关闭服务(通过设定其权重>0);此应用场景中,已经连接的用户将可以继续使用此服务,直到其退出或超时;新的连接请求将被拒绝;

3、保存ipvs设置,通过使用“ipvsadm-sav > ipvsadm.sav”命令实现;

4、恢复ipvs设置,通过使用“ipvsadm-sav < ipvsadm.sav”命令实现;

5、显示ip_vs的版本号,下面的命令显示ipvs的hash表的大小为4k;

# ipvsadm

IP Virtual Server version 1.2.1 (size=4096)

6、显示ipvsadm的版本号

# ipvsadm --version

ipvsadm v1.24 2003/06/07 (compiled with popt and IPVS v1.2.0)

二、ipvsadm使用中应注意的问题

默认情况下,ipvsadm在输出主机信息时使用其主机名而非IP地址,因此,Director需要使用名称解析服务。如果没有设置名称解析服务、服务不可用或设置错误,ipvsadm将会一直等到名称解析超时后才返回。当然,ipvsadm需要解析的名称仅限于RealServer,考虑到DNS提供名称解析服务效率不高的情况,建议将所有RealServer的名称解析通过/etc/hosts文件来实现;

三、调度算法

Director在接收到来自于Client的请求时,会基于"schedule"从RealServer中选择一个响应给Client。ipvs支持以下调度算法:

1、轮询(round robin, rr),加权轮询(Weighted round robin, wrr)——新的连接请求被轮流分配至各RealServer;算法的优点是其简洁性,它无需记录当前所有连接的状态,所以它是一种无状态调度。轮叫调度算法假设所有服务器处理性能均相同,不管服务器的当前连接数和响应速度。该算法相对简单,不适用于服务器组中处理性能不一的情况,而且当请求服务时间变化比较大时,轮叫调度算法容易导致服务器间的负载不平衡。

2、最少连接(least connected, lc), 加权最少连接(weighted least connection, wlc)——新的连接请求将被分配至当前连接数最少的RealServer;最小连接调度是一种动态调度算法,它通过服务器当前所活跃的连接数来估计服务器的负载情况。调度器需要记录各个服务器已建立连接的数目,当一个请求被调度到某台服务器,其连接数加1;当连接中止或超时,其连接数减一。

3、基于局部性的最少链接调度(Locality-Based Least Connections Scheduling,lblc)——针对请求报文的目标IP地址的负载均衡调度,目前主要用于Cache集群系统,因为在Cache集群中客户请求报文的目标IP地址是变化的。这里假设任何后端服务器都可以处理任一请求,算法的设计目标是在服务器的负载基本平衡情况下,将相同目标IP地址的请求调度到同一台服务器,来提高各台服务器的访问局部性和主存Cache命中率,从而整个集群系统的处理能力。LBLC调度算法先根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于其一半的工作负载,则用“最少链接”的原则选出一个可用的服务器,将请求发送到该服务器。

4、带复制的基于局部性最少链接调度(Locality-Based Least Connections with Replication Scheduling,lblcr)——也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法的不同之处是它要维护从一个目标IP地址到一组服务器的映射,而 LBLC算法维护从一个目标IP地址到一台服务器的映射。对于一个“热门”站点的服务请求,一台Cache 服务器可能会忙不过来处理这些请求。这时,LBLC调度算法会从所有的Cache服务器中按“最小连接”原则选出一台Cache服务器,映射该“热门”站点到这台Cache服务器,很快这台Cache服务器也会超载,就会重复上述过程选出新的Cache服务器。这样,可能会导致该“热门”站点的映像会出现在所有的Cache服务器上,降低了Cache服务器的使用效率。LBLCR调度算法将“热门”站点映射到一组Cache服务器(服务器集合),当该“热门”站点的请求负载增加时,会增加集合里的Cache服务器,来处理不断增长的负载;当该“热门”站点的请求负载降低时,会减少集合里的Cache服务器数目。这样,该“热门”站点的映像不太可能出现在所有的Cache服务器上,从而提供Cache集群系统的使用效率。LBLCR算法先根据请求的目标IP地址找出该目标IP地址对应的服务器组;按“最小连接”原则从该服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载;则按“最小连接”原则从整个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。

5、目标地址散列调度(Destination Hashing,dh)算法也是针对目标IP地址的负载均衡,但它是一种静态映射算法,通过一个散列(Hash)函数将一个目标IP地址映射到一台服务器。目标地址散列调度算法先根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。

6、源地址散列调度(Source Hashing,sh)算法正好与目标地址散列调度算法相反,它根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。它采用的散列函数与目标地址散列调度算法的相同。除了将请求的目标IP地址换成请求的源IP地址外,它的算法流程与目标地址散列调度算法的基本相似。在实际应用中,源地址散列调度和目标地址散列调度可以结合使用在防火墙集群中,它们可以保证整个系统的唯一出入口。

四、关于LVS追踪标记fwmark:

如果LVS放置于多防火墙的网络中,并且每个防火墙都用到了状态追踪的机制,那么在回应一个针对于LVS的连接请求时必须经过此请求连接进来时的防火墙,否则,这个响应的数据包将会被丢弃。

以上来源于网络

五、生产中使用最多的模式DR

第一种:1 + 2 模式

LVS-DR:直接路由

各集群节点,必须要跟directory在同一物理网络中

RIP可以使用公网地址,实现远程管理(也可以使用私有地址)

directory仅负责处理入展请求,响应报文则有realserver 直接发往客户端

集群节点不能将网关指向DIP

directory不支持端口映射

实施规划:

同一物理网段的三个共有地址

使用私有ip,映射VIP地址到外网,

实验信息和拓扑:
备注:Centos 6.5 selinux –disabled iptables off

检查内核是否已经支持LVS:

# grep -i ‘CONFIG_IP_VS‘/boot/config-2.6.32-431.el6.x86_64
CONFIG_IP_VS=m
CONFIG_IP_VS_IPV6=y
# CONFIG_IP_VS_DEBUG is not set
CONFIG_IP_VS_TAB_BITS=12
CONFIG_IP_VS_PROTO_TCP=y
CONFIG_IP_VS_PROTO_UDP=y
CONFIG_IP_VS_PROTO_AH_ESP=y
CONFIG_IP_VS_PROTO_ESP=y
CONFIG_IP_VS_PROTO_AH=y
CONFIG_IP_VS_PROTO_SCTP=y
CONFIG_IP_VS_RR=m
CONFIG_IP_VS_WRR=m
CONFIG_IP_VS_LC=m
CONFIG_IP_VS_WLC=m
CONFIG_IP_VS_LBLC=m
CONFIG_IP_VS_LBLCR=m
CONFIG_IP_VS_DH=m
CONFIG_IP_VS_SH=m
CONFIG_IP_VS_SED=m
CONFIG_IP_VS_NQ=m
CONFIG_IP_VS_FTP=m
CONFIG_IP_VS_PE_SIP=m
[[email protected] ~]#

出现以上说明内核已经支持LVS模块

Directory的配置如下:
安装ipvsadm管理工具:

 yum install ipvsadm –y

使用ipvsadm配置lvs

vim dirctory.sh
#!/bin/bash
#
# LVS script for VS/DR
#
. /etc/rc.d/init.d/functions
#
VIP=172.16.100.200
RIP1=172.16.100.100
RIP2=172.16.100.101
PORT=80
 
#
case "$1" in
start)         
 
 /sbin/ifconfig eth0:1 $VIP broadcast $VIPnetmask 255.255.255.255 up
 /sbin/route add -host $VIP dev eth0:1
 
# Since this is the Director we must beableto forward packets
 echo1 > /proc/sys/net/ipv4/ip_forward
 
# Clear all iptables rules.
 /sbin/iptables -F
 
# Reset iptables counters.
 /sbin/iptables -Z
 
# Clear all ipvsadm rules/services.
 /sbin/ipvsadm -C
 
# Add an IP virtual service forVIP192.168.0.219 port 80
# In this recipe, we will usetheround-robin scheduling method.
# In production, however, you should useaweighted, dynamic scheduling method.
 /sbin/ipvsadm -A -t $VIP:80 -s wlc
 
# Now direct packets for this VIP to
# the real server IP (RIP) insidethecluster
 /sbin/ipvsadm -a -t $VIP:80 -r $RIP1 -g -w 1
 /sbin/ipvsadm -a -t $VIP:80 -r $RIP2 -g -w 2
 
 /bin/touch /var/lock/subsys/ipvsadm &>/dev/null
;;
 
stop)
# Stop forwarding packets
 echo0 > /proc/sys/net/ipv4/ip_forward
 
# Reset ipvsadm
 /sbin/ipvsadm -C
 
# Bring down the VIP interface
 /sbin/ifconfig eth0:1 down
 /sbin/route del $VIP
 
 /bin/rm -f /var/lock/subsys/ipvsadm
 
 echo"ipvs is stopped..."
;;
 
status)
  if[ ! -e /var/lock/subsys/ipvsadm ]; then
  echo "ipvsadm is stopped ..."
 else
   echo"ipvs is running ..."
  ipvsadm -L -n
  fi
;;
*)
 echo"Usage: $0 {start|stop|status}"
;;
esac
#sh dirctory.sh  start

两台R而阿里Server配置如下:
保证正常的WEB访问即可

vim realserver.sh
#!/bin/bash
#
# Script to start LVS DR real server.
# description: LVS DR real server
#
. /etc/rc.d/init.d/functions
 
VIP=172.16.100.200
host=`/bin/hostname`
 
case "$1" in
start)
     # Start LVS-DR real server on this machine.
      /sbin/ifconfig lo down
      /sbin/ifconfig lo up
      echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
      echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
      echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
      echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
 
      /sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
      /sbin/route add -host $VIP dev lo:0
 
;;
stop)
 
      # Stop LVS-DR real server loopback device(s).
      /sbin/ifconfig lo:0 down
      echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
      echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
      echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
       echo 0 >/proc/sys/net/ipv4/conf/all/arp_announce
 
;;
status)
 
      # Status of LVS-DR real server.
      islothere=`/sbin/ifconfig lo:0 | grep $VIP`
      isrothere=`netstat -rn | grep "lo:0" | grep $VIP`
       if [ ! "$islothere" -o !"isrothere" ];then
          # Either the route or the lo:0 device
          # not found.
          echo "LVS-DR real server Stopped."
      else
          echo "LVS-DR real server Running."
      fi
;;
*)
          # Invalid entry.
          echo "$0: Usage: $0 {start|status|stop}"
          exit 1
;;
esac
 
# sh realserver.sh  start

访问WEB服务器:

# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu16436 qdisc noqueue state UNKNOWN
    link/loopback00:00:00:00:00:00 brd 00:00:00:00:00:00
   inet 127.0.0.1/8 scope host lo
   inet6 ::1/128 scope host
      valid_lft forever preferred_lft forever
2: eth0:<BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen1000
    link/ether 00:0c:29:63:2b:5c brdff:ff:ff:ff:ff:ff
   inet 172.16.100.10/24 brd 172.16.100.255 scope global eth0
   inet 172.16.100.200/32 brd 172.16.100.200 scope global eth0:1
   inet6 fe80::20c:29ff:fe63:2b5c/64 scope link
      valid_lft forever preferred_lft forever
[[email protected] ~]#

备注:

目前才在一个问题,就是如果后端的realserver宕机,如果将其从从lvs集群中剔除此服务器,并且当realserver恢复又是如何将其加入LVS集群中呢,这就是健康检查的功能,这里使用如下的脚本实现。

# vim check_health.sh
#!/bin/bash
#
VIP=172.16.100.200
CPORT=80
FAIL_BACK=127.0.0.1
RS=("172.16.100.100" "172.16.100.101")
declare -a RSSTATUS
RW=("2" "1")
RPORT=80
TYPE=g
CHKLOOP=3
LOG=/var/log/ipvsmonitor.log
 
addrs(){
 ipvsadm -a -t $VIP:$CPORT -r $1:$RPORT -$TYPE-w $2
  [$? -eq 0 ] && return 0 || return 1
}
 
delrs(){
 ipvsadm -d -t $VIP:$CPORT -r $1:$RPORT
  [$? -eq 0 ] && return 0 || return 1
}
 
checkrs(){
 local I=1
 while [ $I -le $CHKLOOP ]; do
   if curl --connect-timeout 1 http://$1&> /dev/null; then
     return 0
   fi
   let I++
 done
 return 1
}
 
initstatus(){
 local I
 local COUNT=0;
  forI in ${RS[*]}; do
   if ipvsadm -L -n | grep "$I:$RPORT" && > /dev/null; then
     RSSTATUS[$COUNT]=1
   else
     RSSTATUS[$COUNT]=0
   fi
  letCOUNT++
 done
}
 
initstatus
while :; do
  letCOUNT=0
  forI in ${RS[*]}; do
   if checkrs $I; then
     if [ ${RSSTATUS[$COUNT]} -eq 0 ]; then
        addrs $I ${RW[$COUNT]}
        [ $? -eq 0 ] &&RSSTATUS[$COUNT]=1 && echo "`date+‘%F %H:%M:%S‘`, $I isback." >> $LOG
     fi
   else
     if [ ${RSSTATUS[$COUNT]} -eq 1 ]; then
        delrs $I
        [ $? -eq 0 ] &&RSSTATUS[$COUNT]=0 && echo "`date+‘%F %H:%M:%S‘`, $I isgone." >> $LOG
     fi
   fi
   let COUNT++
 done
 sleep 5
done

执行脚本:

# touch /var/log/ipvsmonitor.log
# chmod +x check_health.sh
# nohup ./check_health.sh  &
# tail -f /var/log/ipvsmonitor.log
2014-10-25 18:11:59, 172.16.100.100 isgone.
2014-10-25 18:11:59, 172.16.100.101 isgone.
2014-10-25 18:18:08, 172.16.100.100 isback.
2014-10-25 18:23:26, 172.16.100.101 isback.
2014-10-25 18:23:56, 172.16.100.101 isgone.
2014-10-25 18:24:12, 172.16.100.101 isback.

启动和停止realserver上的服务,可以看到日志记录,LVS集群会对其进行剔除和添加功能。

End

第二种:2 + 2 模式

  1. 配置lvs Master & lvs Backup
yum install poptpopt-devel popt-static libnl-devel libnl –y
mkdir -p mkdir /usr/local/src/lvs
cd /usr/local/src/lvs/

安装ipvsadm

wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.26.tar.gz
tar zxvf ipvsadm-1.26.tar.gz
make && make install && echo"install LVS ok"

安装keepalived

wget http://www.keepalived.org/software/keepalived-1.2.13.tar.gz
tar zxvf keepalived-1.2.13.tar.gz
cd keepalived-1.2.13
./configure && make && make install && echo "install keepalivedok" || echo "install keepalived is failed"

配置keepalived为启动脚本

cp /usr/local/etc/rc.d/init.d/keepalived  /etc/init.d/
cp /usr/local/etc/sysconfig/keepalived  /etc/sysconfig/
mkdir /etc/keepalived
cp /usr/local/etc/keepalived/keepalived.conf  /etc/keepalived/
cp /usr/local/sbin/keepalived  /usr/sbin/

LVS Backup 配置同上

Master keepalived.conf配置文件:

!Configuration File for keepalived 
global_defs{ 
   notification_email { 
         [email protected] 
   } 
   notification_email_from [email protected]
   smtp_server 127.0.0.1 
   router_id LVS_DEVEL 
} 
vrrp_instanceVI_1 { 
    state MASTER              
    interface eth0 
    virtual_router_id 51 
    priority 100     
    advert_int 1 
    authentication { 
        auth_type PASS 
        auth_pass 1q2w3e4r5t6y 
    } 
    virtual_ipaddress { 
        172.16.100.200  
    } 
} 
virtual_server172.16.100.200 80 { 
    delay_loop 6                   
    lb_algo wrr                   
    lb_kind DR                    
    persistence_timeout 60         
    protocol TCP                 
    real_server 172.16.100.100 80 { 
        weight 3                
        TCP_CHECK { 
        connect_timeout 10        
        nb_get_retry 3 
        delay_before_retry 3 
        connect_port 80 
        } 
    } 
    real_server 172.16.100.101 80 { 
        weight 3 
        TCP_CHECK { 
        connect_timeout 10 
        nb_get_retry 3 
        delay_before_retry 3 
        connect_port 80 
        } 
     } 
}

LvsBackup配置文件:

!Configuration File for keepalived 
global_defs{ 
   notification_email { 
         [email protected] 
   } 
   notification_email_from [email protected]
   smtp_server 127.0.0.1 
   router_id LVS_DEVEL 
} 
vrrp_instanceVI_1 { 
    state BACKUP              
    interface eth0 
    virtual_router_id 51 
    priority 99     
    advert_int 1 
    authentication { 
        auth_type PASS 
        auth_pass 1q2w3e4r5t6y 
    } 
    virtual_ipaddress { 
        172.16.100.200  
    } 
} 
virtual_server172.16.100.200 80 { 
    delay_loop 6                   
    lb_algo wrr                   
    lb_kind DR                   
    persistence_timeout 60         
    protocol TCP                  
    real_server 172.16.100.100 80 { 
        weight 3                
        TCP_CHECK { 
        connect_timeout 10        
        nb_get_retry 3 
        delay_before_retry 3 
        connect_port 80 
        } 
    } 
    real_server 172.16.100.101 80 { 
        weight 3 
        TCP_CHECK { 
        connect_timeout 10 
        nb_get_retry 3 
        delay_before_retry 3 
        connect_port 80 
        } 
     } 
}

访问验证:

任意关闭一台web服务器,服务都可以正常访问
任意关闭一台lvs,服务都可以正常访问

实现LVS的1 + 2 模式 & 2 + 2 模式

时间: 2024-08-01 10:46:06

实现LVS的1 + 2 模式 & 2 + 2 模式的相关文章

LVS 持久连接 PPC模式、PCC模式、防火墙标记

持久连接 PPC模式.PCC模式.防火墙标记 [LVS]我的是X86的系统 ipvsadm 功能类似Iptables 管理集群服务 增删改 管理RS增删改 查看 –L [磨刀不误砍柴工]看清楚,不要配置错了 两台RS都安装 192.168.3.123     192.168.3.87 网关都一样 route add default gw 192.168.3.77 [做不同端口持久连接测试用] yum -y install telnet-server yum -y install httpd se

LVS 服务器集群三种实现模式配置

LVS (Linux Virtual Server) Linux 服务器集群 LVS服务器集群中基于IP的负载均衡技术,有3种实现模式:VS/NET模式,VS/TUN模式(IP隧道模式),VS/DR模式(直接路由模式) 一,[VS/NET 模式] 1,配置Linux Director(前端负载调度器)IP,并打开IP数据包转发功能 1 2 3 ifconfig eth0 192.168.1.2 broacast 192.168.1.255 netmask 255.255.255.0 up ifc

基于CentOS实现LVS的nat模式和DR模式

关于LVS的错误总结见以下: nat模式:http://amelie.blog.51cto.com/12850951/1979172 DR模式:http://amelie.blog.51cto.com/12850951/1979437 来自于某国内名企架构师的说法--LVS学好了,网络这部分就通透了. 这里阿拉只列举实现方式.伙计们有不懂的可以call我.嘛,最起码一两个月阿拉混博客都挺勤. DR模式: 负载均衡器:172.17.7.17(eth0) real server1:172.17.6.

LVS负载均衡群集1(NAT模式)

一.群集技术概述 1.群集的类型1)负载均衡群集:主要的功能将来自客户机的访问请求分流给多台服务器,从而缓单台服务器的负载压力,例如京东淘宝的购物节的时候,当天的并发量是分常大的,单台服务器是无法承载的.2)高可用群集:高可用群集和hsrp原理基本一样,服务器有主从之分,实现故障切换,当一台服务器发生故障的时候,另一台服务器马上提供工作.3)高性能运算群集:这种群集主要用在"云计算"中,就是将多台服务器的硬件整合到一起,实现高性能运算能力. 2.负载均衡的分层结构第一层:负载调度器,是

LVS + Keepalived 高可用群集 【DR模式】

简介 Keepalived 起初是专门针对 LVS 设计的一款强大的辅助工具,主要用来提供故障切换和健康检查( Health Checking )功能--判断 LVS 负载调度器.节点服务器的可用性,及时隔离并替换为新的服务器,当故障主机恢复后就会重新加入群集中. Keepalived 采用 VRRP (虚拟路由冗余协议)热备份协议,和HSRP一样,只不过 HSRP 是思科私有的协议,VRRP 可以跑在很多设备上!VRRP 是以软件的方式实现 Linux 服务器的多机热备功能. VRRP 工作原

PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化)/约束类型/魔术方法小结

  前  言  OOP  学习了好久的PHP,今天来总结一下PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化). 1  PHP中的抽象类与抽象方法 1.什么是抽象方法?              没有方法体 {} 的方法,必须使用abstract 关键字修饰.这样的方,我们叫做抽象方法.                    abstract function say(); //    抽象方法 2.什么是抽象类?        

2 结构型模式之 - 外观模式

外观模式的介绍:外观模式在开发运用中的频率非常高,尤其是现阶段各种第三方SDK充斥在我们的周边,而这些SDK很大概率会使用外观模式,通过一个外观类使得整个系统的接口只有一个统一的高层接口,这样就能够降低用户使用的复杂度,也对用户屏蔽了很多实现细节,当然 ,在我们的开发过程中,外观模式也是我们封装API的常用手段,例如网络模块,ImageLoader模块等.可能你已经在开发中运用过无数次外观模式,只是没有理论层面上认识它,本章我们就从理论与实践相结合的方式来理解外观模式 外观模式的定义: 要求一个

Java设计模式—工厂方法模式&amp;抽象工厂模式

工厂方法模式与抽象工厂模式都是设计模式中重要而且常见的模式.       工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 通用类图如下: 在工厂方法模式中,抽象产品类Product负责定义产品的共性,实现对事物最抽象的定义:Creator为抽象创建 类,也就是抽象工厂,具体如何创建产品类是由具体的实现工厂ConcreteCreator完成的. 工厂方法模式的扩展方式有很多种,下边是工厂方法模式一个比较实用的源代码: 抽象产品类: pub

第19章 行为型模式—中介者模式

1. 中介者模式(Mediator Pattern)的定义 (1)定义:用一个中介对象来封装一系统对象交互.中介者使得各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互.       ①中介者模式主要用来将同事类之间网状结构变为星状结构,使同事类之间的关系变的清晰一些. ②所有对象只跟中介者对象进行通信,相互之间不再有联系,这样也能够集中控制这些对象的交互关系. (2)中介者模式的结构和说明 ①Mediator: 中介者接口.在里面定义各个同事之间交互需要的方法,可以