计算机系统应用教程网站

网站首页 > 技术文章 正文

.NET微服务之服务网关 微服务网关选择

btikc 2024-12-23 08:52:26 技术文章 17 ℃ 0 评论


简介


服务网关是系统对外的唯一入口,它封装了系统内部架构,为每个客户端提供了定制的API,所有的客户端和消费端都通过统一的网关接入微服务,在网关层处理所有非业务功能。


为什么要使用服务网关?


  • 单体应用


浏览器发起请求到单体应用所在的机器,应用从数据库查询数据原路返回给浏览器,对单体应用来说是可以不用网关的。


  • 微服务


微服务的应用可能是部署在不同机房、不同地区、不同域名下的。此时客户端想要请求对应的服务,都需要知道机器的具体IP或域名;当微服务实例众多时,对客户端来说就难以维护。此时就有了网关,客户端相关的请求直接发送到网关,由网关根据请求标识解析判断出具体的微服务网址,再把请求发送到服务实例上。


如果由客户端直接请求各个微服务,会存在以下问题:


  • 客户端多次请求不同的微服务,增加了网络的负担和客户端的复杂性
  • 身份认证问题,每个微服务都需要独立身份认证
  • 难以重构,随着项目的迭代,可能需要重新规划微服务
  • 存在跨域请求,每个服务都要处理,非常麻烦


因此,我们需要网关介于客户端和服务端之间的中间层,所有外部请求率先经过网关,客户端只需要与网关交互,只需要知道网关地址即可,这样简化了开发,并且有以下优点:


  • 易于监控,可在微服务网关收集监控数据并进行数据分析
  • 易于认证,可在微服务网关上进行认证,然后再将请求转发到后端的微服务,从而无需在每个微服务中进行认证
  • 减少了客户端与每个微服务之间的交互次数
  • 可以在网关设置统一或个性化的服务策略,比如熔断、超时、重试、限流、舱壁等。


创建一个Web Api项目


  • 提前准备:安装并启动Consul、数据库支持(SqlServer、Oracle、MySql、PostgreSql、Sqlite)、RabbitMQ(可选)
  • 打开 Visual Studio 2022 并创建Web Api项目(点击查看完整示例代码1.5open in new window)


安装依赖包


安装服务注册nuget包Wing.Consul,服务网关nuget包Wing.Gateway,选择对应的数据库包,以SqlServer为例,安装Wing.SqlServer,请求日志支持本地消息队列和分布式消息队列进行异步持久化,基本上不影响网关性能。如果不想记录请求日志,可以不安装该包。如果想启用EventBus记录请求日志,需要安装RabbitMQ nuget包Wing.RabbitMQ。


dotnet add package Wing.Consul

dotnet add package Wing.Gateway

dotnet add package Wing.RabbitMQ

dotnet add package Wing.SqlServer(可选Wing.MySql/Wing.Oracle/Wing.PostgreSQL)

Program代码


using Wing;

var builder = WebApplication.CreateBuilder(args);

builder.Host.AddWing(builder => builder.AddConsul());

// Add services to the container.

builder.Services.AddControllers();

builder.Services.AddWing()
            .AddPersistence()
            .AddGateWay()
            .AddEventBus();// 如果不想使用EventBus记录请求日志,可以删除此行代码

var app = builder.Build();

// Configure the HTTP request pipeline.

app.UseHttpsRedirection();

app.UseAuthorization();

app.MapControllers();

app.Run();

添加配置


{
  // 是否启用配置中心,默认启用
  "ConfigCenterEnabled": false,
  "Consul": {
    "Url": "http://localhost:8500",
    "Service": {
      //Http  Grpc
      "Option": "Http",
      "HealthCheck": {
        "Url": "http://localhost:1510/health",
        //单位:秒
        "Timeout": 10,
        //单位:秒
        "Interval": 10
      },
      "Name": "Wing.Demo_1.5",
      "Host": "localhost",
      "Port": 1510,
      "LoadBalancer": {
        //RoundRobin  WeightRoundRobin LeastConnection
        "Option": "WeightRoundRobin",
        //权重
        "Weight": 50
      },
      "Scheme": "http",
      "Developer": "linguicheng"
    },
    //定时同步数据时间间隔,单位:秒 小于等于0表示立即响应
    "Interval": 10,
    //数据中心
    "DataCenter": "dc1",
    //等待时间,单位:分钟
    "WaitTime": 3
  },
  "ConnectionStrings": {
    "Wing": "Data Source=192.168.56.96;User Id=sa;Password=wing123.;Initial Catalog=Wing;TrustServerCertificate=true;Pooling=true;Min Pool Size=1"
  },
  //自动同步实体结构到数据库
  "UseAutoSyncStructure": true,
  // 如果不启用EventBus,可以删除RabbitMQ配置
  "RabbitMQ": {
    "HostName": "192.168.56.99",
    "UserName": "admin",
    "Password": "admin",
    "VirtualHost": "/",
    "Port": 5672,
    //消息过期时间,单位:毫秒,过期会自动路由到死信队列,小于或等于0则永久有效
    "MessageTTL": 0,
    "ExchangeName": "Sample.GateWay",
    //每次投递消息数量
    "PrefetchCount": 1
  },
  "Gateway": {
    // 请求日志
    "Log": {
      // 是否启用网关日志记录
      "IsEnabled": true,
      // 是否启用事件总线(RabbitMQ)存储日志,生产环境推荐启用,可以提升程序的性能
      "UseEventBus": false
    }
  }
}

查看运行效果


  • 运行示例 1.2 并启动当前示例程序,浏览器访问
    http://localhost:1510/Wing.Demo_1.2/weatherforecastopen in new window ,运行效果如下图:


  • 运行示例 1.3,浏览器访问 http://localhost:1310/wing/index.html#/gateWayLogopen in new window ,可以看到网关请求日志,运行效果如下图:


本教程基于.NET微服务框架Wing, 项目地址:

gitee:

https://gitee.com/linguicheng/Wing

github:

https://github.com/linguicheng/Wing

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表