Consul 简介
Consul是一个服务网格(微服务间的 TCP/IP,负责服务之间的网络调用、限流、熔断和监控)解决方案,它是一个一个分布式的,高度可用的系统,而且开发使用都很简便。它提供了一个功能齐全的控制平面,主要特点是:服务发现、健康检查、键值存储、安全服务通信、多数据中心。除了 Consul 之外,还有 Eureka、Zookeeper 等类似软件。
安装Consul
我们这里是直接在Windows上开发,所以对应下载Windows
版本的。下载地址:
下载完成后实际就是consul.exe
,我们在下载位置运行cmd命令
consul agent -dev
然后我们打开浏览器,输 src="https://cdn.jsdelivr.net/gh/jellydong/img/images/20200807102643.png" alt="image-20200807102643159" loading="lazy">
可以看到Consul已经启动了,但是除了他自己外还没有其他服务注册进来。
服务注册
我们创建一个Api项目,比如订单服务OrderService
。
安装Consul
健康检查
创建完成后就是默认的项目结构,我们添加一个健康检查的Controller。健康检查的意思是Consul会根据我们的配置定时的去请求健康检查接口,判断当前服务是不是可用。避免提供挂掉的服务给消费者,当然间隔时间也会有,需要配合后面的熔断、降级使用。
using System;using Microsoft.AspNetCore.Mvc;namespace Consul.OrderService.Controllers{ [ApiController] [Route("[controller]")] public class HealthController : ControllerBase { public IActionResult Get() { Console.WriteLine("调用了健康检查" + DateTime.Now); return Ok("OK"); } }}
调用时我们输出下当前时间,可以看到Consul有没有调用健康检查。
服务注册及注销
因为这里需要指定Api的地址,所以我们配置一下获取配置。
修改Program.cs
public static IHostBuilder CreateHostBuilder(string[] args) { var config = new ConfigurationBuilder().AddCommandLine(args).Build(); string ip = config["ip"]; string port = config["port"]; return Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>() .UseUrls($" }); }
修改Startup.cs
public void Configure(IApplicationBuilder app, IWebHostEnvironment env,IHostApplicationLifetime applicationLifetime) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); string ip = Configuration["ip"]; int port = Convert.ToInt32(Configuration["port"]); string serveiceName = "OrderService"; string serviceId = serveiceName + Guid.NewGuid(); using (var consulClient = new ConsulClient(ConsulConfig)) { AgentServiceRegistration agentServiceRegistration = new AgentServiceRegistration(); //服务编号,不能重复,用 Guid 最简单 agentServiceRegistration.ID = serviceId; //服务的名字 agentServiceRegistration.Name = serveiceName; //服务提供者的能被消费者访问的 ip 地址(可以被其他应用访问的 地址,本地测试可以用 127.0.0.1,机房环境中一定要写自己的内网 ip 地址) agentServiceRegistration.Address = ip; // 服务提供者的能被消费者访问的端口 agentServiceRegistration.Port = port; agentServiceRegistration.Check = new AgentServiceCheck() { //服务停止多久 后反注册(注销) DeregisterCriticalServiceAfter = TimeSpa.........