LVS类型的介绍,调度算法和不同类型的实现

LVS类型介绍,调度算法和不同类型的实现

LVS集群的组成与特点

Linux虚拟服务器(Linux Virtual Server,LVS),是一个由章文嵩开发的一款自由软件。利用LVS可以实现高可用的、可伸缩的Web、Mail、Cache和Media等网络服务,并在此基础上开发支持庞大用户数的、可伸缩的、高可用的电子商务应用。LVS自1998年发展到现在,已经变得比较成熟,目前广应用在各种网络服务和电子商务应用中。LVS具有很好的可伸缩性、可靠性和可管理性,通过LVS要实现的最终目标是:利用Liunx操作系统和LVS集群软件可以实现一个高可用、高性能、低成本的服务器应用集群。

LVS集群的组成

利用LVS架设的服务器集群系统由3个部分组成:最前端的负载均衡(这里用Load Balancer表示)中间是服务器组层(Server Array表示),底端是数据共享存储层(用Shared Storage表示)。在用户看来,整个LVS集群系统的所有内部应用结构都是透明的,最终用户只是在使用一个虚拟服务器提供的高性能服务。

LVS的各个组成部分进行详细介绍。

负载均衡层:位于整个集群系统的最前端,由一台或多台负载调度器(Director Server)组成,LVS核心模版IPVS就安装在Director Server上,而Director的主要作用类似于一个路由器,它含有为完成LVS功能所设定的路由表,通过这些路由表把用户的请求分发给服务器群组的应用服务器(Real Server)。同时在Director Server上还要安装对Real Server的监控模块Ldirectord,此模块用于监测各个Real Server服务的健康状况。在Real Server不可用时可以将其从LVS路由表剔除,在恢复时重新加入。

服务器群组层:由一组实际运行应用服务的机器组成,Real Server可以是Web服务器、Mail服务器、DNS服务器、视频服务器中的一个或多个,每个Real Server之间通过高速的LAN或分布在各地的WAN相连接,在实际的应用中,Director Server也可以同时兼任Real Server的角色。

共享存储层:是为了所有的Real Server提供共享存储空间和内容一致性的存储区域,一般由磁盘阵列设备组成,为了提供内容的一致性,一般可以通过NFS网络文件系统共享数据,但是NFS在繁忙的业务系统中,性能并不是很好,此时可采用集群文件系统,例如Red Hat

的GFS文件系统,Oracle提供的OCFS2文件系统等。

从整个LVS结构可以看出,Diredtor Server是整个LVS的核心,目前,用于Director Server的操作系统只有Linux和FreeBSD,Linux2.6内核内置了LVS的各个模块,不用任何设置就可以支持LVS功能。

对于Real Server,几乎所有的系统平台,如Linux、Windows、Solaris、AIX、BSD系统等都能很好的支持它。

LVS:

工作在用户空间的ipvsadm ,是一个命令行工具,用于管理集群服务

工作在内核空间的ipvs:工作在netfilter中 INPUT链上,根据ipvsadm编写的规则强行从INPUT链上将数据包转发到后续的real Server中

对应的IP:

Client IP: CIP

Director Virutal IP: VIP

Director IP: DIP

Real Server IP: RIP

LVS集群的特点:

1、IP负载均衡与负载调度算法

(1)IP负载均衡技术

负载均衡技术有很多实现方案,有基于DNS域名轮流解析的方法,有基于客户端调度访问的方法,有基于应用层系统负载的调度方法,还有基于IP地址的调度方法,在这些负载调度算法中,执行效率最高的IP负载均衡技术。

LVS的IP负载均衡技术是通过IPVS模块来实现的,IPVS是LVS集群系统的核心软件,它的主要作用是:安装在Director Server上,同时在Director Server上虚拟出一个IP地址,用户必须通过这个虚拟IP地址来服务器,这个虚拟IP一般称为LVS的VIP,即Virtual IP,访问的请求首先经过VIP到达负载调度器,然后由负载调度器从Real Server列表中选取一个服务器节点响应的请求。

在用户的请求到达负载调度器后,调度器如何将请求发送到提供服务的Real Server节点,而Real Server节点如何中返回数据给用户,是IPVS实现的重点技术,IPVS实现负载均衡的方式有以下几种,分别是NAT、DR 、TUN和FULLNAT,下面进行详细介绍。

