我正在尝试利用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)。
答案 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。