Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Consul Service Discovery Not Working With Dynamic Routing #655

Closed
mikejr83 opened this issue Oct 10, 2018 · 12 comments
Closed

Consul Service Discovery Not Working With Dynamic Routing #655

mikejr83 opened this issue Oct 10, 2018 · 12 comments
Labels
bug Identified as a potential bug help wanted Not actively being worked on. If you plan to contribute, please drop a note. merged Issue has been merged to dev and is waiting for the next release

Comments

@mikejr83
Copy link
Contributor

Expected Behavior

Use Ocelot and Consul for service discovery and dynamic routing.

Actual Behavior

Without defining ReRoutes an error occurs.

Steps to Reproduce the Problem

  1. Setup Consul and register a service
  2. Setup Ocelot and provide configuration to talk to Consul with Ocelot.Provider.Consul
  3. Attempt to go to the route which should be dynamically routed.

Specifications

  • Version: 12.0.1
  • Platform: .Windows
  • Subsystem: NET Core 2.1

Error

dbug: Ocelot.Errors.Middleware.ExceptionHandlerMiddleware[0]
      requestId: 0HLHEQFFHMBL6:00000002, previousRequestId: no previous request id, message: ocelot pipeline started
dbug: Ocelot.DownstreamRouteFinder.Middleware.DownstreamRouteFinderMiddleware[0]
      requestId: 0HLHEQFFHMBL6:00000002, previousRequestId: no previous request id, message: Upstream url path is /background-forms-api/api/values
info: Ocelot.DownstreamRouteFinder.Finder.DownstreamRouteProviderFactory[0]
      requestId: 0HLHEQFFHMBL6:00000002, previousRequestId: no previous request id, message: Selected DownstreamRouteCreator as DownstreamRouteProvider for this request
dbug: Ocelot.Errors.Middleware.ExceptionHandlerMiddleware[0]
      requestId: 0HLHEQFFHMBL6:00000002, previousRequestId: no previous request id, message: error calling middleware
fail: Ocelot.Errors.Middleware.ExceptionHandlerMiddleware[0]
      requestId: 0HLHEQFFHMBL6:00000002, previousRequestId: no previous request id, message: Exception caught in global error handler, exception message: The given key 'DownstreamRouteCreator' was not present in the dictionary., exception stack:    at System.Collections.Generic.Dictionary`2.get_Item(TKey key)
         at Ocelot.DownstreamRouteFinder.Finder.DownstreamRouteProviderFactory.Get(IInternalConfiguration config) in C:\projects\Ocelot\src\Ocelot\DownstreamRouteFinder\Finder\DownstreamRouteProviderFactory.cs:line 28
         at Ocelot.DownstreamRouteFinder.Middleware.DownstreamRouteFinderMiddleware.Invoke(DownstreamContext context) in C:\projects\Ocelot\src\Ocelot\DownstreamRouteFinder\Middleware\DownstreamRouteFinderMiddleware.cs:line 39
         at Ocelot.Responder.Middleware.ResponderMiddleware.Invoke(DownstreamContext context) in C:\projects\Ocelot\src\Ocelot\Responder\Middleware\ResponderMiddleware.cs:line 34
         at Ocelot.Middleware.Pipeline.MapWhenMiddleware.Invoke(DownstreamContext context) in C:\projects\Ocelot\src\Ocelot\Middleware\Pipeline\MapWhenMiddleware.cs:line 40
         at Ocelot.Errors.Middleware.ExceptionHandlerMiddleware.Invoke(DownstreamContext context) in C:\projects\Ocelot\src\Ocelot\Errors\Middleware\ExceptionHandlerMiddleware.cs:line 53 RequestId: 0HLHEQFFHMBL6:00000002, exception: System.Collections.Generic.KeyNotFoundException: The given key 'DownstreamRouteCreator' was not present in the dictionary.
         at System.Collections.Generic.Dictionary`2.get_Item(TKey key)
         at Ocelot.DownstreamRouteFinder.Finder.DownstreamRouteProviderFactory.Get(IInternalConfiguration config) in C:\projects\Ocelot\src\Ocelot\DownstreamRouteFinder\Finder\DownstreamRouteProviderFactory.cs:line 28
         at Ocelot.DownstreamRouteFinder.Middleware.DownstreamRouteFinderMiddleware.Invoke(DownstreamContext context) in C:\projects\Ocelot\src\Ocelot\DownstreamRouteFinder\Middleware\DownstreamRouteFinderMiddleware.cs:line 39
         at Ocelot.Responder.Middleware.ResponderMiddleware.Invoke(DownstreamContext context) in C:\projects\Ocelot\src\Ocelot\Responder\Middleware\ResponderMiddleware.cs:line 34
         at Ocelot.Middleware.Pipeline.MapWhenMiddleware.Invoke(DownstreamContext context) in C:\projects\Ocelot\src\Ocelot\Middleware\Pipeline\MapWhenMiddleware.cs:line 40
         at Ocelot.Errors.Middleware.ExceptionHandlerMiddleware.Invoke(DownstreamContext context) in C:\projects\Ocelot\src\Ocelot\Errors\Middleware\ExceptionHandlerMiddleware.cs:line 53
