美高梅平台下载-美高梅娱乐平台登录

热门关键词: 美高梅平台下载,美高梅娱乐平台登录

这个是基于Redis缓存的Session共享,让我们开始吧

日期:2019-10-06编辑作者:美高梅平台下载

适用场景

  • 为了使Web能适应大规模的访问,需要实现应用程序的集群部署
  • 实现集群部署首先要解决session的统一,即需要实现session的共享机制,即分布式会话
  • 基于resin/tomcat web容器本身的session复制机制
  • 基于NFS共享文件系统
  • 基于Cookie进行session共享
  • 基于数据库的Session共享
  • 基于分布式缓存的Session共享,如memcached,Redis,jbosscache
  • 基于ZooKeeper的Session共享

下面代码将演示基于Spring Session的实现,这个是基于Redis缓存的Session共享。

任何一种技术的出现,都是来解决特定的问题的!

本文使用Spring Session实现了Spring Boot水平扩展,每个Spring Boot应用与其他水平扩展的Spring Boot一样,都能处理用户请求。如果宕机,Nginx会将请求反向代理到其他运行的Spring Boot应用上,如果系统需要增加吞吐量,只需要再启动更多的Spring Boot应用即可。
本文选自 《Spring Boot 2精髓:从构建小系统到架构分布式大系统》

方案1

如果配置的Redis的是自己在维护,那很方便就可以实现了。

只需要在pom文件添加以下依赖

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-redis</artifactId></dependency><dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session</artifactId></dependency>

spring.redis.host=localhostspring.redis.port=6379server.session.timeout=36000

Spring Boot会自动把session从文件存储方式切换到Redis方式,根本不需要再做任何配置。

本篇开始学习Spring-Session相关的一些知识学习整理,让我们开始吧!

Spring Boot应用通常会部署在多个Web服务器上同时提供服务,这样做有很多好处:

方案2

如果配置的Redis的不是自己在维护,不能够更改它的配置(如应用程序部署在阿里云,同时使用阿里云的Redis数据库),那就有点麻烦了。

因为方案1需要Redis的一个功能:

notify-keyspace-events

默认情况下,这个功能是不开启的。

如果你要使用方案1,你就必须通过下面的命令,来让你的Reids开启这个功能。

redis-cli config set notify-keyspace-events Egx

那就必须新建如下RedisSessionConfig类,即可在不改变Redis配置的前提下使用Redis来存储Session了。

package com.jege.spring.boot.Config;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.session.data.redis.config.ConfigureRedisAction;import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;/** * @author JE哥 * @email 1272434821@qq.com * @description:可在不改变Redis配置的前提下使用Redis来存储Session了 */@Configuration//在这里设置Session过期时间,单位:秒@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 36000)public class RedisSessionConfig { @Bean public static ConfigureRedisAction configureRedisAction() { return ConfigureRedisAction.NO_OP; }}

Spring-Session介绍

  1. Spring-Session使用的场景?

HttpSession是通过Servlet容器进行创建和管理的,在单机环境中。通过Http请求创建的Session信息是存储在Web服务器内存中,如Tomcat/Jetty。

假如当用户通过浏览器访问应用服务器,session信息中保存了用户的登录信息,并且session信息没有过期失,效那么用户就一直处于登录状态,可以做一些登录状态的业务操作!

图片 1

单机session

但是现在很多的服务器都采用分布式集群的方式进行部署,一个Web应用,可能部署在几台不同的服务器上,通过LVS或者Nginx等进行负载均衡(一般使用Nginx+Tomcat实现负载均衡)。此时来自同一用户的Http请求将有可能被分发到不同的web站点中去(如:第一次分配到A站点,第二次可能分配到B站点)。那么问题就来了,如何保证不同的web站点能够共享同一份session数据呢?

假如用户在发起第一次请求时候访问了A站点,并在A站点的session中保存了登录信息,当用户第二次发起请求,通过负载均衡请求分配到B站点了,那么此时B站点能否获取用户保存的登录的信息呢?答案是不能的,因为上面说明,Session是存储在对应Web服务器的内存的,不能进行共享,此时Spring-session就出现了,来帮我们解决这个session共享的问题!

图片 2

集群session

  1. 如何进行Session共享呢?

简单点说就是请求http请求经过Filter职责链,根据配置信息过滤器将创建session的权利由tomcat交给了Spring-session中的SessionRepository,通过Spring-session创建会话,并保存到对应的地方。

图片 3

session共享

实际上实现Session共享的方案很多,其中一种常用的就是使用Tomcat、Jetty等服务器提供的Session共享功能,将Session的内容统一存储在一个数据库(如MySQL)或缓存(如Redis,Mongo)中,

