Spring Cloud微服务下的权限架构调研
随着微服务架构的流行,系统架构调整,项目权限系统模块开发提上日程,需要对权限架构进行设计以及技术选型。所以这段时间看了下相关的资料,做了几个对比选择。
一、架构图
初步设想的架构如下,结构很简单:eureka为服务注册中心,config是服务配置中心,redis做为缓存服务,gateway是后端网关。目前只设计了一套节点,考虑系统高并发高可用性后续可部署多套节点,Nginx做负载均衡以及增加熔断、失败重试等。系统流程为:客户端请求经Nginx转发到后端网关,网关直接转发到权限系统进行认证授权,统一在网关做鉴权,鉴权通过则转发到对应微服务。
二、技术选型
① 用户权限
在传统的单体应用中,很多项目用的是shiro,毕竟shiro功能强大又灵活。而在Spring Cloud微服务架构中,好像大家更喜欢用Spring Security,所以了解了一下这两个框架的区别,大致如下:
- Shiro比Spring更容易使用、实现和理解。
- Spring Security更加知名是因为品牌名称。
- 很多人发现Spring Security使用比较麻烦。
- Spring Security有更好的社区支持。
- Apache Shiro在Spring Security处理密码学方面有一个额外的模块。
- Spring Security 对Spring 结合较好,并且不能脱离Spring,如果项目用的SpringMVC ,使用起来很方便。
- Shiro 功能强大、且 简单、灵活。是Apache 下的项目比较可靠,且不跟任何的框架或者容器绑定,可以独立运行。
- Spring Security支持Oauth、OpenID
- Spring Security的权限细粒度更高(关于这点,从我翻阅到的博客来看,大家一致表示还未发现高在哪里)
从以上几点来看,各有优劣,根据具体项目需求进行选择。综合多种原因,我们选用了Spring Security。
② 用户认证
传统的单体应用都是通过session来做用户认证,在前后端分离后偏向基于token认证。在微服务流行后,Spring Security 结合 OAuth 被推行。关于OAuth可以看看这篇文字 - 理解OAuth 2.0
OAuth2分为认证服务器和资源服务器:在这个架构中,Auth Server作为认证服务器,负责对客户端进行认证授权,为客户端颁发令牌。Gateway作为资源服务器,负责对token进行验证来判断是否允许客户端的访问操作。
OAuth2包含4种授权模式:
- 授权码(认证码)模式 (Authorization code)
- 简化(隐形)模式 (Impilict
- 密码模式 (Resource Owner Password Credential)
- 客户端模式 (Client Credential)
根据项目业务情况,我们这里目前采用密码模式,随着项目运作模式的改变、版本的大更新,后面不排除会使用其他授权模式。
③ JWT认证协议
JWT(JSON Web Token)是一种认证协议,是目前最流行的跨域身份验证解决方案。它将用户信息加密到token里并由客户端存储,服务器不保存任何用户信息。服务器通过使用保存的密钥验证token的正确性,只要正确即通过验证。
JWT优点是可以解决Session共享问题,提高后端服务的可用性和扩展性;缺点是无法作废已颁发的令牌,虽然可以通过其他途径实现,但是不免有些麻烦,而且违背了JWT的初衷。结合我们的项目来看,我认为使用JWT的弊是大于利的,所以这里我不打算使用JWT,延续以往的实现方式,在Redis中维护token。
三、系统工作流
简单画了下访问系统时系统的工作流:
系统架构的设计相对简单,后续可能还要经过讨论进行调整。架构需要达到业务需求并且具备高并发、高可用、可扩展性,不能因为项目的变更或者用户体量上升等等原因出现不可扩展、重构、大调整等问题。
Spring Cloud微服务下的权限架构调研的更多相关文章
- Spring Cloud 微服务项目实现总架构一
Spring Cloud 服务是一种分布式服务,包括配置管理,服务发现,断路器,智能路由,微代理,控制总线,一次性令牌,全局锁,主节点选举, 分布式session, 集群状态等公共组件. 一 注册机 ...
- spring cloud微服务下手动回滚事务
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); 这里使用的场景是,跨服务调用接口,比如:用户信息和用户积分 ...
- 一张图了解Spring Cloud微服务架构
Spring Cloud作为当下主流的微服务框架,可以让我们更简单快捷地实现微服务架构.Spring Cloud并没有重复制造轮子,它只是将目前各家公司开发的比较成熟.经得起实际考验的服务框架组合起来 ...
- 如何优化Spring Cloud微服务注册中心架构?
作者: 石杉的架构笔记 1.再回顾:什么是服务注册中心? 先回顾一下什么叫做服务注册中心? 顾名思义,假设你有一个分布式系统,里面包含了多个服务,部署在不同的机器上,然后这些不同机器上的服务之间要互相 ...
- Dubbo和Spring Cloud微服务架构比较
Dubbo 出生于阿里系,是阿里巴巴服务化治理的核心框架,并被广泛应用于中国各互联网公司:只需要通过 Spring 配置的方式即可完成服务化,对于应用无入侵,设计的目的还是服务于自身的业务为主. 微服 ...
- Dubbo 和 Spring Cloud微服务架构 比较及相关差异
你真的了解微服务架构吗?听听八年阿里架构师怎样讲述Dubbo和Spring Cloud微服务架构. 微服务架构是互联网很热门的话题,是互联网技术发展的必然结果.它提倡将单一应用程序划分成一组小的服务, ...
- 全链路实践Spring Cloud 微服务架构
Spring Cloud 微服务架构全链路实践Spring Cloud 微服务架构全链路实践 阅读目录: 网关请求流程 Eureka 服务治理 Config 配置中心 Hystrix 监控 服务调用链 ...
- Spring Cloud 微服务架构解决方案
1 理解微服务 1.1 软件架构演进 软件架构的发展经历了从单体结构.垂直架构.SOA架构到微服务架构的过程. 1.1.1 单体架构 特点: 1.所有的功能集成在一个项目工程中. 2.所有的功能打一个 ...
- Spring Cloud微服务初探
学习初衷 因为加了不少优秀的知识星球,结交了更多的小伙伴,加了更多的群,每每在自我介绍的时候,都说自己是Android & Java攻城狮. 然鹅,有的小伙伴就来问了,你是搞Java的,那对S ...
随机推荐
- 软件光栅器实现(二、VS和PS的运作,法线贴图,切空间的计算)
二.软件光栅器的VS和PS的输入.输出和运作,实现法线贴图效果的版本.转载请注明出处. 这里介绍的VS和PS是实现法线映射的版本,本文仅介绍实现思路,并给出代码供参考.切空间计算.光照模型等相关公式不 ...
- Day07 (黑客成长日记) 函数的参数及作用
定义函数: 1.定义函数注意: (1)位置参数:直接定义函数. def func(a,b): print(a,b) func(1,2) (2)默认参数:关键字参数:参数名= ‘默认的值‘ def fu ...
- Linux(Ubuntu-CentOS)
2017.3.29 查看已安装软件版本 dpkg-query --list 2017.3.3 Ubuntu 14.04 安装 phpmyadmin make sure apache works wel ...
- spak数据倾斜解决方案
数据倾斜解决方案 数据倾斜的解决,跟之前讲解的性能调优,有一点异曲同工之妙. 性能调优中最有效最直接最简单的方式就是加资源加并行度,并注意RDD架构(复用同一个RDD,加上cache缓存).相对于前面 ...
- Python Memo 赋值与ID (Assignment & id())
利用Python内置函数id()找出内部地址,探讨赋值与内建地址. id()的官方解释:this is the address of the object in memory 那么 a =1 是什么意 ...
- Python学习笔记-函数基础
函数基础 定义: 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可 为什么使用函数:减少重复代码.使程序变的可扩展使程序变得易维护 1.定义一个函数 #定 ...
- [转]深入理解 GRE tunnel
我以前写过一篇介绍 tunnel 的文章,只是做了大体的介绍.里面多数 tunnel 是很容易理解的,因为它们多是一对一的,换句话说,是直接从一端到另一端.比如 IPv6 over IPv4 的 tu ...
- ThreadLocal类的简单使用
1.概述变量值的共享可以使用public 是static 变量的形式,所有的线程都使用同一个public static 变量. 如实现线程内的共享变量,jdk提供了ThreadLocal来解决这个问题 ...
- InnoDB Insert Buffer(插入缓冲)
InnoDB Insert Buffer(插入缓冲) 每个存储存储引擎自身都有自己的特性(决定性能以及更高可靠性),而InnoDB的关键特性有: 插入缓冲(Insert Buffer)-->Ch ...
- Javascript高级编程学习笔记(67)—— 事件(11)HTML5事件
DOM规范没有涵盖所有浏览器支持的所有事件 而许多浏览器出于满足用户需求,或解决特殊问题的目的,实现了一些自定义事件 HTML5列出了浏览器应该支持的所有事件,这里只讨论得到浏览器完善支持的事件(并非 ...