mirror of
				https://github.com/nsnail/Ocelot.git
				synced 2025-11-04 12:30:49 +08:00 
			
		
		
		
	Feature/automatic routes with sd (#351)
* #340 started looking at supporting automatic routing when using service discovery * #340 getting old routing tests to pass * #340 renamed stuff to provider rather than finder, as its not longer finding anything * #340 working towards supporting dynamic routing * #340 loads of refactoring to make configuration work with dynamic routing * #340 refactor consul config code so the registry class owns it * #340 default to consul to maintain backwards compat * #340 added docs, finished this branches todos
This commit is contained in:
		@@ -177,4 +177,11 @@ and
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
In the example above if you make a request into Ocelot on /goods/delete Ocelot will match /goods/delete ReRoute. Previously it would have
 | 
			
		||||
matched /goods/{catchAll} (because this is the first ReRoute in the list!).
 | 
			
		||||
matched /goods/{catchAll} (because this is the first ReRoute in the list!).
 | 
			
		||||
 | 
			
		||||
Dynamic Routing
 | 
			
		||||
^^^^^^^^^^^^^^^
 | 
			
		||||
 | 
			
		||||
This feature was requested in `issue 340 <https://github.com/TomPallister/Ocelot/issue/340>`_. The idea is to enable dynamic routing 
 | 
			
		||||
when using a service discovery provider so you don't have to provide the ReRoute config. See the docs :ref:`service-discovery` if 
 | 
			
		||||
this sounds interesting to you.
 | 
			
		||||
 
 | 
			
		||||
@@ -1,3 +1,5 @@
 | 
			
		||||
.. service-discovery:
 | 
			
		||||
 | 
			
		||||
Service Discovery
 | 
			
		||||
=================
 | 
			
		||||
 | 
			
		||||
@@ -88,3 +90,65 @@ Eureka. One of the services polls Eureka every 30 seconds (default) and gets the
 | 
			
		||||
When Ocelot asks for a given service it is retrieved from memory so performance is not a big problem. Please note that this code
 | 
			
		||||
is provided by the Pivotal.Discovery.Client NuGet package so big thanks to them for all the hard work.
 | 
			
		||||
 | 
			
		||||
Dynamic Routing
 | 
			
		||||
^^^^^^^^^^^^^^^
 | 
			
		||||
 | 
			
		||||
This feature was requested in `issue 340 <https://github.com/TomPallister/Ocelot/issue/340>`_. The idea is to enable dynamic routing when using 
 | 
			
		||||
a service discovery provider (see that section of the docs for more info). In this mode Ocelot will use the first segmentof the upstream path to lookup the
 | 
			
		||||
downstream service with the service discovery provider. 
 | 
			
		||||
 | 
			
		||||
An example of this would be calling ocelot with a url like https://api.mywebsite.com/product/products. Ocelot will take the first segment of 
 | 
			
		||||
the path which is product and use it as a key to look up the service in consul. If consul returns a service Ocelot will request it on whatever host and
 | 
			
		||||
port comes back from consul plus the remaining path segments in this case products thus making the downstream call http://hostfromconsul:portfromconsul/products. 
 | 
			
		||||
Ocelot will apprend any query string to the downstream url as normal.
 | 
			
		||||
 | 
			
		||||
In order to enable dynamic routing you need to have 0 ReRoutes in your config. At the moment you cannot mix dynamic and configuration ReRoutes. In addition to this you
 | 
			
		||||
need to specify the Service Discovery provider details as outlined above and the downstream http/https scheme as DownstreamScheme.
 | 
			
		||||
 | 
			
		||||
In addition to that you can set RateLimitOptions, QoSOptions, LoadBalancerOptions and HttpHandlerOptions, DownstreamScheme (You might want to call Ocelot on https but 
 | 
			
		||||
talk to private services over http) that will be applied to all of the dynamic ReRoutes.
 | 
			
		||||
 | 
			
		||||
The config might look something like 
 | 
			
		||||
 | 
			
		||||
.. code-block:: json
 | 
			
		||||
 | 
			
		||||
    {
 | 
			
		||||
        "ReRoutes": [],
 | 
			
		||||
        "Aggregates": [],
 | 
			
		||||
        "GlobalConfiguration": {
 | 
			
		||||
            "RequestIdKey": null,
 | 
			
		||||
            "ServiceDiscoveryProvider": {
 | 
			
		||||
                "Host": "localhost",
 | 
			
		||||
                "Port": 8510,
 | 
			
		||||
                "Type": null,
 | 
			
		||||
                "Token": null,
 | 
			
		||||
                "ConfigurationKey": null
 | 
			
		||||
            },
 | 
			
		||||
            "RateLimitOptions": {
 | 
			
		||||
                "ClientIdHeader": "ClientId",
 | 
			
		||||
                "QuotaExceededMessage": null,
 | 
			
		||||
                "RateLimitCounterPrefix": "ocelot",
 | 
			
		||||
                "DisableRateLimitHeaders": false,
 | 
			
		||||
                "HttpStatusCode": 429
 | 
			
		||||
            },
 | 
			
		||||
            "QoSOptions": {
 | 
			
		||||
                "ExceptionsAllowedBeforeBreaking": 0,
 | 
			
		||||
                "DurationOfBreak": 0,
 | 
			
		||||
                "TimeoutValue": 0
 | 
			
		||||
            },
 | 
			
		||||
            "BaseUrl": null,
 | 
			
		||||
                "LoadBalancerOptions": {
 | 
			
		||||
                "Type": "LeastConnection",
 | 
			
		||||
                "Key": null,
 | 
			
		||||
                "Expiry": 0
 | 
			
		||||
            },
 | 
			
		||||
            "DownstreamScheme": "http",
 | 
			
		||||
            "HttpHandlerOptions": {
 | 
			
		||||
                "AllowAutoRedirect": false,
 | 
			
		||||
                "UseCookieContainer": false,
 | 
			
		||||
                "UseTracing": false
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
Please take a look through all of the docs to understand these options.
 | 
			
		||||
		Reference in New Issue
	
	Block a user