一周搭建一个简单的微服务架构(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,访问orderapi地址是可以的。或者是先写代码,从consul里面获取服务列表, 然后再进行对应的访问,这里就不再举例了,因为后面我们要用api网关直接访问consul

 

最后,我们整理一个流程图,方便回顾;

 

posted @ 2020-08-19 19:36  mshybinbin  阅读(195)  评论(0)    收藏  举报