Service Fabric¶
If you have services deployed in Azure Service Fabric you will normally use the naming service to access them.
The following example shows how to set up a Route that will work in Service Fabric.
The most important thing is the ServiceName which is made up of the Service Fabric application name then the specific service name.
We also need to set up the ServiceDiscoveryProvider in GlobalConfiguration.
The example here shows a typical configuration.
It assumes Service Fabric is running on localhost
and that the naming service is on port 19081
.
The example below is taken from the OcelotServiceFabric sample, so please check it if this doesn’t make sense!
{
"Routes": [
{
"DownstreamScheme": "http",
"DownstreamPathTemplate": "/api/values",
"UpstreamPathTemplate": "/EquipmentInterfaces",
"UpstreamHttpMethod": [ "Get" ],
"ServiceName": "OcelotServiceApplication/OcelotApplicationService"
}
],
"GlobalConfiguration": {
"BaseUrl": "https://ocelot.com"
"RequestIdKey": "OcRequestId",
"ServiceDiscoveryProvider": {
"Host": "localhost",
"Port": 19081,
"Type": "ServiceFabric"
}
}
}
If you are using stateless / guest exe services, Ocelot will be able to proxy through the naming service without anything else. However, if you are using statefull / actor services, you must send the PartitionKind and PartitionKey query string values with the client request e.g.
GET
http://ocelot.com/EquipmentInterfaces?PartitionKind=xxx&PartitionKey=xxx
There is no way for Ocelot to work these out for you.
Placeholders in Service Name [1]¶
In Ocelot, you can insert placeholders for variables into your UpstreamPathTemplate
and ServiceName
using the format {something}
.
Important Note: The placeholder variable must exist in both the DownstreamPathTemplate
(or ServiceName
) and the UpstreamPathTemplate
.
Specifically, the UpstreamPathTemplate
should include all placeholders from the DownstreamPathTemplate
and ServiceName
.
Failure to do so will result in Ocelot not starting due to validation errors, which are logged.
Once the validation stage is cleared, Ocelot will replace the placeholder values in the UpstreamPathTemplate
with those from the DownstreamPathTemplate
and/or ServiceName
for each processed request.
Thus, the Placeholders in Service Name 1 behave similarly to the Placeholders feature, but with the ServiceName
property considered during processing.
Placeholders example¶
Here is the example of the version
variable in Service Fabric service name.
Given you have the following ocelot.json:
{
"Routes": [
{
"UpstreamPathTemplate": "/api/{version}/{endpoint}",
"DownstreamPathTemplate": "/{endpoint}",
"ServiceName": "Service_{version}/Api",
}
],
"GlobalConfiguration": {
"BaseUrl": "https://ocelot.com"
"ServiceDiscoveryProvider": {
"Host": "localhost",
"Port": 19081,
"Type": "ServiceFabric"
}
}
}
When you make a request: GET https://ocelot.com/api/1.0/products
Then the Service Fabric request: GET http://localhost:19081/Service_1.0/Api/products