more error handling and docs

This commit is contained in:
TomPallister
2020-04-13 12:46:14 +01:00
parent c9483cdad6
commit 7408060fba
18 changed files with 189 additions and 76 deletions

View File

@ -42,5 +42,6 @@
RequestCanceled = 37,
ConnectionToDownstreamServiceError = 38,
CouldNotFindLoadBalancerCreator = 39,
ErrorInvokingLoadBalancerCreator = 40,
}
}

View File

@ -4,15 +4,16 @@
using Ocelot.Configuration;
using Ocelot.Infrastructure;
using Ocelot.ServiceDiscovery.Providers;
using Ocelot.Responses;
public class CookieStickySessionsCreator : ILoadBalancerCreator
{
public ILoadBalancer Create(DownstreamReRoute reRoute, IServiceDiscoveryProvider serviceProvider)
public Response<ILoadBalancer> Create(DownstreamReRoute reRoute, IServiceDiscoveryProvider serviceProvider)
{
var loadBalancer = new RoundRobin(async () => await serviceProvider.Get());
var bus = new InMemoryBus<StickySession>();
return new CookieStickySessions(loadBalancer, reRoute.LoadBalancerOptions.Key,
reRoute.LoadBalancerOptions.ExpiryInMs, bus);
return new OkResponse<ILoadBalancer>(new CookieStickySessions(loadBalancer, reRoute.LoadBalancerOptions.Key,
reRoute.LoadBalancerOptions.ExpiryInMs, bus));
}
public string Type => nameof(CookieStickySessions);

View File

@ -3,6 +3,7 @@
using System;
using Ocelot.Configuration;
using Ocelot.ServiceDiscovery.Providers;
using Ocelot.Responses;
public class DelegateInvokingLoadBalancerCreator<T> : ILoadBalancerCreator
where T : ILoadBalancer
@ -15,9 +16,17 @@
_creatorFunc = creatorFunc;
}
public ILoadBalancer Create(DownstreamReRoute reRoute, IServiceDiscoveryProvider serviceProvider)
public Response<ILoadBalancer> Create(DownstreamReRoute reRoute, IServiceDiscoveryProvider serviceProvider)
{
return _creatorFunc(reRoute, serviceProvider);
try
{
return new OkResponse<ILoadBalancer>(_creatorFunc(reRoute, serviceProvider));
}
catch (Exception e)
{
return new ErrorResponse<ILoadBalancer>(new ErrorInvokingLoadBalancerCreator(e));
}
}
public string Type => typeof(T).Name;

View File

@ -0,0 +1,12 @@
namespace Ocelot.LoadBalancer.LoadBalancers
{
using System;
using Errors;
public class ErrorInvokingLoadBalancerCreator : Error
{
public ErrorInvokingLoadBalancerCreator(Exception e) : base($"Error when invoking user provided load balancer creator function, Message: {e.Message}, StackTrace: {e.StackTrace}", OcelotErrorCode.ErrorInvokingLoadBalancerCreator)
{
}
}
}

View File

@ -1,11 +1,12 @@
using Ocelot.Configuration;
using Ocelot.ServiceDiscovery.Providers;
namespace Ocelot.LoadBalancer.LoadBalancers
namespace Ocelot.LoadBalancer.LoadBalancers
{
using Ocelot.Responses;
using Ocelot.Configuration;
using Ocelot.ServiceDiscovery.Providers;
public interface ILoadBalancerCreator
{
ILoadBalancer Create(DownstreamReRoute reRoute, IServiceDiscoveryProvider serviceProvider);
Response<ILoadBalancer> Create(DownstreamReRoute reRoute, IServiceDiscoveryProvider serviceProvider);
string Type { get; }
}
}

View File

@ -2,12 +2,13 @@
{
using Ocelot.Configuration;
using Ocelot.ServiceDiscovery.Providers;
using Ocelot.Responses;
public class LeastConnectionCreator : ILoadBalancerCreator
{
public ILoadBalancer Create(DownstreamReRoute reRoute, IServiceDiscoveryProvider serviceProvider)
public Response<ILoadBalancer> Create(DownstreamReRoute reRoute, IServiceDiscoveryProvider serviceProvider)
{
return new LeastConnection(async () => await serviceProvider.Get(), reRoute.ServiceName);
return new OkResponse<ILoadBalancer>(new LeastConnection(async () => await serviceProvider.Get(), reRoute.ServiceName));
}
public string Type => nameof(LeastConnection);

View File

@ -35,8 +35,14 @@
return new ErrorResponse<ILoadBalancer>(new CouldNotFindLoadBalancerCreator($"Could not find load balancer creator for Type: {requestedType}, please check your config specified the correct load balancer and that you have registered a class with the same name."));
}
var createdLoadBalancer = applicableCreator.Create(reRoute, serviceProvider);
return new OkResponse<ILoadBalancer>(createdLoadBalancer);
var createdLoadBalancerResponse = applicableCreator.Create(reRoute, serviceProvider);
if (createdLoadBalancerResponse.IsError)
{
return new ErrorResponse<ILoadBalancer>(createdLoadBalancerResponse.Errors);
}
return new OkResponse<ILoadBalancer>(createdLoadBalancerResponse.Data);
}
}
}

View File

@ -2,12 +2,13 @@
{
using Ocelot.Configuration;
using Ocelot.ServiceDiscovery.Providers;
using Ocelot.Responses;
public class NoLoadBalancerCreator : ILoadBalancerCreator
{
public ILoadBalancer Create(DownstreamReRoute reRoute, IServiceDiscoveryProvider serviceProvider)
public Response<ILoadBalancer> Create(DownstreamReRoute reRoute, IServiceDiscoveryProvider serviceProvider)
{
return new NoLoadBalancer(async () => await serviceProvider.Get());
return new OkResponse<ILoadBalancer>(new NoLoadBalancer(async () => await serviceProvider.Get()));
}
public string Type => nameof(NoLoadBalancer);

View File

@ -2,12 +2,13 @@
{
using Ocelot.Configuration;
using Ocelot.ServiceDiscovery.Providers;
using Ocelot.Responses;
public class RoundRobinCreator : ILoadBalancerCreator
{
public ILoadBalancer Create(DownstreamReRoute reRoute, IServiceDiscoveryProvider serviceProvider)
public Response<ILoadBalancer> Create(DownstreamReRoute reRoute, IServiceDiscoveryProvider serviceProvider)
{
return new RoundRobin(async () => await serviceProvider.Get());
return new OkResponse<ILoadBalancer>(new RoundRobin(async () => await serviceProvider.Get()));
}
public string Type => nameof(RoundRobin);

View File

@ -46,7 +46,8 @@ namespace Ocelot.Responder
}
if (errors.Any(e => e.Code == OcelotErrorCode.UnableToCompleteRequestError
|| e.Code == OcelotErrorCode.CouldNotFindLoadBalancerCreator))
|| e.Code == OcelotErrorCode.CouldNotFindLoadBalancerCreator
|| e.Code == OcelotErrorCode.ErrorInvokingLoadBalancerCreator))
{
return 500;
}