API Gateway: Response Aggregation with Ocelot and ASP.net Core
In the previous article, we've learned how to setup an API gateway using ASP.net Core and Ocelot. This article supplements the previous article by introducing downstream response aggregation through the use of API gateways. You can download the application used in this article by cloning it from GITHUB.
Articles in the Series
This article belongs to a series of articles that explains the importance of API gateways and how to build them using ASP.net Core. If you're interested to learn more about API gateways, it might be a good idea to spend some time reading the articles listed below.- Part 1: API Gateway in a Nutshell.
- Part 2: Building Simple API Gateways with Ocelot.
- Part 3: API Response Aggregation using Ocelot
- Part 4: API Defense using Rate Limiting and Ocelot.
- Part 5: Containerizing API Gateways
- Part 6: Containerizing API Gateways using Alpine Base Image
Recap
In the previous article, we've setup a simple API gateway that aggregates three bounded context APIs (Authentication, Ledger and Catalog). This gateway merely behaves like a reverse-proxy and does nothing special, which is totally fine with simple API gateway use-cases. However, API gateways become more interesting when they start performing response aggregation.
Response Aggregation
Response aggregation is a technique used for merging response from multiple downstream services into a single object. API gateways achieve this by accepting a single request from clients and issuing multiple parallelized requests to downstream services, once all downstream services responds, API gateways perform merging of data into single object and serves it to the clients. This technique results to the following benefits:
-
Fewer HTTP transactions between client and server
Since the responsibility of sending requests to multiple downstream services is offloaded to the API gateway, the communication between the client is reduced to a fewer transaction. -
Client only needs to know a single schema.
Since API gateways aggregate response objects, client-parties only need to deal with a single form of data as compared to dealing schema from multiple providers. -
Cross continental communication become faster.
If the invoking client resides on a different geo-location, the latency factor introduced by cross-continental communication becomes lesser.
Request Aggregation Demo
In order to showcase response aggregation, we will setup an endpoint that will accept a single client request which will then be propagated to our ledger and authentication service for the retrieval of user's profile and all the transactions he/she is involved with.
User Profile Endpoint
User Transactions Endpoint
Basic JSON Response Aggregation
Ocelot offers a powerful mechanism for performing simple response aggregation from downstream services that serve data in JSON format. This could be achieved by writing similar mappings from the previous article but this time with a key property. The key property helps ocelot identify which downstream endpoints to aggregate when configuring an aggregated upstream endpoint.
User Profile Endpoint Mapping
User Transactions Endpoint Mapping
Aggregated Route Configuration
You can test the output of the individual endpoint re-routes and aggregated route using the links below:
-
User Profile
http://localhost:52793/api/user/getbyid/539bf338-e5de-4fc4-ac65-4a91324d8111 -
User Transactions
http://localhost:52793/api/transaction/getbyuserid/539bf338-e5de-4fc4-ac65-4a91324d8111 -
User Profile + Transactions
http://localhost:52793/api/user-transactions/539bf338-e5de-4fc4-ac65-4a91324d8111
Result
Conclusion
Ocelot offers a simple yet powerful mechanism to aggregate multiple downstream endpoints. This feature eases the life of front-end developers that previously have to deal with multiple endpoints. In the next article we will explore how to use Rate Limiting to defend our API gateways from DDOS attacks.
Related Articles
- Part 1: API Gateway in a Nutshell.
- Part 2: Building Simple API Gateways with Ocelot.
- Part 3: API Response Aggregation using Ocelot
- Part 4: API Defense using Rate Limiting and Ocelot.
- Part 5: Containerizing API Gateways
- Part 6: Containerizing API Gateways using Alpine Base Image
- Microservices: Picking the .NET Framework for your containerized applications.
- 10 Steps to Setup and Containerize an Express Server
Thank you very much for your article. It was perfect addition to official documentation. It helps me to clearly understand ocelot functionality.
ReplyDeleteI also can add something about aggregation in new version of ocelot (16.0.1).
There is a possibility to add custom aggregate class to compose result HTTP reply as you wish.
1. in configuration json add name of aggregation. It will be a name of class we have to made.
`"Aggregator": "ProfileAggregator"`
```
...
"Aggregates": [
{
"RouteKeys": [
"users",
"candidates",
"requests"
],
"UpstreamPathTemplate": "/api/{version}/profile/{id}"
"Aggregator": "ProfileAggregator"
}
],
...
```
2. aggregator class ProfileAggregator itself. Here we can do anything with replies from any of microservice and compose any result we need:
```
public class ProfileAggregator : IDefinedAggregator
{
private readonly ILogger _logger;
public ProfileAggregator(ILogger logger)
{
_logger = logger;
}
public async Task Aggregate(List responses)
{
var contentBuilder = new StringBuilder();
foreach (var context in responses)
{
contentBuilder.Append(await context.Items.DownstreamResponse().Content.ReadAsStringAsync());
contentBuilder.Append(",");
}
var stringContent = new StringContent(contentBuilder.ToString())
{
Headers = { ContentType = new MediaTypeHeaderValue("application/json") }
};
return new DownstreamResponse(stringContent, HttpStatusCode.OK,
responses.SelectMany(x => x.Items.DownstreamResponse().Headers).ToList(), "OK");
}
}
```
3. create object of aggregator using DI when application building while starting
```
...
.ConfigureServices(service =>
{
service
.AddOcelot();
.AddSingletonDefinedAggregator();
})
...
```
Thanks for sharing this blog with required contents.
ReplyDeleteAWS Training in Chennai
AWS Training in Bangalore
Excellent article for the people who need information about this course.
ReplyDeleteOnline German Language Course
Online German Course