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查看效果
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)