在 visual studio 上进行项目创建
- 创建网关 Gateway
类型 webapi
- 创建 user 微服务
类型 webapi
- 创建 Api 客户端
类型 类库
使用 NuGet 包管理器给 Api 客户端添加 Refit 包
- 给要进行远程调用的服务添加 Api 引用
- 创建完成后大致目录如下所示
├───Api
│ ├───Clients
│ │ └───impl
│ ├───Models
├───Gateway
│ ├───Controllers
│ ├───Properties
│ └───Services
└───User
├───Controllers
├───Models
└───Properties
在 UserService/UserController 下添加
// /UserService/Controller/UserController.cs
namespace UserService.Controllers {
[Route("api/[controller]")]
[ApiController]
public class UserController : ControllerBase {
List<User> users;
public UserController() {
users = new List<User>(){
new User{Id = 1, Name = "用户1", Age=10,Sex=true },
new User{Id = 2, Name = "用户2", Age=11,Sex=false },
new User{Id = 3, Name = "用户3", Age=12 ,Sex=false },
};
}
[HttpGet("/users")]
public List<User> GetUsers() {
Console.WriteLine("entry userService GetUsers");
return users;
}
[HttpGet("/user/{id}")]
public User GetUser(int id) {
Console.WriteLine($"entry userService GetUser: id = {id}");
if (id < users.Count) return users[id];
return new User { Id = id, Name = $"用户{id}", Age = 10 };
}
}
}
在 UserService/Models 下添加
// /UserService/Models/User.cs
namespace UserService.Models {
public class User {
public int Id { get; set; }
public string? Name { get; set; }
public int Age { get; set; }
public bool Sex { get; set; }
}
}
在 Api/Models 目录下添加
// Api/Models/User.cs
namespace Api.Models {
public class User {
public int Id { get; set; }
public string? Name { get; set; }
public int Age { get; set; }
public bool Sex { get; set; }
}
}
在 Api/Clients 目录下添加
// /Api/Clients/IUserClient.cs
namespace Api.Clients {
public interface IUserClient {
[Get("/users")]
Task<List<User>> GetUsers();
[Get("/user/{id}")]
Task<User> GetUser(int id);
}
}
在 Api/Clients/impl 目录下添加
namespace Api.Clients.impl {
public class UserClient : IUserClient {
public IUserClient userClient;
public UserClient() {
this.userClient = RestService.For<IUserClient>("http://localhost:5244");
}
public Task<User> GetUser(int id) {
return this.userClient.GetUser(id);
}
public Task<List<User>> GetUsers() {
return this.userClient.GetUsers();
}
}
}
在 Gateway/Controller 下添加
// Gateway/Controller/UserController
namespace gateway.Controllers {
[Route("api/[controller]")]
[ApiController]
public class UserController : ControllerBase {
private IUserClient _userClient;
public UserController(IUserClient userClient) {
_userClient = userClient;
}
[HttpGet("/users")]
public async Task<List<User>> GetUsers() {
Console.WriteLine($"entry gateway GetUsers");
return await this._userClient.GetUsers();
}
[HttpGet("/user/{id}")]
public async Task<User> GetUser(int id) {
Console.WriteLine($"entry gateway GetUsers: id = {id}");
return await this._userClient.GetUser(id);
}
}
}
修改 Gateway/Program.cs 文件
// ...
// 添加改行文件
builder.Services.AddTransient<IUserClient, UserClient>();
var app = builder.Build();
// ...