一周搭建一个简单的微服务架构(2)
上一节,我们仅仅至创建了API和鉴权中心,简单说只有了微服务,还没有服务发现和API网关,这节我们重点说下服务发现,其实非常简单
服务发现
- Consul安装:很简单,直接在官网下载解压即可。
- Consul运行:在consul.exe目录下打开命令行执行 consul.exe agent -dev
- 浏览器访问:http://localhost:8500/
Consul已成功运行。
Consul是独立的,在每个微服务的项目里面,将服务注册到Consul里面就行,Consul就会显示出对应的服务。

服务注册
改一下订单服务的代码。先Nuget安装一下Consul。
创建一个IApplicationBuilder RegisterConsul,在里面实现服务注册的方法

public static IApplicationBuilder RegisterConsul(this IApplicationBuilder app, IConfiguration configuration, IHostApplicationLifetime lifetime)
{
var consulClient = new ConsulClient(c =>
{
//consul地址
c.Address = new Uri(configuration["ConsulSetting:ConsulAddress"]);
});
var registration = new AgentServiceRegistration()
{
ID = Guid.NewGuid().ToString(),//服务实例唯一标识
Name = configuration["ConsulSetting:ServiceName"],//服务名
Address = configuration["ConsulSetting:ServiceIP"], //服务IP
Port = int.Parse(configuration["ConsulSetting:ServicePort"]),//服务端口 因为要运行多个实例,端口不能在appsettings.json里配置,在docker容器运行时传入
Check = new AgentServiceCheck()
{
DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(5),//服务启动多久后注册
Interval = TimeSpan.FromSeconds(10),//健康检查时间间隔
HTTP = $"http://{configuration["ConsulSetting:ServiceIP"]}:{configuration["ConsulSetting:ServicePort"]}{configuration["ConsulSetting:ServiceHealthCheck"]}",//健康检查地址
Timeout = TimeSpan.FromSeconds(5)//超时时间
}
};
//服务注册
consulClient.Agent.ServiceRegister(registration).Wait();
//应用程序终止时,取消注册
lifetime.ApplicationStopping.Register(() =>
{
consulClient.Agent.ServiceDeregister(registration.ID).Wait();
});
return app;
}
注意这里的“取消注册”代码,意思是当服务停止时,consul会自动取消该服务的注册,或者说注销掉该服务。
在appsettings里面,添加1个服务的配置项。

"ConsulSetting": {
"ServiceName": "OrderService",
"ServiceIP": "localhost",
"ServicePort": "9061",
"ServiceHealthCheck": "/healthcheck",
"ConsulAddress": "http://localhost:8500/" //注意,docker容器内部无法使用localhost访问宿主机器,如果是控制台启动的话就用localhost
},
最后这个Consul的地址很重要,就是指定我们将服务注册到那个Consul里面了。
Startup.cs:在这调用注册方法,注册对应的服务

还要记得,增加健康检查的代码:其实就是增加一个有健康检查的controller

[Route("[controller]")]
[ApiController]
public class HealthCheckController : ControllerBase
{
/// <summary>
/// 健康检查接口
/// </summary>
/// <returns></returns>
[HttpGet]
public IActionResult Get()
{
return Ok();
}
}
启动order微服务,然后再次启动Consul,进入首页

就能看到我们已经注册进来的服务。
如果程序发生异常,健康检查不能正确响应的话,Consul也会移除,有一点区别。
如何使用已注册的服务
直接使用postman,访问order的api地址是可以的。或者是先写代码,从consul里面获取服务列表, 然后再进行对应的访问,这里就不再举例了,因为后面我们要用api网关直接访问consul。
最后,我们整理一个流程图,方便回顾;


浙公网安备 33010602011771号