1、单体服务结构
单体服务不存在会话共享的问题
2、分布式架构
三种方案来解决会话共享的问题:
1、nginx ip-hash方式
nginx.conf配置
upstream ngixServers{
server localhost:8081;
server localhost:8082;
ip_hash;
}
server {
listen 8888;
server_name localhost;
location / {
proxy_pass http://ngixServers;
}
}
即一个ip只会请求到一个服务器上去
2、spring-session +redis方式
maven配置
4.0.0 org.springframework.boot spring-boot-starter-parent2.4.5 org.example miaoshaStu1.0-SNAPSHOT org.springframework.boot spring-boot-starterorg.springframework.boot spring-boot-starter-weborg.springframework.boot spring-boot-starter-data-redisorg.springframework.session spring-session-data-redis
@RestController
public class SpringSessionController {
@GetMapping("query")
@ResponseBody
public String query(HttpServletRequest request) {
HttpSession session = request.getSession();
session.setAttribute("hello","123123123");
System.out.println("----------sessionId-----------"+session.getId());
return String.valueOf(session.getAttribute("hello"));
}
}
application.yml:
#redis server: port: 8081 redis: host: localhost password: timeout: PT30M #spring-session session: store-type: redis timeout: PT30M
nginx.config配置:
upstream ngixServers{
server localhost:8081;
server localhost:8082;
}
server {
listen 8888;
server_name localhost;
location / {
proxy_pass http://ngixServers;
}
}
请求:http://localhost:8888/query
主要是两点:spring-session会让两个服务的sessionId保持一致(自定义httpSession),然后把相关参数设置在redis中以sessionId进行绑定
3、JWT
这种方案比较简单的,就是定义一个有意义的token,token中带了用户的非敏感信息,相关实现只有两个1、生成JWT 2、校验 JWT两步,实现比较简单
3、微服务架构
现在比较流行的有oauth2和cas两种解决方案,oauth2相关看后续帖子
两种解决方案的针对性不一样,oauth2主要是针对第三方系统的信任,cas主要是针对用户身份的认证,侧重点不一样,根据不同的业务场景去选择