而上面说的使用Nginx也可以,使用ip_hash策略。
【Nginx】实现负载均衡的几种方式
在使用Nginx的ip_hash策略时候,每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,也可以解决session的问题。

  1. Spring官方介绍
    Why Spring Session & HttpSession?

Spring会话提供了与HttpSession的透明集成,允许以应用程序容器(即Tomcat)中性的方式替换HttpSession,但是我们从中得到了什么好处呢?

  • 集群会话——Spring会话使支持集群会话变得微不足道,而不需要绑定到应用程序容器的特定解决方案。

  • 多个浏览器会话——Spring会话支持在单个浏览器实例中管理多个用户会话(也就是多个经过验证的帐户,类似于谷歌)。

  • RESTful api——Spring会话允许在header中提供会话id以使用RESTful api。

  • Spring Session & WebSockets的完美集成。

  • 单个应用宕机不会停止服务,升级应用可以逐个升级而不必停止服务。
  • 提高了应用整体的吞吐量。

Spring Session默认会话时间

Spring Session默认的Session过期时间是30分钟。

采用方案1的时候,你可以在application.properties里配置

server.session.timeout=36000

来设置Session过期时间。

如果采用方案2来配置Session,那么application.properties里设置的Session过期时间是不起作用的。必须使用上面RedisSessionConfig类里注解的参数来设置。

项目搭建

整个项目的整体骨架:

图片 4

项目的整体骨架

我们称这种部署方式为水平扩展,前端通过Nginx提供反向代理,会话管理可以通过Spring Session,使用Redis来存放Session。部署Spring Boot应用到任意一台Web服务器上,从而提高了系统可靠性和可伸缩性。

验证

需要使用nginx,配置2个tomcat来验证,需要等待。。。

  • Spring Boot 菜鸟教程1-HelloWorld

如果觉得我的文章或者代码对您有帮助,可以请我喝杯咖啡。**您的支持将鼓励我继续创作!谢谢! **

基于XML配置方式的Spring Session

本次只讲解xml配置方式,javaConfig配置可以参考官方文档:Spring Java Configuration

1 水平扩展实现

当系统想提升处理能力的时候,通常用两种选择,一种是重置扩展架构,即提升现有系统硬件的处理能力,比如提高CPU频率、使用更好的存储器。另外一种选择是水平扩展架构,即部署系统到更多的服务器上同时提供服务。这两种方式各有利弊,现在通常都优先采用水平扩展架构,这是因为:

  • 重置扩展架构
    缺点:架构中的硬件提升能力有限,而且硬件能力提升往往需要更多的花销;
    优点:应用系统不需要做任何改变。
  • 水平扩展
    优点:成本便宜;
    缺点:更多的应用导致管理更加复杂。对于Spring Boot 应用,会话管理是一个难点。

Spring Boot 应用水平扩展有两个问题需要解决,一个是将用户的请求派发到水平部署的任意一台Spring Boot应用,通常用一个反向代理服务器来实现,本文将使用Nginx作为反向代理服务器。

反向代理(Reverse Proxy)方式是指接收internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。
正向代理服务器:局域网内通过一个正向代理服务器访问外网。

另外一个需要解决的问题是会话管理, 单个Spring Boot应用的会话由Tomcat来管理,会话信息与Tomcat存放在一起。如果部署多个Spring Boot应用,对于同一个用户请求,即使请求通过Nginx派发到不同的Web服务器上,也能共享会话信息。有两种方式可以实现。

  • 复制会话:Web服务器通常都支持Session复制,一台应用的会话信息改变将立刻复制到其他集群的Web服务器上。
  • 集中式会话:所有Web服务器都共享一个会话,会话信息通常存放在一台服务器上,本文使用Redis服务器来存放会话。

复制会话的缺点是每次会话改变需要复制到多台Web服务器上,效率较低。因此Spring Boot应用采用第二种方式(集中式会话方式),结构如下图所示。

图片 5

1.png

上图是一个大型分布式系统架构,包含了三个独立的子系统。业务子系统一和业务子系统二分别部署在一台Tomcat服务器上,业务子系统三部署在两台Tomcat服务器上,采用水平扩展。

架构采用Nginx作为反向代理,其后的各个子系统都采用Spring Session,将会话存放在Redis中,因此,这些子系统虽然是分开部署的,支持水平扩展,但能整合成一个大的系统。Nginx提供统一的入口,对于用户访问,将按照某种策略,比如根据访问路径派发到后面对应的Spring Boot应用中,Spring Boot调用Spring Session取得会话信息,Spring Session并没有从本地存取会话,会话信息存放在Redis服务器上。

环境说明

本次项目需要用户Nginx和Redis,如果没有配置Nginx的请看这里: Windows上Nginx的安装教程详解

没有配置Redis的请看这里:Redis——windows环境安装Redis和Redis sentinel部署教程

