当前位置:首页 > 技术 > 正文内容

微服务网关

访客 技术 2026年6月26日 1

一、网关基本概念

  1. 解耦 解耦能够使客户端与微服务独立扩展,服务端可随意增加而客户端无需感知。网关层可扩展的功能包括缓存和抗并发等。

  2. 分发 网关通过负载均衡算法将请求分发到不同实例,提升系统伸缩性。这与Nginx的理念相似,但定位不同。

二、使用网关的原因 从基本概念可知网关的作用。使用网关可解决服务管理复杂、扩展性差等问题。

  1. 问题背景 当服务实例数量庞大时,管理复杂度增加,服务间调用关系错综复杂,维护困难。

传统方式中,服务间的调用需手动修改负载均衡配置,违反开闭原则,降低系统可用性。

  1. 网关模型 网关可剥离缓存、负载均衡、鉴权、限流等功能,使微服务专注于业务处理。

两种网关模型:

  • 进程外:独立服务,推荐使用
  • 进程内:侵入业务,不建议使用

三、网关实现 使用Net Core和Ocelot实现进程外网关。

  1. 实现环境 实现步骤:
  2. 创建独立API服务作为网关
  3. 改造项目为Abp vNEXT项目
  4. 集成Ocelot并修改配置文件
  5. 创建HttpApi并引用到网关项目
  6. 修改网关模块类配置

基本概念:

  • 上游Upstream:请求地址
  • 下游Downstream:服务地址

通过Nuget安装相关包: NuGet包安装

添加中间件:

context.Services.AddOcelot(context.Services.GetConfiguration());
app.UseOcelot().Wait();

添加服务引用:

[DependsOn(
   typeof(AbpAutofacModule),
   typeof(OrderHttpApiModule),
   typeof(ProductHttpApiModule)
)]
public class InternalGatewayModule : AbpModule
{ }

配置appsettings.json:

"Routes": [
  {
    "DownstreamPathTemplate": "/api/OrderService/{everything}",
    "DownstreamScheme": "https",
    "DownstreamHostAndPorts": [
      {
        "Host": "localhost",
        "Port": 44361
      }
    ],
    "UpstreamPathTemplate": "/api/OrderService/{everything}",
    "UpstreamHttpMethod": [ "Put", "Delete", "Get", "Post" ]
  },
  {
    "DownstreamPathTemplate": "/api/ProductService/{everything}",
    "DownstreamScheme": "https",
    "DownstreamHostAndPorts": [
      {
        "Host": "localhost",
        "Port": 44372
      }
    ],
    "UpstreamPathTemplate": "/api/ProductService/{everything}",
    "UpstreamHttpMethod": [ "Put", "Delete", "Get", "Post" ]
  }
],
"GlobalConfiguration": {
  "BaseUrl": "https://localhost:44329"
},

配置Swagger:

context.Services.AddSwaggerGen(c =>
{
      c.SwaggerDoc("v1", new OpenApiInfo { Title = "InternalGateway.Services", Version = "v1" });
      c.DocInclusionPredicate((docName,description)=>true);
      c.CustomSchemaIds(t=>t.FullName);
});
  1. 负载均衡 Ocelot支持轮询和最小连接数两种算法。配置示例:
"LoadBalancerOptions": {
  "Type": "RoundRobin"
}
  1. 自定义负载均衡 实现自定义随机算法:
public class RandomLoadBalancer : ILoadBalancer
{
    private readonly Func<Task<List<Service>>> _services;

    private readonly object _lock = new object();

    private int _last;

    public RandomLoadBalancer(Func<Task<List<Service>>> services)
    {
        _services = services;
    }

    public async Task<Response<ServiceHostAndPort>> Lease(HttpContext httpContext)
    {
        var service = await _services();
        lock (_lock)
        {
            Random random = new Random();
            int randomNum = random.Next(service.Count);
            var next = service[randomNum];
            return new OkResponse<ServiceHostAndPort>(next.HostAndPort);
        }
    }

    public void Release(ServiceHostAndPort hostAndPort)
    {
        throw new System.NotImplementedException();
    }
}
  1. 限流 配置限流:
"RateLimitOptions": {
  "ClientWhitelist": [],
  "EnableRateLimiting": true,
  "Period": "10s",
  "PeriodTimespan": 1,
  "Limit": 1
}
  1. 熔断 使用Polly实现熔断:
"QoSOptions": {
  "ExceptionsAllowedBeforeBreaking": 3,
  "DurationOfBreak": 500,
  "TimeoutValue": 5000
}
  1. 路由缓存 配置缓存:
"FileCacheOptions":
{
"TtlSeconds": 15,
"Region": "somename"
}
标签: 微服务

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。