1) Nginx i. 什么是nginx? 1. Nginx是一款高性能的http服务器、反向代理服务器、电子邮件服务器 2. 官方测试nginx能够支撑5W并发连接,并且内存等资源消耗非常低,运行稳定。 3. 引用场景: a) http服务器:nginx是一个http服务可以独立提供http服务,可以叫做网页静态服务器 b) 虚拟主机:可以实现一台服务器虚拟出多个网站 c) 反向代理(负载均衡服务器):在高并发情况下,需要用多台服务器集群可以使用nginx做反向代理,并且多台服务器可以平均分担负载,不会因为某台服务器负载高宕机而某台服务器闲置的情况。 4. ii. 项目中什么地方用到了nginx? 1. 访问商品详情页面时,是通过访问nginx静态资源服务器访问商品详情页面。 2. 登录注册通过nginx反向代理访问sso单点登录的session服务器和应用服务器 iii. 为什么要使用nginx? 1. 单个Tomcat最大能处理的并发只有500不到,考虑整个商场项目上线后的并发量远不止500,需要更大的并发,tomcat不能满足需求。 2. 单个Nginx的并发可以达到50000,相对于tomcat,并发量的到巨大的提升 3. 传统访问模式:客户端------》应用服务器:并发低,反应慢 4. 加入nginx:客户端----》nginx----》引用服务器集群:将一个应用部署在多台服务器上,将大量请求分配给多台服务器处理,同时带来的好处是某台服务器挂了,只要其他服务器还在运行,不会影响用户使用。 a) 负载均衡原理:http upstream模块,这个模块通过一个简单的调度算法来实现客户端ip到后端服务器的负载均衡,算法有四种: i. 轮询(默认):每个请求按时间顺序逐一分配到不 同的后端服务器,如果后端某台服务器挂掉了,故障系统自动剔除,使用户访问不受影响;使用weight指定轮询的权重,权重越大的被访问的几率越大,主要用于后端服务器性能不均衡的情况。 ii. Ip-hash:每个请求按访问ip的hash结果分配,这样来自同一个ip的用户固定访问一个后端服务器,有效解决了动态页面存在session共享问题 iii. Fair:这是 一个更加智能的负载均衡算法,此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx本身是不支持fair的,如果需要使用这种调度算法,必须下载Nginx的upstream_fair模块。 iv. url-hash: 此方法按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。Nginx本身是不支持url_hash的,如果需要使用这种调度算法,必须安装Nginx 的hash软件包。 5. nginx高可用,为了屏蔽负载均衡服务器宕机,需要建立一个备份机,主备机之间采用心跳检测机制。 6. 总之nginx功能强大,用它没毛病 iv. 怎么使用的nginx? 1. v. 使用nginx存在什么问题? 2) 单点登录(single sign on) i. 什么是单点登录系统? 1. 在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统,它包括可以将本次登录映射到其他应用中,用于同一个用户的登录机制 ii. 为什么要有点单登录? 1. 传统的登录方案是将用户信息保存在session中,放在session中存在一个问题就是session共享问题,也就是在集群情况下,session存在的服务器不一样时,要保证这些session中的内容都一样才能确定用户是否已经登录,一般的解决方案是把session复制,但是当集群过多时,session复制会引发集群风暴,降低服务器的性能,故而我们将session单独提取出来做一个session服务器,每次登录访问session服务器来判断用户是否登录,也实现了session的统一管理。 2. 使用session服务器,保存session信息,使集群的每个节点都是五状态的,需要模拟session,我们使用redis模拟session,实现session的统一管理。 iii. 项目中怎么实现的单点登录? 1. 业务逻辑: a) 普通登录,在服务端检查用户名和密码是否正确,不正确返回登录界面,正确执行下一步 b) 生成token(令牌),那用户信息保存至redis中并设置一个有效时间 c) 返回登录成功 d) Token写入cookie中 e) 判断是否有回调url(在用户是从订单页面跳转登录,然后登录成功后应该跳转回订单页面),没有则进入首页,有则进入下一步 f) 返回用户已经登录,显示订单信息 g) 用户选择查看订单 h) 请求查询订单到服务端 i) 从cookie中取token j) 调用sso服务根据token查询用户信息,接收token k) 根据token查询session l) 判断token的值是否还存在,不存在说明已经过期需要重新登录,存在则进入下一步 m) 调整token对应的值的过期时间 n) 返回用户已登录 o) 显示订单 3) Shiro(权限框架) i. Shiro是什么? 1. 是java的一个安全框架,使用简单,功能强大,执行身份认证、授权、密码学和会话管理,使用shiro的易于理解的api,可以快速、轻松的获得任何应用程序。 2. 四大基石 a) 身份认证(Authentication),有时也简称为“登录”,这是一个证明用户是他们所说的他们是谁的行为 b) 授权(Authorization),访问控制的过程,也就是决定“谁”去访问“什么” c) 会话管理(Session Managerment),管理用户特定的会话,即使在非web或ejb应用 d) 加密(Cryptography),通过使用加密算法保持数据安全同时易于使用 ii. 项目中什么地方使用了shiro? iii. 为什么要使用shiro? 1. 对比springSecurity a) 没有springsecurity功能强,实际应用并不需要那么复杂的东西,使用小巧而简单的shiro就足够了。 b) iv. 怎么使用shiro? 1. Shiro运行主要运行流程 a) Application(用户编写的代码) b) Subject(就是shrio管理的用户) c) Shrio securityManager(安全管理器):是shrio权限控制核心对象,在编程时,只需要操作subject方法,底层调用securityManager方法,无需直接操作securityManager d) Realm(应用程序和安全数据之间连接器):应用程序进行权限控制读取安全数据,通过realm对象完成 2. 执行流程:应用程序调用subject,subject调用shrio manager,依次调用realm,realm在读取安全数据。 3. 四种权限控制方式: a) 在程序中通过配置subject编程方式 b) 配置filter实现url粗粒度 c) 配置dialing,基于注解实现细粒度 d) 在页面使用shiro自定义标签实现页面显示权限控制 4. url粗粒度实现过程: a) 在web.xml中配置一个名为shiroFilter的delegatingFilterProxy,名字不能乱取,因为他会去spring的配置文件中取寻找同名的shrioFilter的bean。 b) 在applicationContext-shiro.xml中配置shiroFilter,shiroFilterfactory权限过滤 c) 配置realm d) 配置安全管理器 e) 将自定义realm注入安全管理器securityManager中 f) 在登录方法中 g) 从securityUtils中获取subject对象,调用个getSubject()方法获取 h) Subject对象调用其中方法(登录退出) i) 自定义realm对象,实现认证方法(doGetAuthentication())和授权方法(doGetAuthorizationInfo()) j) 5. 方法级别细粒度实现过程 a) 配置applicationContext激活注解(defaultAdvisorAutoProxyCreator和authorizationAttributeSourceAdvisor---注入securityManager) b) 在方法上使用注解(@RequiresUser………) c) 代理目标类开启,在注解管理实务<tx:annotation-driven proxy-target-class=”true”> d) 开启shiro注解<property name=”proxyTargetClass” value=”true”> e) v. 使用shiro存在什么问题?
|