如何将同一解决方案下的两个项目拆分并通过Web API实现相互通信
拆分后项目通过Web API实现跨服务通信的实现方案
1. 提前对齐通信契约
- 先梳理两个项目原有的所有交互场景,把需要跨服务调用的操作抽象为公开API接口,统一约定每个接口的请求参数、响应格式、错误码规则、调用频次限制,默认采用JSON作为数据传输格式。
- 举个例子:如果项目B需要获取项目A存储的用户基础信息,提前明确
GET /api/v1/users/{userId}的接口规范,所有入参、出参、异常返回结构双方提前对齐,避免联调时出现结构不兼容问题。
2. 被调用方API实现规范
- 对外提供服务的项目新增独立的API控制器层,和内部业务逻辑解耦,后续对外接口迭代不会直接影响内部业务流程。
- 必须增加接口鉴权逻辑,不允许未授权访问:轻量场景推荐用API Key校验,调用方请求时在请求头携带
X-API-Key参数,被调用方校验密钥有效性后再放行;对安全性要求更高的场景可以采用JWT令牌鉴权。
.NET Web API的API Key校验中间件参考代码:
public class ApiKeyMiddleware { private readonly RequestDelegate _next; private const string API_KEY_HEADER = "X-API-Key"; private readonly IConfiguration _configuration; public ApiKeyMiddleware(RequestDelegate next, IConfiguration configuration) { _next = next; _configuration = configuration; } public async Task InvokeAsync(HttpContext context) { if (!context.Request.Headers.TryGetValue(API_KEY_HEADER, out var extractedApiKey)) { context.Response.StatusCode = 401; await context.Response.WriteAsync("Missing API Key"); return; } var validKey = _configuration.GetValue<string>("ValidApiKeys:ProjectB"); if (!validKey.Equals(extractedApiKey)) { context.Response.StatusCode = 403; await context.Response.WriteAsync("Invalid API Key"); return; } await _next(context); } }
- 所有涉及数据写入的接口必须做好幂等性处理,避免重复调用导致数据异常。
3. 调用方请求逻辑封装
- 调用方不要在业务代码里硬编码HTTP请求,建议封装独立的HTTP客户端服务,统一处理请求地址、鉴权头添加、超时设置、重试逻辑、异常捕获。
.NET 下HttpClient封装参考代码:
// 项目B中调用项目A接口的客户端封装 public class ProjectAApiClient { private readonly HttpClient _httpClient; private const string API_KEY = "项目B对应的合法API密钥"; public ProjectAApiClient(HttpClient httpClient) { _httpClient = httpClient; _httpClient.BaseAddress = new Uri("https://项目A的内网/公网访问地址"); _httpClient.DefaultRequestHeaders.Add("X-API-Key", API_KEY); _httpClient.Timeout = TimeSpan.FromSeconds(10); } public async Task<UserInfo> GetUserInfoAsync(Guid userId) { var response = await _httpClient.GetAsync($"/api/v1/users/{userId}"); response.EnsureSuccessStatusCode(); return await response.Content.ReadFromJsonAsync<UserInfo>(); } }
- 在依赖注入容器中注册该客户端后,即可直接在业务代码中注入调用。
4. 部署联调注意事项
- 如果两个项目部署在同一内网环境,优先用内网域名通信,降低公网延迟和数据泄露风险。
- 做好接口版本管理,后续接口迭代不要直接修改已上线的v1版本接口,新增v2版本避免影响原有调用逻辑。
- 补充接口调用日志,记录所有跨服务调用的请求参数、响应结果、耗时,方便后续问题排查。
内容的提问来源于stack exchange,提问作者user6838116
相关产品推荐
相关产品推荐

