-
-
Notifications
You must be signed in to change notification settings - Fork 70
Host template guidance
Thang Chung edited this page Dec 28, 2018
·
3 revisions
- Rest Template
- Standard Template
- EfCore Template
- MongoDb Template
- gRPC template
- Standard gRPC Template
- EfCore gRPC Template
- MongoDb gPRC Template
No. | Feature | Type of feature | Description | Guidance |
---|---|---|---|---|
1. | EfCore or MongoDb | Opt-in | Database Providers: Entity Framework(SQL Server, MySQL, and SQLite) and MongoDb | link |
2. | RestClient | Out of the box | The Rest client along with failure resilient mechanism which uses to call to another endpoints | link |
3. | DomainEventBus | Out of the box | In-memory domain event bus which allows another subscribers to subscribe and publish other events to distributed bus. | link |
4. | CleanArch | Opt-in | Build-in with simplify Clean Architecture elements which help developers easy to organize the code with clean style | link |
5. | Cache | Out of the box | Output cache for WebAPI | link |
6. | ApiVersion | Opt-in | Help to organize the API along with versioning its | link |
7. | Mvc | Out of the box | Add Mvc code style for WebAPI | link |
8. | DetailException | Out of the box | Exception handling with details of stack trace in clean structure which helps a lot in debug and error trace | link |
9. | AuthN | Opt-in | Enabled ability which helps to do authentication on the API with the effortless works | link |
10. | OpenApi | Opt-in | Support the OpenApi standard with the Swagger file generated out of the box. | link |
11. | Cors | Out of the box | Support CORS mechanism then we can configure the white list of accessing sites. | link |
12. | HeaderForward | Out of the box | Help to forward x-forward-for and x-forward-proto headers in case we host behind of the reverse proxy or load balancer | link |
13. | OpenApi-Profiler | Opt-in | Enable the profiler for WebAPI which is we can see how many seconds does it take to do the request to the WebAPI | link |
14. | Health | Out of the box | Expose /healthz endpoint so that the orchestrator like Docker Swarm or Kubernetes can check that to make sure the readiness of the application | link |
No. | Feature | Type of feature | Description | Guidance |
---|---|---|---|---|
1. | In-Process Bus | Opt-in | Help to publish and subscribe the domain events in simplify cases | link |
2. | Redis Bus | Opt-in | Help to publish and subscribe the domain events in high scalability style using Redis Broker | link |
3. | Kafka Bus | Opt-in | Help to publish and subscribe the domain events in high scalability style using Kafka Broker | link |
4. | MessagePack | Opt-in | Support MessagePack for WebAPI | link |
5. | ResponseCompression | Opt-in | Support brotli compression standard | link |
- Log exception handler
app.UseMiddleware<LogHandlerMiddleware>();
- Response cache
app.UseResponseCaching();
- Configure Exception handling
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
if (feature.IsEnabled("OpenApi:Profiler"))
app.UseMiniProfiler();
}
else
{
app.UseExceptionHandler("/error");
}
app.UseExceptionHandlerCore();
app.UseMiddleware<ErrorHandlerMiddleware>();
- BeatPulse healthcheck
app
.UseBeatPulse(options =>
{
options.ConfigurePath("healthz") //default hc
.ConfigureTimeout(1500) // default -1 infinitely
.ConfigureDetailedOutput(true, true); //default (true,false)
});
- Miniprofiler on API
if (feature.IsEnabled("OpenApi:Profiler"))
app.UseMiddleware<MiniProfilerMiddleware>();
- liveness endpoint
#pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously
app.Map("/liveness", lapp => lapp.Run(async ctx => ctx.Response.StatusCode = 200));
#pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously
- Re-configure the base path (need for hosting in sub-directory on Kubernetes)
var basePath = config.GetBasePath();
if (!string.IsNullOrEmpty(basePath))
{
var logger = loggerFactory.CreateLogger("init");
logger.LogInformation($"Using PATH BASE '{basePath}'");
app.UsePathBase(basePath);
}
- ForwardHeaders
if (!env.IsDevelopment())
app.UseForwardedHeaders();
- Cors
app.UseCors("CorsPolicy");
- AuthN
if (feature.IsEnabled("AuthN"))
app.UseAuthentication();
- Mvc
app.UseMvc();
- Open API
if (feature.IsEnabled("OpenApi"))
app.UseSwagger();
if (feature.IsEnabled("OpenApi:OpenApiUI"))
{
// to make it work, we need to create an application with swagger_app name
app.UseSwaggerUI(
c =>
{
var provider = app.ApplicationServices.GetRequiredService<IApiVersionDescriptionProvider>();
foreach (var description in provider.ApiVersionDescriptions)
c.SwaggerEndpoint(
$"{basePath}swagger/{description.GroupName}/swagger.json",
description.GroupName.ToUpperInvariant());
if (feature.IsEnabled("AuthN"))
{
c.OAuthClientId("swagger_id");
c.OAuthClientSecret("secret".Sha256());
c.OAuthAppName("swagger_app");
c.OAuth2RedirectUrl($"{config.GetExternalCurrentHostUri()}/swagger/oauth2-redirect.html");
}
if (feature.IsEnabled("OpenApi:Profiler"))
c.IndexStream = () =>
typeof(Infrastructure.AspNetCore.All.ServiceCollectionExtensions)
.GetTypeInfo()
.Assembly
.GetManifestResourceStream("NetCoreKit.Infrastructure.AspNetCore.All.Swagger.index.html");
});
}