从单机应用到微服务,用户认证走几步?

用户认证指在用户访问服务的时候确认用户的身份,受限于HTTP无状态的特性,应用开发者需要自行实现用户认证相关功能。

通常是用户登录时服务端生成通行证返回给客户端,客户端在接下来的请求中携带通行证,然后服务端通过校验该通行证实现用户认证。

不管具体的业务是什么,如果用户认证失败,那么所有的后续操作都无法执行,需要返回给客户端用户认证失败,对应到HTTP Status Code是401。

本文阐述随着流量和规模增长,服务从单机应用发展到微服务架构的过程中,用户认证功能的实现方式变迁。

单机应用

640?wx_fmt=png

这个阶段只有一台服务器,应用将session维护在本机的内存/磁盘,然后生成一个session id告之客户端即可。很多Web框架有内置的实现,开箱即用,有时间简单到你都没注意到用户认证的存在。

但是一台应用服务器往往不够用,有多个理由:流量太大一台扛不住、机器一挂服务就挂可用性太低...

负载均衡

640?wx_fmt=png

因为有多台服务器,所以没法再简单地将session维护在本机上,因为用户在一台机器上登录后,下次访问可能就到了另一台机器。

  • 方案A:认证令牌

在登录的时候将一些用户的信息编码到一个字符串里返回给客户端,客户端在随后的操作中携带此字符串操作,服务端验证这个字符串,字符串合法则认证通过并从字符串中读取用户身份信息。

这样就不需要服务端再存储session信息,轻松支持多台服务器。而这个用来认证的字符串,就跟军队的通关令牌一样,我们管它叫认证令牌。

认证令牌的格式需要仔细设计,要能防篡改、具备有效期、要能放到URL中使用、还要可扩展等等。已经有人设计了好了一种令牌格式,还形成了标准叫JWT,可以直接拿来用,当然要是嫌JWT不好用,重新设计一个也是可以的。

这里有一份JWT的简明介绍。

认证令牌这个方案的缺点是,难以实现登录态的云端管理。通常一个令牌生成后,只能等它过期或者encode在其中的某些用户身份信息发生变化的时候才会生效。像用户退登就失效、用户的在线设备管理、用户的登录态管控等功能,没有办法实现。

  • 方案B:分布式Session

还有一种方案,将session从应用服务器拿出来单独维护,形成一个分布式session,这样每一台应用服务器都能访问得到。

640?wx_fmt=png

具体到实现,分布式Session可以是Redis、MySQL等。但不管用什么样的存储系统,用户认证服务的可用性都强依赖它,相比认证令牌不需要服务端存储的方案,可用性肯定相对要低一些。

  • 方案A+B

认证令牌有功能缺失,分布式Session可用性相对不足,把两者结合起来就成了顺利成章的方案。

将认证令牌当做session id,正常服务时,用户认证都做分布式session校验,而当分布式session依赖的存储系统偶尔出现故障时,则服务降级,改为只校验认证令牌。这样可用性有保障,功能也齐全。

如果需要保证登录服务时,分布式Session也是高可用的,还可以在令牌里面增加一个字段用来区分有session和无session的类型。

微服务

业务规模越来越大,团队人数越来越多。一起维护同一个服务越来越难了,需要服务拆分,但不管怎么拆,用户认证是每个面向终端用户的服务都需要的。

640?wx_fmt=png

用户认证都需要,只要在拆分的时候把相关代码都拷贝走,然后各个服务都要依赖用户信息和分布式session。

这样维护起来困难太大,只好将用户认证相关的功能拆分出来,形成一个独立的用户认证服务。这个服务几乎每一个大点的互联网公司都有,名字不太一样,有的叫Passport,有的叫Account,有的叫User,但总归功能是差不多的。

640?wx_fmt=png

这样登录、注册、用户认证相关的代码、数据、线上部署,完全独立出来,形成一个用户认证服务。然后随着业务增长,服务会继续拆分,越来越多。服务之间可能有依赖,然后大部分服务尤其是面向终端用户的服务都会依赖用户认证服务。