NAT:即 Network Address Translation,也就是网络地址翻译技术实现虚拟服务器,当用户请求到达调度器时,调度器将请求的报文目标地址(即虚拟IP地址)改写成选定的Real Server地址,同时将报文的目标端口也改写成Real Server的相应端口,最后将报文请求发送到选定的Real Server。在服务器端得到数据后,Real Server将数据返回给用户时,需要再次经过负载调度器,将报文件的源地址和源端口改成虚拟IP地址和相应端口,然后把数据发送给用户,完成整个负载调度过程。

可以看出NAT方式下,用户的请求和响应报文件都必须经过Director Server地址重写,当用户请求越来越多时,调度器的处理能为将成为瓶颈。

NAT:

(1)RS和DIP应该使用私有地址,且RS的网关指向DIP

(2)请求和响应报文都要经由Director转发;在极高负载的场景中,Director可能成为系统瓶颈。

(3)支持端口映射

(4)RS可以使用任意的OS

(5)RS的RIP和Director的DIP必须在同一IP网络。

NAT实现模型如下:

DR:即 Director Routing,也就是用直接路由技术实现虚拟服务器,这种方式的连接调度与前两种一样,但它的报文转发方法又有不同,VS/DR通过改写请求报文件的目标MAC地址,将请求发送到Real Server,则Real Server将响应直接返回给客户,要求Director Server与Real Server必须是一块网卡连在同一个物理网段上。

DR:

(1)保保证前端路由器将目标IP为VIP的请求报文发送给director;

解决方法:

静态绑定

arpiptables

修改RS主机内核的参数(这样RS只能使用Linux操作系统)

(2)RS的RIP可以为私有地址;但也可以使用公网地址

(3)RS跟Director必须在同一个物理网络中:

(4)请求报文经由Director调度,但响应报文一定不能经由Director;

(5)不支持端口映射

(6)RS的网关不能指向DIP

DR的实现模型:

DR实现过程:

1.在客户端发送请求报文,源IP为CIP,目标IP为VIP,经过层层路由,最终到达本地路由,当报文到达路由器时,路由器查看目标IP为VIP,就开始在本地发送arp广播,来查询本地VIP的MAC地址。但是由于在同一物理网络中,Real Server和Director都一个VIP,所以为了实现LVS的负载均衡就必须保证前端路由器将目标IP为VIP的请求报文发送给director。实现方法有:

静态绑定:就是在前端路由上进行arp的MAC绑定,将Director上的VIP对应的MAC地址写到前端路由上的路由表上。

使用arptables:arptables的用法和iptables类似,就是编写对arp的限制规则。

修改RS主机的内核参数:

2.当数据报根据MAC地址到达Director调度器后,DR类型的LVS会修改请求报的目标MAC地址。源MAC地址为DIR网卡对应的MAC地址,目标MAC地址为Real Server上的RIP对应的MAC地址。

3.请求报文最终到达Real Server 上。在刚进入Real Server时经过数据报的拆解,发现数据包的IP地址为VIP,就会将数据报文交给VIP ,经过VIP和端口对应的套接字,找到对应的程序,最终将数据报交给应用程序。

关键的一步来了,realserver怎么将数据包回复给客户端?

1.当VIP和RIP,DIP位于同一网段中:

首先,在realserver上定义一条特殊路由,目标为VIP的数据包都从loopback口发出去,于是源地址还是为VIP,数据包的源和目的地址都没有变化。但是由于限制了arp的广播和应答方式,外界并不知道realserver上有VIP的存在,realserver也不知道VIP这个网段中的其它主机,所以数据包就卡在realserver这里了。但是由于VIP和RIP,DIP位于同一网络中,数据包可以从Realserver直接发往它们的网关,于是路由器接收到数据包后就直接路由转发给客户了。

2.当VIP和RIP,DIP不在同一网段中

首先,在realserver上定义一条特殊路由,目标为VIP的数据包都从loopback口发出去,于是源地址还是为VIP,数据包的源和目的地址都没有变化。但是由于限制了arp的广播和应答方式,外界并不知道realserver上有VIP的存在,realserver也不知道VIP这个网段中的其它主机,所以数据包就卡在realserver这里了。解决方法就是,在realserver上添加一条默认路由,不知道的包都发往上私网地址的网关,于是路由器接收到数据包后就直接路由转发给客户了,在这个拓扑图中,路由器链接交换机的接口要有2个地址,一个是私网的网关地址,一个是公网的网关地址。

TUN:即IP Tunneling,也就是通过IP隧道技术实现虚拟服务器,这种方式的连接调度和管理与VS/NAT

