博客
关于我
3. .NET5微服务添加Consul中间件
阅读量:492 次
发布时间:2019-03-07

本文共 3344 字,大约阅读时间需要 11 分钟。

服务发现与Consul之道

在微服务架构中,服务发现是保证系统可靠性和灵活性的核心环节。传统的网关层每添加一个服务实例或接口,都需要手动更新发布,带来urious负担。而使用Consul这样的服务发现工具,可以实现自动化注册发现,让网关只需更新一次,无论服务实例还是接口如何增加,Consul都能自动识别和发现。

Consul服务发现核心原理

Consul是一个独立的进程,主要职责是管理服务实例地址。服务注册过程如下:

  • 在服务器上安装并启动Consul进程。
  • 每个服务实例向Consul注册时,提供自身的 hostname和port。
  • Consul将该实例添加到服务名单中。
  • 网关在需要调用服务时,首先向Consul查询所有服务实例地址。
  • 这种设计使得无需手动更新网关,服务实例的变化自动生效。

    卫生机制与健康检查

    服务发现的另一关键是服务状态管理。Consul支持健康检查机制,确保服务状态一直可靠。

    • 健康检查(Heartbeat):服务实例在注册时,提供一个健康检查地址。Consul定期发送请求,确保服务响应正常。
    • 定期检查间隔:可以配置检查间隔时间,如每5秒发送一次请求。
    • 异常处理:若请求超时或未响应,Consul将该服务实例从名单中移除。

    这样,网关在调用时,就不会引用已被移除的服务实例,确保调用始终是可靠的。

    Consul的安装与配置

    安装Consul相对简单。以下是Windows环境下的步骤:

  • Download Consul.exe文件。
  • 将安装文件所在目录路径添加到环境变量中,便于直接运行。
  • 启动Consul,输入命令consul.exe agent -dev
  • 打开浏览器,访问Consul默认地址http://localhost:8500,即可进入Consul界面。
  • 界面与访问权限

    Consul提供友好的Web界面,便于管理服务实例。管理员可以查看服务运行状态,执行相关操作,如服务注册、修改、删除等。

    代码实战与应用场景

    在实际项目中,Consul的应用通常包括以下步骤:

  • 配置模型类:定义服务注册的配置参数,如服务名称、IP、端口、健康检查地址等。
  • 基于代码的注册:创建一个类库ConsulBuilder,统一处理服务注册,简化开发流程。
  • Startup.cs中引用Consul配置,完成服务注册。
  • 配置appsettings.json,配置具体的Consul地址和服务参数。
  • 在目标服务中添加健康检查路由,返回正常响应。
  • 示例代码如下:

    public class ConsulBuilder {
    public static void AddConsul(this IApplicationBuilder app,
    ConsulServiceOptions options) {
    var consular = new ConsulClient(_ => {
    _ .Address = new Uri(options.ConsulAddress);
    });
    var registration = new AgentServiceRegistration {
    ID = Guid.NewGuid().ToString(),
    Name = options.ServiceName,
    Address = options.ServiceIP,
    Port = options.ServicePort,
    Check = new AgentServiceCheck {
    DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(5),
    Interval = TimeSpan.FromSeconds(10),
    HTTP = options.ServiceHealthCheck,
    Timeout = TimeSpan.FromSeconds(5)
    }
    };
    consular.Agent.ServiceRegister(registration).Wait();
    app.UseConsul();
    }
    }
    public class ConsulServiceOptions {
    public string ServiceName { get; set; }
    public string ServiceIP { get; set; }
    public int ServicePort { get; set; }
    public string ServiceHealthCheck { get; set; }
    public string ConsulAddress { get; set; }
    }

    网关配置与服务发现

    在网关层,采用Ocelot框架,可集成Consul作为服务发现提供商。配置文件Ocelot.json中,添加相应的服务发现设置。

    "Routes": [
    {
    "ServiceName": "UserService",
    "DownstreamScheme": "https",
    "DownstreamPathTemplate": "/api/user/{path}",
    "UpstreamPathTemplate": "/user/{path}",
    "UpstreamHttpMethod": ["Get", "Post"],
    "LoadBalancerOptions": {
    "Type": "RoundRobin"
    },
    "UseServiceDiscovery": true,
    "RateLimitOptions": {
    "ClientIdHeader": "client_id",
    "QuotaExceededMessage": "Too many requests, are you OK?",
    "HttpStatusCode": 999,
    "Period": "1s",
    "PeriodTimespan": 15,
    "Limit": 2
    }
    }
    ],
    "GlobalConfiguration": {
    "BaseUrl": "https://localhost:44335",
    "ReRouteIsCaseSensitive": false,
    "ServiceDiscoveryProvider": {
    "Host": "localhost",
    "Port": 8500,
    "Type": "Consul"
    }
    }

    确保配置文件中Consul地址与实际运行一致,路径正确配置可选项如重审限流和QoS。

    部署与环境搭建

    优秀的开源文档等待完善网关配置,不论是Linux、Windows还是Docker环境,主要是将Consul和Ocelot安装配置到同一网络中即可。

    总结

    通过Consul实现服务自动发现,即可简化网关管理。在开发过程中,只需配置服务注册信息,Consul即可自动处理地址变更和健康检查。特别不需要修改网关代码,无论服务实例数量怎样增加,都能无缝支持。

    转载地址:http://xppcz.baihongyu.com/

    你可能感兴趣的文章
    NN&DL4.3 Getting your matrix dimensions right
    查看>>
    NN&DL4.7 Parameters vs Hyperparameters
    查看>>
    NN&DL4.8 What does this have to do with the brain?
    查看>>
    nnU-Net 终极指南
    查看>>
    No 'Access-Control-Allow-Origin' header is present on the requested resource.
    查看>>
    NO 157 去掉禅道访问地址中的zentao
    查看>>
    no available service ‘default‘ found, please make sure registry config corre seata
    查看>>
    No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?
    查看>>
    no connection could be made because the target machine actively refused it.问题解决
    查看>>
    No Datastore Session bound to thread, and configuration does not allow creation of non-transactional
    查看>>
    No fallbackFactory instance of type class com.ruoyi---SpringCloud Alibaba_若依微服务框架改造---工作笔记005
    查看>>
    No Feign Client for loadBalancing defined. Did you forget to include spring-cloud-starter-loadbalanc
    查看>>
    No mapping found for HTTP request with URI [/...] in DispatcherServlet with name ...的解决方法
    查看>>
    No mapping found for HTTP request with URI [/logout.do] in DispatcherServlet with name 'springmvc'
    查看>>
    No module named 'crispy_forms'等使用pycharm开发
    查看>>
    No module named cv2
    查看>>
    No module named tensorboard.main在安装tensorboardX的时候遇到的问题
    查看>>
    No module named ‘MySQLdb‘错误解决No module named ‘MySQLdb‘错误解决
    查看>>
    No new migrations found. Your system is up-to-date.
    查看>>
    No qualifying bean of type XXX found for dependency XXX.
    查看>>