lvs--小白博客
lvs
一、负载均衡LVS基本介绍
LVS是 Linux Virtual Server 的简称,也就是Linux虚拟服务器。这是一个由章文嵩博士发起的一个开源项目,它的官方网站是 http://www.linuxvirtualserver.org 现在 LVS 已经是 Linux 内核标准的一部分。使用 LVS 可以达到的技术目标是:通过 LVS 达到的负载均衡技术和 Linux 操作系统实现一个高性能高可用的 Linux 服务器集群,它具有良好的可靠性、可扩展性和可操作性。从而以低廉的成本实现最优的性能。LVS 是一个实现负载均衡集群的开源软件项目,LVS架构从逻辑上可分为调度层、Server集群层和共享存储。
LVS:
1、抗负载能力强。抗负载能力强、性能高,能达到F5硬件的60%;对内存和cpu资源消耗比较低
2、工作在网络4层,通过vrrp协议转发(仅作分发之用),具体的流量由linux内核处理,因此没有流量的产生。
2、稳定性、可靠性好,自身有完美的热备方案;(如:LVS+Keepalived)
3、应用范围比较广,可以对所有应用做负载均衡;
4、不支持正则处理,不能做动静分离。
5、支持负载均衡算法:rr(轮循)、wrr(带权轮循)、lc(最小连接)、wlc(权重最小连接)
6、配置 复杂,对网络依赖比较大,稳定性很高。
Ngnix:
1、工作在网络的7层之上,可以针对http应用做一些分流的策略,比如针对域名、目录结构;
2、Nginx对网络的依赖比较小,理论上能ping通就就能进行负载功能;
3、Nginx安装和配置比较简单,测试起来比较方便;
4、也可以承担高的负载压力且稳定,一般能支撑超过1万次的并发;
5、对后端服务器的健康检查,只支持通过端口来检测,不支持通过url来检测。
6、Nginx对请求的异步处理可以帮助节点服务器减轻负载;
7、Nginx仅能支持http、https和Email协议,这样就在适用范围较小。
8、不支持Session的直接保持,但能通过ip_hash来解决。、对Big request header的支持不是很好,
9、支持负载均衡算法:Round-robin(轮循)、Weight-round-robin(带权轮循)、Ip-hash(Ip哈希)
10、Nginx还能做Web服务器即Cache功能。
HAProxy的特点是:
1、支持两种代理模式:TCP(四层)和HTTP(七层),支持虚拟主机;
2、能够补充Nginx的一些缺点比如Session的保持,Cookie的引导等工作
3、支持url检测后端的服务器出问题的检测会有很好的帮助。
4、更多的负载均衡策略比如:动态加权轮循(Dynamic Round Robin),加权源地址哈希(Weighted Source Hash),加权URL哈希和加权参数哈希(Weighted Parameter Hash)已经实现
5、单纯从效率上来讲HAProxy更会比Nginx有更出色的负载均衡速度。
6、HAProxy可以对Mysql进行负载均衡,对后端的DB节点进行检测和负载均衡。
9、支持负载均衡算法:Round-robin(轮循)、Weight-round-robin(带权轮循)、source(原地址保持)、RI(请求URL)、rdp-cookie(根据cookie)
10、不能做Web服务器即Cache。
二、LVS的组成
LVS 由2部分程序组成,包括 ipvs 和 ipvsadm。
1. ipvs(ip virtual server):一段代码工作在内核空间,叫ipvs,是真正生效实现调度的代码。
2. ipvsadm:另外一段是工作在用户空间,叫ipvsadm,负责为ipvs内核框架编写规则,定义谁是集群服务,而谁是后端真实的服务器(Real Server)
三、lvs的三种模式
VS/DR模式
①.客户端将请求发往前端的负载均衡器,请求报文源地址是CIP,目标地址为VIP。
②.负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将目标MAC改为了RIP的MAC地址,并将此包发送给RS。
③.RS发现请求报文中的目的MAC是自己,就会将次报文接收下来,处理完请求报文后,将响应报文通过lo接口送给eth0网卡直接发送给客户端。
注意:
需要设置lo接口的VIP不能响应本地网络内的arp请求。
总结:
1、通过在调度器 LB 上修改数据包的目的 MAC 地址实现转发。注意源地址仍然是 CIP,目的地址仍然是 VIP 地址。
2、请求的报文经过调度器,而 RS 响应处理后的报文无需经过调度器 LB,因此并发访问量大时使用效率很高(和 NAT 模式比)
3、因为 DR 模式是通过 MAC 地址改写机制实现转发,因此所有 RS 节点和调度器 LB 只能在一个局域网里面
4、RS 主机需要绑定 VIP 地址在 LO 接口(掩码32 位)上,并且需要配置 ARP 抑制。
5、RS 节点的默认网关不需要配置成 LB,而是直接配置为上级路由的网关,能让 RS 直接出网就可以。
6、由于 DR 模式的调度器仅做 MAC 地址的改写,所以调度器 LB 就不能改写目标端口,那么 RS 服务器就得使用和 VIP 相同的端口提供服务。
7、直接对外的业务比如WEB等,RS 的IP最好是使用公网IP。对外的服务,比如数据库等最好使用内网IP。
优点:
和TUN(隧道模式)一样,负载均衡器也只是分发请求,应答包通过单独的路由方法返回给客户端。与VS-TUN相比,VS-DR这种实现方式不需要隧道结构,因此可以使用大多数操作系统做为物理服务器。
DR模式的效率很高,但是配置稍微复杂一点,因此对于访问量不是特别大的公司可以用haproxy/nginx取代。日1000-2000W PV或者并发请求1万一下都可以考虑用haproxy/nginx。
缺点:
所有 RS 节点和调度器 LB 只能在一个局域网里面。
VS/TUN模式
①.客户端将请求发往前端的负载均衡器,请求报文源地址是CIP,目标地址为VIP。
②.负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将在客户端请求报文的首部再封装一层IP报文,将源地址改为DIP,目标地址改为RIP,并将此包发送给RS。
③.RS收到请求报文后,会首先拆开第一层封装,然后发现里面还有一层IP首部的目标地址是自己lo接口上的VIP,所以会处理次请求报文,并将响应报文通过lo接口送给eth0网卡直接发送给客户端。
注意:
需要设置lo接口的VIP不能在公网上出现。
总结:
1.TUNNEL 模式必须在所有的 realserver 机器上面绑定 VIP 的 IP 地址
2.TUNNEL 模式的 vip ------>realserver 的包通信通过 TUNNEL 模式,不管是内网和外网都能通信,所以不需要 lvs vip 跟 realserver 在同一个网段内
3.TUNNEL 模式 realserver 会把 packet 直接发给 client 不会给 lvs 了
4.TUNNEL 模式走的隧道模式,所以运维起来比较难,所以一般不用。
优点:
负载均衡器只负责将请求包分发给后端节点服务器,而RS将应答包直接发给用户。所以,减少了负载均衡器的大量数据流动,负载均衡器不再是系统的瓶颈,就能处理很巨大的请求量,这种方式,一台负载均衡器能够为很多RS进行分发。而且跑在公网上就能进行不同地域的分发。
缺点:
隧道模式的RS节点需要合法IP,这种方式需要所有的服务器支持”IP Tunneling”(IP Encapsulation)协议,服务器可能只局限在部分Linux系统上。
VS/NAT模式
①.客户端将请求发往前端的负载均衡器,请求报文源地址是CIP(客户端IP),后面统称为CIP),目标地址为VIP(负载均衡器前端地址,后面统称为VIP)。
②.负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将客户端请求报文的目标地址改为了后端服务器的RIP地址并将报文根据算法发送出去。
③.报文送到Real Server后,由于报文的目标地址是自己,所以会响应该请求,并将响应报文返还给LVS。
④.然后lvs将此报文的源地址修改为本机并发送给客户端。
注意:
在NAT模式中,Real Server的网关必须指向LVS,否则报文无法送达客户端
特点:
1、NAT 技术将请求的报文和响应的报文都需要通过 LB 进行地址改写,因此网站访问量比较大的时候 LB 负载均衡调度器有比较大的瓶颈,一般要求最多之能 10-20 台节点
2、只需要在 LB 上配置一个公网 IP 地址就可以了。
3、每台内部的 realserver 服务器的网关地址必须是调度器 LB 的内网地址。
4、NAT 模式支持对 IP 地址和端口进行转换。即用户请求的端口和真实服务器的端口可以不一致。
优点:
集群中的物理服务器可以使用任何支持TCP/IP操作系统,只有负载均衡器需要一个合法的IP地址。
缺点:
扩展性有限。当服务器节点(普通PC服务器)增长过多时,负载均衡器将成为整个系统的瓶颈,因为所有的请求包和应答包的流向都经过负载均衡器。当服务器节点过多时,大量的数据包都交汇在负载均衡器那,速度就会变慢!
七、LVS的八种调度算法
1. 轮叫调度 rr
这种算法是最简单的,就是按依次循环的方式将请求调度到不同的服务器上,该算法最大的特点就是简单。轮询算法假设所有的服务器处理请求的能力都是一样的,调度器会将所有的请求平均分配给每个真实服务器,不管后端 RS 配置和处理能力,非常均衡地分发下去。
2. 加权轮叫 wrr
这种算法比 rr 的算法多了一个权重的概念,可以给 RS 设置权重,权重越高,那么分发的请求数越多,权重的取值范围 0 – 100。主要是对rr算法的一种优化和补充, LVS 会考虑每台服务器的性能,并给每台服务器添加要给权值,如果服务器A的权值为1,服务器B的权值为2,则调度到服务器B的请求会是服务器A的2倍。权值越高的服务器,处理的请求越多。
3. 最少链接 lc
这个算法会根据后端 RS 的连接数来决定把请求分发给谁,比如 RS1 连接数比 RS2 连接数少,那么请求就优先发给 RS1
4. 加权最少链接 wlc
这个算法比 lc 多了一个权重的概念。
5. 基于局部性的最少连接调度算法 lblc
这个算法是请求数据包的目标 IP 地址的一种调度算法,该算法先根据请求的目标 IP 地址寻找最近的该目标 IP 地址所有使用的服务器,如果这台服务器依然可用,并且有能力处理该请求,调度器会尽量选择相同的服务器,否则会继续选择其它可行的服务器
6. 复杂的基于局部性最少的连接算法 lblcr
记录的不是要给目标 IP 与一台服务器之间的连接记录,它会维护一个目标 IP 到一组服务器之间的映射关系,防止单点服务器负载过高。
7. 目标地址散列调度算法 dh
该算法是根据目标 IP 地址通过散列函数将目标 IP 与服务器建立映射关系,出现服务器不可用或负载过高的情况下,发往该目标 IP 的请求会固定发给该服务器。
8. 源地址散列调度算法 sh
与目标地址散列调度算法类似,但它是根据源地址散列算法进行静态分配固定的服务器资源。

