【微服务】05-网关与BFF(Backend For Frontend)

news/2024/5/19 21:08:08 标签: 微服务, 架构, .netcore, 后端, 开发语言

文章目录

    • 1.打造网关
      • 1.1 简介
      • 1.2 连接模式
      • 1.3 打造网关
    • 2.身份认证与授权
      • 2.1 身份认证方案
        • 2.1.1 JWT是什么
        • 2.1.2 启用JwtBearer身份认证
        • 2.1.3 配置身份认证
        • 2.1.4 JWT注意事项

1.打造网关

1.1 简介

BFF(Backend For Frontend)负责认证授权,服务聚合,目标是为前端提供服务。BFF是在前后端分离架构出来后才出现的,为前端提供单纯的API样式的网关。

微服务架构中网关和BFF的区别实际不大,二者之间的职责可以是重叠,聚合的,本质来讲BFF模式是网关职责的一种进化。

1.2 连接模式

在这里插入图片描述

传统的连接模式

在这里插入图片描述

共享网关模式的好处是统一的入口,所有的应用程序通过单一的网关进行请求,适合网关比较强大并且所有接口都在网关上注册,要求网关的可用性比较高。

在这里插入图片描述

随着业务的发展,单个服务并不能满足要求,很可能需求是需要跨微服务之间进行组装数据,这时候就出现了聚合服务。聚合服务可以单独作为一个服务存在微服务的体系下,也是通过网关去访问它,实际上聚合服务也可以设计在网关中,这样的网关实际上就类似于BFF。

在这里插入图片描述

专用网关模式指的是针对不同的客户端采用不用的网关,比如将移动端和PC的网关分开。这样的好处在于,不同的客户端所依赖的网关是不同的,可以使故障隔离,不用端之间是不会收到相互之间的影响;同时也可以为不同端设计不同的数据聚合接口,暴露不同的微服务Api。不同业务线之间只要维护自己的网关,同时根据自身业务线去进行业务的拆分

1.3 打造网关

  • 添加包Ocelot 14.0.3
  • 添加配置文件ocelot.json
  • 添加配置读取代码
  • 注册Ocelot服务
  • 注册Oceot中间件
// startup

public Startup(IConfiguration configuration)
{
    Configuration = configuration;
}

public IConfiguration Configuration { get; }
        
public void ConfigureServices(IServiceCollection services)
{
	services.AddOcelot(Configuration);
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
	... 
	 app.UseOcelot().Wait(); // 放最后是为了让网关内置的 Api仍然生效
}

2.身份认证与授权

2.1 身份认证方案

  • Cookie
  • JWT Bearer

2.1.1 JWT是什么

  • 全程 Json Web Tokens
  • 支持签名的数据结构

在这里插入图片描述

2.1.2 启用JwtBearer身份认证

  • Microsoft.AspNetCore.Authentication.JwtBearer

2.1.3 配置身份认证

  • Ocelot网关配置身份认证
  • 微服务配置认证与授权
// appsetting.json配置秘钥
{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "SecurityKey": "aabbccddffskldjfklajskdlfjlas234234234"
}

// startup 配置
 var secrityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["SecurityKey"]));
  services.AddSingleton(secrityKey);
  services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
       .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options =>
       {
           
       })
       .AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, options =>
       {
           options.TokenValidationParameters = new TokenValidationParameters
           {
               ValidateIssuer = true,//是否验证Issuer
               ValidateAudience = true,//是否验证Audience
               ValidateLifetime = true,//是否验证失效时间
               ClockSkew = TimeSpan.FromSeconds(30),
               ValidateIssuerSigningKey = true,//是否验证SecurityKey
               ValidAudience = "localhost",//Audience
               ValidIssuer = "localhost",//Issuer
               IssuerSigningKey = secrityKey//拿到SecurityKey
           };
       });

// 注册
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
	...
	// 这两个需要注册在UseEndpoints之前
	app.UseAuthentication();
    app.UseAuthorization();

	app.UseEndpoints(endpoints =>
     {
           endpoints.MapHealthChecks("/live");
           endpoints.MapHealthChecks("/ready");
           endpoints.MapHealthChecks("/hc", new Microsoft.AspNetCore.Diagnostics.HealthChecks.HealthCheckOptions
           {
               ResponseWriter = HealthChecks.UI.Client.UIResponseWriter.WriteHealthCheckUIResponse
           });
           endpoints.MapControllers();

           endpoints.MapDefaultControllerRoute();
       });
       
       app.UseOcelot().Wait();
}

2.1.4 JWT注意事项

  • Payload信息不宜过大
  • Payload不宜存储敏感信息

http://www.niftyadmin.cn/n/4970538.html

相关文章

【JS】随机打乱数组的方法

一 数组对象 使用 this.list[{src:https://bjetxgzv.cdn.bspapp.com/VKCEYUGU-hello-uniapp/2cc220e0-c27a-11ea-9dfb-6da8e309e0d8.mp3,num:0},{src:https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/2minute-demo.mp4,num:1},{src:22,num:2},{src:33,num:3},{src:44,num:…

定州市社会保险待遇手机app-定州社会保障

社会保险的缴纳主要包括养老保险、医疗保险、生育保险,单位职工还有工伤保险和失业保险的缴纳,社会保险的缴纳一般都在当地人力资源和社会保障部门,在定州,社会保险登记的流程是怎样走的?下面由法律指南小编为大家解答…

【SLAM】光流 - LK光流 - 金字塔分层LK光流

在SLAM的视觉里程计中,比较常用的就是特征点法和直接法。而直接法中,光流则是其中的重点内容,比如LSD-SLAM中就使用到了光流的方法。本文将会就光流的理论原理、公式推导进行详细的剖析,以帮助读者深刻地理解。 光流算法 光流是关…

GEE/PIE遥感大数据处理与典型案例丨数据整合Reduce、云端数据可视化、数据导入导出及资产管理、机器学习算法等

目录 ​专题一:初识GEE和PIE遥感云平台 专题二:GEE和PIE影像大数据处理基础 专题三:数据整合Reduce 专题四:云端数据可视化 专题五:数据导入导出及资产管理 专题六:机器学习算法 专题七:…

论文解读 | ScanNet:室内场景的丰富注释3D重建

原创 | 文 BFT机器人 大型的、有标记的数据集的可用性是为了利用做有监督的深度学习方法的一个关键要求。但是在RGB-D场景理解的背景下,可用的数据非常少,通常是当前的数据集覆盖了一小范围的场景视图,并且具有有限的语义注释。 为了解决这个问题&#…

算法笔记(一):时间复杂度

省略的技巧 已知 f ( n ) f(n) f(n) 来说,求 g ( n ) g(n) g(n) 表达式中相乘的常量,可以省略,如 f ( n ) 100 ∗ n 2 f(n) 100*n^2 f(n)100∗n2 中的 100 100 100 多项式中数量规模更小(低次项)的表达式&#…

浅谈容器网络

1.什么是容器网络 容器网络是一种新兴的应用程序沙箱机制,用于家庭桌面和网络规模的 企业网络 解决方案,其概念与虚拟机类似。容器内部与主机和所有其他容器隔离的是一个功能齐全的 Linux 环境,具有自己的用户、文件系统、进程和网络堆栈。容…

常用元注解

1.Java常用元注解 Retention:用于指定被注解的注解的保留策略,即定义注解的生命周期。它的取值包括:RetentionPolicy.SOURCE:注解仅存在于源代码中,在编译时会被丢弃。RetentionPolicy.CLASS:注解存在于源…