Windows11搭建APISIX网关,启用Skywalking插件

前言

需要先安装Docker Desktop和git,本文是基于docker进行操作的,Docker Desktop的安装步骤略过。

一、搭建APISIX网关

1.拉取apisix-docker仓库

git clone https://github.com/apache/apisix-docker.git
cd apisix-docker/example

2.修改配置文件 config.yaml,注意如果你的项目不需要路由改写,那么proxy-rewrite这个插件可以不用加

apisix:
    admin_key:
      - 
        name: "admin"
        key: my_apisix_key #修改自己的key值
        role: admin  

plugins:
  - proxy-rewrite       # plugin you need
  - skywalking          # 启用skywalking插件


#配置skywalking的属性
plugin_attr:
  skywalking:
    service_name: APISIX_GATEWAY
    service_instance_name: "APISIX_INSTANCE_GATEWAY"
    endpoint_addr: http://127.0.0.1:12800  #skywalking的地址,本机默认是这个,可自行修改

3.使用docker-compose启用APISIX

docker-compose -p docker-apisix up -d

可以看到APISIX已经成功启动了,打开链接 http://localhost:9000 可以进入dashboard界面,默认的账号密码都是admin

二、创建.Net6 api服务

1.新建Asp.NET Core Web API 项目,添加控制器HomeController,并且添加方法GetUserInfo(会根据发布的端口号,区分不同的服务)

[Route("[controller]")]
[ApiController]
public class HomeController : ControllerBase
{
    [HttpGet("UserInfo")]
    public string GetUserInfo()
    {
        return $"[端口号:{HttpContext.Connection.LocalPort}]姓名:张三,年龄:18岁";   
    }
}

2.发布项目,并启动3个站点。(指定不同的端口进行发布)

注意,需要先配置系统的环境变量,否则Skywalking注入失败

dotnet .\API2.dll --urls=http://0.0.0.0:38081
dotnet .\API2.dll --urls=http://0.0.0.0:38082
dotnet .\API2.dll --urls=http://0.0.0.0:38083

三、APISIX搭建负载均衡

1.创建上游服务

2.创建路由,这里用正则改写了路由

{
  "uri": "/my_service/*",
  "name": "test我的服务",
  "methods": [
    "GET",
    "POST",
    "PUT",
    "DELETE",
    "PATCH",
    "HEAD",
    "OPTIONS",
    "CONNECT",
    "TRACE"
  ],
  "plugins": {
    "proxy-rewrite": {
      "regex_uri": [
        "^/my_service/(.*)",
        "/$1"
      ]
    }
  },
  "upstream_id": "415311501834846916",
  "status": 1
}

现在这个服务就算是搭建完毕了,可以发起请求看下效果 http://127.0.0.1:9080/my_service/home/userinfo

3个站点会轮询结果

[端口号:38081]姓名:张三,年龄:18[端口号:38082]姓名:张三,年龄:18[端口号:38083]姓名:张三,年龄:18

四、搭建Skywalking

1.搭建skywalking-oap服务,这里用的是8.9.1版本,oap服务需要关联ES

说明:因为我已经有现成的es环境,所以就直接用了。你可以用docker运行es,然后SW_STORAGE_ES_CLUSTER_NODES=19.133.60.117:9200改成你对应的es地址

docker启动es

docker run -d -p 9200:9200 -p 9300:9300 --name es -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms128m -Xmx256m" elasticsearch:7.16.3

docker启动 skywalking-oap

docker run --name skywalking-oap --restart always -p 11800:11800 -p 12800:12800 -d -e TZ=Asia/Shanghai  -e SW_ES_USER=  -e SW_ES_PASSWORD=  -e SW_STORAGE=elasticsearch  -e SW_STORAGE_ES_CLUSTER_NODES=19.133.60.117:9200  -v /etc/localtime:/etc/localtime:ro  apache/skywalking-oap-server:8.9.1