DR模式direct_server:</span>192.168.254.17<span style="color: #000000;"> real_server:</span>192.168.254.18<span style="color: #000000;">
real_server:</span>192.168.254.19 <span style="color: #008000;">#</span><span style="color: #008000;">vip为虚拟服务ip</span>
vip:192.168.254.250<span style="color: #000000;">
direct_server:
yum install ipvsadm老板
direct_server:
ipvsadm -C #清除配置信息<span style="color: #008000;">#</span><span style="color: #008000;">添加对外提供的服务ip</span>
ipvsadm -A -t 192.168.254.250:80 -s rr <span style="color: #008000;">#</span><span style="color: #008000;">-A为ADD -t为tcp -s rr为设置算法为轮叫算法</span> <span style="color: #008000;">#</span><span style="color: #008000;">添加2台real_server主机</span>
ipvsadm -a -t 192.168.254.250:80 -r 192.168.254.18:80 -g <span style="color: #008000;">#</span><span style="color: #008000;">-a为add -t为tcp -r为realserver -g为DR路由模式</span>
ipvsadm -a -t 192.168.254.250:80 -r 192.168.254.19:80 -g <span style="color: #008000;">#</span><span style="color: #008000;">-a为add -t为tcp -r为realserver -g为DR路由模式</span> <span style="color: #008000;">#</span><span style="color: #008000;">配置网卡的子网口为vip,ip地址为192.168.254.250</span>
ifconfig ens33:0 192.168.254.250 broadcast 192.168.254.250 netmask 255.255.255.255<span style="color: #000000;"> up </span><span style="color: #008000;">#</span><span style="color: #008000;">添加路由(访问192.168.254.250都走ens33:0这个网卡)</span>
route add -host 192.168.254.250<span style="color: #000000;"> dev ens33:0
员工1 | 员工2
real_server:
#在回环地址的子网口上配置服务ip(vip)
ifconfig lo:0 192.168.254.250 broadcast 192.168.254.250 netmask 255.255.255.255 up</span><span style="color: #008000;">#</span><span style="color: #008000;">添加路由</span>
route add -host 192.168.254.250<span style="color: #000000;"> dev lo:0 echo </span><span style="color: #800000;">"</span><span style="color: #800000;">1</span><span style="color: #800000;">"</span>>/proc/sys/net/ipv4/conf/lo/<span style="color: #000000;">arp_ignore
echo </span><span style="color: #800000;">"</span><span style="color: #800000;">2</span><span style="color: #800000;">"</span>>/proc/sys/net/ipv4/conf/lo/<span style="color: #000000;">arp_announce
echo </span><span style="color: #800000;">"</span><span style="color: #800000;">1</span><span style="color: #800000;">"</span>>/proc/sys/net/ipv4/conf/all/<span style="color: #000000;">arp_ignore
echo </span><span style="color: #800000;">"</span><span style="color: #800000;">2</span><span style="color: #800000;">"</span>>/proc/sys/net/ipv4/conf/all/<span style="color: #000000;">arp_announce echo </span><span style="color: #800000;">"</span><span style="color: #800000;">0</span><span style="color: #800000;">"</span>>/proc/sys/net/ipv4/conf/lo/<span style="color: #000000;">arp_ignore
echo </span><span style="color: #800000;">"</span><span style="color: #800000;">0</span><span style="color: #800000;">"</span>>/proc/sys/net/ipv4/conf/lo/<span style="color: #000000;">arp_announce
echo </span><span style="color: #800000;">"</span><span style="color: #800000;">0</span><span style="color: #800000;">"</span>>/proc/sys/net/ipv4/conf/all/<span style="color: #000000;">arp_ignore
echo </span><span style="color: #800000;">"</span><span style="color: #800000;">0</span><span style="color: #800000;">"</span>>/proc/sys/net/ipv4/conf/all/<span style="color: #000000;">arp_announce arp_ignore:定义接收到ARP请求时的响应级别
0:默认,只用本地配置的有响应地址都给予响应
</span>1<span style="color: #000000;">:仅仅在目标IP是本地地址,并且是配置在请求进来的接口上的时候才给予响应
(仅在请求的目标地址配置请求到达的接口上的时候,才给予响应) arp_announce:定义将自己的地址向外通告时的级别
0:默认,表示使用配置在任何接口的任何地址向外通告
</span>1<span style="color: #000000;">:尽量仅向目标网络通告与其网络匹配的地址
</span>2<span style="color: #000000;">:仅向与本地接口上地址匹配的网络进行通告
tun隧道模式
lvs-server
ifconfig tunl0 192.168.254.250 broadcast 192.168.254.250 netmask 255.255.255.0 up
route add -host 192.168.254.250 dev tunl0
ipvsadm -A -t 192.168.254.250:80 -s rr
ipvsadm -a -t 192.168.254.250:80 -r 192.168.254.18 -i
ipvsadm -a -t 192.168.254.250:80 -r 192.168.254.19 -ireal server
ifconfig tunl0 </span>192.168.254.250 netmask 255.255.255.255 broadcast 192.168.254.250<span style="color: #000000;"> up
route add </span>-host 192.168.254.250<span style="color: #000000;"> dev tunl0
echo </span><span style="color: #800000;">"</span><span style="color: #800000;">1</span><span style="color: #800000;">"</span> >/proc/sys/net/ipv4/conf/tunl0/<span style="color: #000000;">arp_ignore
echo </span><span style="color: #800000;">"</span><span style="color: #800000;">2</span><span style="color: #800000;">"</span> >/proc/sys/net/ipv4/conf/tunl0/<span style="color: #000000;">arp_announce
echo </span><span style="color: #800000;">"</span><span style="color: #800000;">1</span><span style="color: #800000;">"</span> >/proc/sys/net/ipv4/conf/all/<span style="color: #000000;">arp_ignore
echo </span><span style="color: #800000;">"</span><span style="color: #800000;">2</span><span style="color: #800000;">"</span> >/proc/sys/net/ipv4/conf/all/<span style="color: #000000;">arp_announce
echo </span><span style="color: #800000;">"</span><span style="color: #800000;">0</span><span style="color: #800000;">"</span> >/proc/sys/net/ipv4/conf/tunl0/<span style="color: #000000;">rp_filter
echo </span><span style="color: #800000;">"</span><span style="color: #800000;">0</span><span style="color: #800000;">"</span> > /proc/sys/net/ipv4/conf/all/<span style="color: #000000;">rp_filter 0:不开启源地址校验。
</span>1<span style="color: #000000;">:开启严格的反向路径校验。对每个进来的数据包,校验其反向路径是否是最佳路径。
如果反向路径不是最佳路径,则直接丢弃该数据包。
</span>2<span style="color: #000000;">:开启松散的反向路径校验。对每个进来的数据包,校验其源地址是否可达,即反向路径是否能通(通过任意网口),
如果反向路径不同,则直接丢弃该数据包。
keepalived:
yum install keepalived
vim /etc/keepalived/keepalived.conf! Configuration File for keepalived
#全局配置
global_defs {
notification_email {
#收件人地址
}
#邮件服务器
}
VRRP配置DS1
vrrp_instance VI_1 {
state MASTER #角色类型MASTER|BACKUP
interface ens33 #网卡名称
virtual_router_id 51 #虚拟路由id(需要与BACKUP一致)
priority 100 #优先级
advert_int 1 #没1秒检查一次
#nopreempt #非抢占模式
authentication {
auth_type PASS #认证类型 主备之间必须一样
auth_pass 1111 #认证密码 主备之间必须一样
}
virtual_ipaddress {
192.168.254.250 #虚拟ip(vip)
}
}#LVS配置
virtual_server 192.168.254.250 80 {
delay_loop 3 #健康检查时间间隔
lb_algo rr #负载均衡调度算法
lb_kind DR #负载均衡转发规则
protocol TCP #协议
real_server 192.168.254.18 80 { #要监控的real_server的ip和端口号
weight 1 #权重
TCP_CHECK { #基于tcp协议的检查
connect_timeout 3 #连接时间超时
retry 3 #重连次数
delay_before_retry 3 #重连间隔时间
}
}real_server </span>192.168.254.19 80<span style="color: #000000;"> {
weight </span>1<span style="color: #000000;">
TCP_CHECK {
connect_timeout </span>3<span style="color: #000000;">
retry </span>3<span style="color: #000000;">
delay_before_retry </span>3<span style="color: #000000;">
}
}
}
192.168.254.17 DS1
192.168.254.20 DS2
ifconfig ens33:0 192.168.254.250 broadcast 192.168.254.250 netmask 255.255.255.255 up
route add -host 192.168.254.250 dev ens33:0192.168.254.18 RS1
ifconfig lo:0 192.168.254.250 broadcast 192.168.254.250 netmask 255.255.255.255 up #loopback
route add -host 192.168.254.250 dev lo:0echo </span><span style="color: #800000;">"</span><span style="color: #800000;">1</span><span style="color: #800000;">"</span>>/proc/sys/net/ipv4/conf/lo/<span style="color: #000000;">arp_ignore
echo </span><span style="color: #800000;">"</span><span style="color: #800000;">2</span><span style="color: #800000;">"</span>>/proc/sys/net/ipv4/conf/lo/<span style="color: #000000;">arp_announce
echo </span><span style="color: #800000;">"</span><span style="color: #800000;">1</span><span style="color: #800000;">"</span>>/proc/sys/net/ipv4/conf/all/<span style="color: #000000;">arp_ignore
echo </span><span style="color: #800000;">"</span><span style="color: #800000;">2</span><span style="color: #800000;">"</span>>/proc/sys/net/ipv4/conf/all/<span style="color: #000000;">arp_announce
192.168.254.19 RS2
ifconfig lo:0 192.168.254.250 broadcast 192.168.254.250 netmask 255.255.255.255 up #loopback
route add -host 192.168.254.250 dev lo:0echo </span><span style="color: #800000;">"</span><span style="color: #800000;">1</span><span style="color: #800000;">"</span>>/proc/sys/net/ipv4/conf/lo/<span style="color: #000000;">arp_ignore
echo </span><span style="color: #800000;">"</span><span style="color: #800000;">2</span><span style="color: #800000;">"</span>>/proc/sys/net/ipv4/conf/lo/<span style="color: #000000;">arp_announce
echo </span><span style="color: #800000;">"</span><span style="color: #800000;">1</span><span style="color: #800000;">"</span>>/proc/sys/net/ipv4/conf/all/<span style="color: #000000;">arp_ignore
echo </span><span style="color: #800000;">"</span><span style="color: #800000;">2</span><span style="color: #800000;">"</span>>/proc/sys/net/ipv4/conf/all/<span style="color: #000000;">arp_announce
tail -f /var/log/messages