dbug: Ocelot.Errors.Middleware.ExceptionHandlerMiddleware[0]
      requestId: 0HLHEQFFHMBL6:00000002, previousRequestId: no previous request id, message: ocelot pipeline finished

Configuration

Ocelot

The configuration is pulled from appsettings.json:

{
  "ReRoutes": [],
  "Aggregates": [],
  "GlobalConfiguration": {
    "RequestIdKey": null,
    "ServiceDiscoveryProvider": {
      "ConfigurationKey": "Ocelot",
      "Host": "localhost",
      "Port": 8500,
      "Type": "Consul"
    },
    "RateLimitOptions": {
      "ClientIdHeader": "ClientId",
      "QuotaExceededMessage": null,
      "RateLimitCounterPrefix": "ocelot",
      "DisableRateLimitHeaders": false,
      "HttpStatusCode": 429
    },
    "QoSOptions": {
      "ExceptionsAllowedBeforeBreaking": 0,
      "DurationOfBreak": 0,
      "TimeoutValue": 0
    },
    "LoadBalancerOptions": {
      "Type": "LeastConnection"
    },
    "DownstreamScheme": "http",
    "HttpHandlerOptions": {
      "AllowAutoRedirect": false,
      "UseCookieContainer": false,
      "UseTracing": false
    }
  }
}

Consul

The service self-registers with Consul on startup.

{
	"ID": "098a60b3-9e77-d3e1-ccb7-56580afadb74",
	"Node": "54060bfe6310",
	"Address": "127.0.0.1",
	"Datacenter": "dc1",
	"TaggedAddresses": {
		"lan": "127.0.0.1",
		"wan": "127.0.0.1"
	},
	"NodeMeta": {
		"consul-network-segment": ""
	},
	"ServiceKind": "",
	"ServiceID": "background-forms-api-v1-final-01-192.168.1.203-5000",
	"ServiceName": "background-forms-api",
	"ServiceTags": [
		"Forms"
	],
	"ServiceAddress": "192.168.1.203",
	"ServiceWeights": {
		"Passing": 1,
		"Warning": 1
	},
	"ServiceMeta": {
		"BoolTest": "\"True\"",
		"DecimalTest": "\"12.3\"",
		"Scopes": "[\"oidc\",\"name\",\"email\",\"gender\",\"birthdate\",\"zoneinfo\",\"locale\",\"phone_number\",\"address\"]",
		"StringTest": "\"Hello\""
	},
	"ServicePort": 5000,
	"ServiceEnableTagOverride": false,
	"ServiceProxyDestination": "",
	"ServiceConnect": {
		"Native": false,
		"Proxy": null
	},
	"CreateIndex": 396,
	"ModifyIndex": 580
}

Description

I've setup a basic API gateway in .NET Core 2.1 using Ocelot. The goal is to have the API gateway configure its routing based on the information inside of a service registry.

To meet this I've setup Consul and have services self-register as they come on-line. Ocelot should then be able to use Consul to determine the routes for downstream services.

When I attempt to do this per the configuration I get the above error. If I change my configuration to manually put the route information into ReRoutes Ocelot will detect the host and port information from Consul and redirect the request.

I tried to trace what is going on during the configuration of Ocelot. To me it seems that the ConsulProviderFactory.Get is never executed in the case where the ReRoutes array is empty.

@TomPallister
Copy link
Member

@mikejr83 thanks for your PR! I will merge it ASAP.

@TomPallister TomPallister added bug Identified as a potential bug help wanted Not actively being worked on. If you plan to contribute, please drop a note. labels Oct 13, 2018
@TomPallister TomPallister added the merged Issue has been merged to dev and is waiting for the next release label Oct 13, 2018
@TomPallister TomPallister reopened this Oct 13, 2018
@Loongle
Copy link

Loongle commented Oct 14, 2018

I have the same problem, please kindly release the new version as soon as possible

@Loongle
Copy link

Loongle commented Oct 15, 2018

Dude, I can't wait for your version

@mikejr83
Copy link
Contributor Author

LOL. I've been just building it and replacing the binary in the NuGet path. It was driving me bonkers on this PoC I'm working on.

@Loongle
Copy link

Loongle commented Oct 15, 2018

@mikejr83 Thank you for your hard work

@Loongle
Copy link

Loongle commented Oct 17, 2018

When will it be updated to the nuget repository?

@thiagoloureiro
Copy link
Contributor

thiagoloureiro commented Nov 5, 2018

Guys any plan to release new Nuget Package ? I need urgently use dynamic routes and this is blocking me!
Or release as beta this one :)
Thanks a lot!

@Loongle
Copy link

Loongle commented Nov 5, 2018

me too. @thiagoloureiro

@rodineijf
Copy link

me too

@ricofritzsche
Copy link

Is there a new version? Have the same problem :(

@mickeygo
Copy link

The same problem,I have to downgrade from 12.0.1 version to 12.0.0

@TomPallister
Copy link
Member

available in version 13.0.0 on nuget

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Identified as a potential bug help wanted Not actively being worked on. If you plan to contribute, please drop a note. merged Issue has been merged to dev and is waiting for the next release
Projects
None yet
Development

No branches or pull requests

7 participants