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

相关推荐
风铃儿~12 小时前
Java微服务线程隔离技术对比:线程池隔离 vs 信号量隔离
java·微服务·面试
18你磊哥14 小时前
java中使用微服务的痛点有哪些,怎么解决
java·开发语言·微服务
Pasregret14 小时前
05-微服务可观测性体系建设:从日志、监控到链路追踪实战指南
java·微服务·云原生·架构
菜鸟起航ing18 小时前
【Java面试系列】Spring Boot微服务架构下的分布式事务处理与性能优化详解 - 3-5年Java开发必备知识
java·spring boot·微服务·性能优化·分布式事务
极客先躯19 小时前
高级java每日一道面试题-2025年4月06日-微服务篇[Nacos篇]-如何诊断和解决Nacos中的常见问题?
java·开发语言·微服务
爱的叹息20 小时前
关于 Spring Boot 微服务解决方案的对比,并以 Spring Cloud Alibaba 为例,详细说明其核心组件的使用方式、配置及代码示例
spring boot·后端·微服务
帝锦_li20 小时前
微服务1--服务架构
分布式·微服务·系统架构
极客先躯1 天前
高级java每日一道面试题-2025年4月08日-微服务篇[Nacos篇]-生产环境中部署Nacos的最佳实践有哪些?
java·开发语言·微服务
AronTing1 天前
07-云原生安全深度剖析:从 Kubernetes 集群防护到微服务安全加固
spring·微服务·架构