Add XCode skills for entity caching, ORM, and sharding ETL
|
---
name: stardust-platform
description: >
使用 NewLife.Stardust æŽ¥å…¥æ˜Ÿå°˜åˆ†å¸ƒå¼æœåС平å°ï¼Œæ¶µç›– StarFactory 统一接入入å£ã€
æœåŠ¡æ³¨å†Œä¸Žå‘现(IRegistry)ã€é…ç½®ä¸å¿ƒï¼ˆstar.Config → IConfigProvider)ã€
APM 性能追踪(StarTracer + 全链路诊æ–监å¬å™¨ï¼‰ã€åº”用心跳监控,
ä»¥åŠ IoC 集æˆï¼ˆAddStardust/UseStardust)和 StarAgent 守护进程接入。
适用于微æœåŠ¡æ³¨å†Œå‘现ã€é›†ä¸é…置管ç†ã€åˆ†å¸ƒå¼é“¾è·¯è¿½è¸ªã€åº”用è¿ç»´ç›‘控ç‰åœºæ™¯ã€‚
argument-hint: >
è¯´æ˜Žä½ çš„æ˜Ÿå°˜ä½¿ç”¨åœºæ™¯ï¼šæœåŠ¡æ³¨å†Œå‘现ã€é…ç½®ä¸å¿ƒã€æ€§èƒ½ç›‘控(APM)ã€
还是以上全部;是å¦é›†æˆåœ¨ ASP.NET Core ä¸ï¼›
是å¦éœ€è¦é€šè¿‡ StarAgent 接入本地代ç†ï¼›
é…ç½®ä¸å¿ƒæ˜¯å¦éœ€è¦çƒæ›´æ–°ã€‚
---
# æ˜Ÿå°˜åˆ†å¸ƒå¼æœåŠ¡å¹³å°æŠ€èƒ½ï¼ˆNewLife.Stardust)
## 适用场景
- å¾®æœåŠ¡æž¶æž„ä¸é€šè¿‡æ˜Ÿå°˜æ³¨å†Œä¸å¿ƒå®žçްæœåŠ¡æ³¨å†Œã€å‘现与负载å‡è¡¡ã€‚
- 集ä¸ç®¡ç†å¤šå¥—环境(开å‘/测试/生产)é…置,支æŒåЍæ€çƒæ›´æ–°æ— 需é‡å¯ã€‚
- æœåŠ¡é—´è°ƒç”¨é“¾è·¯è¿½è¸ªï¼ˆAPM),自动采集 HTTP/SQL/EF Core/gRPC/MQ 调用链。
- 应用心跳监控:CPU å 用ã€å†…å˜ã€çº¿ç¨‹ã€GC ç‰æŒ‡æ ‡å®šæœŸä¸ŠæŠ¥åˆ°æ˜Ÿå°˜å¹³å°ã€‚
- ASP.NET Core 应用快速接入(`AddStardust`ï¼‰ï¼Œä¸æ”¹ä¸šåС代ç 实现全链路å¯è§‚测性。
- StarAgent 守护进程接管应用部署ã€è¿›ç¨‹ç›‘控ã€è¿œç¨‹å‘布。
## æ ¸å¿ƒåŽŸåˆ™
1. **`StarFactory` 是唯一的接入入å£**:通过 `new StarFactory(server, appId, secret)` 或 `AddStardust()` 获å–ï¼›ä¸è¦ç›´æŽ¥ `new StarClient()`/`new AppClient()`,内部åˆå§‹åŒ–é¡ºåºæœ‰ä¾èµ–。
2. **é…ç½®åŠ è½½ä¼˜å…ˆçº§ï¼ˆé«˜â†’ä½Žï¼‰**ï¼šæž„é€ å‚æ•° > `appsettings.json` çš„ `Star` 节 > 本机 StarAgent(UDP 5500)> `star.config` 文件;生产环境推è用 `appsettings.json`,本地开å‘通过 StarAgent è‡ªåŠ¨èŽ·å–æœåŠ¡ç«¯åœ°å€ã€‚
3. **`star.Config` 返回 `IConfigProvider`,与本地é…置统一接å£**:é…ç½®ä¸å¿ƒçš„ key 通过 `star.Config["Key"]` 读å–ï¼›å¯ä¸Ž `appsettings.json` 组åˆä½¿ç”¨ï¼ˆåŒä¸€æŽ¥å£ï¼Œæ˜Ÿå°˜é…置优先级å¯è°ƒæ•´ï¼‰ã€‚
4. **APM 追踪调用 `DiagnosticListenerObserver.Install()` 一次å³å¯**:安装åŽè‡ªåŠ¨ç›‘å¬ ASP.NET Core/HttpClient/EF Core/SQL/gRPC ç‰ï¼Œæ— 需在æ¯ä¸ªè°ƒç”¨ç‚¹æ‰‹åŠ¨åŸ‹ç‚¹ï¼›ä»…éœ€åœ¨å…³é”®ä¸šåŠ¡æ“作处用 `tracer.NewSpan()` 补充自定义 span。
5. **æœåŠ¡å‘现消费返回地å€åˆ—表,调用方负责负载å‡è¡¡**:`registry.Consume("UserService")` 返回该æœåŠ¡å…¨éƒ¨å¯ç”¨å®žä¾‹åœ°å€ï¼›ç»“åˆ `NewLife.Http.HttpClient` 或手动轮询实现客户端负载å‡è¡¡ã€‚
6. **StarAgent 是 NewLife.Agent 的增强版本**:`StarAgent` 基于 `ServiceBase` 构建,é¢å¤–æä¾›è¿›ç¨‹å®ˆæŠ¤ã€è¿œç¨‹å‘布ã€èŠ‚ç‚¹ç›‘æŽ§é‡‡é›†ï¼›éƒ¨ç½² StarAgent åŽï¼Œæœ¬åœ°åº”用å¯é€šè¿‡ UDP 5500 è‡ªåŠ¨èŽ·å–æ˜Ÿå°˜æœåŠ¡ç«¯åœ°å€ï¼ˆæ— 需硬编ç )。
## 执行æ¥éª¤
### ä¸€ã€æŽ§åˆ¶å°/Worker 应用接入
```csharp
using NewLife.Stardust;
// æ–¹å¼ 1:显å¼å‚数(指定星尘æœåŠ¡ç«¯ï¼‰
var star = new StarFactory("http://stardust.example.com:6600", "MyApp", "secret");
// æ–¹å¼ 2:自动å‘现(本机有 StarAgent 时自动获å–地å€ï¼‰
var star = new StarFactory(); // ä»ŽçŽ¯å¢ƒè‡ªåŠ¨è¯»å–æœåŠ¡ç«¯åœ°å€
// 获å–å„功能入å£
var registry = star.Registry; // æœåŠ¡æ³¨å†Œå‘现
var config = star.Config; // é…ç½®ä¸å¿ƒ
var tracer = star.Tracer; // APM 性能追踪
// 使用é…ç½®ä¸å¿ƒè¯»å–é…ç½®
var dbConn = config["ConnectionStrings:Default"];
// å‘布自身æœåŠ¡ï¼ˆæ³¨å†Œåˆ°æ³¨å†Œä¸å¿ƒï¼‰
registry.Register("OrderService", "http://192.168.1.10:5001");
// åº”ç”¨é€€å‡ºæ—¶å–æ¶ˆæ³¨å†Œï¼ˆå»ºè®®æ”¾åœ¨ IDisposable ä¸ï¼‰
registry.Unregister("OrderService");
```
### 二ã€ASP.NET Core 集æˆï¼ˆæŽ¨è)
```csharp
// Program.cs
var builder = WebApplication.CreateBuilder(args);
// ä¸€è¡Œä»£ç æŽ¥å…¥æ˜Ÿå°˜ï¼ˆæ³¨å†Œå‘现 + é…ç½®ä¸å¿ƒ + APM)
var star = builder.AddStardust("OrderService");
// 自动完æˆï¼š
// 1. 将本æœåŠ¡æ³¨å†Œåˆ°æ˜Ÿå°˜æ³¨å†Œä¸å¿ƒ
// 2. 接入é…ç½®ä¸å¿ƒï¼ˆstar.Config åˆå¹¶åˆ° IConfiguration)
// 3. 安装 APM 诊æ–监å¬å™¨ï¼ˆè‡ªåŠ¨è¿½è¸ª HTTP/SQL/EF)
// 4. 定期心跳上报 CPU/内å˜ç‰è¿è¡ŒæŒ‡æ ‡
builder.Services.AddControllers();
var app = builder.Build();
app.MapControllers();
app.Run();
```
### 三ã€appsettings.json é…ç½®
```json
{
"Star": {
"Server" : "http://stardust.example.com:6600",
"AppKey" : "OrderService",
"Secret" : "your-secret",
"TracerPeriod" : 60,
"MaxSamples" : 1,
"MaxErrors" : 10,
"Debug" : false
}
}
```
### å››ã€æœåŠ¡æ³¨å†Œä¸Žå‘现
```csharp
// å‘布(注册自身)
var registry = star.Registry;
registry.Register("OrderService", "http://192.168.1.10:5001");
// 消费(å‘现其他æœåŠ¡ï¼‰
var addresses = await registry.ConsumeAsync("UserService");
// addresses: ["http://192.168.1.20:5002", "http://192.168.1.21:5002"]
// 客户端负载å‡è¡¡ï¼ˆç®€å•轮询)
var idx = Interlocked.Increment(ref _roundRobinIndex);
var addr = addresses[idx % addresses.Length];
// 使用 NewLife.Http é…åˆå¤šåœ°å€è‡ªåŠ¨æ•…éšœåˆ‡æ¢
var client = new HttpClient { BaseAddress = new Uri(addr) };
var result = await client.GetStringAsync("/api/users/1");
```
### 五ã€é…ç½®ä¸å¿ƒä½¿ç”¨
```csharp
// 读å–é…置(与 IConfiguration 接å£ä¸€è‡´ï¼‰
var config = star.Config;
var dbConn = config["DbConn"];
var timeout = config["Timeout"].ToInt(30);
// 订阅é…ç½®å˜æ›´ï¼ˆçƒæ›´æ–°ï¼‰
config.OnChanged += (k, v) =>
{
XTrace.WriteLine($"é…置已更新: {k} = {v}");
// 釿–°åº”用é…ç½®
};
// 在 DI ä¸ä½¿ç”¨ï¼ˆIConfiguration æ–¹å¼ï¼‰
builder.Configuration.AddStardust(star);
// ç„¶åŽé€šè¿‡æ ‡å‡† IConfiguration 读å–
var connStr = configuration.GetConnectionString("Default");
```
### å…ã€APM 性能追踪
```csharp
// æ–¹å¼ 1:自动安装(推è,覆盖全部框架埋点)
// 在 AddStardust æ—¶è‡ªåŠ¨è°ƒç”¨ï¼Œæ— éœ€æ‰‹åŠ¨
DiagnosticListenerObserver.Install();
// æ–¹å¼ 2:手动自定义 Span(业务关键路径补充)
var tracer = star.Tracer;
using var span = tracer.NewSpan("ProcessOrder");
span.Tag = orderId.ToString();
try
{
// 业务逻辑
ProcessOrderInternal(orderId);
}
catch (Exception ex)
{
span.SetError(ex, null); // æ ‡è®°é”™è¯¯å¹¶è®°å½•å¼‚å¸¸
throw;
}
// 自动追踪的框架(安装 DiagnosticListenerObserver åŽï¼‰ï¼š
// - ASP.NET Core 请求(入站 HTTP)
// - HttpClient(出站 HTTP)
// - EF Core / ADO.NET SQL 查询
// - gRPC 调用
// - MongoDB æ“作
// - DNS 查询 / TCP 连接
```
### 七ã€é€šè¿‡ StarAgent 接入(推è生产部署)
```bash
# 1. 机器上部署 StarAgent(一次性)
dotnet StarAgent.dll -install
# StarAgent ç›‘å¬ UDP 5500,应用自动å‘现星尘æœåŠ¡ç«¯åœ°å€
# 2. 应用代ç ä¸ç›´æŽ¥ç”¨è‡ªåЍå‘现模å¼
# var star = new StarFactory(); // 自动从本机 StarAgent èŽ·å–æœåŠ¡ç«¯åœ°å€
# æ— éœ€åœ¨ä»£ç æˆ–é…置文件ä¸ç¡¬ç¼–ç æ˜Ÿå°˜æœåŠ¡ç«¯åœ°å€
```
### å…«ã€StarAgent 作为应用守护进程
```csharp
// StarAgent 基于 NewLife.Agent 的 ServiceBase 构建
// 应用åªéœ€è¦ä»¥ NewLife.Agent æ–¹å¼æ‰“包,StarAgent 接管进程生命周期:
// - 进程异常退出自动é‡å¯
// - 远程触å‘å‘布新版本
// - 采集 CPU/内å˜/ç½‘ç»œæŒ‡æ ‡ä¸ŠæŠ¥åˆ°æ˜Ÿå°˜å¹³å°
// - 支æŒé€šè¿‡æ˜Ÿå°˜å¹³å° Web 界é¢è¿œç¨‹æŸ¥çœ‹æ—¥å¿—和执行命令
// å…·ä½“è§ agent-service 技能ä¸çš„ ServiceBase 用法
```
## StarFactory 功能入å£é€ŸæŸ¥
| 属性 | 类型 | 说明 |
|------|------|------|
| `star.Registry` | `IRegistry` | æœåŠ¡æ³¨å†Œä¸Žå‘现 |
| `star.Config` | `IConfigProvider` | é…ç½®ä¸å¿ƒï¼ˆä¸Ž IConfiguration 统一接å£ï¼‰ |
| `star.Tracer` | `ITracer` | APM 性能追踪(NewSpan/StartSpan) |
| `star.Client` | `IApiClient` | 星尘原始 HTTP 客户端(低级 API) |
| `star.Dust` | `AppClient` | åº”ç”¨å®¢æˆ·ç«¯ï¼ˆå¿ƒè·³ã€æœåŠ¡æ³¨å†Œçš„åº•å±‚å®žçŽ°ï¼‰ |
## é…ç½®å‚æ•°é€ŸæŸ¥
| 傿•° | 说明 | 默认值 |
|------|------|--------|
| `Server` | 星尘æœåŠ¡ç«¯åœ°å€ | 空(从 StarAgent/环境å˜é‡è¯»å–) |
| `AppKey` | åº”ç”¨å”¯ä¸€æ ‡è¯† | å…¥å£ç¨‹åºé›†åç§° |
| `Secret` | 应用密钥(鉴æƒï¼‰ | 空 |
| `TracerPeriod` | 追踪数æ®ä¸ŠæŠ¥é—´éš”(秒) | `60` |
| `MaxSamples` | æ¯å‘¨æœŸæœ€å¤§æ£å¸¸é‡‡æ ·æ•° | `1` |
| `MaxErrors` | æ¯å‘¨æœŸæœ€å¤§é”™è¯¯é‡‡æ ·æ•° | `10` |
| `Debug` | 调试模å¼ï¼ˆè¾“出原始请求) | `false` |
## 自动追踪覆盖范围
| 组件 | 监å¬å™¨ç±» | 追踪点 |
|------|---------|--------|
| ASP.NET Core | `AspNetCoreDiagnosticListener` | HTTP 入站请求 |
| HttpClient | `HttpDiagnosticListener` | HTTP 出站调用 |
| EF Core | `EfCoreDiagnosticListener` | SQL 查询 |
| ADO.NET | `SqlClientDiagnosticListener` | SQL 执行 |
| gRPC | `GrpcDiagnosticListener` | gRPC 调用 |
| MongoDB | `MongoDbDiagnosticListener` | æ•°æ®åº“æ“作 |
| Socket/TCP | `SocketEventListener` | 网络连接 |
| DNS | `DnsEventListener` | 域åè§£æž |
## 常è§é”™è¯¯ä¸Žæ³¨æ„事项
- **`AppKey` 相åŒçš„多个实例会被视为åŒä¸€æœåŠ¡çš„å¤šä¸ªèŠ‚ç‚¹**:åŒä¸€æœåŠ¡çš„æ‰€æœ‰å®žä¾‹ä½¿ç”¨ç›¸åŒ `AppKey`,注册ä¸å¿ƒè‡ªåŠ¨è¯†åˆ«ä¸ºåŒä¸€æœåŠ¡çš„ä¸åŒå‰¯æœ¬ï¼Œå‚与负载å‡è¡¡ã€‚
- **é…ç½®ä¸å¿ƒå˜æ›´ä¸æ˜¯å®žæ—¶æŽ¨é€è€Œæ˜¯è½®è¯¢**:默认 60 秒轮询一次;ä¸è¦åœ¨çƒè·¯å¾„ä¸å‡è®¾é…ç½®å€¼æ¯«ç§’çº§åŒæ¥ï¼Œè®¾è®¡æ—¶åº”å…è®¸çŸæš‚的「旧值ã€çª—å£ã€‚
- **StarAgent UDP 5500 端å£éœ€å¼€æ”¾é˜²ç«å¢™**:应用通过 UDP 5500 探测本机 StarAgent èŽ·å–æœåŠ¡ç«¯åœ°å€ï¼›å®¹å™¨åŒ–éƒ¨ç½²æ—¶éœ€æ˜ å°„è¯¥ç«¯å£æˆ–通过环境å˜é‡ `STAR_SERVER` 指定地å€ã€‚
- **`DiagnosticListenerObserver.Install()` åªè°ƒç”¨ä¸€æ¬¡**:é‡å¤è°ƒç”¨ä¼šæ³¨å†Œå¤šä¸ªç›‘å¬å™¨ï¼Œå¯¼è‡´è¿½è¸ªæ•°æ®é‡å¤ä¸ŠæŠ¥ï¼Œå¢žåŠ å¹³å°å˜å‚¨åŽ‹åŠ›ã€‚
- **é…ç½®ä¸å¿ƒ key 区分大å°å†™**:星尘é…ç½®ä¸å¿ƒçš„ key 大å°å†™æ•æ„Ÿï¼›è¯»å– `dbConn` 与 `DbConn` 是两个ä¸åŒçš„ key。
- **`secret` ä¸ºç©ºæ—¶æ‰€æœ‰åº”ç”¨å¯æŽ¥å…¥**:开å‘环境å¯çœç•¥ secret;生产环境必须é…ç½®å¯†é’¥ï¼Œé˜²æ¢æœªæŽˆæƒåº”用注册到注册ä¸å¿ƒæ±¡æŸ“æœåŠ¡åˆ—è¡¨ã€‚
|