网站开发后期做什么,工业园区网站模版,夏邑县百城建设提质网站,济南成之运维网络科技有的人可能会觉得题目有点夸张#xff0c;其实不夸张#xff0c;题目没有使用任何修辞手法#xff01;认真读完本文#xff0c;你就知道gblfy说的是对的了#xff01; 文章目录一、背景二、分析思路三、实战1. 创建工程2. pom.xml3. redis配置4. 使用5. 项目打包6. 启动项…有的人可能会觉得题目有点夸张其实不夸张题目没有使用任何修辞手法认真读完本文你就知道gblfy说的是对的了
文章目录一、背景二、分析思路三、实战1. 创建工程2. pom.xml3. redis配置4. 使用5. 项目打包6. 启动项目的两个实例7. 浏览器验证8. redis变量查询9. 获取8080的服务二、Nginx加入2.0. nginx安装2.1. 修改配置文件2.2. 配置说明2.3. 上传项目jar到linux服务器2.3. 启动两个 Spring Boot 实例三、验证3.1. 启动Nginx3.2. 手动清除 Redis 上的数据3.3. 浏览器访问保存数据到session中3.4. 再访问 /get 请求3.5. 总结3.6. 本文源码地址一、背景
在传统的单服务架构中一般来说只有一个服务器那么不存在 Session 共享问题但是在分布式/集群项目中Session 共享则是一个必须面对的问题先看一个简单的架构图 在这样的架构中会出现一些单服务中不存在的问题例如客户端发起一个请求这个请求到达 Nginx 上之后被 Nginx 转发到 Tomcat A 上然后在 Tomcat A 上往 session 中保存了一份数据下次又来一个请求这个请求被转发到 Tomcat B 上此时再去 Session 中获取数据发现没有之前的数据。对于这一类问题的解决思路很简单就是将各个服务之间需要共享的数据保存到一个公共的地方主流方案就是 Redis
二、分析思路
当所有 Tomcat 需要往 Session 中写数据时都往 Redis 中写当所有 Tomcat 需要读数据时都从 Redis 中读。这样不同的服务就可以使用相同的 Session 数据了。
这样的方案可以由开发者手动实现即手动往 Redis 中存储数据手动从 Redis 中读取数据相当于使用一些 Redis 客户端工具来实现这样的功能毫无疑问手动实现工作量还是蛮大的。
一个简化的方案就是使用 Spring Session 来实现这一功能Spring Session 就是使用 Spring 中的代理过滤器将所有的 Session 操作拦截下来自动的将数据 同步到 Redis 中或者自动的从 Redis 中读取数据。
对于开发者来说所有关于 Session 同步的操作都是透明的开发者使用 Spring Session一旦配置完成后具体的用法就像使用一个普通的 Session 一样。
三、实战
1. 创建工程
首先 创建一个 Spring Boot 工程引入 Web、Spring Session 以及 Redis:
2. pom.xml
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-redis/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.session/groupIdartifactIdspring-session-data-redis/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-security/artifactId/dependency注意 这里我使用的 Spring Boot 版本是2.2.2.RELEASE 如果使用低版 2.1.4.RELEASE 的话可以不添加 Spring Security 依赖
3. redis配置
spring:redis:host: 192.168.43.122port: 6379password:database: 0这里的 Redis 我虽然配置了四行但是考虑到端口默认就是 6379 database 默认就是 0所以真正要配置的其实就是两行。
4. 使用
配置完成后 就可以使用 Spring Session 了其实就是使用普通的 HttpSession 其他的 Session 同步到 Redis 等操作框架已经自动帮你完成了
/*** author gblfy* Description https://www.gblfy.com* Date 2019/12/8 15:45*/
RestController
public class HelloController {Value(${server.port})Integer port;GetMapping(/set)public String set(HttpSession session) {session.setAttribute(user, gblfy);return String.valueOf(port);}GetMapping(/get)public String get(HttpSession session) {return session.getAttribute(user) : port;}
}考虑到一会 Spring Boot 将以集群的方式启动 为了获取每一个请求到底是哪一个 Spring Boot 提供的服务需要在每次请求时返回当前服务的端口号因此这里我注入了 server.port 。
5. 项目打包 6. 启动项目的两个实例
java -jar springboot2-session-share-0.0.1-SNAPSHOT.jar --server.port8080
java -jar springboot2-session-share-0.0.1-SNAPSHOT.jar --server.port80817. 浏览器验证
先访问 localhost:8080/set 向 8080 这个服务的 Session 中保存一个变量访问完成后数据就已经自动同步到 Redis 中 了
8. redis变量查询 9. 获取8080的服务
再调用 localhost:8081/get 接口就可以获取到 8080 服务的 session 中的数据 此时关于 session 共享的配置就已经全部完成了session 共享的效果我们已经看到了但是每次访问都是我自己手动切换服务实例因此接下来我们来引入 Nginx 实现服务实例自动切换。
二、Nginx加入
2.0. nginx安装
https://gblfy.blog.csdn.net/article/details/103447161
2.1. 修改配置文件
很简单进入 Nginx 的安装目录的 conf 目录下默认是在 /usr/local/nginx/conf编辑 nginx.conf 文件:
upstream gblfy.cn{server 127.0.0.1:8080 weight1;server 127.0.0.1:8081 weight2;}server {listen 80;server_name localhost;#charset koi8-r;#access_log logs/host.access.log main;location / {proxy_pass http://gblfy.cn;proxy_redirect default;#root html;#index index.html index.htm;}2.2. 配置说明
标签说明upstream表示配置上游服务器做负载用gblfy.cn表示服务器集群的名字这个可以随意取名字upstream里边配置的是一个个的单独服务相当于一个tomcatweight表示服务的权重意味者将有多少比例的请求从 Nginx 上转发到该服务上location 中的 proxy_pass表示请求转发的地址/表示拦截到所有的请求转发转发到刚刚配置好的服务集群中proxy_redirect表示设置当发生重定向请求时nginx 自动修正响应头数据默认是 Tomcat 返回重定向此时重定向的地址是 Tomcat 的地址我们需要将之修改使之成为 Nginx 的地址
2.3. 上传项目jar到linux服务器
配置完成后将本地的 Spring Boot 打包好的 jar 上传到 Linux 略
2.3. 启动两个 Spring Boot 实例
然后在 Linux 上分别启动两个 Spring Boot 实例
nohup java -jar springboot2-session-share-0.0.1-SNAPSHOT.jar --server.port8080
nohup java -jar springboot2-session-share-0.0.1-SNAPSHOT.jar --server.port8081 标签说明nohup表示当终端关闭时Spring Boot 不要停止运行表示让 Spring Boot 在后台启动
注意如果加入了spring-boot-starter-security依赖建议使用下面启动因为启动时会生成spring-boot-starter-security登录密码等会需要用。
java -jar springboot2-session-share-0.0.1-SNAPSHOT.jar --server.port8080
java -jar springboot2-session-share-0.0.1-SNAPSHOT.jar --server.port8081用户名默认:user
三、验证 预判Nginx 启动成功后我们首先手动清除 Redis 上的数据然后访问 192.168.66.128/set 表示向 session中保存数据这个请求首先会到达 Nginx 上再由 Nginx 转发给某一个 SpringBoot 实例 3.1. 启动Nginx
cd /usr/local/nginx/sbin/./nginx3.2. 手动清除 Redis 上的数据 3.3. 浏览器访问保存数据到session中 如上表示端口为 8081 的 SpringBoot 处理了这个 /set 请求
3.4. 再访问 /get 请求 可以看到 /get 请求是被端口为 8080 的服务所处理的
3.5. 总结
本文主要向大家介绍了 Spring Session 的使用另外也涉及到一些 Nginx 的使用 虽然本文较长但是实际上 Spring Session 的配置没啥。
我们写了一些代码也做了一些配置但是全都和 Spring Session 无关配置是配置 Redis代码就是普通的 HttpSession和 Spring Session 没有任何关系
唯一和 Spring Session 相关的可能就是我在一开始引入了 Spring Session 的依赖吧
如果大家没有在 SSM 架构中用过 Spring Session 可能不太好理解我们在 Spring Boot 中使用 Spring Session 有多么方便因为在 SSM 架构中Spring Session 的使用要配置三个地方 一个是 web.xml 配置代理过滤器然后在 Spring 容器中配置 Redis最后再配置 Spring Session步骤还是有些繁琐的而 Spring Boot 中直接帮我们省去了这些繁琐的步骤不用再去配置 Spring Session。 好了 本文就说到这里有问题欢迎留言讨论 本文相关案例我已经上传到 码云 大家可以自行下载。
3.6. 本文源码地址
https://gitee.com/gb_90/SpringBoot2_Practical_Column