微服务鉴权的几种实现方案

1.Token

1.1 Token透传(不推荐)

刚开始接触微服务时网上给的方案大都数是通过透传Token做鉴权,但我认为这种方式不是很妥当。接着往下看:

图片

这种方式通过透传Token使得各微服务都能获取到当前登录人信息,在代码编写上确实可能会方便,但我认为这不是一种很好的设计方式。

  • 原因一:内部API与外部API混合在一起不太好区分。
  • 原因二:内部调用的微服务API因该具备无状态性质,这样才能保证方法的原子性以提高代码复用率。

换句话说:B服务提供API时不因该关心当前是否为登录状态,登录状态应该由路由中的第一个服务校验维护,在调用后续服务时应该显示的传入相关参数。比如以下场景:

  • 场景一:用户签到添加积分
  • 场景二:后台管理员给用户手动添加积分
  • 场景三:分布式调度批量增加用户积分

根据需求积分服务提供了一个给用户添加积分的API,如果你的API是通过获取的当前登录用户ID增加的积分,那么面对场景二时你需要重新编写一个给用户添加积分的API,因为当前登录的是后台管理员而不是用户(代码复用率较低)。

1.2 不透传数据,显示的提供入参(推荐)

在这里插入图片描述

路由到达的第一个服务已经对Token进行了解析认证并将userId显示的传递给了后续服务,后续服务不需要再对token进行解析认证。根据1.1的三个场景只需要提供一个入参包含userId的API,保证了函数的原子性提供代码复用率。

