本篇以一个Nginx服务、两个Tomcat服务、一个Redis搭建一个负载均衡环境,由于就一台电脑暂以随机分配client请求策略开展,详细工作中推荐以IP地址来实现client请求的动态负载策略。省局IP段发过来的请求单独一个Tomcat应对,其余全部分局IP段发来的请求通过有另外一个单独的Tomcat应付。
素材1:一个Redis节点,用来存储Seesion(跨进程共享)及缓存静态常量。
素材2:两个同一时候执行的Tomcat服务,每一个上面执行着一个简单的小程序;
素材3:一个Nginx,通过随机分配的策略分流client发来的请求。
第一步:Redis环境搭建及測试数据准备
Windows环境下主要是找到相应的版本号,眼下官网是不支持Windows的。能够从微软维护的版本号中下载地址为:下载Redis,假设喜欢用可视化的查看工具能够下载RedisDesktopManager工具下载地址为:下载RedisDesktopManager。
由于配置Redis及RedisDesktopManager的使用比較简单,这个不花篇幅再细述。
第二步:准备一个小java程序公布到两个Tomcat上
同一台server(电脑)部署两套及以上的Tomcat的方法參见:同一台server(电脑)执行多个Tomcat的设置方法。本个演示样例程序不过只在Redis中存储了一个字符串变量。測试程序主要代码例如以下:
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request,response);
}
public String getValueByRedisKey(String keyName) {
//创建一个Jedis的连接
Jedis jedis = new Jedis("127.0.0.1", 6379);
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
//从redis中取值
String result = jedis.get(keyName);
//执行redis命令
jedis.set(keyName, "I am a programmer at:"+df.format(new Date()));
//关闭连接
jedis.close();
return result;
}
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String valueInCache= getValueByRedisKey("keylu");
// 设置响应内容类型
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
String title = "Redis測试页面A";
String docType = "<!DOCTYPE html> \n";
out.println(docType +
"<html>\n" +
"<head><title>" + title + "</title></head>\n" +
"<body bgcolor=\"#f0f0f0\">\n" +
"<h1 align=\"center\">" + title + "</h1>\n" +
"<ul>\n" +
" <li><b>RedisItemKey: keylu</b>"
+ "\n" +
" <li><b>Value: </b>"
+ valueInCache + "\n" +
"</ul>\n" +
"</body></html>");
}
下一步的技术调研就是把session存储进Redis,希望下一篇总结会在下周末前处理完毕。
第三步:构建Nginx
对Nginx不太熟悉的能够參考例如以下两篇文章大体了解下:初识Nginx及Nginx反向代理配置。终于的执行效果例如以下:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYW5kZXJzbHU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="这里写图片描写叙述" title="">
Nginx的主要配置项为:
补充1:Nginx经常使用指令:
- D:\tools\nginx-1.3.2>tasklist /fi "imagename eq nginx.exe" 查看任务管理器内nginx.exe的执行信息
-”start nginx” start
- "nginx -s stop" quick exit
- "nginx -s quit" graceful quit
- "nginx -s reload" changing configuration, starting a new worker, quitting an
old worker gracefully
-"nginx -s reopen" reopening log files
补充2:Nginx负载均衡的几种类型
nginx中的upstream支持以下几种方式:轮询(默认,依照时间顺序对全部server一个一个的訪问,假设有server宕机,会自己主动剔除)、weight(server的方位几率和weight成正比,这个能够在server配置不均的时候进行配置)、ip_hash(对每一个请求的ip进行hash计算,并依照一定的规则分配相应的server)、fair(依照每台server的响应时间(rt)来分配请求,rt晓得优先分配)、url_hash(依照訪问url的hash值来分配请求)
1、轮询(默认)
每一个请求按时间顺序逐一分配到不同的后端server。假设后端serverdown掉,能自己主动剔除。
upstream backserver {
server 192.168.0.14;
server 192.168.0.15;
}
2、weight
指定轮询几率。weight和訪问比率成正比。用于后端server性能不均的情况。
比如:
upstream bakend {
server 192.168.159.10 weight=10;
server 192.168.159.11 weight=10;
}
3、ip_hash
每一个请求按訪问ip的hash结果分配。这样每一个訪客固定訪问一个后端server。能够解决session的问题。
比如:
upstream resinserver{
ip_hash;
server 192.168.159.10:8080;
server 192.168.159.11:8080;
}