<p class="postfoot">
posted on <span id="post-date">2018-11-30 23:08</span> <a href="https://www.cnblogs.com/fengzi7314/">疯子7314</a> 阅读(<span id="post_view_count">668</span>) 评论(<span id="post_comment_count">0</span>) <a href="https://i.cnblogs.com/EditPosts.aspx?postid=10047130" rel="nofollow">编辑</a> <a href="#" onclick="AddToWz(10047130);return false;">收藏</a>
</p>
</div>
lvs--小白博客的更多相关文章
- python之socket模块详解--小白博客
主要是创建一个服务端,在创建服务端的时候,主要步骤如下:创建socket对象socket——>绑定IP地址和端口bind——>监听listen——>得到请求accept——>接 ...
- MariaDB第四章:视图,事务,索引,外键--小白博客
视图 对于复杂的查询,在多个地方被使用,如果需求发生了改变,需要更改sql语句,则需要在多个地方进行修改,维护起来非常麻烦 假如因为某种需求,需要将user拆房表usera和表userb,该两张表的结 ...
- MariaDB第三章:数据库设计与备份--小白博客
数据库设计 1.第一范式(确保每列保持原子性) 第一范式是最基本的范式.如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式. 2.第二范式(确保表中的每列都和主键相关) 第 ...
- Mariadb第一章:介绍及安装--小白博客
mariadb(第一章) 数据库介绍 1.什么是数据库? 简单的说,数据库就是一个存放数据的仓库,这个仓库是按照一定的数据结构(数据结构是指数据的组织形式或数据之间的联系)来组织,存储的,我们可以 ...
- Ansible第二章:palybook介绍与使用--小白博客
playbook tasks variables templates handlers roles yaml介绍 yaml是一个可读性高的用来表达资料序列的格式,yaml参考了其他多种语言,包括:xm ...
- Ansible第一章:基础认识--小白博客
ansible Ansible:Ansible的核心程序Host Lnventory:记录了每一个由Ansible管理的主机信息,信息包括ssh端口,root帐号密码,ip地址等等.可以通过file来 ...
- python第九章:面向对象--小白博客
面向对象介绍 一.面向对象和面向过程 面向过程:核心过程二字,过程即解决问题的步骤,就是先干什么后干什么 基于该思想写程序就好比在这是一条流水线,是一种机械式的思维方式 优点:复杂的过程流程化 缺点 ...
- python之yagmail模块--小白博客
yagmail 实现发邮件 yagmail 可以简单的来实现自动发邮件功能. 安装 pip install yagmail 简单例子 import yagmail #链接邮箱服务器 yag = yag ...
- python之configparser模块详解--小白博客
configparse模块 一.ConfigParser简介 ConfigParser 是用来读取配置文件的包.配置文件的格式如下:中括号“[ ]”内包含的为section.section 下面为类似 ...
- python第八章:多任务--小白博客
多线程threading 多线程特点: #线程的并发是利用cpu上下文的切换(是并发,不是并行)#多线程执行的顺序是无序的#多线程共享全局变量#线程是继承在进程里的,没有进程就没有线程#GIL全局解释 ...
随机推荐
- 痞子衡嵌入式:ARM Cortex-M文件那些事(5)- 映射文件(.map)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家讲的是嵌入式开发里的map文件. 第四节课里,痞子衡给大家介绍了第一种output文件-relocatable文件,本文继续给大家讲projec ...
- MyBatis动态代理执行原理
前言 大家使用MyBatis都知道,不管是单独使用还是和Spring集成,我们都是使用接口定义的方式声明数据库的增删改查方法.那么我们只声明一个接口,MyBatis是如何帮我们来实现SQL呢,对吗,我 ...
- c# 扩展方法初见理解
个人理解扩展方法是对某些类在不改变源码的基础上添加其他的方法.扩展方法必须是在非泛型的静态类里定义,且第一个参数是要使用this 指定需要扩展的类型. class Program { static v ...
- Linux,在不使用U盘的情况下使用wubi.exe程序在Win7上安装ubuntu-14.04.3版系统
本文介绍如何在不使用U盘的情况下使用wubi.exe程序在Win7上安装ubuntu-14.04.3版系统. 花了一天的时间终于安装上了Ubuntu14.04,过程坎坷,是血泪史,开始报“cannot ...
- Oracle day01 select where关键字
select关键字 作用:检索“列” 注意:1.select后面的列可以起别名(查询的显示结果) 1) 列名后面一个空格后添加别名(别名中不许有“空格”) 2) 列名后面一个空格后使用双引号添加别名 ...
- 学JAVA第九天,for循环算质数及for遍历数组的方法。
昨天终于收到了评论,老开心了!!! 算质数之前是我最怕的一件事,以前上学不好好学,之前学C#的时候也没好好研究, 直到今天老师逼我要用JAVA算质数,硬着头皮琢磨老半天才琢磨透,现在看来也挺简单的. ...
- CSS3 box-shadow 属性 紧跟在 -webkit-, -ms- 或 -moz-
浏览器支持 表格中的数字表示支持该属性的第一个浏览器版本号. 紧跟在 -webkit-, -ms- 或 -moz- 前的数字为支持该前缀属性的第一个浏览器版本号. 语法 box-shadow: h-s ...
- Dynamics CRM Web API中的and和or组合的正确方式!
关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复243或者20170111可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong. ...
- Android的WebView调试工具(无需Fan墙,可同时调试多个设备,永不过期)
缘起 前端开发离不开Chrome的开发者工具,尤其是调试Android WebView时.然而,如果使用chrome://Inspect的方法,国内的开发者会惊奇地发现“空白啊”!为此,我发布过这个离 ...
- 如何用git上传代码到github详细步骤
注册账户 这个小菜鸟带着心跳写的第一篇博客! 还请大家多多提点! 想使用github,第一步肯定是要注册github账号,有了账号就是直接登录啦 可以直接打开http://github.com页面注册 ...