配置好了上面的环境,后下面开始正式的Spring-session搭建过程了!

2 Nginx的安装和配置

Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)、TCP/UDP代理服务器,并在一个BSD-like协议下发行。由俄罗斯的程序设计师Igor Sysoev开发,供俄国大型的入口网站及搜索引擎Rambler使用。其特点是占有内存少,并发能力强,事实上Nginx的并发能力确实在同类型的网页服务器中表现较好,国内使用Nginx的网站有百度、新浪、网易、腾讯等。

2.1 安装Nginx

打开Nginx网站( http://nginx.org/ ),进入下载页面,根据自己的操作系统选择下载,以Windows系统为例,下载nginx/Windows-1.11.10版本,直接解压,然后运行Nginx即可。

如果是Mac,可以运行:

>brew install nginx 

Nginx默认会安装在/usr/local/Cellar/nginx/目录下,配置文件在/usr/local/etc/nginx/nginx.conf目录下,日志文件在 /usr/local/var/log/nginx/目录下。

以下是Nginx的常用命令:

  • nginx,启动Nginx,默认监听80端口。
  • nginx -s stop,快速停止服务器。
  • nginx -s quit,停止服务器,但要等到请求处理完毕后关闭。
  • nginx -s reload,重新加载配置文件。

Nginx启动后,可以访问 http://127.0.0.1:80 ,会看到Nginx的欢迎页面,如下图所示。

图片 6

2.png

如果80端口访问不了,则可能是因为你下载的版本的原因,Nginx的HTTP端口配置成其他端口,编辑conf/nginx.conf,找到:

server {
  listen       80;
}

修改listen参数到80端口即可。

Nginx的log目录下提供了三个文件:

  • access.log,记录了用户的请求信息和响应。
  • error.log,记录了Nginx运行的错误日志。
  • nginx.pid,包含了Nginx的进程号。

2.2 配置Nginx

Nginx的配置文件conf/nginx.conf下包含多个指令块,我们主要关注http块和location块。

  • http块:可以嵌套多个Server,配置代理、缓存、日志定义等绝大多数功能和第三方模块,如mime-type定义、日志自定义、是否使用sendfile传输文件、连接超时时间、单连接请求数等。
  • location块:配置请求的路由,以及各种页面的处理情况。

由于本文主要是讲水平扩展Spring Boot应用,因此,我们需要在http块中增加upstream指令,内容如下:

http {
  upstream backend {
    server 127.0.0.1:9000;
    server 127.0.0.1:9001
  }
} 

backend也可以为任意名字,我们在下面的配置将要引用到:

location / {
  proxy_pass http://backend;  
}

location后可以是一个正则表达式,我们这里用“/”表示所有客户端请求都会传给http:// backend,也就是我们配置的backend指令的地址列表。因此,整个http块类似下面的样子:

http {
  include       mime.types;
  default_type  application/octet-stream;
  sendfile        on;
  keepalive_timeout  65;
  upstream backend {
    server 127.0.0.1:9000;
    server 127.0.0.1:9001;
  }
  server {
    listen       80;
    server_name  localhost;

    location / {
      proxy_pass http://backend;
    }
  }
}

我们在后面将创建一个Spring Boot应用,并分别以9000和9001两个端口启动,然后在Spring Session的基础上一步步来完成Spring Boot应用的水平扩展。

注意:Nginx反向代理默认情况下会轮询后台应用,还有一种配置是设置ip_hash,这样,固定客户端总是反向代理到后台的某一个服务器。这种设置方式就不需要使用Spring Session来管理会话,使用Tomcat的会话管理即可。但弊端是如果服务器宕机或者因为维护重启,则会话丢失。ip_hash设置如下:

upstream backend { 
 ip_hash;
 server 127.0.0.1:9000;
 server 127.0.0.1:9001
}

本文由美高梅平台下载发布于美高梅平台下载,转载请注明出处:这个是基于Redis缓存的Session共享,让我们开始吧

关键词:

)中介绍的服务的消费者和提供者都需要在注册

spring-boot-start-dubbo,让你可以使用spring-boot的方式开发dubbo程序。使dubbo开发变得如此简单。 一、注册中心Zookeeper的安...

详细>>

特别的是在一些框架中,为其他对象提供一种代

即ProxyPattern,23种常用的面向对象软件的设计模式之一。为其他对象提供一种代理以控制对这个对象的访问。在某些情...

详细>>

定义抽象命令和多个具体的命令,首先定义命令

命令模式,将一个请求封装成一个对象,从而使你可用不同的请求对客户进行参数化;对请求队列或记录请求日志,...

详细>>

prototype.(用原型实例指定创建对象的种类,但是

原型模式 一. 概念 定义:Specify the kinds of objects to create using a prototypicalinstance,and create new objects by copying thisprototype.(...

详细>>