摘要
在饿了么各类业务和运营系统中,普遍使用了基于Token的认证机制。本次分享,介绍一个通用的、可扩展的SpringSecurity Filter支撑这些业务系统开发,在实际应用中取得了良好的效果。
包括以下内容:
1. 嵌入式Servlet容器的引擎的原理和机制
2. Spring MVC自动化配置的背后详情
内容来源:2017年5月21日,饿了么架构师孙立伟在“饿了么技术沙龙【第六弹】北京研发中心·Java专场”进行《基于SpringBoot的Web层服务开发实践》演讲分享。IT 大咖说作为独家视频合作方,经主办方和讲者审阅授权发布。
阅读字数:1082 | 4分钟阅读
Spring Boot的设计目标
使Spring Framework的应用开发变得简单,容易上手。非侵入性地提供一套常用的配置,“非侵入性”保证了用户可以随时覆盖所有的默认配置。提供更多的基础性、非业务的功能(内置Web容器、权限认证机制、监控、应用配置管理等等),完全不依赖XML配置。
Spring Boot不能取代Spring Framework。想要用好Spring Boot,必须对Spring Framework有足够的知识。
基于Spring Boot的应用
独立可执行Jar;内置Servlet容器(Jetty/Tomcat/Undertow),不用部署war包;自动化配置机制,对常见的Spring基础组件(Data、Security、MVC、MQ…)提供“即开即用”的默认配置。
Cloud Friendly:脚本可定制,适配init.d/systemd;External Configuration灵活的配置注入机制;Actuator应用管理和监控。
Spring Boot是Spring Cloud的基础,它所有的特性就是为了让JAVA应用在当下的云环境中更容易地部署执行,实现微服务。
基于Token的认证机制
根据任意一种认证手段,如用户名+密码、手机号+验证码等方式生成Token。
我个人认为Token是为了取代现在传统的、基于session认证机制的一个机制。Token是一个灵活的解决方案,更适用于移动端开发。
因为传统基于session的机制非常限制应用程序水平的扩展,我们不得不去维护session的一致性,对当下云计算环境中的水平扩展有害。
基于Token的认证机制推荐标准是JWT。
应用场景
移动端用户认证解决方案;RESTful API开发;替代传统的基于Session的用户认证登录机制。
Talk is cheap.
Show me the code.
思考
如何强制收回一个有效的Token?
可以用redis,需要注意的是,一旦用了redis,就会有状态的维护和扩展的问题。
Token有效期设置多长合适?
这个问题需要根据业务场景、依据业务系统和类型去仔细考虑。
Token的缺点
当使用JWT的时候,很容易让开发人员在Token里面塞入太多的东西。Token的职责应该尽量单一,它只是用于做认证鉴权。不要基于Token做太多的业务逻辑,Token的体积不能太大。这在架构层面没有统一的解决方法,只是依赖于业务系统规则的约束。
Spring Boot是打开Spring Cloud大门的钥匙
饿了么目前的服务治理已经有了成熟的现有框架,和Spring Cloud会有一些相关的冲突,这是我们业务系统的现状。基于Spring Boot,我们正在做的就是如何把Spring Boot改造成适合我们公司的框架。
饿了么业务的特点就是它的高峰和低峰期特别明显,对于所有系统的弹性要求非常高。我们的CTO一直在规划Cloud Native整体的架构。在我们内部有一个通用的API网关系统,它的认证鉴权系统是就是一套基于Token的可扩展的框架。这个网关系统,就是完全运行在Mesos平台之上的。
我今天的分享就到这里,谢谢大家!