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地址

相关推荐
阿里云云原生15 小时前
阿里云微服务引擎 MSE 及 API 网关 2025 年 10 月产品动态
阿里云·微服务·云原生·云计算
Tadas-Gao16 小时前
MySQL存储架构解析:从数据无序到索引艺术的演进
数据库·分布式·mysql·微服务·云原生·架构
CV_J16 小时前
编写微服务api
微服务·云原生·架构
黄暄19 小时前
微服务面试题(14题)
java·spring cloud·微服务·架构·java-rabbitmq·java-zookeeper
忙碌54419 小时前
智能应用开发指南:深度学习、大数据与微服务的融合之道
大数据·深度学习·微服务
小冯的编程学习之路20 小时前
【C++】:C++基于微服务的即时通讯系统(2)
开发语言·c++·微服务
IT小哥哥呀1 天前
Jenkins + Docker 打造自动化持续部署流水线
docker·微服务·自动化·jenkins·springboot·高并发·限流
虾米Life1 天前
基于微服务脚手架的视频点播系统 (仿B站) [客户端] -1
c++·qt·微服务·架构
悠闲蜗牛�1 天前
智能时代技术融合之道:大模型、微服务与数据安全的系统化实践
微服务·云原生·架构
qq_12498707532 天前
基于C#的贵州省黔北地区乡村避暑生活共享平台设计与实现(源码+论文+部署+安装)
c#·毕业设计·asp.net·生活