640?wx_fmt=png

依赖用户认证服务的独立微服务越来越多,重复的对接工作需要进行很多次,另外在用户的一次请求中往往涉及多个微服务,在各个微服务单独对接用户认证的情况下,难免会进行多次用户认证,造成重复请求,资源浪费。

API网关

640?wx_fmt=png

通过外网API网关,将公司所有的对外接口的签名和用户身份认证收拢到一起。API网关收到用户的认证令牌之后,先去用户认证服务换取用户id,然后使用用户id访问其它微服务。这样各个微服务都根据用户uid提供服务,不再需要关心终端用户的身份认证,而用户认证服务也只需要对接API网关即可,各自的工作量都大大减小。

Reference

https://www.slideshare.net/opencredo/authentication-in-microservice-systems-david-borsos

原文链接:https://www.cnblogs.com/xinzhao/p/11571907.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/313669.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

编写优雅代码,从挖掉恶心的if/else 开始

背景长话短说, 作为开发人员经常需要根据条件灵活查询数据库,不管你是用rawsql 还是EFCore, 以下类似伪代码大家都可能遇到:特别是在大数据产品或者物联网产品中,字段甚多;if/else 写到死,一边写…

.NET Conf 2019 大会上发布.NET Core 3.0

北京时间今天凌晨如期在.NET Conf 上发布.NET Core 3.0,Keynotes 由Scott Hunter 主演,主要围绕.NET Core 3.0的新特性和社区展开。多功能性是.Net Core 成为我们的生活一部分的最好解释。如果您是Web开发人员还是想开发桌面或移动应用程序,如果您是游戏…

Spring AOP实现原理

先说结论: Spring AOP采用的是JDK动态代理 CGLIB动态代理模式。当当前类为接口的实现时,采用JDK动态代理,否则用CGLIB、 1、AOP 的存在价值 在传统 OOP 编程里以对象为核心,整个软件系统由系列相互依赖的对象所组成&#xff0c…

微软推出Python免费在线教程视频

开源中国曾报道过最近微软针对 Python 初学者,推出了一套免费的教程视频。这套视频名为 Python for Beginners,该在线教学视频由微软高级项目经理 Christopher Harrison、以及微软 AI Gaming 的商业开发经理 Susan Ibach 共同讲解,在课程中加…

推荐neter常用优秀开源项目系列之一

.net社区有很多优秀的开源项目,我们今天先推荐6个开源项目;1.MassTransitMassTransit 是一个自由、开源、轻量级的消息总线, 用于使用. NET 框架创建分布式应用程序。MassTransit在现有消息传输上提供了一组广泛的功能, 从而使开发人员能够友好地使用基于…

聊聊高并发下库存加减那些事儿——“异步扣减库存”

聊聊高并发下库存加减那些事儿不定期福利发放哦聊聊高并发下库存加减那些事儿背景一般在日常开发中经常会遇到打折促销,秒杀活动,就如拼多多最近的4999抢券买爱疯11促销活动,毕竟谁的钱也不是大风刮来的,有秒杀有促销必定带来大量…

什么是MVC

什么是MVC? MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范。 用一种业务逻辑、数据、界面显示分离的方法,将业务逻辑聚集到一个部件里面&#xf…

SpringMVC 、Struts的区别

先说结论:目前Spring MVC已经一统江山,Struts正在被抛弃 1、Spring MVC原理 Spring 体系: Spring MVC工作流程图 SpringMVC的工作流程描述 1. 用户向服务器发送请求,请求被Spring前端控制Servelt DispatcherServlet捕获&#x…

基于Asp.Net Core MVC和AdminLTE的响应式管理后台之侧边栏处理

说明:.NET Core版本为:2.2 AdminLTE版本为:2.4.18 Bootstrap版本为:3.4.1 font-awesome版本为:4.7.01、新建项目:AdminLteDemo,添加区域Admin 在Areas/Admin/Views文件夹添加文件并分别添加如下代码:_ViewImports.cshtmladdTagHel…

