Java工作笔记-Nginx配置IPHash(单点登录)

拓扑图是这样的

iphash实现原理:

记录ip地址,生成iphash值,用这个值去绑定一台服务器,以后这个client的请求都会访问到绑定到的服务器中,这里生成iphash一般是通过Nginx进行生成,然后绑定。

缺点,失去了负载均衡的意义,单点故障,当某个服务器宕机后,服务器上的iphash都会挂了。中小企业用得多,用户信息不敏感。

Nginx配置如下:

worker_processes  1;

events {
    worker_connections  1024;
}

http {
	
	upstream ipHashDemo{
		
		ip_hash;
		server 127.0.0.1:8081;
		server 127.0.0.1:8082;
	}
	
	server{
	
		listen 8888;
		server_name 127.0.0.1;
		location / {
		
			proxy_pass http://ipHashDemo;
		}
	}
}

这里有一个要注意的,上个的server_name里面的prox_pass。

ipHashDemo要和upstream ipHashDemo相对应。

程序运行截图如下,登录用户和获取,都是在IPHashServer1中,这也是ipHashDemo:

关键源码如下:

IPHashServer1中

Server1Controller.java

package cn.it1995.ipHash.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpSession;
import java.util.HashMap;
import java.util.Map;

@RestController
public class Server1Controller {

    @GetMapping("/login")
    public Object userLogin(@RequestParam("username") String username,
                            @RequestParam("password") String password,
                            HttpSession session){

        session.setAttribute("username", username);
        session.setAttribute("password", password);

        Map<String, Object> ret = new HashMap<>();
        ret.put("result", "登录成功");


        return ret;
    }

    @GetMapping("getUser")
    public Object getUser(HttpSession session){

        Object username = session.getAttribute("username");
        Object password = session.getAttribute("password");
        Map<String, Object> ret = new HashMap<>();
        ret.put("用户名", username);
        ret.put("密码", password);
        ret.put("当前服务器名称", "IPHashServer1");

        return ret;
    }
}

IPHashServer2中

Server2Controller.java

package cn.it1995.ipHash.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpSession;
import java.util.HashMap;
import java.util.Map;

@RestController
public class Server2Controller {

    @GetMapping("/login")
    public Object userLogin(@RequestParam("username") String username,
                            @RequestParam("password") String password,
                            HttpSession session){

        session.setAttribute("username", username);
        session.setAttribute("password", password);

        Map<String, Object> ret = new HashMap<>();
        ret.put("result", "登录成功");


        return ret;
    }

    @GetMapping("getUser")
    public Object getUser(HttpSession session){

        Object username = session.getAttribute("username");
        Object password = session.getAttribute("password");
        Map<String, Object> ret = new HashMap<>();
        ret.put("用户名", username);
        ret.put("密码", password);
        ret.put("当前服务器名称", "IPHashServer2");

        return ret;
    }
}

猜你喜欢

转载自blog.csdn.net/qq78442761/article/details/106878729