当前位置: 首页 > 编程日记 > 正文

HAProxy基础

HAProxy

HAProxy是法国开发者Willy Tarreau 开发的一个开源然教案,是一款具备高并发、高性能的TCP和HTTP负载均衡器,支持基于cookie的持久性,自动故障切换,支持正则表达式及web状态统计。

HAProxy功能

HAProxy是TCP/HTTP反向代理服务器,尤其适合于高可用性高并发环境
可以针对HTTP请求添加cookie,进行路由后端服务器。
可平衡负载至后端服务器,并支持持久连接
支持基于cookie进行调度
支持所有主服务器故障切换至别用服务器
支持专用端口实现监控服务
支持不影响现有连接情况下停止接受新连接请求
可以在双线给添加,修改或删除http报文首部
支持基于partten实现连接请求的访问控制
通过特定的uri为授权用户提供详细的状态信息

HAProxy的安装

yum安装

直接使用yum进行安装

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

编译安装HAProxy

1.解压源码包

[root@localhost ~]# tar xf haproxy-1.8.20.tar.gz 

2.编译模块

[root@localhost haproxy-1.8.20]# make  ARCH=x86_64 TARGET=linux2628 USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 USE_SYSTEMD=1  USE_CPU_AFFINITY=1  PREFIX=/usr/local/haproxy

3.复制模块到指定目录

[root@localhost haproxy-1.8.20]# make install PREFIX=/usr/local/haproxy

4.将二进制程序复制到相二进制程序目录

[root@localhost haproxy-1.8.20]# cp haproxy /usr/sbin/

5.为编译安装的HAProxy创建启动脚本

[root@localhost haproxy-1.8.20]# vim /lib/systemd/system/haproxy.service
[Unit]
Description=HAProxyLoad Balancer
After=syslog.targetnetwork.target[Service]
ExecStartPre=/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -c -q
ExecStart=/usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /usr/local/haproxy/run/haproxy.pid
ExecReload=/bin/kill -USR2 $MAINPID[Install]
WantedBy=multi-user.target

6.创建配置文件目录,生成配置文件

[root@localhost haproxy-1.8.20]# mkdir /etc/haproxy
[root@localhost haproxy-1.8.20]# vim /etc/haproxy/haproxy.cfg
global
maxconn 100000
chroot /usr/local/haproxy
#stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin
uid 99
gid 99
daemon
nbproc 4
cpu-map 1 0
cpu-map 2 1
cpu-map 3 2
cpu-map 4 3
pidfile /usr/local/haproxy/run/haproxy.pid
log 127.0.0.1 local3 infodefaults
option http-keep-alive
option  forwardfor
maxconn 100000
mode http
timeout connect 300000ms
timeout client  300000ms
timeout server  300000mslisten statsmode httpbind 0.0.0.0:9999stats enablelog globalstats uri     /haproxy-statusstats auth    haadmin:q1w2e3r4yslisten  web_portbind 0.0.0.0:80mode httplog globalserver web1  127.0.0.1:8080  check inter 3000 fall 2 rise 5

7.为pid文件创建一个目录

[root@localhost ~]# mkdir /usr/local/haproxy/run

8.启动服务