Spring boot——起步依赖

一、起步依赖 1、是什么 本质上是一个Maven项目对象模型(Project Object Model, POM), 定义了对其他库的传递依赖,这些东西加在一起即支持某项功能。 比如: spring-boot-dependencies^ spring-boot-pare…

[翻译] ASP.NET Core 3.0 的新增功能

全文翻译自微软官方文档英文版 Whats new in ASP.NET Core 3.0本文重点介绍了 ASP.NET Core 3.0 中最重要的更改,并提供相关文档的连接。BlazorBlazor 是 ASP.NET Core 中的一个新的框架,用于使用 .NET 构建交互式的客户端 Web UI:使用 C# 而…

Sprig boot自动配置

1、概述 Spring Boot是Spring旗下众多的子项目之一,其理念是约定优于配置,它通过实现了自动配置(大多数用户平时习惯设置的配置作为默认配置)的功能来为用户快速构建出标准化的应用。Spring Boot的特点可以概述为如下几点&#x…

.NET Core 3.0稳定版发布

一年一度的 .NET 开发者盛会 .NET Conf 2019 已正式开始了(举办时间为 9.23-9.25)。大会第一天最重磅也是最激动人心的消息莫过于 .NET Core 3.0 稳定版的发布。.NET 项目管理总监 Scott Hunter 在大会宣布了这则消息,并在主题演讲环节围绕 .…

深入理解 Spring Boot Starters 原理(手写Spring boot Start)

一、Spring Boot Starter诞生原因 Spring Boot Starter是在SpringBoot组件中被提出来的一种概念,stackoverflow上面已经有人概括了这个starter是什么东西,想看完整的回答戳这里 Starter POMs are a set of convenient dependency descriptors that you …

记一次中小公司的研发问题

作者:zollty,资深程序员和架构师,私底下是个爱折腾的技术极客,架构师社区合伙人!一、一些不好的现状,及对应的改进方法1、前后端代码绑定在一起,很难维护,前端UI做得太差&#xff0c…

ASP.NET Core 3.0 使用gRPC

一.简介gRPC 是一个由Google开源的,跨语言的,高性能的远程过程调用(RPC)框架。gRPC使客户端和服务端应用程序可以透明地进行通信,并简化了连接系统的构建。它使用HTTP/2作为通信协议,使用 Protocol Buffers…

Codeforces Round #739 (Div. 3)(AK实况)

Codeforces Round #739 (Div. 3) A. Dislike of Threes 找到第kkk个既不是333的倍数&#xff0c;个位数上也不是333的数&#xff0c;也已预处理然后O(1)O(1)O(1)输出&#xff0c;也可直接forforfor循环暴力。 #include <bits/stdc.h>using namespace std;int main() {/…

利用Helm简化Kubernetes应用部署(2)

目录定义Charts 使用Helm部署Demo Helm常用操作命令 定义Charts回到之前的“charts”目录&#xff0c;我们依次进行解读并进行简单的修改。Chart.yaml配置示例&#xff1a;apiVersion: v1 appVersion: "1.1" description: A demo Helm chart for Kubernetes name:…

linux查看磁盘空间命令

Linux 查看磁盘空间可以使用 df 和 du 命令。 df df 以磁盘分区为单位查看文件系统&#xff0c;可以获取硬盘被占用了多少空间&#xff0c;目前还剩下多少空间等信息。 例如&#xff0c;我们使用df -h命令来查看磁盘信息&#xff0c; -h 选项为根据大小适当显示&#xff1a; …

Visual Studio 2019 16.3 正式发布,支持 .NET Core 3.0

微软正式发布了 Visual Studio 2019 16.3 版本&#xff0c;主要更新内容如下&#xff1a;.NET Core 3.0Visual Studio 版本 16.3 包括对 .NET Core 3.0 的支持。注意&#xff1a;如果使用的是 .NET Core 3.0&#xff0c;则需要使用 Visual Studio 16.3 或更高版本。.NET Core 桌…