@dangao/bun-server 1.3.0 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (153) hide show
  1. package/README.md +15 -0
  2. package/dist/config/config-module.d.ts +17 -0
  3. package/dist/config/config-module.d.ts.map +1 -1
  4. package/dist/config/service.d.ts +18 -1
  5. package/dist/config/service.d.ts.map +1 -1
  6. package/dist/config/types.d.ts +25 -0
  7. package/dist/config/types.d.ts.map +1 -1
  8. package/dist/controller/controller.d.ts +5 -0
  9. package/dist/controller/controller.d.ts.map +1 -1
  10. package/dist/core/application.d.ts +42 -1
  11. package/dist/core/application.d.ts.map +1 -1
  12. package/dist/core/context.d.ts +1 -0
  13. package/dist/core/context.d.ts.map +1 -1
  14. package/dist/core/server.d.ts +33 -1
  15. package/dist/core/server.d.ts.map +1 -1
  16. package/dist/index.d.ts +6 -0
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +6510 -4164
  19. package/dist/microservice/config-center/config-center-module.d.ts +43 -0
  20. package/dist/microservice/config-center/config-center-module.d.ts.map +1 -0
  21. package/dist/microservice/config-center/decorators.d.ts +58 -0
  22. package/dist/microservice/config-center/decorators.d.ts.map +1 -0
  23. package/dist/microservice/config-center/index.d.ts +9 -0
  24. package/dist/microservice/config-center/index.d.ts.map +1 -0
  25. package/dist/microservice/config-center/nacos-config-center.d.ts +37 -0
  26. package/dist/microservice/config-center/nacos-config-center.d.ts.map +1 -0
  27. package/dist/microservice/config-center/nacos-decorators.d.ts +24 -0
  28. package/dist/microservice/config-center/nacos-decorators.d.ts.map +1 -0
  29. package/dist/microservice/config-center/types.d.ts +63 -0
  30. package/dist/microservice/config-center/types.d.ts.map +1 -0
  31. package/dist/microservice/governance/circuit-breaker.d.ts +54 -0
  32. package/dist/microservice/governance/circuit-breaker.d.ts.map +1 -0
  33. package/dist/microservice/governance/decorators.d.ts +51 -0
  34. package/dist/microservice/governance/decorators.d.ts.map +1 -0
  35. package/dist/microservice/governance/index.d.ts +9 -0
  36. package/dist/microservice/governance/index.d.ts.map +1 -0
  37. package/dist/microservice/governance/rate-limiter.d.ts +26 -0
  38. package/dist/microservice/governance/rate-limiter.d.ts.map +1 -0
  39. package/dist/microservice/governance/redis-rate-limiter.d.ts +76 -0
  40. package/dist/microservice/governance/redis-rate-limiter.d.ts.map +1 -0
  41. package/dist/microservice/governance/retry-strategy.d.ts +21 -0
  42. package/dist/microservice/governance/retry-strategy.d.ts.map +1 -0
  43. package/dist/microservice/governance/types.d.ts +212 -0
  44. package/dist/microservice/governance/types.d.ts.map +1 -0
  45. package/dist/microservice/index.d.ts +10 -0
  46. package/dist/microservice/index.d.ts.map +1 -0
  47. package/dist/microservice/monitoring/index.d.ts +4 -0
  48. package/dist/microservice/monitoring/index.d.ts.map +1 -0
  49. package/dist/microservice/monitoring/metrics-collector.d.ts +54 -0
  50. package/dist/microservice/monitoring/metrics-collector.d.ts.map +1 -0
  51. package/dist/microservice/monitoring/metrics-integration.d.ts +24 -0
  52. package/dist/microservice/monitoring/metrics-integration.d.ts.map +1 -0
  53. package/dist/microservice/monitoring/types.d.ts +99 -0
  54. package/dist/microservice/monitoring/types.d.ts.map +1 -0
  55. package/dist/microservice/service-client/call-decorators.d.ts +52 -0
  56. package/dist/microservice/service-client/call-decorators.d.ts.map +1 -0
  57. package/dist/microservice/service-client/decorators.d.ts +35 -0
  58. package/dist/microservice/service-client/decorators.d.ts.map +1 -0
  59. package/dist/microservice/service-client/index.d.ts +7 -0
  60. package/dist/microservice/service-client/index.d.ts.map +1 -0
  61. package/dist/microservice/service-client/interceptors.d.ts +96 -0
  62. package/dist/microservice/service-client/interceptors.d.ts.map +1 -0
  63. package/dist/microservice/service-client/load-balancer.d.ts +59 -0
  64. package/dist/microservice/service-client/load-balancer.d.ts.map +1 -0
  65. package/dist/microservice/service-client/service-client.d.ts +74 -0
  66. package/dist/microservice/service-client/service-client.d.ts.map +1 -0
  67. package/dist/microservice/service-client/types.d.ts +155 -0
  68. package/dist/microservice/service-client/types.d.ts.map +1 -0
  69. package/dist/microservice/service-registry/decorators.d.ts +84 -0
  70. package/dist/microservice/service-registry/decorators.d.ts.map +1 -0
  71. package/dist/microservice/service-registry/discovery-decorators.d.ts +58 -0
  72. package/dist/microservice/service-registry/discovery-decorators.d.ts.map +1 -0
  73. package/dist/microservice/service-registry/health-integration.d.ts +32 -0
  74. package/dist/microservice/service-registry/health-integration.d.ts.map +1 -0
  75. package/dist/microservice/service-registry/index.d.ts +10 -0
  76. package/dist/microservice/service-registry/index.d.ts.map +1 -0
  77. package/dist/microservice/service-registry/nacos-service-registry.d.ts +68 -0
  78. package/dist/microservice/service-registry/nacos-service-registry.d.ts.map +1 -0
  79. package/dist/microservice/service-registry/service-registry-module.d.ts +48 -0
  80. package/dist/microservice/service-registry/service-registry-module.d.ts.map +1 -0
  81. package/dist/microservice/service-registry/types.d.ts +121 -0
  82. package/dist/microservice/service-registry/types.d.ts.map +1 -0
  83. package/dist/microservice/tracing/collectors.d.ts +27 -0
  84. package/dist/microservice/tracing/collectors.d.ts.map +1 -0
  85. package/dist/microservice/tracing/index.d.ts +4 -0
  86. package/dist/microservice/tracing/index.d.ts.map +1 -0
  87. package/dist/microservice/tracing/tracer.d.ts +59 -0
  88. package/dist/microservice/tracing/tracer.d.ts.map +1 -0
  89. package/dist/microservice/tracing/types.d.ts +179 -0
  90. package/dist/microservice/tracing/types.d.ts.map +1 -0
  91. package/dist/request/request.d.ts +1 -0
  92. package/dist/request/request.d.ts.map +1 -1
  93. package/docs/microservice-config-center.md +258 -0
  94. package/docs/microservice-nacos.md +346 -0
  95. package/docs/microservice-service-registry.md +306 -0
  96. package/docs/microservice.md +680 -0
  97. package/docs/troubleshooting.md +41 -0
  98. package/docs/zh/troubleshooting.md +41 -0
  99. package/package.json +5 -4
  100. package/src/config/config-module.ts +210 -0
  101. package/src/config/service.ts +52 -1
  102. package/src/config/types.ts +31 -0
  103. package/src/controller/controller.ts +8 -0
  104. package/src/core/application.ts +189 -3
  105. package/src/core/context.ts +1 -0
  106. package/src/core/server.ts +128 -2
  107. package/src/index.ts +81 -0
  108. package/src/microservice/config-center/config-center-module.ts +98 -0
  109. package/src/microservice/config-center/decorators.ts +159 -0
  110. package/src/microservice/config-center/index.ts +13 -0
  111. package/src/microservice/config-center/nacos-config-center.ts +126 -0
  112. package/src/microservice/config-center/nacos-decorators.ts +34 -0
  113. package/src/microservice/config-center/types.ts +80 -0
  114. package/src/microservice/governance/circuit-breaker.ts +229 -0
  115. package/src/microservice/governance/decorators.ts +113 -0
  116. package/src/microservice/governance/index.ts +18 -0
  117. package/src/microservice/governance/rate-limiter.ts +72 -0
  118. package/src/microservice/governance/redis-rate-limiter.ts +154 -0
  119. package/src/microservice/governance/retry-strategy.ts +74 -0
  120. package/src/microservice/governance/types.ts +247 -0
  121. package/src/microservice/index.ts +12 -0
  122. package/src/microservice/monitoring/index.ts +8 -0
  123. package/src/microservice/monitoring/metrics-collector.ts +223 -0
  124. package/src/microservice/monitoring/metrics-integration.ts +154 -0
  125. package/src/microservice/monitoring/types.ts +118 -0
  126. package/src/microservice/service-client/call-decorators.ts +107 -0
  127. package/src/microservice/service-client/decorators.ts +87 -0
  128. package/src/microservice/service-client/index.ts +37 -0
  129. package/src/microservice/service-client/interceptors.ts +182 -0
  130. package/src/microservice/service-client/load-balancer.ts +205 -0
  131. package/src/microservice/service-client/service-client.ts +488 -0
  132. package/src/microservice/service-client/types.ts +186 -0
  133. package/src/microservice/service-registry/decorators.ts +238 -0
  134. package/src/microservice/service-registry/discovery-decorators.ts +156 -0
  135. package/src/microservice/service-registry/health-integration.ts +146 -0
  136. package/src/microservice/service-registry/index.ts +20 -0
  137. package/src/microservice/service-registry/nacos-service-registry.ts +259 -0
  138. package/src/microservice/service-registry/service-registry-module.ts +105 -0
  139. package/src/microservice/service-registry/types.ts +149 -0
  140. package/src/microservice/tracing/collectors.ts +50 -0
  141. package/src/microservice/tracing/index.ts +15 -0
  142. package/src/microservice/tracing/tracer.ts +293 -0
  143. package/src/microservice/tracing/types.ts +213 -0
  144. package/src/request/request.ts +1 -0
  145. package/tests/config/set-value-by-path.test.ts +53 -0
  146. package/tests/core/graceful-shutdown.test.ts +321 -0
  147. package/tests/microservice/config-center.test.ts +77 -0
  148. package/tests/microservice/governance.test.ts +157 -0
  149. package/tests/microservice/monitoring.test.ts +75 -0
  150. package/tests/microservice/service-client.test.ts +136 -0
  151. package/tests/microservice/service-registry.test.ts +80 -0
  152. package/tests/microservice/tracing.test.ts +143 -0
  153. package/tests/utils/test-port.ts +29 -19