方式一样,只是报文转发方法不同,在VS/TUN方式中,调度器采用IP隧道技术,将用户请求转发到某个Real Server,而这个RealServer将直接响应用户的请求,不再经过请端调度度,此外,对Real Server的地域位置没有要求,可以和Director Server位于同一网段,也可以独立的一个网络中,因此,在TUN方式中,调度器将只处理用户的报文请求,从而使集群系统的吞吐量大大提高。

TUN:不修改请求报文的ip首部,而是通过在原有的ip首部(cip<-->vip)之外,再封装一个ip首部(dip<-->rip)

TUN:

集群节点可以跨越Internet;

RIP必须是公网地址;

director仅负责处理入站请求,响应报文则由realserver直接发往客户端;

realserver网关不能指向director;

只有支持隧道功能的OS才能用于realserver;

不支持端口映射;

实现模型:

FULLNAT:director通过同时修改请求报文的目标地址和源地址进行转发;

(1) VIP是公网地址;RIP和DIP是私网地址,二者无须在同一网络中;

(2) RS接收到的请求报文的源地址为DIP,因此要响应给DIP;

(3) 请求报文和响应报文都必须经由Director;

(4) 支持端口映射机制;

(5) RS可以使用任意OS;

FullNat实现模型:

(2)负载调度算法:

前面介绍过,负载调度器是根据各个服务器的负载情况,动态地选择一台RealServer响应用户请求,那么动态选择是如何实现的呢,其实就是通过这里说的负载调度算法,根据不同的网络服务需求和服务配置,IPVS实现了8种负载调度算法,这里细述常用的4种调度算法。

轮叫算法:(Round Robin) “轮叫”调度也叫1:1调度,调度器通过“轮叫”调度算法将外部用户请求按顺序号1:1地分配到集群中每个Real Server上,这种算法平均地对待每一台Real Server,而不管服务器上实际的负载状况和连接状态。

加权轮叫调度(Weighted Round Robin) “加权轮叫“调度算法根据Real Server的不同处理能力来调度访问请求,可以对每台Real Server设置不同的调度权值,对性能相对较好的Real Server可以设置较高的权值,而对能力较弱的Real Server,可以设置较低的权值,这样保证了处理能力强的服务器处理更多的访关问流量,充分合理地利用了服务器资源,同时,调度器还可以自动查询Real Server的负载情况,并动态地调整其权值。

最少连接调度(least Connection)“最少连接“调度算法动态将网络请求调度到已建立的连接数最少的服务器,如果集群系统的真实服务器具有相近的系统性能,采用“最少连接”调度算法可以较好地均衡负载。

活动连接数*256+inactive  谁小,挑谁。

加权最少连接(Weighted Least Connections) “加权最少连接调度“是”最少连接调度的超集,每个服务节点可以用相应的权值表示其处理能力,而系统管理员可以动态地设置相应的权值,默认值为1,加权最小连接调度在分配新连接请求时尽可能使服务节点的已建立连接数和其权值成正比。

活动连接数*256+inactive  /WEITH

Sh:source hashing(源地址散列)当一个客户端发送请求时,Director Serve会把请求发送到real server上进行处理,并且会生成一张哈希表(源地址),来记录此过程请求和应答的IP。当此客户端在此请求时,Director server利用此调度算法把请求交给上次处理该请求的reals erver

Dh:distination hashing (目标地址散列)

Sed;最短期望延迟  (active+1)*256/weight

nq: never queue

LBLC: 基于本地的最少连接

LBLCR: 基于本地的带复制功能的最少连接

默认方法:wlc

LVS集群的优缺点

LVS是一款自由软件,任何人都可以免费获取并使用它,而且Linux也是一个开源操作系统,这二者的组合大大节约了企业的应用成本,同时LVS具有高稳定性和可靠性,在高并发高吞叶量下,具有高负荷处理能力,当某个服务节点出现故障时,并不影响整个系统服务在正常运行,这些优点使LVS已经广泛在企业、教育行业以及很多知道名网站。 细心的讯都可能发现了,LVS具有上述优点的同时,还将存在一个致命的缺点,从上图可以清楚的看出,所有的用户请求都经过Director Server将任务分发到各个服务器节点,那么,当只有一Direcotr Server时,将会出现单点故障点,如果这个Director Server出现故障时,整个LVS系统将陷入瘫痪状态。

