From e7e4bc2f837c94569987f5630b74fb060a532ec3 Mon Sep 17 00:00:00 2001 From: Ogoun Date: Wed, 10 Apr 2019 17:39:03 +0300 Subject: [PATCH] Fix discovery --- .../Controllers/RoutesController.cs | 17 ---------------- ZeroLevel.Discovery/DiscoveryService.cs | 2 +- ZeroLevel.Discovery/RouteTable.cs | 19 +++++++++--------- ...el.Discovery.csprojAssemblyReference.cache | Bin 160986 -> 164258 bytes ZeroLevel.UnitTests/ExchangeTests.cs | 8 +++----- .../Services/Network/Models/ExServiceInfo.cs | 13 +----------- .../Network/Services/ExServiceHost.cs | 3 +-- .../ZeroLevel.csproj.CoreCompileInputs.cache | 2 +- 8 files changed, 17 insertions(+), 47 deletions(-) diff --git a/ZeroLevel.Discovery/Controllers/RoutesController.cs b/ZeroLevel.Discovery/Controllers/RoutesController.cs index 779fa98..798ff2b 100644 --- a/ZeroLevel.Discovery/Controllers/RoutesController.cs +++ b/ZeroLevel.Discovery/Controllers/RoutesController.cs @@ -33,22 +33,5 @@ namespace ZeroLevel.Discovery return BadRequestAnswer(request, ex); } } - - [HttpPost] - [Route("api/v0/routes")] - [ResponseType(typeof(InvokeResult))] - public HttpResponseMessage AddRoute(HttpRequestMessage request, ExServiceInfo service) - { - try - { - var ir = Injector.Default.Resolve().Append(service); - return request.CreateSelfDestroyingResponse(ir); - } - catch (Exception ex) - { - Log.Error(ex, "Error with append endpoint"); - return BadRequestAnswer(request, ex); - } - } } } \ No newline at end of file diff --git a/ZeroLevel.Discovery/DiscoveryService.cs b/ZeroLevel.Discovery/DiscoveryService.cs index 40cafb6..a0ce469 100644 --- a/ZeroLevel.Discovery/DiscoveryService.cs +++ b/ZeroLevel.Discovery/DiscoveryService.cs @@ -39,7 +39,7 @@ namespace ZeroLevel.Discovery var socketPort = Configuration.Default.First("socketport"); _exInbox = ExchangeTransportFactory.GetServer(socketPort); _exInbox.RegisterInbox>("services", (_, __) => routeTable.Get()); - _exInbox.RegisterInbox("register", (info, _, __) => routeTable.Append(info)); + _exInbox.RegisterInbox("register", (info, _, client) => routeTable.Append(info, client)); Log.Info($"TCP server started {_exInbox.Endpoint.Address}:{socketPort}"); } diff --git a/ZeroLevel.Discovery/RouteTable.cs b/ZeroLevel.Discovery/RouteTable.cs index 7ac8637..8aea7f7 100644 --- a/ZeroLevel.Discovery/RouteTable.cs +++ b/ZeroLevel.Discovery/RouteTable.cs @@ -166,10 +166,11 @@ namespace ZeroLevel.Discovery Save(); } - public InvokeResult Append(ExServiceInfo serviceInfo) + public InvokeResult Append(ExServiceInfo serviceInfo, IZBackward client) { InvokeResult result = null; - if (Ping(serviceInfo.Endpoint, serviceInfo.ServiceKey)) + var endpoint = $"{client.Endpoint.Address}:{client.Endpoint.Port}"; + if (Ping(endpoint, serviceInfo.ServiceKey)) { var key = $"{serviceInfo.ServiceGroup}:{serviceInfo.ServiceType}:{serviceInfo.ServiceKey.Trim().ToLowerInvariant()}"; _lock.EnterWriteLock(); @@ -185,22 +186,22 @@ namespace ZeroLevel.Discovery ServiceType = serviceInfo.ServiceType, Endpoints = new List() }); - _table[key].Endpoints.Add(serviceInfo.Endpoint); - Log.Info($"The service '{serviceInfo.ServiceKey}' registered on endpoint: {serviceInfo.Endpoint}"); + _table[key].Endpoints.Add(endpoint); + Log.Info($"The service '{serviceInfo.ServiceKey}' registered on endpoint: {endpoint}"); } else { var exists = _table[key]; - if (exists.Endpoints.Contains(serviceInfo.Endpoint) == false) + if (exists.Endpoints.Contains(endpoint) == false) { - Log.Info($"The service '{serviceInfo.ServiceKey}' register endpoint: {serviceInfo.Endpoint}"); - exists.Endpoints.Add(serviceInfo.Endpoint); + Log.Info($"The service '{serviceInfo.ServiceKey}' register endpoint: {endpoint}"); + exists.Endpoints.Add(endpoint); } } } catch (Exception ex) { - Log.Error(ex, "Fault append service ({0} {1}) endpoint '{2}'", serviceInfo.ServiceKey, serviceInfo.Version, serviceInfo.Endpoint); + Log.Error(ex, "Fault append service ({0} {1}) endpoint '{2}'", serviceInfo.ServiceKey, serviceInfo.Version, endpoint); result = InvokeResult.Fault(ex.Message); } finally @@ -212,7 +213,7 @@ namespace ZeroLevel.Discovery } else { - result = InvokeResult.Fault($"Appending endpoint '{serviceInfo.Endpoint}' canceled for service {serviceInfo.ServiceKey} ({serviceInfo.Version}) because endpoind no avaliable"); + result = InvokeResult.Fault($"Appending endpoint '{endpoint}' canceled for service {serviceInfo.ServiceKey} ({serviceInfo.Version}) because endpoind no avaliable"); } return result; } diff --git a/ZeroLevel.Discovery/obj/Debug/ZeroLevel.Discovery.csprojAssemblyReference.cache b/ZeroLevel.Discovery/obj/Debug/ZeroLevel.Discovery.csprojAssemblyReference.cache index 6227be23b0ab567d39af3bfdb5ad2468327624a8..e6af6315ac3d8599b2b90de94c14dd005fe8fe08 100644 GIT binary patch literal 164258 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 F{tt1~uyOzZ diff --git a/ZeroLevel.UnitTests/ExchangeTests.cs b/ZeroLevel.UnitTests/ExchangeTests.cs index 0bd9044..3b9a861 100644 --- a/ZeroLevel.UnitTests/ExchangeTests.cs +++ b/ZeroLevel.UnitTests/ExchangeTests.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Net; using System.Text; using System.Threading; using System.Threading.Tasks; @@ -18,7 +19,6 @@ namespace ZeroLevel.NetworkUnitTests // Arrange var info = new ExServiceInfo { - Endpoint = "192.168.1.11:7755", ServiceGroup = "MyServiceGroup", ServiceKey = "MyServiceKey", ServiceType = "MyServiceType", @@ -35,7 +35,7 @@ namespace ZeroLevel.NetworkUnitTests }); // Act - var client = ExchangeTransportFactory.GetClient(server.Endpoint.Address.ToString() + ":6666"); + var client = ExchangeTransportFactory.GetClient(IPAddress.Loopback.ToString() + ":6666"); var ir = client.Send("register", info); locker.WaitOne(1000); @@ -56,7 +56,6 @@ namespace ZeroLevel.NetworkUnitTests // Arrange var info1 = new ExServiceInfo { - Endpoint = "192.168.1.11:7755", ServiceGroup = "MyServiceGroup", ServiceKey = "MyServiceKey", ServiceType = "MyServiceType", @@ -64,7 +63,6 @@ namespace ZeroLevel.NetworkUnitTests }; var info2 = new ExServiceInfo { - Endpoint = "192.168.41.11:4564", ServiceGroup = "MyServiceGroup", ServiceKey = "MyServiceKey2", ServiceType = "MyServiceType", @@ -77,7 +75,7 @@ namespace ZeroLevel.NetworkUnitTests server.RegisterInbox>("services", (_, __) => new[] { info1, info2 }); // Act - var client = ExchangeTransportFactory.GetClient(server.Endpoint.Address.ToString() + ":6666"); + var client = ExchangeTransportFactory.GetClient(IPAddress.Loopback.ToString() + ":6666"); var ir = client.Request>("services", response => { received = response; diff --git a/ZeroLevel/Services/Network/Models/ExServiceInfo.cs b/ZeroLevel/Services/Network/Models/ExServiceInfo.cs index 2c3ca95..22e88a2 100644 --- a/ZeroLevel/Services/Network/Models/ExServiceInfo.cs +++ b/ZeroLevel/Services/Network/Models/ExServiceInfo.cs @@ -30,13 +30,6 @@ namespace ZeroLevel.Network /// [DataMember] public string ServiceType { get; set; } = DEFAULT_TYPE_NAME; - - /// - /// Connection point, address - /// - [DataMember] - public string Endpoint { get; set; } - /// /// Service version /// @@ -51,8 +44,6 @@ namespace ZeroLevel.Network if (string.Compare(this.ServiceKey, other.ServiceKey, true) != 0) return false; if (string.Compare(this.ServiceGroup, other.ServiceGroup, true) != 0) return false; if (string.Compare(this.ServiceType, other.ServiceType, true) != 0) return false; - - if (string.Compare(this.Endpoint, other.Endpoint, true) != 0) return false; if (string.Compare(this.Version, other.Version, true) != 0) return false; return true; } @@ -64,7 +55,7 @@ namespace ZeroLevel.Network public override int GetHashCode() { - return this.ServiceKey.GetHashCode() ^ this.Endpoint.GetHashCode(); + return this.ServiceKey.GetHashCode(); } public void Serialize(IBinaryWriter writer) @@ -72,7 +63,6 @@ namespace ZeroLevel.Network writer.WriteString(this.ServiceKey); writer.WriteString(this.ServiceGroup); writer.WriteString(this.ServiceType); - writer.WriteString(this.Endpoint); writer.WriteString(this.Version); } @@ -81,7 +71,6 @@ namespace ZeroLevel.Network this.ServiceKey = reader.ReadString(); this.ServiceGroup = reader.ReadString(); this.ServiceType = reader.ReadString(); - this.Endpoint = reader.ReadString(); this.Version = reader.ReadString(); } diff --git a/ZeroLevel/Services/Network/Services/ExServiceHost.cs b/ZeroLevel/Services/Network/Services/ExServiceHost.cs index 771d700..aae7de0 100644 --- a/ZeroLevel/Services/Network/Services/ExServiceHost.cs +++ b/ZeroLevel/Services/Network/Services/ExServiceHost.cs @@ -3,6 +3,7 @@ using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; +using System.Net; using System.Reflection; namespace ZeroLevel.Network @@ -46,7 +47,6 @@ namespace ZeroLevel.Network Server = server, ServiceInfo = new ExServiceInfo { - Endpoint = $"{server.Endpoint.Address}:{server.Endpoint.Port}", ServiceKey = service.Key, Version = service.Version, ServiceGroup = service.Group, @@ -88,7 +88,6 @@ namespace ZeroLevel.Network Server = server, ServiceInfo = new ExServiceInfo { - Endpoint = $"{server.Endpoint.Address}:{server.Endpoint.Port}", ServiceKey = serviceInfo.ServiceKey, Version = serviceInfo.Version, ServiceGroup = serviceInfo.ServiceGroup, diff --git a/ZeroLevel/obj/Debug/ZeroLevel.csproj.CoreCompileInputs.cache b/ZeroLevel/obj/Debug/ZeroLevel.csproj.CoreCompileInputs.cache index 431e5cf..1a69533 100644 --- a/ZeroLevel/obj/Debug/ZeroLevel.csproj.CoreCompileInputs.cache +++ b/ZeroLevel/obj/Debug/ZeroLevel.csproj.CoreCompileInputs.cache @@ -1 +1 @@ -4d221d21073e6ec70fc75d0c6e7d2458aa0f2b9a +23b05e1da25edde99ed56a899f894605a2243d39