ASP.NET 微服务网关 Ocelot+Consul+Skywalking

ASP.NET 微服务网关 Ocelot+Consul+Skywalking

APIGateWaySample

Ocelot + Consul + Skywalking

简介

系统设计图

网关

API网关(Gateway)是一个服务器,是系统的唯一入口。从面向对象设计的角度看,它与外观模式类似。API网关封装了系统内部架构,为每个客户端提供一个定制的API。它可能还具有其它职责,如身份验证、监控、负载均衡、缓存、限流等。

相关技术

核心
  • Ocelot轻量级的.NET API网关
  • Consul:服务发现和配置管理
  • Skywalking:分布式系统的APM(应用性能监控)工具
其它
  • Serilog:日志。网关使用Serilog,将结构化的日志信息存储到ES(Elastic Search),便于分析处理。
  • Elasticsearch :是一个分布式、RESTful风格的搜索和分析引擎,具有以下特点:
    • 分布式实时文件存储,每个字段都被索引并可被搜索
    • 分布式实时分析搜索引擎
    • 可以扩展到上百台服务器,处理PB级结构化或非结构化数据
    • 在本项目中主要用于存储和分析系统日志数据

请求处理流程

  • 用户请求API网关,网关根据Ocelot配置,处理和转发到下游服务(Service1,Service2...)。
  • 各个服务注册到Consul,API网关通过服务发现的方式,向Consul请求下游服务的信息,从来实现转发。
  • 网关等所有服务,集成到Skywalking,通过Skywalking监控应用的性能,包括调用链路,响应时间,异常等。

环境搭建

ES: 默认端口 9200

ES Head: 默认端口 9100

Skywalking: WEB默认端口 9091

Consul: 默认端口8500,设置好环境变量后,本地开发模式启动命令:consul agent -dev -node=127.0.0.1

代码

包:

  • Ocelot 23.4.3 :网关组件
    ocelot.json
json 复制代码
{
  "Routes": [
    {
      "UseServiceDiscovery": true,
      "DownstreamPathTemplate": "/{abc}",
      "DownstreamScheme": "http",
      "ServiceName": "service1",
      "LoadBalancerOptions": { "Type": "RoundRobin" },
      "UpstreamPathTemplate": "/service1/{abc}",
      "UpstreamHttpMethod": [ "Get", "Post" ],
      "ReRoutesCaseSensitive": false
    }
  ],
  "GlobalConfiguration": {
    "BaseUrl": "http://localhost:8000",
    "ServiceDiscoveryProvider": {
      "Scheme": "http",
      "Host": "localhost",
      "Port": 8500,
      "Type": "Consul",
      "ConfigurationKey": "node-1"
    },
    "Logging": {
      "LogLevel": {
        "Default": "Trace"
      }
    }
  }
}
  • Ocelot.Provider.Consul 23.4.3:Consul服务发现,使网关可以通过Consul服务发现下游服务,从而正确转发请求
  • Consul 1.7.14.7:服务注册,将网关服务注册到Consul
  • SkyAPM.Agent.AspNetCore 2.2.0 :集成到Skywalking
    skyapm.json
json 复制代码
{
  "SkyWalking": {
    "ServiceName": "api-gateway",
    "Namespace": "",
    "HeaderVersions": [
      "sw8"
    ],
    "Sampling": {
      "SamplePer3Secs": -1,
      "Percentage": -1.0
    },
    "Logging": {
      "Level": "Information",
      "FilePath": "logs\\skyapm-{Date}.log"
    },
    "Transport": {
      "Interval": 3000,
      "ProtocolVersion": "v8",
      "QueueSize": 30000,
      "BatchSize": 3000,
      "gRPC": {
        "Servers": "127.0.0.1:11800",
        "Timeout": 10000,
        "ConnectTimeout": 10000,
        "ReportTimeout": 600000,
        "Authentication": ""
      }
    }
  }
}

Program.cs引入配置文件

csharp 复制代码
builder.Configuration.AddJsonFile("ocelot.json")
    .AddJsonFile($"ocelot.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json", optional: true);
builder.Configuration.AddJsonFile("skyapm.json")
    .AddJsonFile($"skyapm.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json", optional: true);
builder.Configuration.AddJsonFile("serilog.json")
    .AddJsonFile($"serilog.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json", optional: true);
builder.Configuration.AddJsonFile("consul.json")
    .AddJsonFile($"consul.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json", optional: true);

使用网关和服务发现

csharp 复制代码
builder.Services.AddOcelot()
    .AddConsul(); //Consul 服务发现
builder.Services.AddHealthChecks();
...
await app.UseOcelot();

使用skywalking

csharp 复制代码
builder.Services.AddSkyApmExtensions();

运行效果图



源码: gitee地址 git地址

相关推荐
武子康4 小时前
Java-80 深入浅出 RPC Dubbo 动态服务降级:从雪崩防护到配置中心秒级生效
java·分布式·后端·spring·微服务·rpc·dubbo
工藤新一OL13 小时前
把xml的格式从utf-8-bom转为utf-8
xml·c#·asp.net·.netcore·visual studio
guojl15 小时前
MyBatis最佳实践
后端·微服务·mybatis
小裕哥略帅17 小时前
架构师--基于常见组件的微服务场景实战
微服务·云原生·架构
鼠鼠我捏,要死了捏20 小时前
高并发微服务限流算法方案对比与实践指南
微服务·高并发·限流
武子康1 天前
Java-82 深入浅出 MySQL 内部架构:服务层、存储引擎与文件系统全覆盖
java·开发语言·数据库·学习·mysql·spring·微服务
曾经的三心草2 天前
微服务的编程测评系统6-管理员登录前端-前端路由优化
前端·微服务·状态模式
失散132 天前
大型微服务项目:听书——10 缓存+分布式锁优化根据专辑id查询专辑详情接口
redis·分布式·缓存·微服务
失散132 天前
大型微服务项目:听书——11 Redisson分布式布隆过滤器+Redisson分布式锁改造专辑详情接口
分布式·缓存·微服务·架构·布隆过滤器
步、步、为营3 天前
.NET 8使用牛逼的AOT发布ASP.NET Core应用
ui·asp.net·.net