注意: 提供的API不能暴露给外网,我们需要在路径上做区分,避免外网非法访问内部API。我们可以订好内部调用API路径规则,如:/api/inside/** 。在网关层拒绝内部调用API请求的访问。

2.统一授权

统一授权是指: 将API鉴权集中在应用网关上

2.1 Fegin内部调用方式

Spring Cloud Gateway + Fegin内部调用,集中在Gateway上做统一认证鉴权,鉴权后在请求头中添加鉴权后的信息转发给后续服务,如:userId等

图片

缺点: A服务调用B服务时,B服务需要写一个内部调用的Controller接口A服务才能通过Fegin调用到B服务,增加了代码量(这里的设计方案是内部调用与外部调用Controller是分开的)

2.2 Dubbo内部调用方式

Spring Cloud Gateway + Dubbo内部调用,集中在Gateway上做统一认证鉴权,鉴权后在请求头中添加鉴权后的信息转发给后续服务,如:userId等

优点: 与第一种相比不需要额外编写一个Controller接口,只有本地service与远程DubboService的区别,代码更简洁。

缺点: 项目技术栈略微增加了复杂度。

图片

2.3 Spring Boot Web + Dubbo内部调用方式

这里的设计方案直接去掉了Gateway,直接使用了一个Spring Boot Web项目来代替Gateway。但需要注意的是应该将Web项目的容器换成Undertow,因为Tomcat是阻塞式的容器,不换也不是不行,但吞吐量可能会少一下,Undertow是非阻塞式的容器,可以与Gateway到达相同的效果。

非阻塞式:当请求为线程进入阻塞状态时,当前线程会被挂起,当前的计算资源会去做别的事情,当被挂起的线程收到响应时才会被继续执行,压榨CPU用更少的资源做更多的事情,但并不会提升性能

因为去掉了Gateway我们需要将所有服务的Controller集成到Web应用,然后在这个Web应用上做统一认证授权。如果将所有代码写到Web应用中,这样可能不合适,我们可以选择每个服务创建一个Controller模块,Web网关服务只有一个启动类,通过依赖的方式集成所有服务的Controller。

优点: 简化了项目结构,所有服务只有service代码。性能压测时不用考虑Gateway的线程池使用情况,业务服务只需要考虑Dubbo线程池的使用情况。

缺点: 没办法通过配置中心动态调整路由。比如说增加了一个服务Gateway可以不重启通过配置中心增加路由配置即可。

图片

3. 非统一授权

非统一授权:不在应用网关上集成鉴权,网关只有单一的路由转发业务。各位服务都有自己的鉴权方式,当然也可以通过jar包的方式统一各服务的鉴权方式。

3.1 常规模式

通过编写通用的鉴权模块,各服务集成该模块。该模块具备以下功能:

  • JWT Token解析
  • 权限校验拦截
  • 缓存(本地缓存\Redis缓存)

这种模式更适合大型项目团队,可能各微服务都由一个项目组负责。各服务维护自己的权限规则(这里指的是权限规则数据,规则是统一的)

图片

该模式下由于应用网关比较轻量级,不再涉及复杂的鉴权流程,使得项目部署可以更灵活,当我们使用K8S部署项目时,我们可以将应用网关替换成K8S中的Ingress网关。

我们先看常规模式部署在K8S中完整的链路:

在这里插入图片描述

当用户访问时会先到达K8S Ingress网关通过应用网关Service的负载均衡调用应用网关,应用网关需要通过注册中心获取服务注册列表,通过服务注册列表负载均衡到后续服务。

3.2 与K8S集成

我们再来看看将应用网关替换成K8S中的Ingress网关的完整链路:

图片

这里不仅只是去掉了应用网关,同时我们通过K8S Service 负载均衡的能力去掉了注册中心。减少了我们部署微服务时还要额外搭建一套注册中心。同时减少了一层没必要的转发。

至于K8S中的Service,大家可以理解成一个本地的host假域名,比如我们在K8S给商品创建一个Service,名称为:goods-svc。那么我们可以通过goods-svc直连。如:

  • http://goods-svc:8080/api/goods/info/10001
  • dubbo://goods-svc:20880

Fegin具体代码:

@FeignClient(name = "user-service", url = "http://goods-svc:8080")
public interface UserServiceClient {@GetMapping("/users/{id}")User getUserById(@PathVariable("id") Long id);
}

Dubbo具体代码:

@Reference(url = "dubbo://goods-svc:20880") 
private DemoService demoService;

方案没有对错,不知道大家是如何设计的,可以多交流交流。

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

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

相关文章

0103设计算法-算法基础-算法导论第三版

文章目录 一、分治法二、分析分治算法结语 我们可以选择使用的算法设计技术有很多。插入排序使用了增量方法:在排序子数组 A [ 1 ⋯ j − 1 ] A[1\cdots j-1] A[1⋯j−1]后,将单个元素 A [ j ] A[j] A[j]插入子数组的适当位置,产生排序好的子…

【数字图像处理matlab系列】数组索引

【数字图像处理matlab系列】数组索引 【先赞后看养成习惯】【求点赞+关注+收藏】 MATLAB 支持大量功能强大的索引方案,这些索引方案不仅简化了数组操作,而且提高了程序的运行效率。 1. 向量索引 维数为1xN的数组称为行向量。行向量中元素的存取是使用一维索引进行的。因此…

基于SSM+Jsp+Mysql的记账管理系统

开发语言:Java框架:ssm技术:JSPJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包…

基于SSM的花店商城系统+数据库+论文+免费远程调试

项目介绍: 基于SSM的花店商城系统。Javaee项目 采用M(model)V(view)C(controller)三层体系结构,通过Spring SpringMvc MybatisMavenJsp来实现。MySQL数据库作为系统数据储存平台,实…

证书(公钥):网络安全的关键

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

全球大型语言模型(LLMS)现状与比较

我用上个博文的工具将一篇ppt转换成了图片,现分享给各位看官。 第一部分:国外大语言模型介绍 1,openai的Chatgpt 免费使用方法1:choose-carhttps://share.freegpts.org/list 免费使用方法2:Shared Chathttps://share…

springboot精品源码

springboot精品源码 所有项目都包括:源码数据库文件开题LW说明文档运行视频 请看主页资料联系。 项目类型包括: 1 SpringBoot学生心理咨询评估系统 2 基于SpringBoot的网上订餐系统 3 大学生租房平台的设计与实现 4 SpringBoot房屋租赁系统 5 基于SpringBoot的课…

【Go实现】实践GoF的23种设计模式:解释器模式

上一篇:【Go实现】实践GoF的23种设计模式:适配器模式 简单的分布式应用系统(示例代码工程):https://github.com/ruanrunxue/Practice-Design-Pattern–Go-Implementation 简介 解释器模式(Interpreter Pat…

基于springboot+vue的小型诊疗预约平台

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…

软件测试经验与教训

大概在18年的时候,就看过《软件测试经验与教训》的纸制版,里面的一些观点深刻的影响了我,也影响了后来我对测试的思考。最近又一次快速阅读了电子版,还是收获满满。下面精选出10条,和大家分享。 一、测试人员是项目的…

Python使用PaddleOCR进行图片转文字

PaddleOCR是百度飞桨开发的OCR库 安装 安装PaddleOCR,只需要两个命令: pip install paddlepaddle2.4.2 pip install paddleocr 基本使用 PaddleOCR的使用也很简单: from paddleocr import PaddleOCR# use_angle_cls:是否使用…

抖音自动引流秘籍,日吸粉数百,财源滚滚来!

大家好,我是赢销侠运营大师。 引流的重要性在互联网行业中是众所周知的。我们如果想要在这个领域有所作为,掌握有效的引流方法是至关重要的。一个好的引流策略,就像我们的生命线一样重要。 今天,我要给大家分享一种全新的引流方…