【微服务】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不宜存储敏感信息
相关推荐
小村儿几秒前
连载加餐01-claude code 源码泄漏 ---一起吃透 Claude Code,告别 AI coding 迷茫
前端·后端·ai编程
jeCA EURG几秒前
Spring Boot 2.7.x 至 2.7.18 及更旧的版本,漏洞说明
java·spring boot·后端
Zarek枫煜25 分钟前
[特殊字符] C3语言:传承C之高效,突破C之局限
c语言·开发语言·c++·单片机·嵌入式硬件·物联网·算法
FastBean38 分钟前
BizAssert:一个轻量级、生产就绪的 Java 业务断言工具类
java·后端
疯狂的程序猴42 分钟前
iOS 多技术栈混淆实现,跨平台 App 混淆拆解与组合
后端·ios
是Smoky呢1 小时前
springAI+向量数据库+RAG入门案例
java·开发语言·ai编程
法欧特斯卡雷特1 小时前
从 Kotlin 编译器 API 的变化开始: 2.3.20
android·后端·开源
Java水解1 小时前
一篇文章让你彻底弄懂Spring Boot 自动配置原理详解
spring boot·后端
_Twink1e1 小时前
[算法竞赛]九、C++标准模板库STL常用容器大全
开发语言·c++
Java水解1 小时前
【MYSQL】MYSQL学习的一大重点:MYSQL数据类型
后端·mysql