虽然Director Server仅完成用户请求的分发处理,负载并不是很大,但是对于一个健状的集群系统来说,单点故障是绝对不允许的,要避免这种单点故障,最实用、最简单的办法就是对Director Server进行高可以集群,最常见的方案就是为Director Server做一个双机热备:正常状态下主Director Server 工作,备用Director Server监控主Director Server的状态,当主Director Server出现异常或者故障时,备用Director Server马上接过主Director Server的工作,负责对用户请求进行分发处理,这样就避免了台Director Server的单点故障问题,保证了负载均衡端持续地提供服务。

ipvsadm的用法:

ipvsadm的用法很简单,类似于iptables的使用方法,在这简单的介绍一下:

管理集群服务

ipvsadm -A|E -t|u|f service-address [-s scheduler]

ipvsadm -D -t|u|f service-address

service-address:

tcp: -t ip:port

udp: -u ip:port

fwm: -f mark

-s scheculer:

默认为wlc

管理集群服务中的RS

ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]

ipvsadm -d -t|u|f service-address -r server-address

server-address:

ip[:port]

lvs-type:

-g: gateway, dr

-i: ipip, tun

-m: masquerade, nat

清空和查看:

ipvsadm -C

ipvsadm -L|l [options]

-n: numeric,基于数字格式显示地址和端口;

-c: connection,显示ipvs连接;

--stats:统计数据

--rate: 速率

--exact: 精确值

保存和重载:

ipvsadm -R

ipvsadm -S [-n]

置零计数器:

ipvsadm -Z [-t|u|f service-address]

LVS_NAT类型的实现:

实验环境:(本实验是基于对Web服务的负载均衡)

实验拓扑图:

搭建实验环境:

1.在CentOS6虚拟机上实现Director,其中VIP为eth0:172.16.99.1(桥接模式) ,DIP为eth1:192.168.20.1(自定义模式)。在Director安装ipvsadm命令工具。开启路由转发功能。

安装ipvsadm ]# yum install ipvsadm

查看内核是否支持LVS:

]# grep -i "IPVS" /boot/config-2.6.32-504.el6.x86_64

# IPVS transport protocol load balancing support

# IPVS scheduler

# IPVS application helper

开启路由转发:

1.通过修改配置文件;(永久有效)

vim /etc/sysctl.conf

net.ipv4.ip_forward = 1

2.临时配置:

echo “1” > /proc/sys/net/ipv4/ip_forward

2.在两台CentOS6虚拟机上安装web服务,充当Read Server。其中RS1的RIP1为eth0:192.168.20.2(自定义),Gateway为:192.168.20.1。RS2的RIP2为eth0:192.168.20.3(eth0),Gateway为:192.168.20.1。

RS1:

RS2:

在搭建完实验环境之后,就可以在Director上执行ipvsadm命令,添加ipvsadm规则,并在两个RS上开启Web服务,由于为了显示实验效果,在两个Web服务器上显示的页面内容是不相同的。

ipvsadm规则:

开启web服务,进行测试:

LVS_DR类型的实现:

lvs_dr类型的实现:VIP 和DIP,RIP在同一网段内

实验环境:

实验环境搭建:

在Real Server上的配置:

在配置VIP之前要保证前端路由器将目标IP为VIP的请求报文发送给director;

解决方法:

静态绑定

arpiptables

修改RS主机内核的参数(这样RS只能使用Linux操作系统)

在linux主机中,IP地址不属于网卡而是属于内核,就是说无论一个linux主机有多少个IP地址,它在接入的各个网络中都会公布它拥有的所有地址,这就给ARP广播的响应制造了困难,所以就需要修改内核参数来保证router发出ARP广播时,DR会响应RS不予响应,这里所说的内核参数分别为:

#arp_announce:定义arp通知级别;

0:默认级别,在各个网络中通告本机所含有的所有地址

1:尽量不在各个网络中通告本机中含有的不属于该网络的地址

2:不在各个网络中通告本机中含有的不属于该网络的地址

#arp_ignore:定义arp忽略arp请求或arp通告的级别;

0:(默认值): 回应任何网络接口上对任何本地IP地址的arp查询请求

1:只回答目标IP地址是来访网络接口本地地址的ARP查询请求

2:只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内

3:不回应该网络界面的arp请求,而只对设置的唯一和连接地址做出回应

4-7:保留未使用

8:不回应所有(本地地址)的arp查询

在real server配置VIP之前先进行内核参数的修改,保证real server 中的VIP不给予ARP响应,也不让其发送ARP请求广播。

在/proc/sysy/net/ipv4/conf目录下有以下几个目录:all  default  eth0  lo

