• Session管理----分流技术


    1,高并发的分流技术
    tomcat的并发瓶颈:很难突破1000
    测试场景:
    硬件资源:如CPU的核数,内存
    2,WEB层面使用NGINX分流,轻量级的WEB服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。
    特点:占用内存少,并发能力强,稳定
    稳定的原因:因为每次开启的时候都会创建两个进程,一个主进程和一个守护进程
    如果主进程宕机,守护进程检测到以后,会将主进程从新开启。
    配置文件是学习nginx的基础,conf目录 upstream(上游) 接收请求处理和转发,我们主要用的就是转发,
    基于负载均衡+反向代理----也就是分流技术
    默认的策略:轮询策略
    实现横向扩展
    问题:带来session丢失的问题。
    3,session管理,解决session丢失的问题有三大解决方案
    一,粘性session
    实现思路:利用nginx自身提供的负载均衡策略实现;
    优点:实现简单,对应用无侵入性,无额外开销;
    缺点:一旦某个web服务器重启或者宕机,相对应的session数据丢失。对nginx负载均衡的能力进行了弱化;
    使用场景:对稳定性要求不是很高的业务场景

    nginx可以实现热加载:nginx -s reload
    IP_HASH:根据客户端IP地址进行hash计算,取模,然后路由到指定的web服务器,如果服务器挂了,nginx会重新计算,路由到新的web服务器上。
    弱化了nginx的负载均衡的能力:因为可能web服务器的流量高,有的流量低。


    二,服务器session复制
    实现思路:在支持session复制的web服务器上,通过配置可以实现session同步到其他web服务器上,达到每个web服务器上都保存一致的session全量;
    优点:对应用无侵入性,服务器重启或宕机不会造成session丢失;
    缺点:需要依赖支持的web服务器,在数据量很大的情况下不仅占用网络资源,而且会导致延迟;
    使用场景:只适用于web服务器比较少,且在线用户量比较少的情况下(session数据量少的场景)。
    经验:5台服务器以内

    首先找到支持session复制的服务器
    1,在所有工程的web.xml配置文件里加一行配置:<distributable/>分布式部署;
    2,tomcat的server.xml的配置文件也需要配置:Cluster标签;
    3,重启tomcat。
    占用内存资源(如果请求用户量比较大的情况下,需要开辟一个空间用于保存session);
    通过TCP协议长连接的方式,主播网络协议,使用同步非阻塞的NIO的数据传递和分享


    三,session共享机制
    实现思路:使用缓存技术,集中管理所有的session,所有的web服务器都从这个存储介质中存取对应的session,实现session共享;
    优点:可靠性高,减少web服务器的资源开销;服务器重启或宕机不会造成session丢失;
    缺点:实现上有些复杂,配置较多;增加一次网络开销;
    使用场景:web服务器较多,要求高可用的情况。
    对应用的侵入性体现在:
    1,引入jedis,spring对redis操作的jar包
    2,web.xml加入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>
    </filter-mapping>
    3,在spring配置文件中配置redis的连接
    <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
    <property name="maxTotal" value="100"/>
    <property name="maxIdle" value="10"/>
    </bean>

    <bean id="jedisPoolConfigFactory" class="org.springframework.data.redis.connection.jedis.JedisPoolConfigFactory" destory-method="destory">
    <property name="hostName" value="localhost"/>
    <property name="port" value="6379"/>
    <property name="timeout" value="3000"/>
    <property name="usePool" value="true"/>
    <property name="poolConfig" value="jedisPoolConfig"/>
    </bean>

    <bean id="redisHttpSessionConfiguration" class="org.springframework.session.data.redis.config.annotation.web.http.redisHttpSessionConfiguration">
    <property name="maxInactiveIntervalInSession" value="600"/>
    </bean>

    tomcat对一次http是一个标准的接口,有具体的servlet容器实现
    一次http请求--Tomcat--Container--Engine--Host--Context--Wrapper--Servlet--SessionManger--sessions--session

    目前互联网的架构图:
    页面层
    |
    网络层
    |
    应用层--nginx负载均衡---静态资源服务器集群和应用服务器集群---分布式单点登陆服务器
    |
    服务层--分布式服务器集群--搜索中间件/配置注册中心/分布式存储/分布式消息中间件
    | 分布式数据库中间件(mycat)
    数据层--文件服务器集群 MySQL数据库集群(读写分离/分库分表)

  • 相关阅读:
    Spring Cloud Consul Config 知识点
    RabbitMQ 的 docker 镜像使用
    Spring Cloud Config 知识点
    漫画:什么是服务熔断?
    Flux 和 Mono 的区别
    同时引入依赖:spring-cloud-starter-gateway 和 spring-boot-starter-web,报错
    Feign 报错:The bean 'service-producer.FeignClientSpecification', defined in null, could not be registered. A bean with that name has already been defined in null and overriding is disabled.
    Feign和OpenFeign的区别
    Maven 报错:Compilation of Maven projects is supported only if external build is started from an IDE.
    使用 application.properties 中配置的属性,举例:@Value("${server.port}")
  • 原文地址:https://www.cnblogs.com/leiandjing/p/9977678.html
Copyright © 2020-2023  润新知