[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl start haproxy

haproxy简单使用

使用frontend/backend配置服务器

1.修改配置文件

[root@localhost ~]# vim /etc/haproxy/haproxy.cfg 
frontend webbind 172.20.27.20:80    #监听地址和端口use_backend web_host    
backend web_hostserver web1 172.20.27.31:80     #定义后端的服务器server web2 172.20.27.32:80

2.重启服务

[root@localhost ~]# systemctl restart haproxy

3.测试访问

[root@localhost ~]# curl 172.20.27.20
server 1
[root@localhost ~]# curl 172.20.27.20
server 2

使用listen来配置服务器

1.修改配置文件

[root@localhost ~]# vim /etc/haproxy/haproxy.cfg 
listen webbind 172.20.27.21:80        #定义监听的地址和端口server web1 172.20.27.31:80     #定义后端服务器server web2 172.20.27.32:80

2.重启服务器

[root@localhost ~]# systemctl restart haproxy

3.测试

[root@localhost ~]# curl 172.20.27.21
server 1
[root@localhost ~]# curl 172.20.27.21
server 2

HAProxy组成

HAProxy有2个配置段组成,global全局配置段,proxies代理配置段

global配置参数:

1.chroot

用来锁定用户的目录,用来限制被人拿到haporxy账号时登录后跳转到其他目录,此项为安全选项。
示例:

chroot /usr/local/haproxy   #将其限制在/usr/local/haproxy目录下

2.maxconn

单个进程城的最大连接数
示例:

maxconn 100000      #每个haproxy进程的最大并发连接数,有些时候设置65535

3.stats socket

示例

#stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin    #haproxy运行时的socket文件,在本机操作时使用

4.user, group, uid, gid

工作进程的uid,gid,user,group默认为99,nobody用户,也可以对其进行修改
示例:
创建haproxy用户

[root@localhost ~]# useradd -s /sbin/nologin haproxy
[root@localhost ~]# id haproxy
uid=1001(haproxy) gid=1001(haproxy) groups=1001(haproxy)

修改配置文件

[root@localhost ~]# vim /etc/haproxy/haproxy.cfg 
uid 1001
gid 1001

查看进程用户

[root@localhost ~]# ps -ef | grep haproxy
root      20178      1  0 20:41 ?        00:00:00 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -sf 20182
haproxy   20309  20178  0 21:15 ?        00:00:00 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -sf 20182

5.nbprox和cpu-map

nbproc为开启haproxy多线程,最好开启和cpu核心相同的进程数,1.8以上功能
cpu-map为cpu的亲缘性绑定,将进程绑定在固定的cpu核心上。
示例:
配置4个进程,并绑定cpu

daemon
nbproc 4        #启动4个进程
cpu-map 1 0     #第一个进程绑定在0号cpu核心上
cpu-map 2 1     #cpu的核心是从0开始计数
cpu-map 3 2
cpu-map 4 3

重启服务

[root@localhost ~]# systemctl reload haproxy
[root@localhost ~]# ps -ef | grep haproxy
root      20178      1  0 20:41 ?        00:00:00 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -sf 20309
haproxy   20417  20178  0 21:26 ?        00:00:00 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -sf 20309
haproxy   20418  20178  0 21:26 ?        00:00:00 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -sf 20309
haproxy   20419  20178  0 21:26 ?        00:00:00 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -sf 20309
haproxy   20420  20178  0 21:26 ?        00:00:00 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -sf 20309

6.ngthread

指定每个haproxy进程开启的线程数,默认一个进程只有一个线程,1.8版本支持
示例:

nbthread 1

重读配置文件

[root@localhost ~]# systemctl reload haproxy

7.log

将日志发送到某个地址来进行收集
示例:
修改日志配置文件

[root@localhost ~]# vim /etc/rsyslog.conf 
$UDPServerRun 514
local3.*                                                /var/log/haproxy.log            #此处改为和配置文件相同的格式

重启服务

[root@localhost ~]# systemctl restart rsyslog
[root@localhost ~]# systemctl restart haproxy

8.spread-checks

当后台有多台服务器时,对其错开进行tcp探测,防止同一时间tcp连接过大,官方给定值2-5

spread-checks 5

9.deamon

以守护进程运行

daemon

10.pidfile

指定pid文件路径
配置文件中pid路径和启动脚本中的pid路径必须相同

[root@localhost run]# vim /etc/haproxy/haproxy.cfg 
pidfile /usr/local/haproxy/run/haproxy.pid
[root@localhost run]# vim /lib/systemd/system/haproxy.service 
ExecStart=/usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /usr/local/haproxy/run/haproxy.pid

11.maxsslconn

SSL每个haproxy进程ssl最大连接数

12.maxconnrate

每个进程每秒最大连接数


proxies配置

defaults [name]

默认配置项,针对以下的frontend、backend和lsiten生效,可以多个name

option redispatch
#当serverID对应的服务器挂掉后,强制定向到其他健康的服务器(建议配置)
option abortonclose
#当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接(建议配置)
option forwardfor
#将客户端地址透传到后端服务器(建议配置)
option http-keep-alive
#开启会话保持机制(建议开启)
mode tcp|http
#工作在哪种模式下,默认工作在tcp模式
timeout connect 60s 
#转发客户端请求到后端server的最长链接时长。
#用户的请求发送到后端服务器60s后没有相应就报错,这是在建立tcp连接之前
timeout server 600s
#转发客户端请求到后端服务端的超时时长。
#用户的请求已经被转发到后端服务器,但后端服务器600s内没有给HAProxy返回数据就告诉用户服务器挂了,此数值需要设置的长一点,要留给后端服务器足够的时间去做各种操作,这是在已经建立起tcp连接之后。
timeout client 600s
#与客户端的最长空闲时间。
#当用户访问HAProxy后,在之后的600s内再次访问就无需再次建立tcp连接
timeout http-keep-alive 120s
#session会话保持超时时间,范围内会转发到后端服务器。
#表示用户在120s内发起的请求会转发给后端同一台服务器,超过120s就重新调度
timeoutcheck 5s
#对后端服务器的检测超时时长。
#haproxy对后端服务器发起检测如果5秒内没有数据返回,表示第一次检测失败

以上为默认配置选项,当默认配置选项和frontend/backend或listen中定义的有冲突时,以frontend/backend或listen中定义的为主
示例:
defaults配置段

defaults
option redispatch
option abortonclose
option http-keep-alive
option  forwardfor
maxconn 100000
mode http
timeout connect 300000ms
timeout client  300000ms
timeout server  300000ms

定义前端server和后端服务器组

frontend/backend

frontend [name]:前端servername,类似于Nginx的一个虚拟主机 server。
backend [name]:后端服务器组,等于nginx的upstream
示例:
配置一个负载均衡

frontend webbind 192.168.27.21:80use_backend web_server
backend web_serverserver 192.168.27.31:80server 192.168.27.32:80

测试

[root@localhost ~]# curl 192.168.27.21
server 1
[root@localhost ~]# curl 192.168.27.21
server 2

以上的配置方法也可以使用listen来实现更加便捷

listen

listen [name]:将frontend和backend合并在一起配置

listen webbind 192.168.27.21:80server web1 192.168.27.31:80server web2 192.168.27.32:80

测试

[root@localhost ~]# curl 192.168.27.21
server 1
[root@localhost ~]# curl 192.168.27.21
server 2

后端服务器的状态监测相关配置

可以在后端的服务器定义后使用check然后更上各种选项参数
相关的选项参数

addr IP 
#可以指定健康状态监测IP
port NUM
#指定健康状态检测端口
inter NUM
#指定健康状态监测间隔的时间,默认为2000ms
fall NUM
#后端服务器失效的检查次数,默认为3。当3次监测都失败时服务器将从后端列表中摘去,请求将不再调度到此服务器
rise NUM
#后端服务器从下线到恢复上线的检查次数,默认为2。当对已经下线的服务器进行2次检测都正常时,haproxy将再次将用户的请求调度到此服务器上
weight
#权重,默认为1,最大256,0表示不参与负载均衡
backup
#将后端服务器标注为备份状态,当为备份状态时,HAProxy不会请求调度到此服务器,只有当之前的所有服务器都挂了的时候才会调度过来
disabled
#将后端的服务器标记为不可用
redirect prefix http://www.mylinuxops.com
#将请求临时重定向至其他url,只适用于http模式
maxconn NUM
#设定当前后端server的最大并发连接数(一般不设置,或设置1000-2000左右)
backlog NUM
#当server的连接数达到上线后的后援队列长度(一般不设置)

示例:
配置HAProxy做健康状态检测

listen webbind 192.168.27.21:80server web1 192.168.27.31:80 check inter 3s fall 3 rise 5server web2 192.168.27.32:80 check inter 3s fall 3 rise 5  

测试

[root@localhost ~]# curl 192.168.27.21
server 1
[root@localhost ~]# curl 192.168.27.21
server 2

当server1挂了之后,等待一段时间再次检测

[root@localhost ~]# curl 192.168.27.21
server 2
[root@localhost ~]# curl 192.168.27.21
server 2

当server1再次启动以后,等待一段时间再次检测

[root@localhost ~]# curl 192.168.27.21
server 1
[root@localhost ~]# curl 192.168.27.21
server 2

示例:
检测后端端口,有些时候后端服务器是nginx,而nginx上又有跑了PHP应用,此时就会用来检查后端的9000端口,避免php挂了,还在向后端转发请求的情况

listen webbind 192.168.27.21:80server web1 192.168.27.31:80 port 9000 check inter 3s fall 3 rise 5server web2 192.168.27.32:80 port 9000 check inter 3s fall 3 rise 5

示例:
设定权重,server1为2,server2为1

listen webbind 192.168.27.21:80server web1 192.168.27.31:80 weight 2 check inter 3s fall 3 rise 5 server web2 192.168.27.32:80 weight 1 check inter 3s fall 3 rise 5 

测试

[root@localhost ~]# curl 192.168.27.21
server 1
[root@localhost ~]# curl 192.168.27.21
server 1
[root@localhost ~]# curl 192.168.27.21
server 2

示例:
将server1设置为备用,此时请求将不再发送给server1

listen webmode tcpbind 192.168.27.21:80server web1 192.168.27.31:80 weight 2  check  inter 3s fall 3 rise 5 backupserver web2 192.168.27.32:80 weight 1  check  inter 3s fall 3 rise 5

测试
请求只发给server2

[root@localhost ~]# curl 192.168.27.21
server 2
[root@localhost ~]# curl 192.168.27.21
server 2
[root@localhost ~]# curl 192.168.27.21
server 2

当server2挂了之后,backup的启用。

[root@localhost ~]# curl 192.168.27.21
server 1
[root@localhost ~]# curl 192.168.27.21
server 1
[root@localhost ~]# curl 192.168.27.21
server 1

示例:
将server2标记为disabled

listen webmode tcpbind 192.168.27.21:80server web1 192.168.27.31:80 weight 2  check  inter 3s fall 3 rise 5server web2 192.168.27.32:80 weight 1  check  inter 3s fall 3 rise 5 disabled

测试

[root@localhost ~]# curl 192.168.27.21
server 1
[root@localhost ~]# curl 192.168.27.21
server 1
#请求只发给server 1

示例:
将请求临时重定向至其他URL

listen webmode httpbind 192.168.27.21:80redirect prefix http://www.mylinuxops.com/
#       server web1 192.168.27.31:80 weight 2  check  inter 3s fall 3 rise 5
#       server web2 192.168.27.32:80 weight 1  check  inter 3s fall 3 rise 5 disabled

测试

[root@localhost ~]# curl -L 192.168.27.21
www.mylinuxops.com

使用haproxy做4层负载,区分80和443的配置方法

# http入口
listen web_httpmode httpbind 192.168.27.21:80server web1 192.168.27.31:80 weight 2  check  inter 3s fall 3 rise 5server web2 192.168.27.32:80 weight 1  check  inter 3s fall 3 rise 5
# https入口
listen web_httpsmode tcpbind 192.168.27.21:443server web1 192.168.27.31:443 weight 2 check inter 3s fall 3 rise 5server web2 192.168.27.31:443 weight 1 check inter 3s fall 3 rise 5

重启后查看监听端口

[root@localhost ~]# systemctl restart haproxy
[root@localhost ~]# ss -tnl | grep 192.168.27.21
LISTEN     0      128    192.168.27.21:80                       *:*                  
LISTEN     0      128    192.168.27.21:443                      *:*       

转载于:https://blog.51cto.com/11886307/2405071

相关文章:

不试过你怎么知道?开博第一篇(本人菜鸟也,高手可以飘过)

我是菜鸟,一直都是,只不过以前比现在更菜而已。 注册博客园居然有5个月了。昨晚看过一位迷茫中的仁兄30岁了不知道干什么。。我跟他差不多。 既然他可以申请开博,为什么我就不试试看呢? 试试看又不会损失什么?被拒绝又…

java 类隔离_微服务架构中zuul的两种隔离机制实验

ZuulException REJECTED_SEMAPHORE_EXECUTION 是一个最近在性能测试中经常遇到的异常。查询资料发现是因为zuul默认每个路由直接用信号量做隔离,并且默认值是100,也就是当一个路由请求的信号量高于100那么就拒绝服务了,返回500。信号量隔离既…

技术网站/博客网址收藏

1、W3CHtmlDom标准 http://www.w3school.com.cn/htmldom/dom_obj_window.asp2、JavaScirpt参考教程:http://www.iselong.com/online/ebooks/javascript/3、CSS手册http://www.w3school.com.cn/css/css_positioning_floating.asp4、Lucene查询语句http://tech.ddvip.…

TableStore: 海量结构化数据分层存储方案

2019独角兽企业重金招聘Python工程师标准>>> 前言 表格存储是阿里云自研分布式存储系统,可以用来存储海量结构化、半结构化的数据。表格存储支持高性能和容量型两种实例类型。高性能使用SSD的存储介质,针对读多写多的场景都有较好的访问延时。…

计算 webView 显示内容后实际高度

两种方法,方法1可以得到内容的实际高度,方法2得到了将内容显示完整后的 webView 的尺寸(包含 UIEdgeInsets) - (void)webViewDidFinishLoad:(UIWebView *)wb{//方法1CGFloat documentWidth [[wb stringByEvaluatingJavaScriptFro…

另一个.java文件调用_java - 如何调用另一个类“写文件”的方法? - SO中文参考 - www.soinside.com...

在我的Android应用程序,我想有一类处理所有“写入/读取到文本文件”的行动。所以,我根本就调用我的readUserFile.java文件我想的方法。但我的方法将不会在该文件中工作?创建一个文件在我的MainActivity工作正常,但不会在我的readU…

编译器实现(五)

1.自底向上的分析 最普通的自底向上算法称作LR(1)分析( LR(1)parsing) ( L表示由左向右处理输入,R表示生成了最右推导,而数字1则表示使用了先行的一个符号)。 1.1自底向上分析概览 自底向上的分析程序使用了显式栈来完成分析,这与非递归的自顶…

Python字符串的修改以及传参

前两天去面试web developer,面试官提出一个问题,用JavaScript或者Python实现字符串反转,我选择了Python,然后写出了代码(错误的): 1 #!/usr/bin/env python2 #-*-coding:utf-8-*-3 __author__ …

充血模式和贫血模式

贫血模型:是指领域对象里只有get和set方法,或者包含少量的CRUD方法,所有的业务逻辑都不包含在内而是放在Business Logic层。 优点是系统的层次结构清楚,各层之间单向依赖,Client->(Business Facade)->Busin…

java 方法里面定义接口_java – 当接口A在其方法签名中定义接口B时

…如何限制A的实现在方法签名中使用B的某个实现?用例这是一个Unit接口和两个实现它的枚举:public interface Unit { ... }public enum ForceUnit implements Unit { ... }public enum MassUnit implements Unit { ... }属性界面使用哪个:publ…

ANDROID_MARS学习笔记_S01_011ProgressBar

文档是这样来设置样式 <ProgressBarandroid:layout_width"wrap_content"android:layout_height"wrap_content"style"android:style/Widget.ProgressBar.Small"android:layout_marginRight"5dp" /> 1.xml <RelativeLayout xml…

怎样使phpnow1.5.6-1支持firebird

&#xff08;以下部分步骤可能不是必要&#xff0c;自己测试。&#xff09; 环境&#xff1a;windows&#xff0c;phpnow1.5.6-1 默认支持mysql&#xff0c;修改配置文件&#xff0c;使之支持firebird。 php.ini 的位置 &#xff1a; php-5.2.14-Win32\php-apache2handler.ini …

php 引入其他文件中的变量

在php的开发过程中&#xff0c;如果所有的代码都写在同一个文件中的话&#xff0c;那么文件中的代码数量是否太多了,一来不便维护&#xff0c;二来对于编辑器也是个负担include("class0.php");在php文件的首部引入即可;转载于:https://www.cnblogs.com/wrhbk/p/10985…

java struts技术_java技术框架之:struts

一&#xff1a;struts的优缺点优点&#xff1a;1、开源&#xff1a;2、利用Struts提供的taglib可以大大节约开发时间。3、维护扩展比较方便。通过一个配置文件&#xff0c;即可把握整个系统各部分之间的联系&#xff0c;这对于后期的维护有着莫大的好处。4、表现与逻辑分离5、表…

BZOJ 2780: [Spoj]8093 Sevenk Love Oimaster( 后缀数组 + 二分 + RMQ + 树状数组 )

全部串起来做SA, 在按字典序排序的后缀中, 包含每个询问串必定是1段连续的区间, 对每个询问串s二分RMQ求出包含s的区间. 然后就是求区间的不同的数的个数(经典问题), sort queries BIT 就行了.时间复杂度O(N log N). 速度垫底了QAQ 你们都会SAM。。。。----------------------…

centos7下Gitlab+Jenkins部署持续集成CI环境

1.基本环境 主机&#xff1a;win10&#xff0c;IP&#xff1a;192.168.0.111&#xff1b;部署机器centos7&#xff0c;IP&#xff1a;192.168.0.65&#xff1b;内存推荐到8G&#xff0c;实测需要6G以上&#xff0c;以免出现内存不够用而报错。 2.安装gitlab需要的组件 [rootloc…

VIM7.3添加中文帮助文档

安装中文帮助文档之前首先执行下列操作&#xff1a;在home目录下列新建文件夹 &#xff1a;.vim ------------------>.vim是一个隐藏文件&#xff0c;不要漏了 “.”.vim/plugin ---------->.vim目录下的plugin文件夹.vim/doc ------------->.vim目录下的doc文件夹.v…

安卓java代码标签_Android实现动态添加标签及其点击事件

在做Android开发的时候&#xff0c;会遇到动态添加标签让用户选择的功能&#xff0c;所以自己写了个例子&#xff0c;运行效果图如下。标签可以左右滑动进行选择&#xff0c;点击的时候&#xff0c;会弹出toast提示选择或者取消选择了哪个标签。通过动态添加TextView作为标签&a…

Windows 7 SDK Fails to Install with Return Code 5100 (GRMSDK_EN_DVD.iso)

来源&#xff1a;http://support.microsoft.com/kb/2717426/de 不对全文做翻译了&#xff0c;总结一下&#xff1a; 原因&#xff1a;电脑上已经安装了新版本的Visual C 2010 Redistributable运行库 解决办法&#xff1a;卸载Visual C 2010 Redistributable&#xff0c;然后再安…

Android动画效果translate、scale、alpha、rotate详解

动画类型Android的animation由四种类型组成XML中 alpha渐变透明度动画效果scale渐变尺寸伸缩动画效果translate画面转换位置移动动画效果rotate画面转移旋转动画效果JavaCode中 AlphaAnimation渐变透明度动画效果ScaleAnimation渐变尺寸伸缩动画效果TranslateAnimation画面转换…

对javscript中Object.defineProperty的理解

自己在使用vue的过程中经常会用到听到数据双向绑定这个词&#xff0c;而且我们还可以直接通过调用this.msg(this表示vue实例),来获取data上的数据&#xff0c;以前一直不太明白为什么可以这样获取&#xff0c;直到有一天我在论坛里看到了寻找海蓝96这位大佬写的文章,才明白其原…

java kafka 集群消费_kafka集群搭建和使用Java写kafka生产者消费者

转自&#xff1a;http://chengjianxiaoxue.iteye.com/blog/21904881 kafka集群搭建1.zookeeper集群 搭建在110&#xff0c; 111,1122.kafka使用3个节点110&#xff0c; 111,112修改配置文件config/server.propertiesbroker.id110host.name192.168.1.110log.dirs/usr/local/kafk…

Java之替换“\n”符号

开发平台&#xff1a;Android 4.1.2 在去除字符串中的换行符(\n)的时候&#xff0c;写成str.replace("\\n", "")才能正确执行。str.replace("\n","") &#xff0c;str.replaceAll("\\n","")&#xff0c;str.repla…

ThinkPHP项目笔记之登录,注册,安全退出篇

1.先说注册 a.准备好注册页面&#xff0c;register.html,当然一般有&#xff0c;姓名&#xff0c;邮箱&#xff0c;地址等常用的。 b."不要相信用户提交的一切数据",安全&#xff0c;安全是第一位的。所以要做判断&#xff0c;客户端要做基本判断&#xff0c;为了防止…

c语言第八次作业

1.选择法排序。输入一个正整数n(1<n<10)&#xff0c;再输入n个整数&#xff0c;将他们从大到小排序后输出。试写出相应程序。 #include<stdio.h>int main (void){int i,index,k,n,t;int a[10];printf("输入数据的个数n:");scanf("%d",&n);…

java线程池的工作原理_Java 线程池的介绍以及工作原理

在什么情况下使用线程池&#xff1f;1.单个任务处理的时间比较短2.将需处理的任务的数量大使用线程池的好处:1. 降低资源消耗&#xff1a;      通过重复利用已创建的线程降低线程创建和销毁造成的消耗。2. 提高响应速度&#xff1a;      当任务到达时&#xff0c…

.NET 程序设计实验 含记事本通讯录代码

实验一 .NET 程序设计基本流程 【实验内容】 一、控制台、Windows 应用程序、ASP.NET 程序开发流程 1、熟悉开发平台 2、分别开发控制台、Windows 应用程序、ASP.NET 程序下显示“Hello world&#xff01;”的应用程序&#xff0c; 掌握新建、基本输入输出、程序流程、程序调试…

复制构造函数(拷贝构造函数)

也许很多C的初学者都知道什么是构造函数&#xff0c;但是对复制构造函数&#xff08;copy constructor&#xff09;却还很陌生。对于我来说&#xff0c;在写代码的时候能用得上复制构造函数的机会并不多&#xff0c;不过这并不说明复制构造函数没什么用&#xff0c;其实复制构造…

VMware上实现LVS负载均衡(NAT)

本文LVS的实现方式採用NAT模式。关于NAT的拓扑图请參照我的上一篇文章。本文纯粹实验。NAT在生产环境中不推荐使用。原因是Load Balancereasy成为瓶颈&#xff01; 1.VMware9上安装CentOS-6.5-x86_64-minimal版 2.安装完毕后将其hostname设置为LVS-master hostname LVS-master …

java se13安装教程_在Linux发行版中安装Java 13/OpenJDK 13的方法

本文介绍在Linux发行版Ubuntu 18.04/16.04、Debian 10/9、CentOS 7/8、Fedora 31/30/29中安装Java 13/OpenJDK 13、Java SE Development Kit 13的方法。在Ubuntu 18.04/16.04、Debian 10/9、CentOS 7/8、Fedora 31/30/29中安装OpenJDK 13访问JDK 13版本页面以下载最新的版本&am…