在每个目录中都有:arp_ignore 和arp_announce这两个文件。更改相对应的值:(修改完之后自己的真实机可能无法访问realserver)

在real server上进行更改:更改之后lo上在配置VIP

    ~]# sysctl -w net.ipv4.conf.eth0.arp_announce=2    
    ~]# sysctl -w net.ipv4.conf.eth0.arp_ignore=1
    ~]# sysctl -w net.ipv4.conf.all.arp_announce=2
    ~]# sysctl -w net.ipv4.conf.all.arp_ignore=1

配置VIP:

ifconfig lo:0 172.16.99.20/32 broadcast 172.16.99.20 up

route add -host 172.16.99.20 dev lo:0

在Director上进行设置:

VIP:

    [[email protected] ~]# ifconfig eth0:0 172.16.99.20/32 broadcast 172.16.99.20 up    
    [[email protected] ~]# route add -host 172.16.99.20 dev eth0:0

配置好实验环境之后,在Director上添加ipvsadm规则,在两台RS上开启Web服务进行测试:

        ipvsadm -A -t 172.16.99.20:80 -s rr    
        ipvsadm -a -t 172.16.99.20:80 -r 172.16.99.2 -g
        ipvsadm -a -t 172.16.99.20:80 -r 172.16.99.3 -g

LVS_DR 的实现:VIP和DIP,RIP不在同一个网段内:

实验环境:

实验环境介绍:

在此实验中使用了一台转发主机,充当路由。各个网段的设置如上图,其中黑色尖头表示客户端的请求报文的流向,而绿色尖头是响应客户端请求的流向。

每台RS中都要配置VIP地址,在lo中定义的VIP地址处封装报文之后,再由RIP上的网卡接口出去,其中RIP的网关必须指向转发主机的eth1上的IP。

实验总共准备了5台虚拟机,其中客户端Client是测试端,CIP的网关指向转发主机的eth2上的IP。

实验配置:

1.转发主机/转发路由的网络配置和路由:

开启路由转发功能:

echo 1 /proc/sys/net/ipv4/ip_forward

2.两台web服务器RS上的配置:

在RS1上的配置:

a.配置RIP为172.16.99.3,其中网关指向172.16.0.1。

b.配置web服务器:为了实验结果加以区别,网页内容不一样。

网页内容为:

c.配置VIP:

编写一脚本实现web服务器的VIP相关的设置:

    #!/bin/bash    
    echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce
    echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
    echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
    echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
    echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
    echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
    sleep 3
    ifconfig lo:0 192.168.0.100 netmask 255.255.255.255  broadcast 192.168.0.100 up
    route add -host 192.168.0.100 dev lo:0

在RS2上配置:

a.配置RIP2:172.16.99.4网关为172.16.0.1

b.网页内容:

c.配置VIP:

1.Director上配置:

配置VIP:

编写ipvsadm规则:

    # ipvsadm -A -t 192.168.0.100:80 -s wlc    
    #ipvsadm -a -t 192.168.0.100:80 -r 172.16.99.3 -g -w 2
    #ipvsadm -a -t 192.168.0.100:80 -r 172.16.99.4 -g -w 4

4、测试:

在192.168.1.200上进行测试:

时间: 2024-07-30 10:15:43

LVS类型的介绍,调度算法和不同类型的实现的相关文章

MySQL 常用字段类型,介绍及其建表使用方法经验分享

由于工作的公司没有专业的DBA又经常需要建立各种各种的表来满足自己的业务逻辑,所以经常查看MySQL 手册或者谷歌查看相关资料,所以本人就根据我的工作经验和相关资料来介绍一下MySQL各种字段类型及其使用.(由于本人还算是菜鸟哪里写的不对请多多指正,有兴趣的可以探讨一下) MySQL字段类型 int型包括(tinyint, smallint, mediumint, int, bigint) tinyint是1个字节表达范围就是2的8次方(-128-128) 或者(0-255) 很多人不明白为什么

