负载均衡NGINX+redis实现SESSION共享

Posted 猿人课堂

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了负载均衡NGINX+redis实现SESSION共享相关的知识,希望对你有一定的参考价值。

网上的例子,没搜索到JAVA的,看到C#什么的,感觉挺奇怪的,就正好自己借助别人的思路用JAVA实现

   SESSION共享实现的方法,我选择了COOKIE,当然其他方法比如说,中间服务器,或者制定一个SESSION规则,将哪个SEESION分配到哪个服务器。选择COOKIE实现,最主要是方便,同时也有我现在做的是ERP系统,对于并发没有太多要求。

   nginx的负载均衡,去官网http://nginx.org/  下载,现在对于很多开源JAR包或者工具下载,建议去官网,因为有最新的文档和介绍,比国内网盘存的东西,认识更加清晰

   负载均衡最基本的设置,在nginx.conf里面设置,我sheng'l


[plain] view plain copy




  1. upstream mytomcats {    

  2.   

  3.           server 127.0.0.1:8080;    

  4.   

  5.           server 127.0.0.1:8081;    

  6.   

  7.           server 127.0.0.1:8082;    

  8.     }    

[plain] view plain copy




  1.   server {  

  2.         listen       8088;  

  3.         server_name  localhost;shengl  

[plain] view plain copy




  1. <span style="white-space:pre;"> </span>    ...........  

  2.     }  


   这是没有设置会话固定,设置了的话,SESSION的测试很难测试了。


   Redis是Key,Value的数据库,当成一个数据库就好了,主要是速度快。并且容易装和使用

   JAVA代码实现的核心就是判断是否已经有COOKIE的SESSIONID值,没有COOKIE中的值就SET进去,讲的很很粗糙,具体测试代码如下,测一下就很明白了。

   info.java

[java] view plain copy




  1. package htd;  

  2.   

  3. import java.io.IOException;  

  4. import java.util.Set;  

  5.   

  6. import javax.servlet.ServletException;  

  7. import javax.servlet.http.Cookie;  

  8. import javax.servlet.http.HttpServlet;  

  9. import javax.servlet.http.HttpServletRequest;  

  10. import javax.servlet.http.HttpServletResponse;  

  11.   

  12. import redis.clients.jedis.Jedis;  

  13.   

  14. /** 

  15.  * Servlet implementation class hzm 

  16.  */  

  17. public class info extends HttpServlet {  

  18.     private static final long serialVersionUID = 1L;  

  19.   

  20.     /** 

  21.      * Default constructor.  

  22.      */  

  23.     public info() {  

  24.         // TODO Auto-generated constructor stub  

  25.     }  

  26.   

  27.     /** 

  28.      * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 

  29.      */  

  30.     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  

  31.         // TODO Auto-generated method stub  

  32.         Jedis jedis = new Jedis("localhost");  

  33.         String sessionId=null;  

  34.         //判断COOKIE是否存了SessionId  

  35.         Cookie[] cookeArray=request.getCookies();  

  36.         for(Cookie cookie:cookeArray){  

  37.             if(cookie.getName().equals("sessionId")){  

  38.                 System.out.println("找到了"+sessionId);  

  39.                 sessionId=cookie.getValue();  

  40.             }  

  41.         }  

  42.         if(sessionId==null){  

  43.             System.out.println("找不到");  

  44.             sessionId=request.getSession().getId();  

  45.         }  

  46.         Set<String> test=jedis.zrange(sessionId, 03);  

  47.         response.getWriter().write("{data:"+test.toString()+",seesionId:"+sessionId+"}");  

  48.         response.getWriter().write("{place:"+request.getRealPath("\\")+"}");  

  49.           

  50.         jedis.close();  

  51.     }  

  52.   

  53.     /** 

  54.      * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 

  55.      */  

  56.     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  

  57.         // TODO Auto-generated method stub  

  58.         doGet(request, response);  

  59.     }  

  60.   

  61. }  

   login.java


  

