Presentation about API Gateway and Service Discovery in .NET
Links:
https://devmentors.io/distributed-net-core/
https://microservices.io/patterns/index.html
https://www.consul.io/docs/index.html
https://github.com/canton7/RestEase
https://github.com/tbr09/TrashRouting
08448380779 Call Girls In Civil Lines Women Seeking Men
Clean up this mess - API Gateway & Service Discovery in .NET
1. Clean up this mess!
API Gateway and Service Discovery in .NET
2. Marcin Tyborowski
• .NET Developer at Billennium
• Speaker
• Co-organizer of Programistok
• Member of Billennium Inspiration
Team
3. Microservices
• Split monolith into small applications
• Separately processes
• Way of designing software applications
• Is not a golden mean
4.
5. Agenda
• What’s the problem?
• Split our solution into services
• API Gateway with RestEase
• What about security? ( ͡° ͜ʖ ͡° )
• Let’s remove some dependencies! – Service Discovery
14. Service Contract in RestEase
public interface IRouteService
{
[Get("route")]
Task<IEnumerable<Route>> GetRoutes();
[Get("route/{id}")]
Task<Route> GetRouteById([Path] int id);
[Post("route")]
Task<Response<HttpResponseMessage>>
Post(AddRouteCommand route);
}
API
27. Service Discovery
• Services actual state
• Client-side (CSSD)
• API asks register
• Server-side (SSSD)
• API send request to LB which
uses register
32. Consul service registration - startup.cs
public void Configure(IApplicationBuilder app, IHostingEnvironment env,
IApplicationLifetime lifetime)
{
var address = Configuration["Consul:ServiceAddress"];
var servicePort = Configuration["Consul:ServicePort"];
var serviceName = Configuration["Consul:ServiceName"];
var registration = new AgentServiceRegistration()
{
ID = $"{service}-{servicePort}",
Name = service,
Address = address,
Port = Int32.Parse(servicePort)
};
consulClient.Agent.ServiceRegister(registration).Wait();
}
33. public void Configure(IApplicationBuilder app, IHostingEnvironment
env, IApplicationLifetime lifetime)
{
// Registration area
lifetime.ApplicationStopping.Register(() =>
{
consulClient.Agent.ServiceDeregister(registration.ID).Wait();
});
}
Consul service deregistration - startup.cs
39. Service Initialization – HARDCODED ;_;
[Route("[controller]")]
[ApiController]
public class RouteController : ControllerBase
{
private readonly IRouteService routeService;
public RouteController()
{
routeService =
RestClient.For<IRouteService>("http://localhost:5002");
}
}
40. Service Initialization - appsettings.json
[Route("[controller]")]
public class RouteController : ControllerBase
{
private readonly IRouteService routeService;
public RouteController()
{
routeService = RestClient.For<IRouteService>(
configuration["Services:Route:Address"]);
}
}
41. Service Initialization - Consul
[Route("[controller]")]
public class RouteController : ControllerBase
{
private readonly IRouteService routeService;
public RouteController(IConsulClient consulClient)
{
var query = consulClient.Catalog.Service("service-routes")
.GetAwaiter().GetResult();
var serviceInstance = query.Response.First();
routeService = RestClient.For<IRouteService>
($"{serviceInstance.ServiceAddress}:{serviceInstance.ServicePort}");
}
}
45. Tag consul service
var serviceName = Configuration["Fabio:ServiceName"];
var registration = new AgentServiceRegistration()
{
ID = $"{Configuration["Consul:ServiceID"]}-{servicePort}",
Name = serviceName,
Address = address,
Port = Int32.Parse(servicePort),
Tags = $"urlprefix-/{serviceName} strip=/{serviceName}"
};
urlprefix-/route strip=/route
46.
47.
48.
49. • High availability of service
• LB is additional component
in infrastructure (latency!)
• Sewer components in
network
• Avoid API ask for registry
• API should know only LB
address
• More traffic control
Client Side SD Server Side SD
50. Summary
API Gateway:
• Add some organization
• Offload logic to API Gateway (slim
down services)
• Easy documentation
Service Discovery:
• Control services instances
changes
• Load balancing for multiple
instances
Register / Deregister services info in SD register
Zookeeper:
Cluster membership - which brokers are alive and part of the cluster?
Topic configuration - which topics exist, how many partitions each has, where are the replicas