精华内容
下载资源
问答
  • Session分布式共享 = Session + Redis + Nginx 原文:Session分布式共享 = Session + Redis + Nginx一、Session 1、Session 介绍 我相信,搞Web开发的对Session一定再熟悉不过了,所以我就简单的...
    原文: Session分布式共享 = Session + Redis + Nginx

    一、Session


    1、Session 介绍

          我相信,搞Web开发的对Session一定再熟悉不过了,所以我就简单的介绍一下。

          Session:在计算机中,尤其是在网络应用中,称为“会话控制”。 每个用户(浏览器)首次与web服务器建立连接时,就会产生一个Session,同时服务器会分配一个SessionId给用户的浏览器。我们可以用Fiddler查看cookies中,会看到有一个ASP.Net_SessionId的cookie。大家都知道Http是无状态请求,但是ASP.Net中的Session仿佛又让Http请求变得有状态,其核心就在于这个叫ASP.Net_SessionId的cookie。大家可以想象一下,这个相当于数据库的Key,服务器那边再有个Session内容缓存表,是不是Session的内容就很容易得到了?当然Session不是那么简单,但Session原理不是本文介绍重点,所以请大家自行度娘。

    image

     

    2、又爱又恨的Session

          刚接触程序开发的人一定爱死Session了,因为Session让Http从无状态变成有状态了,页面之间传值、用户相关信息、一些不变的数据、甚至于查出来的DataTable也可以放进去,取值的时候只需要Session[Key]即可,真是方便极了。Session真是个利器,人挡杀人佛挡杀佛,但任何事物被封为利器基本也是双刃剑,Session的许多问题我们不得不去面对。

    【常见问题请见下图】

          image

          我相信一见到这个问题,老程序员都会心里一哆嗦,Session是导致这个原因之一,大家也会想到这个情景,“我去,是不是Session又丢了,让用户重新登录”,事故报告中会填写:.NET规定,用户登陆后长时间没操作导致的。解决方案为:把Session时间调到9999。

          结果该发生的还是继续发生着,Session照样丢失。

    常见Session丢失原因】

          1、Session超时,用户打开页面,页面长时间不操作会导致此原因

          2、IIS应用程序池回收,或者重启

          3、Web.Config修改,即IIS应用程序池重启

          4、dll被替换或者动态页面修改,即IIS应用程序池重启

          5、杀毒软件对.config文件进行扫描,可能会导致IIS应用程序池回收

          6、用户浏览器禁用cookie

          7、其他原因

          其他原因有点不负责,但是好多程序员无法查明是什么原因导致Session丢失,但Session丢失我归结为两大类,一个是数据的Key丢了,一个是Session内容数据库的丢了,大家这样就好理解了,用户浏览器禁用cookie一定是Key没了。IIS应用程序池回收必定会导致Session的内容缓存表丢失,当然还有一些其他原因。

    3、解决Session丢失的漫长路

          解决过Session丢失的都会用到这几种方法

              1、InProc:将Session存到进程内。

              2、StateServer:将Session存到独立的状态服务中(Asp.Net State Service)。

              3、SqlServer:将Session存到SqlServer中。

              4、Cookieless:设置客户端Session存储的方式。

         用了这些方法之后,有的是该丢还丢,有的是稳定了速度却慢了。

         大家也注意到了,还有个这个Custom自定义模式,有人会说:“除了大牛,有几个敢写的啊,写出来有问题怎么办,算了算了。” 等等,大家不要还停留在非开源模式下解决问题的思想,找找开源项目,一定能找到的,有人说ASP.NET上哪里找开源啊,非常简单NuGet,如果想了解开源,一定要学会使用NuGet。

     

    二、Redis


    1、前言  

         上文说了那么多,有人一定会说我是来解决Session丢失的,上哪里来的Session分布式共享,标题党,我还是继续用我的cookie吧。

         我要说的是,几年前,在Stack Overflow上找到了这个方法解决了丢失问题,之后,发现这种方法还可以实现Session分布式共享。那就是运用Custom自定义模式,将Session持久化到Memcache和Redis中。Session丢失、以及持久化到SqlServer数据的性能问题也随之解决。

         此种方法很适合老项目中大量应用Session而导致法搞成分布式而苦恼的.NET开发人员使用。因为很有可能老项目维护过程中,身边的JAVA团队、PHP团队,正在重构你的项目。

    2、RedisSessionProvider

         正文开始,首先,沿着我们的思路Session持久化到Memcache或者Redis中,通过nuget下载 RedisSessionProvider(别问我怎么找到的,因为我英文过了四级,我会使用度娘,嘿嘿)

    image

     

    【web.config配置如下】

    <system.web>
        <sessionState mode="Custom" customProvider="RedisSessionProvider">
          <providers>
            <add name="RedisSessionProvider" type="RedisSessionProvider.RedisSessionStateStoreProvider, RedisSessionProvider"/>
          </providers>
        </sessionState>
    </system.web>

    【Global.asax】

        void Application_Start(object sender, EventArgs e)
        {
           
            StackExchange.Redis.ConfigurationOptions redisConfigOpts = StackExchange.Redis.ConfigurationOptions.Parse("192.168.8.138:6379");
            RedisSessionProvider.Config.RedisConnectionConfig.GetSERedisServerConfig = (HttpContextBase context) =>
            {
                return new KeyValuePair<string, StackExchange.Redis.ConfigurationOptions>(
                    "DefaultConnection",                
                    redisConfigOpts);
            };
    
        }

    存储方法】

       Session["Test"] = "aa";

    调用方法】

       string str = Session["Test"].ToString()

     !前方坑,请注意!

        如果你配置好Redis,并且做好上面这些配置,运行会出现以下问题,请更新RedisSessionProvider的依赖包StackExchange.Redis到最新。

    imageimage

     

    3、Redis安装

    3-1、Redis for windows下载

         如果会配置Redis的同学,请略过此章节,直接进入Nginx。

         Redis下载:https://github.com/MSOpenTech/redis

    image

    !此处为坑,请注意!

         修改Redis.windows.conf,如果不修改,远程不能访问Redis

         1、将bind 127.0.0.1 改成了bind 0.0.0.0。注意:进入生产环境时候,要启用密码,否则会是Redis漏洞,具体请自行度娘和自己公司的运维阿牛

         2protected-mode yes 改成 protected-mode no

         详细修改的传送门: redis开启远程访问

    3-2、启动Redis

    redis-server redis.windows.conf

    image     上图为redis启动成功,默认6379,可以通过redis-cli进行测试,看别的机子能否访问。还可以在找个redis可视化工具看看里面存了啥,也可以监控Session是否持久化到Redis中了。

    3-3、验证Session是否持久化到Redis

         运行RedisSessionProvider这个项目。同一个IIS下,同域名,不同IP,同一浏览器,不同端口一个是2459,一个是2490。

         1[6]

    注意

         不同浏览器SessionId是不同的。必须保证SessionId,测试必须是同一个浏览器进程分出的不同子标签才可以,这样SessionId是共享的。

    image

         感觉成功了,让我们看看这样的拓扑图:

    image

         囧……这是啥玩意?我的分布式呢?这个拓扑图很显然不是分布式啊,还两个IP,我还要在前面做个路由登录页面?这时Nginx该登场了。

     

    三、Ngnix 


    1、Ngnix安装&下载

          下载地址:http://nginx.org/

    2、nginx.conf配置修改

    image

    2-1、【接口修改】

           listen   80; 改成  listen   1100; 因为一般都被80都被使用。

    image

    2-2、【增加负载均衡】

    upstream  Jq_one {  
    
         server 127.0.0.1:8770;
         server 192.168.8.138:7777;
    } 
    server {
    .....
    }

     

    image

    2-3、【location节点修改】

    location / {
                root   html;
                index  index.aspx index.html index.htm;
                #其中jq_one 对应着upstream设置的集群名称
                proxy_pass         http://Jq_one; 
                #设置主机头和客户端真实地址,以便服务器获取客户端真实IP
                proxy_set_header   Host             $host; 
                proxy_set_header   X-Real-IP        $remote_addr; 
                proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
            }

    2-4、【Nginx启动命令】

            C:\server\nginx-1.0.2>start nginx

            或

            C:\server\nginx-1.0.2>nginx.exe

     

    2-5、【Nginx重新载入命令】

            C:\server\nginx-1.0.2>nginx.exe -s reload

    2-6、【参考文章】

             详细配置传送门:nginx+iis实现负载均衡

    四、Session分布式共享

    1、拓扑图

    image

             通过Nginx+Redis实现对Session的分布式共享功能。通过测试,发现Session分布式共享共有两种解决方案。

     

    2、利用Nginx的Ip_Hash进行Session分布式共享

             使用nginx将同一ip的请求分配到固定服务器,修改如下。ip_hash会计算ip对应hash值,然后分配到固定服务器

    upstream Jq_one{
         server 127.0.0.1:8770;
         server 192.168.8.138:7777;
         ip_hash;
    }

             效果可以理解为就是一个Ip,通过Nginx路由到IIS_1上面,在多次请求,会一直在IIS_1上,不会路由到IIS_2上面。

    2

     

     

    3、利用MachineKey进行Session分布式共享

         Ip_Hash在一定程度上解决了Session分布式共享的问题,但是总感觉没有发挥出nginx均衡负载的功能,继续改造

    3-1、现将Ip_Hash去掉

        去掉Ip_Hash重启Nginx,打开网站,点击设置Session按钮,结果报错

    image

    3-2、web.config添加MachineKey

    <machineKey
       validationKey="86B6275BA31D3D713E41388692FCA68F7D20269411345AA1C17A7386DACC9C46E7CE5F97F556F3CF0A07159659E2706B77731779D2DA4B53BC47BFFD4FD48A54"
       decryptionKey="9421E53E196BB56DB11B9C25197A2AD470638EFBC604AC74CD29DBBCF79D6046"
       validation="SHA1"
       decryption="AES"
    />

    【注意

         负载均衡的两个网站的MachineKey必须一样,否则出问题。

    3-3、演示

         下图,大家可以看到,服务器的Ip在不断变化,而Session却没有丢失,至此实现了Session分布式共享。3[8]

    五、后记&感悟


       希望能通过本文,解决有的项目中Session分布式共享和Session丢失的难题,给大家一些解决问题、分析问题启发。

         ASP.Net给我们带来了新的一种编码体验,如今.Net已经15岁了,.Net的在企业中发展中扮演最多的角色是快枪手和背锅侠的角色,在企业刚起步时候选择易上手的.Net无非是最好的选择之一,但是因为.Net的高度封装,让.Net高级人才在市场上十分稀少,而且企业在创立之初应用.net的时候也不会考虑架构之类的问题。可是随着业务越来越复杂,.Net开发人员无法解决和满足市场的需求和项目中出现的技术难题,技术债随之产生,解决不了问题随之一些程序员便让.Net背锅,再加上.Net的新技术推陈出新(有好多人说微软瞎折腾,囧),WebForm、mvc、silverlight、sharepoint、wpf、window phone、wcf等等。可是中国大环境并不买账,慢慢成长的企业发现.Net现有架构无法满足,.Net开发人员又无法解决现有问题,又找不到.Net架构师之类的角色,又看到了京东等大厂转JAVA的成功,其他企业家便会想咱也转个JAVA试试,招聘Java架构师,结果一大堆人应聘(高级的、中级的、技术总监),企业家高兴坏了,很快JAVA便组建了一支精英团队准备重构.net项目。JAVA发展的历史比Net要长很多,早些做JAVA开发早已转型为管理,你会发现现在市场上,挖过来的其中一些CTO很喜欢组建JAVA、PHP团队,NET团队很少,原因多数是.Net不开源、不跨平台、解决方案不成熟,背后的原因就不得而知了。但不得不说,JAVA语言很容易培养牛人,因为当你学了JAVA中的Spring,你就开始接触了IOC容器,你就在慢慢的面向接口编程,当你学会了的AOP,你就开始在面向方面编程的道路上迈出了一小步。语言只是一个工具,干了这么多年.Net,看看招聘信息或多或少有了些迷茫,路是自己走的,做出的决定就不能后悔,但在十字路口时,还是多想一想。

         以上为个人观点,有可能因为知识和阅历的原因,分析片面,请多谅解。

     

    六、参考文章

            redis开启远程访问

            nginx+iis实现负载均衡

             ASP.NET性能优化之分布式Session

            .Net分布式架构(一):Nginx实现负载均衡

            .Net分布式架构(二):基于Redis的Session共享

    非常感谢上述文章,对本文的启发,谢谢。

    posted on 2017-12-07 02:48 NET未来之路 阅读( ...) 评论( ...) 编辑 收藏

    转载于:https://www.cnblogs.com/lonelyxmas/p/7996589.html

    展开全文
  • 在了解session分布式共享之前先来了解Session、Redis和Nginx的相关知识。 一、Session相关知识 1、Session 介绍 Session在网络应用中,称为“会话控制”。 每个用户(浏览器)首次与web服务器建立连接时,就会...

    在了解session分布式共享之前先来了解Session、Redis和Nginx的相关知识。

    一、Session相关知识

    1、Session 介绍

    Session在网络应用中,称为“会话控制”。 每个用户(浏览器)首次与web服务器建立连接时,就会产生一个Session,同时服务器会分配一个SessionId给用户的浏览器。我们可以用Fiddler查看cookies中,会看到有一个SessionId的cookie,大家都知道Http是无状态请求,但是Session仿佛又让Http请求变得有状态,其核心就在于这个叫SessionId的cookie,这个相当于数据库的Key,服务器那边再有个Session内容缓存表,是不是Session的内容就很容易得到了。

    什么是Session分布式共享

    刚接触程序开发的人一定爱死Session了,因为Session让Http从无状态变成有状态了,页面之间传值、用户相关信息、一些不变的数据、甚至于查出来的DataTable也可以放进去,取值的时候只需要Session[Key]即可,真是方便极了,但任何事物被封为利器基本也是双刃剑,Session的许多问题我们不得不去面对。

    什么是Session分布式共享

    这个问题很多人都遇到过,Session是导致这个原因之一,Session丢了让用户重新登录,解决方案为是把Session时间调到9999,结果该发生的还是继续发生着,Session照样丢失。

    2、常见Session丢失原因

    • Session超时,用户打开页面,页面长时间不操作会导致此原因

    • IIS应用程序池回收,或者重启

    • Web.Config修改,即IIS应用程序池重启

    • dll被替换或者动态页面修改,即IIS应用程序池重启

    • 杀毒软件对.config文件进行扫描,可能会导致IIS应用程序池回收

    • 用户浏览器禁用cookie

    • 其他原因

    为什么说其他原因呢,好多程序员无法查明是什么原因导致Session丢失,但Session丢失我归结为两大类,一个是数据的Key丢了,一个是Session内容数据库的丢了,用户浏览器禁用cookie一定是Key没了。IIS应用程序池回收必定会导致Session的内容缓存表丢失。

    3、解决Session丢失的方法

    解决过Session丢失的都会用到这几种方法:

    • InProc:将Session存到进程内。

    • StateServer:将Session存到独立的状态服务中(Asp.Net State Service)。

    • SqlServer:将Session存到SqlServer中。

    • Cookieless:设置客户端Session存储的方式。

    二、Redis相关知识

    1、Redis介绍

    Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。开发人员用它解决了丢失问题,后来发现它还可以实现Session分布式共享,Session丢失、以及持久化到SqlServer数据的性能问题也随之解决。

    2、RedisSessionProvider

    首先通过nuget下载 RedisSessionProvider

    什么是Session分布式共享

    【web.config配置如下】

    <system.web> <sessionState mode="Custom" customProvider="RedisSessionProvider"> <providers> <add name="RedisSessionProvider" type="RedisSessionProvider.RedisSessionStateStoreProvider, RedisSessionProvider"/> </providers> </sessionState> </system.web>

    【Global.asax】

    void Application_Start(object sender, EventArgs e) { StackExchange.Redis.ConfigurationOptions redisConfigOpts = StackExchange.Redis.ConfigurationOptions.Parse("192.168.8.138:6379"); RedisSessionProvider.Config.RedisConnectionConfig.GetSERedisServerConfig = (HttpContextBase context) => { return new KeyValuePair<string, StackExchange.Redis.ConfigurationOptions>( "DefaultConnection", redisConfigOpts); }; }

    【存储方法】

    Session["Test"] = "aa";

    【调用方法】

    string str = Session["Test"].ToString()

    如果你配置好Redis,并且做好上面这些配置,运行如果出现以下问题,请更新RedisSessionProvider的依赖包StackExchange.Redis到最新。

    什么是Session分布式共享

    3、Redis下载与安装

    Redis下载:https://github.com/MSOpenTech/redis

    什么是Session分布式共享

    • 修改Redis.windows.conf,如果不修改,远程不能访问Redis

    • 将bind 127.0.0.1 改成了bind 0.0.0.0。注意:进入生产环境时候,要启用密码,否则会是Redis漏洞,具体请自行百度

    • protected-mode yes 改成 protected-mode no

    • 详细修改的传送门: redis开启远程访问

    redis-server redis.windows.conf

    什么是Session分布式共享

    上图为redis启动成功,默认6379,可以通过redis-cli进行测试,看别的机子能否访问。还可以在找个redis可视化工具看看里面存了啥,也可以监控Session是否持久化到Redis中了。

    运行RedisSessionProvider这个项目。同一个IIS下,同域名,不同IP,同一浏览器,不同端口一个是2459,一个是2490。

    什么是Session分布式共享

    不同浏览器SessionId是不同的。必须保证SessionId,测试必须是同一个浏览器进程分出的不同子标签才可以,这样SessionId是共享的。

    什么是Session分布式共享

    成功了就是这样的拓扑图:

    什么是Session分布式共享

    三、Ngnix的相关知识

    1、Ngnix安装&下载

    下载地址:http://nginx.org/

    2、nginx.conf配置修改

    什么是Session分布式共享

    a、接口修改

    listen 80; 改成 listen 1100; 因为一般都被80都被使用。

    什么是Session分布式共享

    b、增加负载均衡】

    upstream Jq_one { server 127.0.0.1:8770; server 192.168.8.138:7777; } server { ..... }

    什么是Session分布式共享

    c、location节点修改

    location / { root html; index index.aspx index.html index.htm; #其中jq_one 对应着upstream设置的集群名称 proxy_pass http://Jq_one; #设置主机头和客户端真实地址,以便服务器获取客户端真实IP proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }

    d、Nginx启动命令

    C:server ginx-1.0.2>start nginx或C:server ginx-1.0.2>nginx.exe

    e、Nginx重新载入命令

    C:server ginx-1.0.2>nginx.exe -s reload

    四、Session分布式共享

    1、拓扑图

    什么是Session分布式共享

    通过Nginx+Redis实现对Session的分布式共享功能有二种方式:

    2、利用Nginx的Ip_Hash进行Session分布式共享

    使用nginx将同一ip的请求分配到固定服务器,修改如下。ip_hash会计算ip对应hash值,然后分配到固定服务器

    upstream Jq_one{ server 127.0.0.1:8770; server 192.168.8.138:7777;   ip_hash; }

    效果可以理解为就是一个Ip,通过Nginx路由到IIS_1上面,在多次请求,会一直在IIS_1上,不会路由到IIS_2上面。

    什么是Session分布式共享

    3、利用MachineKey进行Session分布式共享

    Ip_Hash在一定程度上解决了Session分布式共享的问题,但是没有发挥出nginx均衡负载的功能,继续改进。

    a、现将Ip_Hash去掉

    去掉Ip_Hash重启Nginx,打开网站,点击设置Session按钮,结果报错

    什么是Session分布式共享

    b、往web.config添加MachineKey

    <machineKey validationKey="86B6275BA31D3D713E41388692FCA68F7D20269411345AA1C17A7386DACC9C46E7CE5F97F556F3CF0A07159659E2706B77731779D2DA4B53BC47BFFD4FD48A54" decryptionKey="9421E53E196BB56DB11B9C25197A2AD470638EFBC604AC74CD29DBBCF79D6046" validation="SHA1" decryption="AES" />

    【注意】负载均衡的两个网站的MachineKey必须一样,否则出问题。

    c、如下图服务器的Ip在不断变化,而Session却没有丢失,至此实现了Session分布式共享。

    什么是Session分布式共享

    转载于:https://www.cnblogs.com/a8457013/p/9055286.html

    展开全文
  • 详解Session分布式共享(.NET CORE版)

    千次阅读 2017-05-02 09:54:23
     在上篇文章Session分布式共享 = Session + Redis + Nginx中,好多同学留言问了我好多问题,其中印象深刻的有:nginx挂了怎么办?采用Redis的Session方案与微软Session方案相比,有什么优势呢?Cookie也可以取代...

    一、前言&回顾


           在上篇文章Session分布式共享 = Session + Redis + Nginx中,好多同学留言问了我好多问题,其中印象深刻的有:nginx挂了怎么办?采用Redis的Session方案与微软Session方案相比,有什么优势呢?Cookie也可以取代Session的,采用Redis的Session方案优势在哪里?Nginx的iphash方式到底是什么?MachineKey有啥用?Net Core怎样实现?

           那会儿看到大家的提问,我的回答也只是从应用层面回答,基本上的回答可以总结为:“别人这么做了,解决了这个问题,我用这个方法也解决了这个问题,原理请看链接。”很惭愧的说,那时的我并没有完全理解他真正的优势在哪里,只是凭着直觉和经验知道这样做比较好,知道当一部分东西不可控时候,将其解耦、可视化、集群就可以让一个系统更加健壮,但没有一个理论支撑。经过最近一段时间的查阅资料和阅读书籍,对此有了深刻理解,本文将从网站架构的可用性角度对这种Session共享进行分析和讲解,并用.net core再次实现这种架构模式。(Session分布式共享的net core版,因为工作没有机会应用到生产环境,过往经验就更别提了,所以只是研究性的,请大家注意,但园子里早有大牛写出了相关文章,本文结束会将相关文章贴出)

    二、网站可用性--Session管理


         可用性是网站架构中非常重要的一环,什么是可用性,说的简单些,就是用户随时随地打开这个网站,这个网站都能打开,并且里面的功能都能用。如果可用性不高会出现什么情况?大家想象一下春节在12306抢票的情景,网站各种崩溃,大家保准会想:要是有别的方式能买到票,我才不用12306这个破网站呢。这个例子有点极端,因为业务场景比较极端,当然,这种现象也不光是网站可用性这一环出了问题。但是一个网站三天两头打不开,要么是点开了里面的页面到处是报错页面和操作无反应,你还会用这个网站么?我相信我们在浏览网站时候,只要不像12306这种垄断业务的网站,出现不可用的情况,我们一定会离开寻找其他类似的网站。

         Session管理是网站可用性的内容之一,大家都知道Http是无状态请求,即无法追踪上次Http请求的相关信息,但是业务中大量需要将Http变为有状态请求,Session就随之产生了,可是在分布式网站设计中,无状态请求才能实现网站的横向拓展(增减应用服务器),因此又与Session相矛盾,因为Session信息如果存储在网站应用服务器的缓存中,加台服务器就不能用了,因此将Session解耦是解决此问题的关键,下面介绍网站常见的Session管理手段。

    1、Session复制

         Session复制是最早企业应用系统使用较多的一种服务集群Session管理机制,开启Session复制功能,即是在集群中的几台服务器之间同步Session对象,Java中好像JBoss有这个功能,.Net暂不知道。

         优势:Session信息读取快,实现简单。

         缺点:集群规模较大时,服务器之间Session复制会占用服务器资源和网络资源,最后系统会不堪重负。

    image

    2、Session绑定 

         Session绑定的方式,一般软/硬均衡负载服务器都会提供此功能,例如:上篇文章Nginx的IPhash方式,均衡负载服务器利用Hash算法将同一IP分配到同一台服务器上,即Session绑定在某台特定服务器上,保证Session总能在这台服务器上获得,又称作为会话黏滞。

         缺点:如果某台服务器宕机,那么这台服务器上面的Session也就不存在了,用户请求切换到其他服务器上因为没有Session而出错。

    image

     

    3、利用Cookie记录Session

         通过Cookie记录Session信息是大部分网站采用的方法,这种方式只要Cookie不滥用,也是非常好非常成熟的方案。Cookie记录Session就是把一些状态信息放到了客户端,每次请求都要传输到服务器。

         优势:这种方法简单易实现,可用性高,支持服务器横向拓展,方案成熟

         缺点:安全性问题,Cookie有大小限制,而且每次请求传输Cookie会影响性能

    image

     

    4、Session服务器

         Session服务器的方式管理Session,是一种非常好的解决方案,因为Session是为了业务需要Http状态而产生,而分布式网站设计中提倡Http无状态,为了满足这一设计,Session服务器是将有状态的Session信息与无状态的应用服务器相分离,再针对不同服务器的不同特性进行设计。例如:我们将Session信息存入到Redis中,那么Redis的集群配置、稳定性设置都有很多好的解决方案,如果将Session存入到Memcache,那么Memcache的集群配置、稳定性设置也会有很多成熟案例。这样我们就将一些问题简单化,如果我们单独应用.Net的Session,我们需要了解更多.Net深层次的东西并加以改造来保证其可用和稳定,越深层的东西越需要时间和阅历,而如果将Session存储介质转移到Redis中,Redis集群方案、管理工具都非常成熟,只需要配置配置就解决了Session的问题,何乐而不为呢。

         优势:可用性高、安全性高、伸缩性好、性能高、信息大小无限制

    image

     

    三、.Net Core+Redis+Nginx实现Session分布式共享


    1、前期准备&环境

          (1)Vs2017    (2).Net Core 1.1  (3) Win 7  (4)ubuntu 16.04

    2、.Net Core简介

           随着互联网的发展,在当今中国市场(外国不大清楚)开源、跨平台是衡量一门语言、技术好坏的重要指标之一,微软为了推动.Net开源及跨平台,.Net Core随之诞生。

           详见大牛的文章:.NET Core与.NET Framework、Mono之间的关系

           下面说说.Net Core给我的初步的感受:

             1).Net Core并没有颠覆之前C#语法

              通俗讲就是之前说中国话(C#),现在还是说中国话,只是说话的环境变了。

             2).Net Core因为刚起步,API变了或者少了很多

              通俗讲就是说话环境变了,而且里面有好多你没见过的东西,你不知道用什么官方词语来描述,因为官方正在找相关词来描述这些新东西。

             3)脱离IIS,跨平台

              通俗讲就是微软老妈为了不让我们到了新环境饿着,怕离开现在这个环境(Windows+IIS)之后不知道怎么生存。于是,教会了我们语言(C#),给了我们挣钱的工具(.Net Core+Kestrel),说了一句“去吧孩子,自己奋斗去吧,稍等,别忘了把这张Visa卡带上(.Net Core SDK),我会定期给你打钱的。”

             4)NuGet越来越重要

              NuGet经过几年的发展,越来越成熟,.Net Core开源组件获取的主要方法,通过NuGet可以下载各种中间件和组件,而且方便快捷(除了有时候断网,但是可以使用国内镜像),NuGet就像微软老妈给咱们的一个通讯录,并告诉咱们,如果你在某些方面需要帮助的时候,可以通过NuGet找到你的七大姑八大姨来帮忙。

    3、拓扑图

    image

              根据之前文章中成功的经验,简单改造一下,中间一个Windows系统和一个Ubuntu系统承载着.Net Core程序,有人会问Windows那个咋不来个IIS啊,我要说的是.Net Core实行走出去的原则,基本脱离IIS,如果IIS上面想部署.Net Core程序的话,需要安装同样的应用程序,并且站点配置的应用程序池也要变成“无托管代码”。

    4、开发.Net Core程序使用Session

    4-1、创建一个Web程序

              用Vs2017创建一个.Net Core的Web应用程序,且这个应用程序不包含身份验证信息

    image

    image

             创建完如下

    image

    4-2、.Net Core调用Session

            .Net Core使用Session,需要引用相关Session的NuGet包,网上一查,发现.Net Core的官方Session组件类似一个中间件,并且官方支持Redis。

             注意:.Net Core的Mvc不能直接使用Session,如果你在程序里面写了个HttpContext.Session就会出现如下错误:Session has not been configured for this application or request.

    image

    4-2-1、Microsoft.AspNetCore.Session

             .Net Core使用Session必须安装Microsoft.AspNetCore.Session,他的NuGet包安装如下图:

    image

    4-2-2、修改Startup.cs让Session可用

              在相应位置加入高亮代码services.AddSession(); app.UseSession();

    复制代码
    public void ConfigureServices(IServiceCollection services)
     {
         // Add framework services.
         services.AddMvc();
         services.AddSession();
     }
    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
         loggerFactory.AddConsole(Configuration.GetSection("Logging"));
         loggerFactory.AddDebug();
    
         if (env.IsDevelopment())
         {
              app.UseDeveloperExceptionPage();
              app.UseBrowserLink();
         }
         else
         {
              app.UseExceptionHandler("/Home/Error");
         }
    
         app.UseStaticFiles();
         app.UseSession();
         app.UseMvc(routes =>
         {
              routes.MapRoute(
              name: "default",
              template: "{controller=Home}/{action=Index}/{id?}");
         });
    }
    复制代码

    4-2-3、Session写入和读取

              Session的读取方式,与.Net有所不同,写法如下,并且Session的HttpContext.Session.SetString或者HttpContext.Session.Set方法分别支持字符串和Byte数组,所以复杂实体需要转化成Json存入Session中。

    【Session 写入方法】

    HttpContext.Session.SetString("key", "strValue");

    【Session 读取方法】

    HttpContext.Session.GetString("key")

    5、Session存储介质更换为Redis

    5-1、首先配置Redis

    详细配置方式见:Session分布式共享 = Session + Redis + Nginx

    redis-server redis.windows.conf

    详细配置方式见:Session分布式共享 = Session + Redis + Nginx

    5-2、安装Microsoft.Extensions.Caching.Redis.Core

           NuGet中搜索Microsoft.Extensions.Caching.Redis.Core并安装,此NuGet包是对Caching的拓展,即可以更换Caching存储介质

    image

    5-3、appsettings.json配置Redis连接字符串

           appsettings.json配置Redis连接字符串(相当于web.config里面配置appsetting节点),注意:添加位置要在Logging上面,否则读不到,添加代码为下面的高亮部分

    复制代码
    {
    
      "Data": "RedisConnection",
      "ConnectionStrings": { 
        "RedisConnection": "192.168.8.138:6379"
      },
    "Logging": {
        "IncludeScopes": false,
        "LogLevel": {
          "Default": "Warning"
        }
      }
    }
    复制代码

    5-4、Startup.cs的ConfigureServices方法中添加引用

    复制代码
    public void ConfigureServices(IServiceCollection services)
            {
                // Add framework services.
                services.AddMvc();
                services.AddDistributedRedisCache(option =>
                {       
                       //redis 数据库连接字符串
                       option.Configuration = Configuration.GetConnectionString("RedisConnection" );
                       // redis 实例名
                       
    option.InstanceName = "master" ;
                 
    } );
                  
    services.AddSession();
              }
    复制代码

             页面运行HttpContext.Session.GetString("key"),然后用Redis管理工具RedisDesktopManager查询Session是否入库。

    4

    5-5、发布前指定IP和端口(重要) 

             如果你没有看这个步骤,继续下面发布步骤,等你发布时候,你会发现一个尴尬的问题,就是你用IP访问不了你的网站,用localhost可以访问,.Net Core默认是5000端口,端口占用也会让你的网站访问不了。

             只需要在Program.cs中添加高亮代码即可,细心地人已经看到.UseUrls(new string[] { }) 传入的是个数组,那么这里定义多个网站,当你执行时候dotnet命令时候,多个网站都会启动。

    image

    复制代码
    public static void Main(string[] args)
            {
                var host = new WebHostBuilder()
    
                      //增加处,*号表示ip
                      .UseUrls(new string[] { "http://*:7201
    })
                    .UseKestrel()
                    .UseContentRoot(Directory.GetCurrentDirectory())
                    .UseIISIntegration()
                    .UseStartup<Startup>()
                    .UseApplicationInsights()
                    .Build();
    
                host.Run();
            }
    复制代码

    6、.Net Core 发布

    6-1、Windows安装.Net Core发布环境[10.2.107.100]

             1)安装Windows Server Hosting (x64 & x86)相当于IIS,注意安装时候请联网(好像是自动下载sdk,具体没仔细研究)。

    image

            2)输入dotnet命令验证,如果“报’dotnet’不是内部或者外部命令”请找到“C:\Program Files\dotnet”文件夹中的dotnet.exe,用cmd来调用dotnet.exe来运行,或者添加系统环境变量(window中cmd命令可以节省在编写命令时候可以.exe,即命令dotnet就是dotnet.exe)

    image

           坑1】

             在win7下提示一下错误:Failed to load the dll from [C:\Program Files\dotnet\host\fxr\1.0.1\hostfxr.dll], HRESULT: 0x80070057

    image

             解决方法:

             需要安装补丁:KB2533623

            下载地址如下:

             https://support.microsoft.com/en-us/kb/2533623 

          【坑2】

             注意.net Core版本,本文主要是用的.net Core 1.1.1开发的,下面两个截图是版本按错了出的错误信息

    image

    6-2、Ubuntu安装.Net Core发布环境[10.2.107.46]

             Ubuntu安装.Net Core官方写的很详细了,照着做即可,千万别抵触Linux系统,抵触的话那就别用.Net Core了,如果不知道Ubuntu和Linux的关系的话请百度。

    image

             最后验证dotnet命令是否可以使用。

    image

    6-3、发布网站

           在项目上右键->发布…

    image

    image

           点击发布按钮,生成的文件如下(SessionTest为应用程序名)

    image

            好了,有了这些文件,我们只需要把这些文件扔到服务器上就成了,但是怎么启动呢?通过查询,网上说只要用dotnet命令就成。继续实践…

            说明:我的项目叫做image生成了image这个为主要的dll,也是程序的入口。

            大家都知道.Net Core是跨平台的,不同系统的服务器环境配置好了,网上查询说是使用dotnet命令启动网站,那么可以推断出几个平台的dotnet命令是一样的。

    6-3-1、Windows启动.Net Core网站[10.2.107.100:7201]

             启动.Net Core网站的命令很简单,安装好发布环境的应用程序,C:\Program Files\dotnet目录如下(如果dotnet命令不能用,可以直接调用dotnet.exe这个应用程序。)

    image

             将生成好的网站复制到服务器上

    image

     cmd命令找到PublishOutput

    cd C:\PublishOutput

    image

    dotnet运行网站命令

    dotnet SessionTest.dll

    成功以后(之后再编译运行,会提示下面截图)

    image

    访问http://10.2.107.100:7201/(如果一台机子有多个网卡多个IP,其他IP的7201端口也是个独立网站)

    image

     

    6-3-2、Ubuntu启动.Net Core网站[10.2.107.46:7201]

    想办法将发布的程序复制到Ubuntu上面去,我测试使用的VBox虚拟机。

    具体方法传送门:virtualbox中ubuntu和windows共享文件夹设置

    dotnet SessionTest.dll

    image

    访问http://10.2.107.46:7201/

    image

    7、Nginx配置

    7-1、网站端口修改

            nginx.conf配置修改

    image

            listen   80; 改成 listen   81; 因为一般都被80都被使用。

    server {
            listen       81;
            ……
    }

    7-2、增加负载均衡

      nginx.conf中添加upstream节点

    复制代码
    upstream Jq_one {
          server
    10.2.107.100:7201
    ;
           server
    10.2.107.46:7201;
    } 
    server {
    .....
    }
    复制代码

     

    7-3、location节点修改

    复制代码
    location / {
                root   html;
                index  index.aspx index.html index.htm;
                #其中jq_one 对应着upstream设置的集群名称
                proxy_pass         http://Jq_one; 
                #设置主机头和客户端真实地址,以便服务器获取客户端真实IP
                proxy_set_header   Host             $host; 
                proxy_set_header   X-Real-IP        $remote_addr; 
                proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
    }
    复制代码

    7-4、Nginx启动命令

            C:\server\nginx-1.0.2>start nginx

            或

            C:\server\nginx-1.0.2>nginx.exe

    7-5、Nginx重新载入命令

          C:\server\nginx-1.0.2>nginx.exe -s reload

     

    四、黎明前的黑暗-MachineKey


     

          本以为做了上述准备和相关代码编写,就能够实现Session共享了,结果我想的太简单了,应用程序发布后并不能实现Session共享,难道分布式共享下Session需要特殊处理?.Net我是怎么实现的,它们的方法应该方法类似。我突然想到了MachineKey这个东西,之前在.Net版本分布式共享时候需要添加这个东西,评论也有人问我什么要加MachineKey。后来只能搜索.Net Core Machinekey关键词,找到了以下几篇文章做参考。

          搭建分布式 ASP.NET Core Web

          ASP.NET Core 数据保护(Data Protection)

          坎坷路:ASP.NET Core 1.0 Identity 身份验证(中集)

          net core 1.0 实现负载多服务器单点登录

          此问题属于数据安全问题,微软在开发.Net Core中延续了之前的设计,采用数据保护(Data Protection)方式对一些内部数据进行加密解密设计,如:Session、Cookie等(远不止这些)。这样可以保证数据的真实性、完整性、机密性、隔离性。数据安全必然离不开加解密算法,大家想一下之前.Net的WebFrom中的ViewState,它最终解析到Html页面是个hidden标签里面有一串很复杂的字符串,这个字符串是被数据保护(Data Protection)机制加密过的。Session也一样,大家可以看看Session存到Redis中啥样,见下图:

    image

           数据保护(Data Protection)有个特性是隔离性,大家可以想象一下,数据保护核心是加密解密,常见的加密方式有对称加密和非对称加密,上一篇做分布式共享时候,两台机子拷贝了同样的MahcineKey,那么他的内部加密猜测好像是对称加密,MachineKey直译中文为“机器钥匙”在联想隔离性,那么可以推断出来不同机子密钥是不同的,那么MachineKey的作用是统一不同机子的密钥。(吐血中…….这个只是个猜测,详细原理请参考专业文章)

    1、提取.Net Core的MachineKey

            .Net Core的MachineKey存储是以key-xxxx-xxxx-xxxx-xxxx.xml的形式存储的,那如何提取这个xml信息呢?

           Startup.cs的ConfigureServices添加下图高亮代码

    复制代码
    public void ConfigureServices(IServiceCollection services)
            {
    
                  //抽取key-xxxxx.xml
                services.AddDataProtection().PersistKeysToFileSystem(new DirectoryInfo(@"D:\XML"));
                services.AddSession();
                services.AddDistributedRedisCache(option =>
                {
                    //redis 数据库连接字符串
                    option.Configuration = Configuration.GetConnectionString("RedisConnection");
    
                    //redis 实例名
                    option.InstanceName = "master";
                });
                services.AddMvc();
            }
    复制代码

           查看D:\Xml里的xml文件

    imageimage

     

    2、重写IXmlRepository接口固定Key

           在项目中添加CustomXmlRepository.cs类,其中keyContent中填写key.xml内容,注意:里面的几个时间(现在还不能确定expirationDate对项目是否有影响),有人问我KeyContent能否从文件里读,回答是可以,但是ubuntu的文件路径保准不是Windows的d:\之类的,需要使用Linux的写法,所以干脆字符串来的快。

    复制代码
    using Microsoft.AspNetCore.DataProtection.Repositories;
    using Microsoft.AspNetCore.Http;
    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Threading.Tasks;
    using System.Xml.Linq;
    
    namespace SessionTest
    {
        public class CustomXmlRepository : IXmlRepository
        {
            private readonly string keyContent =
    @"<?xml version='1.0' encoding='utf-8'?>
    <key id='9108538d-9ea4-45fb-a690-438c8d788619' version='1'>
      <creationDate>2017-04-27T06:15:07.2194692Z</creationDate>
      <activationDate>2017-04-27T06:15:07.1844647Z</activationDate>
      <expirationDate>2017-07-26T06:15:07.1844647Z</expirationDate>
      <descriptor deserializerType='Microsoft.AspNetCore.DataProtection.AuthenticatedEncryption.ConfigurationModel.AuthenticatedEncryptorDescriptorDeserializer, Microsoft.AspNetCore.DataProtection, Version=1.1.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'>
        <descriptor>
          <encryption algorithm='AES_256_CBC' />
          <validation algorithm='HMACSHA256' />
          <masterKey p4:requiresEncryption='true' xmlns:p4='http://schemas.asp.net/2015/03/dataProtection'>
            <!-- Warning: the key below is in an unencrypted form. -->
          <value>HOz58FE6STtDHlMo2ZONoPgPTOOjRPikRWXmHOwNDS5o6NPb4hlgl/DxXUhat66soovBUFy1APXCQ4z30DDPyw==</value>
          </masterKey>
        </descriptor>
      </descriptor>
    </key>";
             
            public virtual IReadOnlyCollection<XElement> GetAllElements()
            {
                return GetAllElementsCore().ToList().AsReadOnly();
            }
    
            private IEnumerable<XElement> GetAllElementsCore()
            {
                yield return XElement.Parse(keyContent);
            }
            public virtual void StoreElement(XElement element, string friendlyName)
            {
                if (element == null)
                {
                    throw new ArgumentNullException(nameof(element));
                }
                StoreElementCore(element, friendlyName);
            }
    
            private void StoreElementCore(XElement element, string filename)
            {
            }
        }
    }
    复制代码

    修改Startup.cs文件中的ConfigureServices方法加载自定义的CustomXmlRepository类

    复制代码
    public void ConfigureServices(IServiceCollection services)
            {
                ////抽取key-xxxxx.xml
                //services.AddDataProtection()
                //        .PersistKeysToFileSystem(new DirectoryInfo(@"D:\XML"));
    
                services.AddSingleton<IXmlRepository, CustomXmlRepository>(); 
                  services.AddDataProtection(configure =>
                {
                    configure.ApplicationDiscriminator = "newP.Web";
                });
    
                services.AddSession();
                services.AddDistributedRedisCache(option =>
                {
                    //redis 数据库连接字符串
                    option.Configuration = Configuration.GetConnectionString("RedisConnection");
    
                    //redis 实例名
                    option.InstanceName = "master";
                });
    
                services.AddMvc();
    
            }
    复制代码

    五、实现效果演示


             演示效果说明

             本机127.0.0.1也为10.2.107.100,因为电脑性能有限,没有弄windows虚拟机,只弄了10.2.107.46这台Linux虚拟机。

             MachineKey的这个实现思路也可以用到.Net Core的身份验证上。

             UNC文件也可以实现Session共享方式

             原理就是Windows和Linux通过文件共享和挂载的方式Key.xml共享一个文件,但是总觉得有点怪怪的,共享文件会不会被别人恶意篡改,所以最后采用重写的方式实现。

             对UNC方式感兴趣的请看:搭建分布式 ASP.NET Core Web

     

     

    5 六、后记&感悟


             希望通过本文,让大家对网站的可用性中有个简单认识,并了解到Session存入Redis中的优势。本文介绍的网站可用性内容中的冰山一角,还有许多知识需要我们去学习和积累。

            .Net Core版本的Session分布式共享,让我们对.Net Core有了初步了解,.Net Core的高性能、跨平台、开源,让许多人改变了对.Net的看法,但是.Net Core在中国市场的路还有很长要走,我认为.Net Core并不是扭转.Net语言在中国市场占有率的银弹。真正的银弹也许是我们这些天天写程序的.Neter,即使是微软大量宣传.Net Core、成功案例漫天飞,我们不去学习、不去了解新知识,我们最终会被淘汰。语言只是工具,只有通过不断学习和努力,将知识消化、吸收并最终分享给别人才会有最大的收获,我们在十字路口迷茫之时,为何不去学习新的知识和方法提升自身的经验和阅历。我经常会跟别人说,工作前几年最重要的不是知识,而是你做事的风格和为目标持之以恒的信念,俗话说“江山易改,本性难移”,如果不好的工作态度和方法变成了你的工作习惯,即使换了语言、换了工作甚至转了行,都会对你的职业发展有很大影响。好的习惯一定要坚持,有些事坚持一天可以、坚持两天可以、但是坚持三个月以上,却变成了无法完成的任务,更别提几年了,“不积跬步,无以至千里”,只有坚持每天去磨练自己才能有所成长,因为我知道我不是天才,需要后天的努力才能成长。

          “踏踏实实做人,认认真真做事”我坚信自己的努力,一定会有回报的,只是现在还没有抓住机遇。最后,向那些奋斗在一线使用.Net Core开发的人员致敬。

            以上总结是我熬的味道浓郁的心灵鸡汤01DAAF7A,可话说啥时候能改掉我工作外的拖延症啊01D99C38,这篇文章一直拖拖拖,论文一直拖拖拖,学英语拖拖拖,还有好多事要做可一直也是拖拖拖,悲剧啊01D9102F。。。突然发现鸭梨山大啊,坏习惯不好改啊!请大家引以为戒!当然别做工作狂,身体健康更重要,有时间多陪陪家里人。

            个人观点,有可能因为知识和阅历的原因,分析片面,请多谅解。

     

    七、参考文章


             ASP.NET Core 使用 Redis 和 Protobuf 进行 Session 缓存

            .Net Core Session使用

            Asp.net Core 使用Redis存储Session

            Using Sessions and HttpContext in ASP.NET Core and MVC Core

            .NET Core与.NET Framework、Mono之间的关系

            virtualbox中ubuntu和windows共享文件夹设置  

            搭建分布式 ASP.NET Core Web

            ASP.NET Core 数据保护(Data Protection)

            坎坷路:ASP.NET Core 1.0 Identity 身份验证(中集)

            net core 1.0 实现负载多服务器单点登录
    展开全文
  • web.xml 配置spring-session filter <!-- 分布式Session共享Filter --> <filter> <filter-name>springSessionRepositoryFil...

    web.xml 配置spring-session filter

     

    
        <!-- 分布式Session共享Filter -->
        <filter>
            <filter-name>springSessionRepositoryFilter</filter-name>
            <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
        </filter>
        <filter-mapping>
            <filter-name>springSessionRepositoryFilter</filter-name>
            <url-pattern>/*</url-pattern>
            <dispatcher>REQUEST</dispatcher>
            <dispatcher>ERROR</dispatcher>
        </filter-mapping>

    spring- applicationcontext.xml 配置

    配置redis数据源,将session 放到redis中

     <!--spring session配置-->
        <context:annotation-config/>
        <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
              p:hostName="${redis.user.ip}" p:port="${redis.user.port}" p:timeout="${redis.timeout}" p:usePool="true">
        </bean>
        <!-- sesion 放到redis里-->
        <bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration">
            <property name="maxInactiveIntervalInSeconds" value="1800"/>
        </bean>

     

    redis.properties 配置

    #存储用户信息的session配置
    redis.user.ip=127.0.0.1
    redis.user.port=6379

     

     

     

     

     

    转载于:https://my.oschina.net/121lyyllm/blog/736150

    展开全文
  • Session共享分布式系统设计时必须考虑的一个重要的点。相比较java中的session共享解决方案,.net中的解决方案还是比较少,MemcachedSessionProvider类库是比较优秀的. EnyimMemcached是windows 下的memcached的...
  • 1、<Server port="8005" shutdown="SHUTDOWN">是tomcat 监听的关闭端口 2、<... 访问地址端口 3、<Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/>这个是接受其他服务转发过来的请求。...
  • spring-session实现分布式session共享及自定义sessionid
  • 购物车分布式Session处理方案,一个用户的分布式的购物车在集群分布式的情况下怎么处理解决Session共享的问题
  • Spring Session作为Spring社区官方推荐的一个比较简单快速的Java Web分布式session解决方案,帮我们搞定了长期以来比较蛋疼的session分布式的问题。 搭建spring boot整合spring session 1. 加入Redis和spring-...
  • 分布式 共享session

    2018-03-02 15:56:25
    分布式框架中,将session托管到缓存中,也是常用的解决方案之一;Spring Session官方说明Spring Session provides an API and implementations for managing a user’s session information.如何使用1、引入依赖&...
  • session分布式处理

    2019-09-17 21:05:47
    session分布式处理 session复制 在支持Session复制的Web服务器上,通过修改Web服务器的配置,可以实现将Session同步到其他Web服务器上,达到每个Web服务器上都保存一致的Session。 1.优点:代码上不需要做支持和修改...
  • 分享一篇关于 分布式 Spring Cloud Session 分布式共享的文章    原文地址   https://www.jianshu.com/p/e4191997da56
  • 前言本文写下session持久化和分布式共享 基于shiro框架对session的管理机制来实现必要性一直处于登陆状态:你登陆微信 不可能三天两头就让你重新登陆吧?而是一直处于登陆状态 除非主动退出微信session共享 对于...
  • 分布式session 共享

    2018-07-29 11:50:39
    微服务分布式架构实践,分布式session 共享,下载即运行[9]
  • 分布式 Session跨域共享问题 浏览器在Cookie中保存jessionid,session不能跨不是一类域名进行共享(子域名可以共享父域名的session),即使同一服务,分布式session不能同步 Session共享问题解决 1、session复制 ...
  • 分布式Session共享方案

    2017-11-02 19:42:38
    分布式Session共享

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 61,884
精华内容 24,753
关键字:

session分布式共享