[java] view plain copy




  1. package htd;  

  2.   

  3. import java.io.IOException;  

  4. import java.util.Set;  

  5.   

  6. import javax.servlet.ServletException;  

  7. import javax.servlet.http.Cookie;  

  8. import javax.servlet.http.HttpServlet;  

  9. import javax.servlet.http.HttpServletRequest;  

  10. import javax.servlet.http.HttpServletResponse;  

  11.   

  12. import redis.clients.jedis.Jedis;  

  13.   

  14. /** 

  15.  * Servlet implementation class login 

  16.  */  

  17. public class login extends HttpServlet {  

  18.     private static final long serialVersionUID = 1L;  

  19.          

  20.     /** 

  21.      * @see HttpServlet#HttpServlet() 

  22.      */  

  23.     public login() {  

  24.         super();  

  25.         // TODO Auto-generated constructor stub  

  26.     }  

  27.   

  28.     /** 

  29.      * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 

  30.      */  

  31.     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  

  32.         // TODO Auto-generated method stub  

  33.           

  34.         String sessionId=null;  

  35.         //判断COOKIE是否存了SessionId  

  36.         Cookie[] cookeArray=request.getCookies();  

  37.         for(Cookie cookie:cookeArray){  

  38.             if(cookie.getName().equals("sessionId")){  

  39.                 sessionId=cookie.getValue();  

  40.             }  

  41.         }  

  42.         if(sessionId==null){  

  43.             sessionId=request.getSession().getId();  

  44.             Cookie cookie = new Cookie("sessionId",sessionId);  

  45.             cookie.setPath("/");  

  46.             response.addCookie(cookie);  

  47.         }  

  48.         Jedis jedis = new Jedis("localhost");  

  49.         Set<String> test=jedis.zrange(sessionId, 03);  

  50.         if(test==null||test.isEmpty()){  

  51.             System.out.println("set一次=============");  

  52.             String userName = request.getParameter("userName");  

  53.             String password = request.getParameter("password");  

  54.             String value = request.getParameter("value");  

  55.             jedis.zadd(sessionId, 1,userName);  

  56.             jedis.zadd(sessionId, 2,password);  

  57.             jedis.zadd(sessionId, 3,value);  

  58.             test=jedis.zrange(sessionId, 03);  

  59.         }  

  60.           

  61.         response.getWriter().write(test.toString()+"sessionID:"+sessionId);;  

  62.         response.getWriter().write("{place:"+request.getRealPath("\\")+"}");  

  63.         jedis.expire(sessionId,600);  

  64.         jedis.close();  

  65.             

  66.     }  

  67.   

  68.     /** 

  69.      * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 

  70.      */  

  71.     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  

  72.         // TODO Auto-generated method stub  

  73.         doGet(request, response);  

  74.     }  

  75.   

  76. }  

     web.xml配置SERVLET


      

[plain] view plain copy




  1. <!DOCTYPE web-app PUBLIC  

  2.  "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"  

  3.  "http://java.sun.com/dtd/web-app_2_3.dtd" >  

  4.   

  5. <web-app>  

  6.   <display-name>Archetype Created Web Application</display-name>  

  7.   <servlet>  

  8.     <servlet-name>info</servlet-name>  

  9.     <display-name>info</display-name>  

  10.     <description></description>  

  11.     <servlet-class>htd.info</servlet-class>  

  12.   </servlet>  

  13.   <servlet>  

  14.     <servlet-name>login</servlet-name>  

  15.     <display-name>login</display-name>  

  16.     <description></description>  

  17.     <servlet-class>htd.login</servlet-class>  

  18.   </servlet>  

  19.   <servlet-mapping>  

  20.     <servlet-name>info</servlet-name>  

  21.     <url-pattern>/info</url-pattern>  

  22.   </servlet-mapping>  

  23.   <servlet-mapping>  

  24.     <servlet-name>login</servlet-name>  

  25.     <url-pattern>/login</url-pattern>  

  26.   </servlet-mapping>  

  27.   

  28. </web-app>  



      index.jsp


[html] view plain copy




  1. <%@ page language="java" contentType="text/html; charset=ISO-8859-1"  

  2.     pageEncoding="ISO-8859-1"%>  

  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  

  4. <html>  

  5. <head>  

  6. <script src="/htd/resources/jquery-3.1.1.min.js"></script>  

  7. <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">  

  8. <title>Insert title here</title>  

  9. </head>  

  10. <script>  

  11. function getCookie(name)  

  12. {  

  13.     var arr,reg=new RegExp("(^| )"+name+"=([^;]*)(;|$)");  

  14.     if(arr=document.cookie.match(reg))  

  15.     return unescape(arr[2]);  

  16.     else  

  17.     return null;  

  18. }  

  19. function getHt(){  

  20.     $.ajax({   

  21.         type: "GET",  

  22.         url: "/htd/info",  

  23.         success: function(data){  

  24.         $("#t1").text("t1=="+data);  

  25.     }  

  26.     });  

  27. }  

  28. getHt();  

  29.     function submit(){  

  30.         $.ajax({  

  31.             type: "GET",  

  32.             url: "/htd/login",  

  33.             data: {userName:$('#userName').val(),  

  34.                 password:$('#password').val(),  

  35.                 value:$('#value').val()},  

  36.             success: function(data){  

  37.                  $("#t2").text("t2=="+data);  

  38.                  getHt();  

  39.             }  

  40.         });  

  41.     }  

  42.       

  43. </script>  

  44. <body>  

  45.       

  46.     <input id="userName" name="userName" id="userName" type="text">userId</input>  

  47.     <input id="password" name="password" id="password" type="text">password</input>  

  48.     <input id="value" name="value" id="value" type="text">value</input>  

  49.     <input id="but1" type="button" value="sub" onclick="javascript:submit();"/>  

  50.     <p id="t1"></p>  

  51.     <p id="t2"></p>  

  52. </body>  

  53. </html>  

       前台测试结果


      

文章来源于网络

以上是关于负载均衡NGINX+redis实现SESSION共享的主要内容,如果未能解决你的问题,请参考以下文章

nginx+tomcat+redis负载均衡,实现session共享

springboot+spring session+redis+nginx实现session共享和负载均衡

转 tomcat+nginx+redis实现均衡负载session共享

负载均衡NGINX+redis实现SESSION共享

nginx+apache+redis实现负载均衡动静分离session共享

转载tomcat+nginx+redis实现均衡负载session共享