Android EventBus的简单使用基本的使用步骤就是如下4步,点击此链接查看例子及介绍。 定义事件类型: `public class MyEvent {}` 定义事件处理方法: `public

基本的使用步骤就是如下4步,点击此链接查看例子及介绍. 定义事件类型: `public class MyEvent {}` 定义事件处理方法: `public void onEventMainThread` 注册订阅者: `EventBus.getDefault().register(this)` 发送事件: `EventBus.getDefault().post(new MyEvent())` 一.实现 **EventBus**使用方法很简单,但用一个东西,如果不了解它的实现用起来心里总是没底

介绍几款 Python 类型检查工具

微软在 Github 上开源了一个 Python 静态类型检查工具:pyright ,引起了社区内的多方关注. 微软在开源项目上的参与力度是越来越大了,不说收购 Github 这种大的战略野心,只说它家开源的 VS Code 编辑器,在猿界已经割粉无数,连我们 Python 圈的红人 Kenneth Reitz (多个开源项目的作者,包括 requests.requests-html.responder等)都对它赞不绝口. 如今开源的 Pyright ,口碑还不错,那我们就来看看它有啥本事,顺便

【js实例】Array类型的9个数组方法,Date类型的41个日期方法,Function类型

前文提要:[js实例]js中的5种基本数据类型和9种操作符 Array类型的9个数组方法 Array中有9个数组方法: 1.检测数组 2.转换方法 3.栈方法 4.队列方法 5.冲排序方法6.操作方法 7.位置方法 8.迭代方法 9.归并方法 在实例中介绍,实例如下 /* Array类型 js数组中的每一项可以用来保存任何类型的数据:js数组的大小是可以动态调整的 */ var colors = ["red", "blue", "green"];

匹夫细说C#:可以为null的值类型,详解可空值类型

首先祝大家中秋佳节快乐~ 0x00 前言 众所周知的一点是C#语言是一种强调类型的语言,而C#作为Unity3D中的游戏脚本主流语言,在我们的开发工作中能够驾驭好它的这个特点便十分重要.事实上,怎么强调C#的这个特点都不为过,因为它牵涉到编程的很多方面.一个很好的例子便是我们本文要介绍的内容——可空型,它是因何出现的,而它的出现又有什么意义呢?以及如何在Unity3D游戏的开发中使用它呢?那么就请各位读者朋友带着这些疑问,通过下面的文字来寻找这些问题的答案吧. 0x01 如果没有值? 一个了解一

关于C语言中的Complex(复数类型)和imaginary(虚数类型)

其实这里的复数complex就是数学里的复数,包含实部和虚部两个部分,比如:x=2.1+6i,下面进行详细介绍. C99 新增了复数类型(_Complex)和虚数类型(_Imaginary).简单来说,C99 提供了三种复数类型:float _Complex,double _Complex,和 long double _Complex.对于 float _Complex类型的变量来说,它包含两个 float类型的值,一个用于表示复数的实部(real part),另一个用于表示虚部(imagina

[转]c# 泛类型(泛型) 以及强类型与弱类型的 理解及优化

[泛型的概念](1)没有泛型的时候,所有的对象都是以object为基础,如果要使用时必须进行强制类型转换,如果对于值类型,则会导致不断拆箱装箱的过程,对系统消耗很大.(2)使用泛型时不需要通过object类进行装箱拆箱,使用的时候都会是确定的类型.(3)泛型的概念一开始是由集合引入,因为集合中的类型都是基于object类.可以在集合中使用泛型类.(4)泛型不仅仅用于集合,还可以用于委托.接口和方法.泛型的优点:高性能ArrayList list1 = new ArrayList();list1.

继承的基本概念: (1)Java不支持多继承,也就是说子类至多只能有一个父类。 (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法。 (3)子类中定义的成员变量和父类中定义的成员变量相同时,则父类中的成员变量不能被继承。 (4)子类中定义的成员方法,并且这个方法的名字返回类型,以及参数个数和类型与父类的某个成员方法完全相同,则父类的成员方法不能被继承。 分析以上程

继承的基本概念: (1)Java不支持多继承,也就是说子类至多只能有一个父类. (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法.(3)子类中定义的成员变量和父类中定义的成员变量相同时,则父类中的成员变量不能被继承.(4)子类中定义的成员方法,并且这个方法的名字返回类型,以及参数个数和类型与父类的某个成员方法完全相同,则父类的成员方法不能被继承. 分析以上程序示例,主要疑惑点是“子类继承父类的成员变量,父类对象是否会实例化?私有成员变量是否会被继承?被继承的成员变量

初步swift语言学习笔记2(可选类型?和隐式可选类型!)

作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/28904115 转载请注明出处 假设认为文章对你有所帮助.请通过留言或关注微信公众帐号fengsh998来支持我,谢谢. 可选类型.隐式可选类型 在swift中.可选类型其根源是一个枚举型.里面有None和Some两种类型.事实上所谓的nil就是Optional.None, 非nil就是Optional.Some, 然后会通过Some(T)包装(wrap)原始值,这