拓扑图是这样的
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;
}
}