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

文章目录

    • 1.打造网关
      • [1.1 简介](#1.1 简介)
      • [1.2 连接模式](#1.2 连接模式)
      • [1.3 打造网关](#1.3 打造网关)
    • 2.身份认证与授权
      • [2.1 身份认证方案](#2.1 身份认证方案)
        • [2.1.1 JWT是什么](#2.1.1 JWT是什么)
        • [2.1.2 启用JwtBearer身份认证](#2.1.2 启用JwtBearer身份认证)
        • [2.1.3 配置身份认证](#2.1.3 配置身份认证)
        • [2.1.4 JWT注意事项](#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不宜存储敏感信息
相关推荐
薛定谔的悦5 分钟前
储能系统(EMS)核心架构解析:充放电控制、防逆流、防过载与 PID 调节
linux·运维·架构
摇滚侠9 分钟前
搭建前端开发环境 安装 nodejs 设置淘宝镜像 最简化最标准版本 不使用 NVM NVM 高版本无法安装低版本 nodejs
java·开发语言·node.js
t1987512824 分钟前
MATLAB十字路口车辆通行情况模拟系统
开发语言·matlab
yyk的萌35 分钟前
AI 应用开发工程师基础学习计划
开发语言·python·学习·ai·lua
Kyph1 小时前
PCIe AVIP架构
架构
Amumu121381 小时前
Js:正则表达式(一)
开发语言·javascript·正则表达式
小江的记录本2 小时前
【Linux】《Linux常用命令汇总表》
linux·运维·服务器·前端·windows·后端·macos
无人机9012 小时前
Delphi 网络编程实战:TIdTCPClient 与 TIdTCPServer 类深度解析
java·开发语言·前端
froginwe112 小时前
CSS 图像拼合技术
开发语言
计算机安禾3 小时前
【数据结构与算法】第22篇:线索二叉树(Threaded Binary Tree)
c语言·开发语言·数据结构·学习·算法·链表·visual studio code