CheckID没有关联的TTL

时间:2017-11-23 20:46:42

标签: c# .net consul

我正在尝试利用Consul .NET API通过TTL注册和解除健康检查。首先,我使用以下代码注册我的服务:

var address = node.Address;
var id = ServiceId(address);
var registration = new AgentServiceRegistration
{
    ID = id,
    Name = node.ClusterName,
    Address = node.Address.Host,
    Port = node.Address.Port.Value,
    Check = new AgentServiceCheck
    {
        TTL = settings.AliveInterval, // 10sec
        DeregisterCriticalServiceAfter = settings.AliveTimeout, // 60sec
    }
};    
// first, try to deregister service, if it has been registered previously
await consul.Agent.ServiceDeregister(registration.ID);
await consul.Agent.ServiceRegister(registration);

之后,我试图通过以下方式解雇TTL:

await consul.Agent.PassTTL("service:" + ServiceId(addr), string.Empty);

但是,我最终得到的是在PassTTL期间抛出的异常: Consul.ConsulRequestException:意外响应,状态代码InternalServerError:CheckID“service:{service-id}”没有关联的TTL

来自领事代理人的相关日志:

  

[ERR] http:请求PUT / v1 / agent / check / pass / service:{service-id},错误:CheckID“service:{service-id}”没有来自= 127.0.0.1的关联TTL: 25419

我想知道我在这里做错了什么。

我正在使用consul agent -dev(版本:1.0.1)和Nuget包Consul(版本:0.7.2.3)。

3 个答案:

答案 0 :(得分:2)

结果证明AgentServiceRegistration.Check属性几乎没有用。我已经通过CheckRegister方法达到了预期的结果。

这是代码

var registration = new AgentServiceRegistration
{
    ID = "serviceId",
    Name = node.ClusterName,
    Address = node.Address.Host,
    Port = node.Address.Port.Value
};    
// first, try to deregister service, if it has been registered previously
await consul.Agent.ServiceDeregister(registration.ID);
await consul.Agent.ServiceRegister(registration);
await consul.Agent.CheckRegister(new AgentCheckRegistration()
{
    ID = "checkId",
    Name = "Check Name",
    Status = HealthStatus.Passing,
    TTL = settings.AliveInterval,
    ServiceID = "serviceId",
    DeregisterCriticalServiceAfter = settings.AliveTimeout, // 60sec
})

现在您可以通过传递

await consul.Agent.PassTTL("checkId", string.Empty);

请务必在以后注销您的支票

答案 1 :(得分:0)

看起来我的示例在这里缺少一个关键细节:ServiceId(address)方法正在以 protocol:// service @ host:port / 的形式构建服务ID,导致领事抱怨缺乏TTL。将其更改为 service @ host:port 似乎可以修复错误。

我猜在这种情况下,领事错误消息非常具有误导性。

答案 2 :(得分:0)

检查ID格式是否为:

"service:{service id}:{number}"

在您的情况下,您必须通过:

"service:" + ServiceId(addr) + ":1"

作为您的支票ID。