目前大家很多使用consul.其实etcd也可以做到只是没有直接集成进去.
etcd作为服务注册发现中心 ,其原理一样.已经有相关包做了封装.
理论上,etcd的服务发现更快,和consul不同的是健康检查,consul主动获取提供的检查地址定时检查 etcd则是服务自己发送心跳包.
服务设置时间周期 定时向etcd服务发送心跳,一旦超时服务将立即从etcd中移除。这里主要是使用了etcd的租约机制.
ocelot则会直接获取etcd中服务状态,不是定时获取服务而是监听服务状态,可以及时更新服务。这里主要使用了etcd的watch机制。能瞬间被推送信息。
etcd还有其它功能方便需要扩展,这里就扩展了存储机制。
版本高的替换否则不能替换。
getcondig(string file)获取配置。
addconfig(string file,string version,string name) 保存配置文件
web服务使用,引入nuget Etcd.Register
//配置etcd地址,只需要一个可用即可,内部会刷新集群地址
builder.Services.AddSingleton<EtcdClientConfiguration>(new EtcdClientConfiguration("127.0.0.1", 2379, ""));
//注册本服务地址
builder.Services.AddEtcd().AddEtcdServiceRegistration(p =>
{
p.Port = 4002;
p.Address = "127.0.0.1";
p.Name = "homepage";
p.Check = new Etcd.Register.AgentCheckRegistration
{
TTL = 10,
ServiceID = "A2"
};
p.ID = Guid.NewGuid().ToString();
});
var app = builder.Build();
基本保持了consul的参数。
Ocelot项目中使用,引入nuget Ocelot.Provider.Etcd.Cluster
builder.Services.AddOcelot(builder.Configuration).AddEtcd().AddPolly(); //加 etcd服务 polly
配置文件中需要配置etcd访问地址,只需要一个可访问的地址,etcd集群会内部获取地址。etcd的服务时主动上报,检查时间就无用了。
"ServiceDiscoveryProvider": {
"Host": "localhost", // Consul Service IP
"Port": 2379, // Consul Service Port ;nginx代理集群时就是ngix端口
// "Port": 8500 // Consul Service Port ;nginx代理集群时就是ngix端口
"Type": "Etcd",
//"Type": "PollConsul",
// "PollingInterval": 100 //健康检查时间端
},