@@ -0,0 +1,346 @@
1
+ # Nacos 集成文档
2
+
3
+ 本文档介绍如何在 Bun Server Framework 中使用 Nacos 作为配置中心和服务注册中心。
4
+
5
+ ## 目录
6
+
7
+ - [概述](#概述)
8
+ - [Nacos 安装](#nacos-安装)
9
+ - [配置中心集成](#配置中心集成)
10
+ - [服务注册中心集成](#服务注册中心集成)
11
+ - [完整示例](#完整示例)
12
+ - [常见问题](#常见问题)
13
+
14
+ ## 概述
15
+
16
+ Bun Server Framework 通过 `@dangao/nacos-client` 包提供 Nacos 3.X 支持,包括:
17
+
18
+ - **配置管理**:动态配置获取和监听
19
+ - **服务注册**:服务实例注册、续约、注销
20
+ - **服务发现**:服务实例查询和监听
21
+ - **Open API**:基于 Nacos 3.X Open API 实现
22
+
23
+ ## Nacos 安装
24
+
25
+ ### Docker 安装(推荐)
26
+
27
+ ```bash
28
+ docker run --name nacos -e MODE=standalone -p 8848:8848 nacos/nacos-server:v3.0.0
29
+ ```
30
+
31
+ ### 访问控制台
32
+
33
+ 访问 http://localhost:8848/nacos,默认用户名/密码:`nacos/nacos`
34
+
35
+ ## 配置中心集成
36
+
37
+ ### 1. 注册配置中心模块
38
+
39
+ ```typescript
40
+ import { Application } from '@dangao/bun-server';
41
+ import { ConfigCenterModule } from '@dangao/bun-server';
42
+
43
+ const app = new Application();
44
+
45
+ app.registerModule(
46
+ ConfigCenterModule.forRoot({
47
+ provider: 'nacos',
48
+ nacos: {
49
+ client: {
50
+ serverList: ['http://localhost:8848'],
51
+ namespaceId: 'public',
52
+ username: 'nacos',
53
+ password: 'nacos',
54
+ },
55
+ watchInterval: 3000, // 配置轮询间隔(毫秒)
56
+ },
57
+ }),
58
+ );
59
+ ```
60
+
61
+ ### 2. 在 Nacos 控制台创建配置
62
+
63
+ 1. 登录 Nacos 控制台
64
+ 2. 进入"配置管理" -> "配置列表"
65
+ 3. 点击"+"创建配置:
66
+ - **Data ID**:`my-config`
67
+ - **Group**:`DEFAULT_GROUP`
68
+ - **配置格式**:`JSON`(或其他格式)
69
+ - **配置内容**:
70
+ ```json
71
+ {
72
+ "app": {
73
+ "name": "MyApp",
74
+ "version": "1.0.0"
75
+ }
76
+ }
77
+ ```
78
+
79
+ ### 3. 使用配置
80
+
81
+ ```typescript
82
+ import {
83
+ CONFIG_CENTER_TOKEN,
84
+ type ConfigCenter,
85
+ } from '@dangao/bun-server';
86
+ import { Inject, Injectable } from '@dangao/bun-server';
87
+
88
+ @Injectable()
89
+ class MyService {
90
+ public constructor(
91
+ @Inject(CONFIG_CENTER_TOKEN) private readonly configCenter: ConfigCenter,
92
+ ) {}
93
+
94
+ public async getConfig() {
95
+ const result = await this.configCenter.getConfig(
96
+ 'my-config',
97
+ 'DEFAULT_GROUP',
98
+ );
99
+ const config = JSON.parse(result.content);
100
+ return config.app.name;
101
+ }
102
+ }
103
+ ```
104
+
105
+ ### 4. 配置热更新
106
+
107
+ ```typescript
108
+ configCenter.watchConfig('my-config', 'DEFAULT_GROUP', (newConfig) => {
109
+ console.log('Config updated:', newConfig.content);
110
+ // 更新应用配置
111
+ });
112
+ ```
113
+
114
+ ## 服务注册中心集成
115
+
116
+ ### 1. 注册服务注册中心模块
117
+
118
+ ```typescript
119
+ import { ServiceRegistryModule } from '@dangao/bun-server';
120
+
121
+ app.registerModule(
122
+ ServiceRegistryModule.forRoot({
123
+ provider: 'nacos',
124
+ nacos: {
125
+ client: {
126
+ serverList: ['http://localhost:8848'],
127
+ namespaceId: 'public',
128
+ username: 'nacos',
129
+ password: 'nacos',
130
+ },
131
+ heartbeatInterval: 5000, // 心跳间隔(毫秒)
132
+ },
133
+ }),
134
+ );
135
+ ```
136
+
137
+ ### 2. 注册服务
138
+
139
+ #### 使用装饰器(推荐)
140
+
141
+ ```typescript
142
+ import { ServiceRegistry, Controller, GET } from '@dangao/bun-server';
143
+
144
+ @ServiceRegistry('user-service', {
145
+ port: 3000,
146
+ weight: 100,
147
+ metadata: { version: '1.0.0' },
148
+ })
149
+ @Controller('/api/users')
150
+ class UserController {
151
+ @GET('/')
152
+ public getUsers() {
153
+ return { users: [] };
154
+ }
155
+ }
156
+
157
+ app.registerController(UserController);
158
+ await app.listen(3000);
159
+ // 服务会自动注册到 Nacos
160
+ ```
161
+
162
+ #### 手动注册
163
+
164
+ ```typescript
165
+ import {
166
+ SERVICE_REGISTRY_TOKEN,
167
+ type ServiceRegistry,
168
+ } from '@dangao/bun-server';
169
+ import { Inject, Injectable } from '@dangao/bun-server';
170
+
171
+ @Injectable()
172
+ class MyService {
173
+ public constructor(
174
+ @Inject(SERVICE_REGISTRY_TOKEN) private readonly registry: ServiceRegistry,
175
+ ) {}
176
+
177
+ public async registerService() {
178
+ await this.registry.register({
179
+ serviceName: 'user-service',
180
+ ip: '127.0.0.1',
181
+ port: 3000,
182
+ weight: 100,
183
+ healthy: true,
184
+ });
185
+ }
186
+ }
187
+ ```
188
+
189
+ ### 3. 服务发现
190
+
191
+ ```typescript
192
+ import {
193
+ SERVICE_REGISTRY_TOKEN,
194
+ type ServiceRegistry,
195
+ } from '@dangao/bun-server';
196
+
197
+ const instances = await serviceRegistry.getInstances('user-service', {
198
+ healthyOnly: true,
199
+ namespaceId: 'public',
200
+ });
201
+
202
+ // 监听服务实例变更
203
+ serviceRegistry.watchInstances('user-service', (newInstances) => {
204
+ console.log('Instances updated:', newInstances);
205
+ });
206
+ ```
207
+
208
+ ## 完整示例
209
+
210
+ ```typescript
211
+ import { Application, Controller, GET, Injectable, Inject } from '@dangao/bun-server';
212
+ import {
213
+ ConfigCenterModule,
214
+ ServiceRegistryModule,
215
+ ServiceClient,
216
+ CONFIG_CENTER_TOKEN,
217
+ SERVICE_REGISTRY_TOKEN,
218
+ type ConfigCenter,
219
+ type ServiceRegistry,
220
+ } from '@dangao/bun-server';
221
+
222
+ // 注册配置中心
223
+ ConfigCenterModule.forRoot({
224
+ provider: 'nacos',
225
+ nacos: {
226
+ client: {
227
+ serverList: ['http://localhost:8848'],
228
+ namespaceId: 'public',
229
+ username: 'nacos',
230
+ password: 'nacos',
231
+ },
232
+ },
233
+ });
234
+
235
+ // 注册服务注册中心
236
+ ServiceRegistryModule.forRoot({
237
+ provider: 'nacos',
238
+ nacos: {
239
+ client: {
240
+ serverList: ['http://localhost:8848'],
241
+ namespaceId: 'public',
242
+ username: 'nacos',
243
+ password: 'nacos',
244
+ },
245
+ },
246
+ });
247
+
248
+ // 服务类
249
+ @Injectable()
250
+ class UserService {
251
+ private readonly serviceClient: ServiceClient;
252
+
253
+ public constructor(
254
+ @Inject(CONFIG_CENTER_TOKEN) private readonly configCenter: ConfigCenter,
255
+ @Inject(SERVICE_REGISTRY_TOKEN) private readonly serviceRegistry: ServiceRegistry,
256
+ ) {
257
+ this.serviceClient = new ServiceClient(this.serviceRegistry);
258
+ }
259
+
260
+ public async callOrderService() {
261
+ return await this.serviceClient.call({
262
+ serviceName: 'order-service',
263
+ method: 'GET',
264
+ path: '/api/orders',
265
+ });
266
+ }
267
+ }
268
+
269
+ // 控制器
270
+ @ServiceRegistry('user-service', { port: 3000 })
271
+ @Controller('/api/users')
272
+ class UserController {
273
+ public constructor(private readonly userService: UserService) {}
274
+
275
+ @GET('/')
276
+ public async getUsers() {
277
+ return { users: [] };
278
+ }
279
+ }
280
+
281
+ // 启动应用
282
+ const app = new Application();
283
+ app.registerController(UserController);
284
+ await app.listen(3000);
285
+ ```
286
+
287
+ ## 常见问题
288
+
289
+ ### 1. 连接失败
290
+
291
+ **问题**:无法连接到 Nacos 服务器
292
+
293
+ **解决方案**:
294
+ - 检查 Nacos 服务器是否运行
295
+ - 检查 `serverList` 配置是否正确
296
+ - 检查网络连接和防火墙设置
297
+ - 检查用户名和密码是否正确
298
+
299
+ ### 2. 配置获取失败
300
+
301
+ **问题**:无法获取配置
302
+
303
+ **解决方案**:
304
+ - 检查配置是否在 Nacos 控制台中存在
305
+ - 检查 Data ID 和 Group 是否正确
306
+ - 检查命名空间是否正确
307
+ - 检查权限设置
308
+
309
+ ### 3. 服务注册失败
310
+
311
+ **问题**:服务无法注册到 Nacos
312
+
313
+ **解决方案**:
314
+ - 检查服务注册中心模块是否已注册
315
+ - 检查服务名、IP、端口是否正确
316
+ - 检查 Nacos 服务器连接是否正常
317
+ - 查看应用日志获取详细错误信息
318
+
319
+ ### 4. 服务发现为空
320
+
321
+ **问题**:服务发现返回空列表
322
+
323
+ **解决方案**:
324
+ - 检查服务是否已注册
325
+ - 检查 `healthyOnly` 选项(如果设置为 true,只返回健康实例)
326
+ - 检查命名空间和分组是否正确
327
+ - 检查服务实例是否健康
328
+
329
+ ### 5. 配置热更新不生效
330
+
331
+ **问题**:配置变更后应用未更新
332
+
333
+ **解决方案**:
334
+ - 检查是否启用了配置监听(`watch: true`)
335
+ - 检查 `watchInterval` 设置是否合理
336
+ - 检查配置监听回调是否正确实现
337
+ - 查看日志确认配置变更是否被检测到
338
+
339
+ ## 参考资源
340
+
341
+ - [Nacos 官方文档](https://nacos.io/docs/latest/)
342
+ - [Nacos 3.X Open API](https://nacos.io/docs/latest/manual/user/open-api/)
343
+ - [微服务使用指南](./microservice.md)
344
+ - [配置中心使用指南](./microservice-config-center.md)
345
+ - [服务注册与发现使用指南](./microservice-service-registry.md)
346
+
@@ -0,0 +1,306 @@
1
+ # 服务注册与发现使用指南
2
+
3
+ 本文档介绍如何使用 Bun Server Framework 的服务注册与发现功能。
4
+
5
+ ## 目录
6
+
7
+ - [概述](#概述)
8
+ - [快速开始](#快速开始)
9
+ - [服务注册](#服务注册)
10
+ - [服务发现](#服务发现)
11
+ - [负载均衡](#负载均衡)
12
+ - [健康检查集成](#健康检查集成)
13
+ - [最佳实践](#最佳实践)
14
+
15
+ ## 概述
16
+
17
+ 服务注册与发现提供了微服务架构中的核心能力:
18
+
19
+ - **服务注册**:将服务实例注册到注册中心
20
+ - **服务发现**:从注册中心发现服务实例
21
+ - **负载均衡**:支持多种负载均衡策略
22
+ - **健康检查**:自动根据健康检查状态更新服务健康状态
23
+ - **实例监听**:监听服务实例变更
24
+
25
+ ## 快速开始
26
+
27
+ ### 1. 注册服务注册中心模块
28
+
29
+ ```typescript
30
+ import { Application } from '@dangao/bun-server';
31
+ import { ServiceRegistryModule } from '@dangao/bun-server';
32
+
33
+ const app = new Application();
34
+
35
+ app.registerModule(
36
+ ServiceRegistryModule.forRoot({
37
+ provider: 'nacos',
38
+ nacos: {
39
+ client: {
40
+ serverList: ['http://localhost:8848'],
41
+ namespaceId: 'public',
42
+ username: 'nacos',
43
+ password: 'nacos',
44
+ },
45
+ heartbeatInterval: 5000, // 心跳间隔(毫秒)
46
+ },
47
+ }),
48
+ );
49
+ ```
50
+
51
+ ### 2. 注册服务
52
+
53
+ ```typescript
54
+ import { ServiceRegistry, Controller, GET } from '@dangao/bun-server';
55
+
56
+ @ServiceRegistry('user-service', {
57
+ port: 3000,
58
+ weight: 100,
59
+ metadata: { version: '1.0.0' },
60
+ })
61
+ @Controller('/api/users')
62
+ class UserController {
63
+ @GET('/')
64
+ public getUsers() {
65
+ return { users: [] };
66
+ }
67
+ }
68
+
69
+ app.registerController(UserController);
70
+ await app.listen(3000);
71
+ // 服务会自动注册到注册中心
72
+ ```
73
+
74
+ ## 服务注册
75
+
76
+ ### 使用装饰器自动注册
77
+
78
+ 最简单的方式是使用 `@ServiceRegistry` 装饰器:
79
+
80
+ ```typescript
81
+ @ServiceRegistry('user-service', {
82
+ port: 3000,
83
+ weight: 100,
84
+ enabled: true,
85
+ healthy: true,
86
+ metadata: {
87
+ version: '1.0.0',
88
+ region: 'us-east',
89
+ },
90
+ clusterName: 'default',
91
+ namespaceId: 'public',
92
+ groupName: 'DEFAULT_GROUP',
93
+ })
94
+ @Controller('/api/users')
95
+ class UserController {
96
+ // ...
97
+ }
98
+ ```
99
+
100
+ **配置说明**:
101
+ - `serviceName`:服务名(必需)
102
+ - `port`:服务端口(可选,默认从 Application 获取)
103
+ - `ip`:服务 IP(可选,默认从 Application 获取)
104
+ - `weight`:服务权重(用于加权负载均衡)
105
+ - `enabled`:是否启用
106
+ - `healthy`:初始健康状态
107
+ - `metadata`:服务元数据(版本、区域等)
108
+ - `clusterName`:集群名
109
+ - `namespaceId`:命名空间
110
+ - `groupName`:分组名
111
+
112
+ ### 手动注册
113
+
114
+ ```typescript
115
+ import {
116
+ SERVICE_REGISTRY_TOKEN,
117
+ type ServiceRegistry,
118
+ type ServiceInstance,
119
+ } from '@dangao/bun-server';
120
+ import { Inject, Injectable } from '@dangao/bun-server';
121
+
122
+ @Injectable()
123
+ class MyService {
124
+ public constructor(
125
+ @Inject(SERVICE_REGISTRY_TOKEN) private readonly registry: ServiceRegistry,
126
+ ) {}
127
+
128
+ public async registerService() {
129
+ const instance: ServiceInstance = {
130
+ serviceName: 'my-service',
131
+ ip: '127.0.0.1',
132
+ port: 3000,
133
+ weight: 100,
134
+ healthy: true,
135
+ enabled: true,
136
+ metadata: {
137
+ version: '1.0.0',
138
+ },
139
+ };
140
+
141
+ await this.registry.register(instance);
142
+ }
143
+
144
+ public async renewService() {
145
+ // 续约服务(心跳)
146
+ await this.registry.renew({
147
+ serviceName: 'my-service',
148
+ ip: '127.0.0.1',
149
+ port: 3000,
150
+ });
151
+ }
152
+
153
+ public async deregisterService() {
154
+ // 注销服务
155
+ await this.registry.deregister({
156
+ serviceName: 'my-service',
157
+ ip: '127.0.0.1',
158
+ port: 3000,
159
+ });
160
+ }
161
+ }
162
+ ```
163
+
164
+ ## 服务发现
165
+
166
+ ### 使用装饰器自动发现
167
+
168
+ 使用 `@ServiceDiscovery` 装饰器自动注入服务实例列表:
169
+
170
+ ```typescript
171
+ import { ServiceDiscovery, Injectable } from '@dangao/bun-server';
172
+ import type { ServiceInstance } from '@dangao/bun-server';
173
+
174
+ @Injectable()
175
+ class MyService {
176
+ @ServiceDiscovery('user-service', {
177
+ healthyOnly: true, // 只获取健康实例
178
+ namespaceId: 'public',
179
+ groupName: 'DEFAULT_GROUP',
180
+ })
181
+ public instances: ServiceInstance[] = [];
182
+
183
+ public async getAvailableInstances() {
184
+ // instances 会自动更新
185
+ return this.instances;
186
+ }
187
+ }
188
+ ```
189
+
190
+ ### 手动发现
191
+
192
+ ```typescript
193
+ // 获取服务实例列表
194
+ const instances = await serviceRegistry.getInstances('user-service', {
195
+ healthyOnly: true,
196
+ namespaceId: 'public',
197
+ groupName: 'DEFAULT_GROUP',
198
+ clusterName: 'default',
199
+ });
200
+
201
+ // 监听服务实例变更
202
+ const unsubscribe = serviceRegistry.watchInstances(
203
+ 'user-service',
204
+ (newInstances) => {
205
+ console.log('Instances updated:', newInstances);
206
+ // 更新本地缓存
207
+ updateLocalCache(newInstances);
208
+ },
209
+ {
210
+ namespaceId: 'public',
211
+ groupName: 'DEFAULT_GROUP',
212
+ },
213
+ );
214
+
215
+ // 取消监听
216
+ unsubscribe();
217
+ ```
218
+
219
+ ## 负载均衡
220
+
221
+ ServiceClient 支持多种负载均衡策略,详见[服务调用文档](./microservice.md#负载均衡)。
222
+
223
+ ## 健康检查集成
224
+
225
+ 服务注册会自动集成健康检查模块,根据健康检查状态更新服务健康状态:
226
+
227
+ ### 1. 注册健康检查模块
228
+
229
+ ```typescript
230
+ import { HealthModule } from '@dangao/bun-server';
231
+
232
+ HealthModule.forRoot({
233
+ indicators: [
234
+ {
235
+ name: 'db',
236
+ async check() {
237
+ // 检查数据库连接
238
+ const isHealthy = await checkDatabase();
239
+ return {
240
+ status: isHealthy ? 'up' : 'down',
241
+ details: { connection: isHealthy ? 'ok' : 'failed' },
242
+ };
243
+ },
244
+ },
245
+ {
246
+ name: 'cache',
247
+ async check() {
248
+ // 检查缓存连接
249
+ return { status: 'up' };
250
+ },
251
+ },
252
+ ],
253
+ });
254
+ ```
255
+
256
+ ### 2. 使用 @ServiceRegistry 装饰器
257
+
258
+ 使用 `@ServiceRegistry` 装饰器的服务会自动根据健康检查状态更新:
259
+
260
+ ```typescript
261
+ @ServiceRegistry('user-service')
262
+ @Controller('/api/users')
263
+ class UserController {
264
+ // 服务会根据健康检查状态自动更新健康状态
265
+ }
266
+ ```
267
+
268
+ ### 3. 健康检查更新机制
269
+
270
+ - 每 30 秒检查一次健康状态
271
+ - 如果健康检查失败,服务会被标记为不健康
272
+ - 不健康的服务实例不会被负载均衡器选择(如果设置了 `healthyOnly: true`)
273
+
274
+ ## 最佳实践
275
+
276
+ ### 1. 服务注册
277
+
278
+ - **使用装饰器**:优先使用 `@ServiceRegistry` 装饰器自动注册
279
+ - **配置元数据**:设置版本、区域等元数据便于管理
280
+ - **合理权重**:根据服务实例性能设置权重
281
+ - **自动注销**:确保应用关闭时正确注销服务
282
+
283
+ ### 2. 服务发现
284
+
285
+ - **健康过滤**:使用 `healthyOnly: true` 只获取健康实例
286
+ - **实例监听**:监听实例变更及时更新本地缓存
287
+ - **命名空间**:使用命名空间区分不同环境
288
+
289
+ ### 3. 负载均衡
290
+
291
+ - **随机**:适用于无状态服务
292
+ - **轮询**:适用于性能相近的实例
293
+ - **加权轮询**:适用于性能差异较大的实例
294
+ - **一致性哈希**:适用于需要会话粘性的场景
295
+ - **最少连接**:适用于长连接场景
296
+
297
+ ### 4. 健康检查
298
+
299
+ - **关键依赖**:为关键依赖(数据库、缓存等)添加健康检查
300
+ - **检查频率**:合理设置检查频率(默认 30 秒)
301
+ - **快速失败**:健康检查应该快速失败,避免阻塞
302
+
303
+ ## 示例
304
+
305
+ 完整示例请参考 `examples/microservice-app.ts`。
306
+