2.搭建skywalking-ui界面,需要关联oap服务

docker run -d --name skywalking-ui --restart always -p 28080:8080 --link skywalking-oap:skywalking-oap -e TZ=Asia/Shanghai  -e SW_OAP_ADDRESS=http://skywalking-oap:12800  -v /etc/localtime:/etc/localtime:ro  apache/skywalking-ui:8.9.1

搭建完成,打开127.0.0.1:28080查看skywalking界面

3.服务接入Skywalking

3.1.安装Nuget包 SkyAPM.Agent.AspNetCore

3.2.launchSettings.json增加环境变量(windows发布后,这个设置会无效,需要添加系统环境变量)

"ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "SkyAPM.Agent.AspNetCore",
"SKYWALKING__SERVICENAME": "API2_UserService" // 必须配置,在skywalking做标识,服务名称

3.3.在项目根目录新增skywalking.json,设置较新复制到输出目录,然后修改ServiceName设置为项目名,和上面的SKYWALKING__SERVICENAME一致

{
  "SkyWalking": {
    "ServiceName": "API2_UserService",
    "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": ""
      }
    }
  }
}

这时候运行项目已经有基本的链路追踪功能了!

启动api项目,发起请求 /home/userinfo ,在skywalking刷新下,可以看到已经追踪到请求了

仪表盘

追踪

五、自定义链路日志

自定义链路日志可以在重要的地方加上,这样就能知道程序跑到这个地方时的关键信息了。

1.添加过滤器进行拦截,注入IEntrySegmentContextAccessor(SkyApm.Tracing)。

/// <summary>
/// 请求日志拦截
/// </summary>
public class RequestActionFilter : IAsyncActionFilter
{
    private readonly IEntrySegmentContextAccessor _segContext;

    public RequestActionFilter(IEntrySegmentContextAccessor segContext)
    {
        _segContext = segContext;
    }

    public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
    {
        var httpContext = context.HttpContext;
        var httpRequest = httpContext.Request;

        _segContext.Context.Span.AddLog(LogEvent.Message($"入参:{JsonConvert.SerializeObject(context.ActionArguments.Count < 1 ? "" : context.ActionArguments)}"));
        var sw = new Stopwatch();
        sw.Start();
        var actionContext = await next();
        sw.Stop();
        // 记录异常
        if (actionContext.Exception != null)
        {
            _segContext.Context.Span.AddLog(LogEvent.Message($"出异常:{actionContext.Exception.Message}"));
        }
        else
        {
            _segContext.Context.Span.AddLog(LogEvent.Message($"请求耗时:{sw.ElapsedMilliseconds}毫秒"));
            string result = "";
            if (actionContext.Result?.GetType() == typeof(JsonResult))
            {
                result = JsonConvert.SerializeObject(actionContext.Result);
            }
            else if (actionContext.Result is ObjectResult objectResult && objectResult != null)
            {
                result = JsonConvert.SerializeObject(objectResult.Value);
            }
            _segContext.Context.Span.AddLog(LogEvent.Message($"返回结果:{result}"));
        }
    }
}

2.在HomeController添加拦截。

3.调用/home/userinfo后,在Skywalking可以看到了程序添加的日志

六、多服务追踪

链路追踪在多服务的时候才能体现它的精髓,一个链路能跟踪到请求涉及的所有服务。

1.新增接口 /home/tracing

[HttpGet("Tracing")]
public async Task<string> Tracing()
{
    var httpClient = new HttpClient();
    var response = await httpClient.GetStringAsync("http://localhost:9080/my_service/home/userinfo");
    return response;
}

2.调用接口/home/tracing后在skywalking查看效果

在链路追踪里面,可以看到服务之间对应的调用关系

七、APISIX接入Skywalking

1.进入apisix控制台,进入路由页面,找到test我的服务添加插件skywalking

2.发起请求/home/tracing,进去skywalking查看效果

posted @   蹲坑思考人生  阅读(2337)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示