SlideShare a Scribd company logo
1 of 47
1
.NET Core Applications: Design &
Development
Andrii Antilikatorov
2
33
4
.Net Core, Java, NodeJS…
.NET Core will be as popular as Ruby and NodeJS.
.NET Core and NodeJS will be the most popular
platforms for back-end solution compete on the market.
In few years .NET Core (not Java) will be number one
choice for enterprise-level applications.
Analytics says…
55
6
.NET Core :: Few Things
• Many mechanisms such as authentication,
security, component interactions now
changed comparing to .Net Framework.
• Many components and platforms (for example
for Desktop applications) missing.
• .NET Core provides corporate-level software
benefits for small projects
Photo is
example for
placement and
max. size
7
.Net Core vs .Net Framework
• There are cross-platform needs.
• Application architecture is based on
microservices.
• Scalability and high performance are the
must. Need to get as much as possible out
of the box.
• Need to use both Linux and Windows
containers.
• You are running multiple .NET versions side-
by-side.
• Opensource framework is required.
.NET Core
• Application currently uses .NET Framework
and has strong dependencies on Windows.
• Need to use Windows APIs that are not
supported by .NET Core.
• Need to use third-party libraries or NuGet
packages that are not available for .NET
Core.
• Need tools, technologies or platforms not
supported by .NET Core.
.Net Framework
8
.Net Core vs .Net Framework :: Docker Containers
Architecture / App Type Linux containers Windows Containers
Microservices on containers .NET Core .NET Core
Monolithic app .NET Core .NET Framework, .NET Core
Best-in-class performance and scalability .NET Core .NET Core
Windows Server legacy app (“brown-field”) migration to
containers
-- .NET Framework
New container-based development (“green-field”) .NET Core .NET Core
ASP.NET Core .NET Core .NET Core (recommended)
.NET Framework
ASP.NET 4 (MVC 5, Web API 2, and Web Forms) -- .NET Framework
SignalR services .NET Core .NET Framework
.NET Core
WCF, WF, and other legacy frameworks Limited WCF support
in .NET Core
.NET Framework
Limited WCF support in
.NET Core
Consumption of Azure services .NET Core .NET Framework, .NET Core
99
Architecture – General Approach
10
Microservices :: Pros and Cons
• Each microservice is relatively small—easy to
manage and evolve.
• It is possible to scale out individual areas of
the application.
• You can divide the development work
between multiple teams.
• Issues are more isolated.
• You can use the latest technologies.
Benefits
• Distributed application adds complexity for
developers.
• Deployment complexity.
• Atomic transactions usually are not possible.
• Usually increase hardware resource needs
• Communication complexity.
• Partitioning the microservices.
Disadvantages
11
.Net Core Apps :: Hosting
Feature App
Service
Service
Fabric
Virtual
Machine
Near-Instant Deployment X X
Scale up to larger machines without redeploy X X
Instances share content and configuration; no need to redeploy or
reconfigure when scaling
X X
Multiple deployment environments (production, staging) X X
Automatic OS update management X
Seamless switching between 32/64 bit platforms X
Deploy code with Git, FTP X X
Deploy code with WebDeploy X X
Deploy code with TFS X X X
Host web or web service tier of multi-tier architecture X X X
Access Azure services like Service Bus, Storage, SQL Database X X X
Install any custom MSI X X
12
User InterfaceUser Interface
Business LogicBusiness Logic
Data AccessData Access
High-Level Architecture
13
High-Level Architecture
14
Architectural Principles
• SOLID
• Separation of Concerns
• Explicit Dependencies
• Don’t Repeat Yourself
• Persistence Ignorance
• Bounded Contexts
• Command and Query Responsibility Segregation (CQRS)
• Domain-Driven Design
1515
16
API :: Direct Communication
Back-EndBack-End
Microservice 1
Microservice 2
Microservice N
Client AppsClient Apps
17
API :: API Gateway
Back-EndBack-End
Microservice 1
Microservice 2
Microservice N
Client AppsClient Apps
API Gateway
18
API :: API Gateway with Azure API Management
Back-EndBack-End
Microservice 1
Microservice 2
Microservice N
Client AppsClient Apps
Azure API
Management
19
API :: Swagger
• Automatically generates API documentation
• Supports Client API generation and discoverability
• Provides ability to automatically consume and integrate APIs
20
API :: Swagger :: Configuration
public void ConfigureServices(IServiceCollection services)
{
// API documentation configuration
var swaggerConfigurationInfo = new SwaggerConfigurationInfo() {
Title = “My Application User API ",
Description = "Service provides all user specific information and management api.",
TermsOfService = “None”,
SecuritySchemas = new List<SecurityScheme> {
// Define the OAuth2.0 scheme (i.e. Implicit Flow), for access_token the user of
// Swagger will be redirected to Auth0 Login hosted page to input credentials
new OAuth2Scheme { Type = "oauth2", Flow = "implicit", AuthorizationUrl =
m_identityProviderSettings.Auth0Authorize.AbsoluteUri,
Scopes = new Dictionary<string, string> { { "openid profile email", "Security API" }}
}}};
// Add Framework API services(API versioning, swagger, etc.)
services.AddApiServices(swaggerConfigurationInfo);
}
21
API :: AutoRest
{autorest-location}autorest -Input http://{webapiname}.azurewebsites.net/swagger/
public async void InvokeTest()
{
UserApiClient client = new UserApiClient(...);
await client.IdentityUserActivatePostAsync(
new ActivateUserModel
{
ExternalReferenceId = "1354687252",
Password = "Qwerty123"
});
}
22
API Versioning
Back-EndBack-End
V 1.0
API Gateway
V N.M
New Client AppsNew Client Apps
Old Client AppsOld Client Apps
23
API Versioning :: Business Rules
• API versioning shall be applicable for any API endpoint.
• Old versions has to be supported as long as you agreed with our clients.
• Old API versions should work the same way they worked before new
version was introduced.
• Old APIs shall be marked as deprecated.
• All versions has to be testable via unit/integration tests.
• Best practice is to apply versioning to external API only.
24
API Versioning :: Versioning in the URI
• URI Path
https://mywebportal.com/api/v2/getUsers
• Query String
https://mywebportal.com/api/getUsers?v=2.0
25
API Versioning :: Versioning with Header/Accept Header
GET /api/camps HTTP/1.1
Host: localhost:43333
Content-Type: application/json
X-version: 2.0
GET /api/camps HTTP/1.1
Host: localhost:43333
Content-Type: application/json
Accept: application/json;version=2.0
26
API Versioning :: Versioning with Content Type
GET /api/camps HTTP/1.1
Host: localhost:43333
Content-Type: application/vnd.myapplication.v1+json
Accept: application/vnd.myapplication.v1+json
27
API Versioning :: Versioning in Action
• Use Microsoft ASP.NET Api Versioning NuGet package
- Each controller should be marked with API version:
- Each old version API controller should be marked as deprecated
- Each API version should be stored in Version folder
- Each controller should be placed in specific namespace
- Unit and integration tests should be also stored separately
28
29
EF Core :: Resilient Connections
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<DbContext>(options =>
{
options.UseSqlServer(Configuration["ConnectionString"],
sqlServerOptionsAction: sqlOptions =>
{
sqlOptions.EnableRetryOnFailure(
maxRetryCount: 5,
maxRetryDelay: TimeSpan.FromSeconds(10),
errorNumbersToAdd: null);
});
});
30
EF Core :: Resilient Connections and Transactions
System.InvalidOperationException: The configured execution strategy
'SqlServerRetryingExecutionStrategy' does not support user initiated transactions. Use the
execution strategy returned by 'DbContext.Database.CreateExecutionStrategy()' to execute
all the operations in the transaction as a retriable unit.
// Use of resiliency strategy within an explicit transaction
var strategy = dbContext.Database.CreateExecutionStrategy();
await strategy.ExecuteAsync(async () => {
using (var transaction = dbContext.Database.BeginTransaction()) {
dbContext.Users.Update(user);
await dbContext.SaveChangesAsync();
await eventLogService.SaveEventAsync(userChangedEvent);
transaction.Commit();
}
});
SOLUTION
31
EF Core :: Seeding
public class Startup
{
// Other Startup code...
public void Configure(IApplicationBuilder app,
IHostingEnvironment env,
ILoggerFactory loggerFactory)
{
// Other Configure code...
// Seed data through our custom class
CatalogContextSeed.SeedAsync(app).Wait();
// Other Configure code...
}
}
32
EF Core :: Seeding
public class CatalogContextSeed {
public static async Task SeedAsync(IApplicationBuilder applicationBuilder) {
var context = (AppDbContext)applicationBuilder.
ApplicationServices.GetService(typeof(AppDbContext));
using (context) {
context.Database.Migrate();
if (!context.Users.Any()) {
context.Users.AddRange(...);
await context.SaveChangesAsync();
}
if (!context.Departments.Any()) {
context.Departments.AddRange(...);
await context.SaveChangesAsync();
}
}
}
}
}
33
EF Core :: Seeding Improvement
• Use standard migration mechanism.
• Create base class(es) for seed migrations.
• Specify data context via attribute.
34
EF Core :: Seeding Improvement
/// <summary>
/// Seed Roles, RolesClaims and UserRoles
/// </summary>
[DbContext(typeof(MyContext))]
[Migration("SEED_201709121256_AddRolesClaimsUserRoles")]
public class AddRolesClaimsUserRoles : EmptyDbSeedMigration
{
/// <summary>
/// <see cref="SeedMigrationBase.PopulateData"/>
/// </summary>
protected override void PopulateData()
{
...
}
}
35
EF Core :: In-Memory Database
public class Startup
{
// Other Startup code ...
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IConfiguration>(Configuration);
// DbContext using an InMemory database provider
services.AddDbContext<AppDbContext>(opt =>
opt.UseInMemoryDatabase());
}
// Other Startup code ...
}
3636
37
Health Checks
• https://github.com/aspnet/HealthChecks
- src/common
- src/Microsoft.AspNetCore.HealthChecks
- src/Microsoft.Extensions.HealthChecks
- src/Microsoft.Extensions.HealthChecks.SqlServer
- src/Microsoft.Extensions.HealthChecks.AzureStorage
38
Health Checks :: Middleware Registration
public class Program
{
public static void Main(string[] args)
{
var host = new WebHostBuilder()
.UseKestrel()
.UseHealthChecks("/hc)
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseStartup<Startup>()
.Build();
host.Run();
}
}
39
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
// Add health checks here.
services.AddHealthChecks(checks => {
checks.AddUrlCheck(“URL Check" )
.AddHealthCheckGroup("servers",
group => group
.AddUrlCheck("https://myserviceurl::8010")
.AddUrlCheck("https://tmysecondserviceurl:7777"))
}
services.AddMvc();
}
}
Health Checks :: Web Resources
40
checks.AddSqlCheck("MyDatabase", Configuration["ConnectionString"]);
checks.AddAzureBlobStorageCheck("accountName", "accountKey");
checks.AddAzureBlobStorageCheck("accountName", "accountKey", "containerName");
checks.AddAzureTableStorageCheck("accountName", "accountKey");
checks.AddAzureTableStorageCheck("accountName", "accountKey", "tableName");
checks.AddAzureFileStorageCheck("accountName", "accountKey");
checks.AddAzureFileStorageCheck("accountName", "accountKey", "shareName");
checks.AddAzureQueueStorageCheck("accountName", "accountKey");
checks.AddAzureQueueStorageCheck("accountName", "accountKey", "queueName");
Health Checks :: Azure Resources
41
Health Checks :: Custom Resources
checks.AddHealthCheckGroup("memory",
group => group.AddPrivateMemorySizeCheck(1)
.AddVirtualMemorySizeCheck(2)
.AddWorkingSetCheck(1),
CheckStatus.Unhealthy)
.AddCheck("thrower",
(Func<IHealthCheckResult>)(() => { throw new DivideByZeroException(); }))
.AddCheck("long-running",
async cancellationToken =>
{ await Task.Delay(10000, cancellationToken);
return HealthCheckResult.Healthy("I ran too long"); })
.AddCheck<CustomHealthCheck>("custom");
42
Health Checks :: Service Fabric Health Monitoring
43
Health Checks :: Service Fabric :: Health Hierarchy
Cluster
Nodes Applications
Deployed
Applications
Deployed Service
Packages
Services
Partitions
Replicas
44
Health Checks :: Service Fabric :: Cluster Health Policy
<FabricSettings>
<Section Name="HealthManager/ClusterHealthPolicy">
<Parameter Name="ConsiderWarningAsError" Value="False" />
<Parameter Name="MaxPercentUnhealthyApplications" Value=“10" />
<Parameter Name="MaxPercentUnhealthyNodes" Value=“10" />
<Parameter Name="ApplicationTypeMaxPercentUnhealthyApplications-
ControlApplicationType" Value="0" />
</Section>
</FabricSettings>
• Consider Warning as Error
• Max Percent Unhealthy Applications
• Max percent Unhealthy Nodes
• Application Type Health Policy Map
45
Health Checks :: Service Fabric :: Health Reports
private static Uri ApplicationName = new Uri("fabric:/MyApplication");
private static string ServiceManifestName = “MyApplication.Service";
private static string NodeName = FabricRuntime.GetNodeContext().NodeName;
private static Timer ReportTimer = new Timer(new TimerCallback(SendReport), null, 3000, 3000);
private static FabricClient Client = new FabricClient(new FabricClientSettings() {
HealthOperationTimeout = TimeSpan.FromSeconds(120),
HealthReportSendInterval = TimeSpan.FromSeconds(0),
HealthReportRetrySendInterval = TimeSpan.FromSeconds(40)});
public static void SendReport(object obj) {
// Test whether the resource can be accessed from the node
HealthState healthState = TestConnectivityToExternalResource();
var deployedServicePackageHealthReport = new DeployedServicePackageHealthReport(
ApplicationName, ServiceManifestName, NodeName,
new HealthInformation("ExternalSourceWatcher", "Connectivity", healthState));
Client.HealthManager.ReportHealth(deployedServicePackageHealthReport);
}
46
Service Fabric + App Insights
https://github.com/DeHeerSoftware/Azure-Service-Fabric-Logging-And-Monitoring
Serilog.Sinks.ApplicationInsights
4747
Thank you!

More Related Content

What's hot

Windows azure sql_database_security_isug012013
Windows azure sql_database_security_isug012013Windows azure sql_database_security_isug012013
Windows azure sql_database_security_isug012013
sqlserver.co.il
 
Geek Sync | Taking Your First Steps to the Cloud—Building a Hybrid Model
Geek Sync | Taking Your First Steps to the Cloud—Building a Hybrid ModelGeek Sync | Taking Your First Steps to the Cloud—Building a Hybrid Model
Geek Sync | Taking Your First Steps to the Cloud—Building a Hybrid Model
IDERA Software
 
Introducing the WSO2 Developer Studio Tools for SOA Developers
Introducing the WSO2 Developer Studio   Tools for SOA DevelopersIntroducing the WSO2 Developer Studio   Tools for SOA Developers
Introducing the WSO2 Developer Studio Tools for SOA Developers
WSO2
 
DataStax | DSE Production-Certified Cassandra on Pivotal Cloud Foundry (Ben L...
DataStax | DSE Production-Certified Cassandra on Pivotal Cloud Foundry (Ben L...DataStax | DSE Production-Certified Cassandra on Pivotal Cloud Foundry (Ben L...
DataStax | DSE Production-Certified Cassandra on Pivotal Cloud Foundry (Ben L...
DataStax
 

What's hot (20)

Docker y azure container service
Docker y azure container serviceDocker y azure container service
Docker y azure container service
 
How Microsoft learned to love Java
How Microsoft learned to love JavaHow Microsoft learned to love Java
How Microsoft learned to love Java
 
Introduction to Windows Azure Data Services
Introduction to Windows Azure Data ServicesIntroduction to Windows Azure Data Services
Introduction to Windows Azure Data Services
 
Extending Windows Admin Center to manage your applications and infrastructure...
Extending Windows Admin Center to manage your applications and infrastructure...Extending Windows Admin Center to manage your applications and infrastructure...
Extending Windows Admin Center to manage your applications and infrastructure...
 
Windows azure sql_database_security_isug012013
Windows azure sql_database_security_isug012013Windows azure sql_database_security_isug012013
Windows azure sql_database_security_isug012013
 
JavaCro'15 - Service Discovery in OSGi Beyond the JVM using Docker and Consul...
JavaCro'15 - Service Discovery in OSGi Beyond the JVM using Docker and Consul...JavaCro'15 - Service Discovery in OSGi Beyond the JVM using Docker and Consul...
JavaCro'15 - Service Discovery in OSGi Beyond the JVM using Docker and Consul...
 
PASS VC: SQL Server Performance Monitoring and Baselining
PASS VC: SQL Server Performance Monitoring and BaseliningPASS VC: SQL Server Performance Monitoring and Baselining
PASS VC: SQL Server Performance Monitoring and Baselining
 
Geek Sync | Taking Your First Steps to the Cloud—Building a Hybrid Model
Geek Sync | Taking Your First Steps to the Cloud—Building a Hybrid ModelGeek Sync | Taking Your First Steps to the Cloud—Building a Hybrid Model
Geek Sync | Taking Your First Steps to the Cloud—Building a Hybrid Model
 
Microservices using .Net core
Microservices using .Net coreMicroservices using .Net core
Microservices using .Net core
 
Full Stack Development With Node.Js And NoSQL (Nic Raboy & Arun Gupta)
Full Stack Development With Node.Js And NoSQL (Nic Raboy & Arun Gupta)Full Stack Development With Node.Js And NoSQL (Nic Raboy & Arun Gupta)
Full Stack Development With Node.Js And NoSQL (Nic Raboy & Arun Gupta)
 
Introducing the WSO2 Developer Studio Tools for SOA Developers
Introducing the WSO2 Developer Studio   Tools for SOA DevelopersIntroducing the WSO2 Developer Studio   Tools for SOA Developers
Introducing the WSO2 Developer Studio Tools for SOA Developers
 
DataStax | DSE Production-Certified Cassandra on Pivotal Cloud Foundry (Ben L...
DataStax | DSE Production-Certified Cassandra on Pivotal Cloud Foundry (Ben L...DataStax | DSE Production-Certified Cassandra on Pivotal Cloud Foundry (Ben L...
DataStax | DSE Production-Certified Cassandra on Pivotal Cloud Foundry (Ben L...
 
SQL ON Azure (decision-matrix)
SQL  ON  Azure (decision-matrix)SQL  ON  Azure (decision-matrix)
SQL ON Azure (decision-matrix)
 
Windows Azure Diagnostics
Windows Azure DiagnosticsWindows Azure Diagnostics
Windows Azure Diagnostics
 
Choosing the right Cloud Database
Choosing the right Cloud DatabaseChoosing the right Cloud Database
Choosing the right Cloud Database
 
Highlights of OpenStack Mitaka and the OpenStack Summit
Highlights of OpenStack Mitaka and the OpenStack SummitHighlights of OpenStack Mitaka and the OpenStack Summit
Highlights of OpenStack Mitaka and the OpenStack Summit
 
THEFT-PROOF JAVA EE - SECURING YOUR JAVA EE APPLICATIONS
 THEFT-PROOF JAVA EE - SECURING YOUR JAVA EE APPLICATIONS THEFT-PROOF JAVA EE - SECURING YOUR JAVA EE APPLICATIONS
THEFT-PROOF JAVA EE - SECURING YOUR JAVA EE APPLICATIONS
 
Azure sql introduction
Azure sql  introductionAzure sql  introduction
Azure sql introduction
 
Introduction to Windows Azure
Introduction to Windows AzureIntroduction to Windows Azure
Introduction to Windows Azure
 
Mysql ecosystem in 2019
Mysql ecosystem in 2019Mysql ecosystem in 2019
Mysql ecosystem in 2019
 

Similar to .NET Core Apps: Design & Development

Kubernetes One-Click Deployment: Hands-on Workshop (Mainz)
Kubernetes One-Click Deployment: Hands-on Workshop (Mainz)Kubernetes One-Click Deployment: Hands-on Workshop (Mainz)
Kubernetes One-Click Deployment: Hands-on Workshop (Mainz)
QAware GmbH
 

Similar to .NET Core Apps: Design & Development (20)

.NET Fest 2017. Андрей Антиликаторов. Проектирование и разработка приложений ...
.NET Fest 2017. Андрей Антиликаторов. Проектирование и разработка приложений ....NET Fest 2017. Андрей Антиликаторов. Проектирование и разработка приложений ...
.NET Fest 2017. Андрей Антиликаторов. Проектирование и разработка приложений ...
 
Red Hat and kubernetes: awesome stuff coming your way
Red Hat and kubernetes:  awesome stuff coming your wayRed Hat and kubernetes:  awesome stuff coming your way
Red Hat and kubernetes: awesome stuff coming your way
 
Easy integration of Bluemix services with your applications
Easy integration of Bluemix services with your applicationsEasy integration of Bluemix services with your applications
Easy integration of Bluemix services with your applications
 
Vijay Oscon
Vijay OsconVijay Oscon
Vijay Oscon
 
NuGet 3.0 - Transitioning from OData to JSON-LD
NuGet 3.0 - Transitioning from OData to JSON-LDNuGet 3.0 - Transitioning from OData to JSON-LD
NuGet 3.0 - Transitioning from OData to JSON-LD
 
Session 41 - Struts 2 Introduction
Session 41 - Struts 2 IntroductionSession 41 - Struts 2 Introduction
Session 41 - Struts 2 Introduction
 
Cloud compiler - Minor Project by students of CBPGEC
Cloud compiler - Minor Project by students of CBPGEC  Cloud compiler - Minor Project by students of CBPGEC
Cloud compiler - Minor Project by students of CBPGEC
 
Develop and deploy Kubernetes applications with Docker - IBM Index 2018
Develop and deploy Kubernetes  applications with Docker - IBM Index 2018Develop and deploy Kubernetes  applications with Docker - IBM Index 2018
Develop and deploy Kubernetes applications with Docker - IBM Index 2018
 
Kubernetes One-Click Deployment: Hands-on Workshop (Mainz)
Kubernetes One-Click Deployment: Hands-on Workshop (Mainz)Kubernetes One-Click Deployment: Hands-on Workshop (Mainz)
Kubernetes One-Click Deployment: Hands-on Workshop (Mainz)
 
Deploying windows containers with kubernetes
Deploying windows containers with kubernetesDeploying windows containers with kubernetes
Deploying windows containers with kubernetes
 
Struts 2 - Introduction
Struts 2 - Introduction Struts 2 - Introduction
Struts 2 - Introduction
 
CloudStack DC Meetup - Apache CloudStack Overview and 4.1/4.2 Preview
CloudStack DC Meetup - Apache CloudStack Overview and 4.1/4.2 PreviewCloudStack DC Meetup - Apache CloudStack Overview and 4.1/4.2 Preview
CloudStack DC Meetup - Apache CloudStack Overview and 4.1/4.2 Preview
 
Open shift and docker - october,2014
Open shift and docker - october,2014Open shift and docker - october,2014
Open shift and docker - october,2014
 
Integrating Infrastructure as Code into a Continuous Delivery Pipeline | AWS ...
Integrating Infrastructure as Code into a Continuous Delivery Pipeline | AWS ...Integrating Infrastructure as Code into a Continuous Delivery Pipeline | AWS ...
Integrating Infrastructure as Code into a Continuous Delivery Pipeline | AWS ...
 
2020-02-10 Java on Azure Solution Briefing
2020-02-10 Java on Azure Solution Briefing2020-02-10 Java on Azure Solution Briefing
2020-02-10 Java on Azure Solution Briefing
 
.NET Intro & Dependency Injection Workshop
.NET Intro & Dependency Injection Workshop.NET Intro & Dependency Injection Workshop
.NET Intro & Dependency Injection Workshop
 
citus™ iot ecosystem
citus™ iot ecosystemcitus™ iot ecosystem
citus™ iot ecosystem
 
Micro services
Micro servicesMicro services
Micro services
 
Spring Cloud Services with Pivotal Cloud Foundry- Gokhan Goksu
Spring Cloud Services with Pivotal Cloud Foundry- Gokhan GoksuSpring Cloud Services with Pivotal Cloud Foundry- Gokhan Goksu
Spring Cloud Services with Pivotal Cloud Foundry- Gokhan Goksu
 
StrongLoop Overview
StrongLoop OverviewStrongLoop Overview
StrongLoop Overview
 

More from GlobalLogic Ukraine

GlobalLogic Machine Learning Webinar “Advanced Statistical Methods for Linear...
GlobalLogic Machine Learning Webinar “Advanced Statistical Methods for Linear...GlobalLogic Machine Learning Webinar “Advanced Statistical Methods for Linear...
GlobalLogic Machine Learning Webinar “Advanced Statistical Methods for Linear...
GlobalLogic Ukraine
 

More from GlobalLogic Ukraine (20)

GlobalLogic Embedded Community x ROS Ukraine Webinar "Surgical Robots"
GlobalLogic Embedded Community x ROS Ukraine Webinar "Surgical Robots"GlobalLogic Embedded Community x ROS Ukraine Webinar "Surgical Robots"
GlobalLogic Embedded Community x ROS Ukraine Webinar "Surgical Robots"
 
GlobalLogic Java Community Webinar #17 “SpringJDBC vs JDBC. Is Spring a Hero?”
GlobalLogic Java Community Webinar #17 “SpringJDBC vs JDBC. Is Spring a Hero?”GlobalLogic Java Community Webinar #17 “SpringJDBC vs JDBC. Is Spring a Hero?”
GlobalLogic Java Community Webinar #17 “SpringJDBC vs JDBC. Is Spring a Hero?”
 
GlobalLogic JavaScript Community Webinar #18 “Long Story Short: OSI Model”
GlobalLogic JavaScript Community Webinar #18 “Long Story Short: OSI Model”GlobalLogic JavaScript Community Webinar #18 “Long Story Short: OSI Model”
GlobalLogic JavaScript Community Webinar #18 “Long Story Short: OSI Model”
 
Штучний інтелект як допомога в навчанні, а не замінник.pptx
Штучний інтелект як допомога в навчанні, а не замінник.pptxШтучний інтелект як допомога в навчанні, а не замінник.pptx
Штучний інтелект як допомога в навчанні, а не замінник.pptx
 
Задачі AI-розробника як застосовується штучний інтелект.pptx
Задачі AI-розробника як застосовується штучний інтелект.pptxЗадачі AI-розробника як застосовується штучний інтелект.pptx
Задачі AI-розробника як застосовується штучний інтелект.pptx
 
Що треба вивчати, щоб стати розробником штучного інтелекту та нейромереж.pptx
Що треба вивчати, щоб стати розробником штучного інтелекту та нейромереж.pptxЩо треба вивчати, щоб стати розробником штучного інтелекту та нейромереж.pptx
Що треба вивчати, щоб стати розробником штучного інтелекту та нейромереж.pptx
 
GlobalLogic Java Community Webinar #16 “Zaloni’s Architecture for Data-Driven...
GlobalLogic Java Community Webinar #16 “Zaloni’s Architecture for Data-Driven...GlobalLogic Java Community Webinar #16 “Zaloni’s Architecture for Data-Driven...
GlobalLogic Java Community Webinar #16 “Zaloni’s Architecture for Data-Driven...
 
JavaScript Community Webinar #14 "Why Is Git Rebase?"
JavaScript Community Webinar #14 "Why Is Git Rebase?"JavaScript Community Webinar #14 "Why Is Git Rebase?"
JavaScript Community Webinar #14 "Why Is Git Rebase?"
 
GlobalLogic .NET Community Webinar #3 "Exploring Serverless with Azure Functi...
GlobalLogic .NET Community Webinar #3 "Exploring Serverless with Azure Functi...GlobalLogic .NET Community Webinar #3 "Exploring Serverless with Azure Functi...
GlobalLogic .NET Community Webinar #3 "Exploring Serverless with Azure Functi...
 
Страх і сила помилок - IT Inside від GlobalLogic Education
Страх і сила помилок - IT Inside від GlobalLogic EducationСтрах і сила помилок - IT Inside від GlobalLogic Education
Страх і сила помилок - IT Inside від GlobalLogic Education
 
GlobalLogic .NET Webinar #2 “Azure RBAC and Managed Identity”
GlobalLogic .NET Webinar #2 “Azure RBAC and Managed Identity”GlobalLogic .NET Webinar #2 “Azure RBAC and Managed Identity”
GlobalLogic .NET Webinar #2 “Azure RBAC and Managed Identity”
 
GlobalLogic QA Webinar “What does it take to become a Test Engineer”
GlobalLogic QA Webinar “What does it take to become a Test Engineer”GlobalLogic QA Webinar “What does it take to become a Test Engineer”
GlobalLogic QA Webinar “What does it take to become a Test Engineer”
 
“How to Secure Your Applications With a Keycloak?
“How to Secure Your Applications With a Keycloak?“How to Secure Your Applications With a Keycloak?
“How to Secure Your Applications With a Keycloak?
 
GlobalLogic Machine Learning Webinar “Advanced Statistical Methods for Linear...
GlobalLogic Machine Learning Webinar “Advanced Statistical Methods for Linear...GlobalLogic Machine Learning Webinar “Advanced Statistical Methods for Linear...
GlobalLogic Machine Learning Webinar “Advanced Statistical Methods for Linear...
 
GlobalLogic Machine Learning Webinar “Statistical learning of linear regressi...
GlobalLogic Machine Learning Webinar “Statistical learning of linear regressi...GlobalLogic Machine Learning Webinar “Statistical learning of linear regressi...
GlobalLogic Machine Learning Webinar “Statistical learning of linear regressi...
 
GlobalLogic C++ Webinar “The Minimum Knowledge to Become a C++ Developer”
GlobalLogic C++ Webinar “The Minimum Knowledge to Become a C++ Developer”GlobalLogic C++ Webinar “The Minimum Knowledge to Become a C++ Developer”
GlobalLogic C++ Webinar “The Minimum Knowledge to Become a C++ Developer”
 
Embedded Webinar #17 "Low-level Network Testing in Embedded Devices Development"
Embedded Webinar #17 "Low-level Network Testing in Embedded Devices Development"Embedded Webinar #17 "Low-level Network Testing in Embedded Devices Development"
Embedded Webinar #17 "Low-level Network Testing in Embedded Devices Development"
 
GlobalLogic Webinar "Introduction to Embedded QA"
GlobalLogic Webinar "Introduction to Embedded QA"GlobalLogic Webinar "Introduction to Embedded QA"
GlobalLogic Webinar "Introduction to Embedded QA"
 
C++ Webinar "Why Should You Learn C++ in 2021-22?"
C++ Webinar "Why Should You Learn C++ in 2021-22?"C++ Webinar "Why Should You Learn C++ in 2021-22?"
C++ Webinar "Why Should You Learn C++ in 2021-22?"
 
GlobalLogic Test Automation Live Testing Session “Android Behind UI — Testing...
GlobalLogic Test Automation Live Testing Session “Android Behind UI — Testing...GlobalLogic Test Automation Live Testing Session “Android Behind UI — Testing...
GlobalLogic Test Automation Live Testing Session “Android Behind UI — Testing...
 

Recently uploaded

Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
panagenda
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Victor Rentea
 

Recently uploaded (20)

Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
 
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
Exploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusExploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with Milvus
 
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamDEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
 
Platformless Horizons for Digital Adaptability
Platformless Horizons for Digital AdaptabilityPlatformless Horizons for Digital Adaptability
Platformless Horizons for Digital Adaptability
 
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot ModelMcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
 

.NET Core Apps: Design & Development

  • 1. 1 .NET Core Applications: Design & Development Andrii Antilikatorov
  • 2. 2
  • 3. 33
  • 4. 4 .Net Core, Java, NodeJS… .NET Core will be as popular as Ruby and NodeJS. .NET Core and NodeJS will be the most popular platforms for back-end solution compete on the market. In few years .NET Core (not Java) will be number one choice for enterprise-level applications. Analytics says…
  • 5. 55
  • 6. 6 .NET Core :: Few Things • Many mechanisms such as authentication, security, component interactions now changed comparing to .Net Framework. • Many components and platforms (for example for Desktop applications) missing. • .NET Core provides corporate-level software benefits for small projects Photo is example for placement and max. size
  • 7. 7 .Net Core vs .Net Framework • There are cross-platform needs. • Application architecture is based on microservices. • Scalability and high performance are the must. Need to get as much as possible out of the box. • Need to use both Linux and Windows containers. • You are running multiple .NET versions side- by-side. • Opensource framework is required. .NET Core • Application currently uses .NET Framework and has strong dependencies on Windows. • Need to use Windows APIs that are not supported by .NET Core. • Need to use third-party libraries or NuGet packages that are not available for .NET Core. • Need tools, technologies or platforms not supported by .NET Core. .Net Framework
  • 8. 8 .Net Core vs .Net Framework :: Docker Containers Architecture / App Type Linux containers Windows Containers Microservices on containers .NET Core .NET Core Monolithic app .NET Core .NET Framework, .NET Core Best-in-class performance and scalability .NET Core .NET Core Windows Server legacy app (“brown-field”) migration to containers -- .NET Framework New container-based development (“green-field”) .NET Core .NET Core ASP.NET Core .NET Core .NET Core (recommended) .NET Framework ASP.NET 4 (MVC 5, Web API 2, and Web Forms) -- .NET Framework SignalR services .NET Core .NET Framework .NET Core WCF, WF, and other legacy frameworks Limited WCF support in .NET Core .NET Framework Limited WCF support in .NET Core Consumption of Azure services .NET Core .NET Framework, .NET Core
  • 10. 10 Microservices :: Pros and Cons • Each microservice is relatively small—easy to manage and evolve. • It is possible to scale out individual areas of the application. • You can divide the development work between multiple teams. • Issues are more isolated. • You can use the latest technologies. Benefits • Distributed application adds complexity for developers. • Deployment complexity. • Atomic transactions usually are not possible. • Usually increase hardware resource needs • Communication complexity. • Partitioning the microservices. Disadvantages
  • 11. 11 .Net Core Apps :: Hosting Feature App Service Service Fabric Virtual Machine Near-Instant Deployment X X Scale up to larger machines without redeploy X X Instances share content and configuration; no need to redeploy or reconfigure when scaling X X Multiple deployment environments (production, staging) X X Automatic OS update management X Seamless switching between 32/64 bit platforms X Deploy code with Git, FTP X X Deploy code with WebDeploy X X Deploy code with TFS X X X Host web or web service tier of multi-tier architecture X X X Access Azure services like Service Bus, Storage, SQL Database X X X Install any custom MSI X X
  • 12. 12 User InterfaceUser Interface Business LogicBusiness Logic Data AccessData Access High-Level Architecture
  • 14. 14 Architectural Principles • SOLID • Separation of Concerns • Explicit Dependencies • Don’t Repeat Yourself • Persistence Ignorance • Bounded Contexts • Command and Query Responsibility Segregation (CQRS) • Domain-Driven Design
  • 15. 1515
  • 16. 16 API :: Direct Communication Back-EndBack-End Microservice 1 Microservice 2 Microservice N Client AppsClient Apps
  • 17. 17 API :: API Gateway Back-EndBack-End Microservice 1 Microservice 2 Microservice N Client AppsClient Apps API Gateway
  • 18. 18 API :: API Gateway with Azure API Management Back-EndBack-End Microservice 1 Microservice 2 Microservice N Client AppsClient Apps Azure API Management
  • 19. 19 API :: Swagger • Automatically generates API documentation • Supports Client API generation and discoverability • Provides ability to automatically consume and integrate APIs
  • 20. 20 API :: Swagger :: Configuration public void ConfigureServices(IServiceCollection services) { // API documentation configuration var swaggerConfigurationInfo = new SwaggerConfigurationInfo() { Title = “My Application User API ", Description = "Service provides all user specific information and management api.", TermsOfService = “None”, SecuritySchemas = new List<SecurityScheme> { // Define the OAuth2.0 scheme (i.e. Implicit Flow), for access_token the user of // Swagger will be redirected to Auth0 Login hosted page to input credentials new OAuth2Scheme { Type = "oauth2", Flow = "implicit", AuthorizationUrl = m_identityProviderSettings.Auth0Authorize.AbsoluteUri, Scopes = new Dictionary<string, string> { { "openid profile email", "Security API" }} }}}; // Add Framework API services(API versioning, swagger, etc.) services.AddApiServices(swaggerConfigurationInfo); }
  • 21. 21 API :: AutoRest {autorest-location}autorest -Input http://{webapiname}.azurewebsites.net/swagger/ public async void InvokeTest() { UserApiClient client = new UserApiClient(...); await client.IdentityUserActivatePostAsync( new ActivateUserModel { ExternalReferenceId = "1354687252", Password = "Qwerty123" }); }
  • 22. 22 API Versioning Back-EndBack-End V 1.0 API Gateway V N.M New Client AppsNew Client Apps Old Client AppsOld Client Apps
  • 23. 23 API Versioning :: Business Rules • API versioning shall be applicable for any API endpoint. • Old versions has to be supported as long as you agreed with our clients. • Old API versions should work the same way they worked before new version was introduced. • Old APIs shall be marked as deprecated. • All versions has to be testable via unit/integration tests. • Best practice is to apply versioning to external API only.
  • 24. 24 API Versioning :: Versioning in the URI • URI Path https://mywebportal.com/api/v2/getUsers • Query String https://mywebportal.com/api/getUsers?v=2.0
  • 25. 25 API Versioning :: Versioning with Header/Accept Header GET /api/camps HTTP/1.1 Host: localhost:43333 Content-Type: application/json X-version: 2.0 GET /api/camps HTTP/1.1 Host: localhost:43333 Content-Type: application/json Accept: application/json;version=2.0
  • 26. 26 API Versioning :: Versioning with Content Type GET /api/camps HTTP/1.1 Host: localhost:43333 Content-Type: application/vnd.myapplication.v1+json Accept: application/vnd.myapplication.v1+json
  • 27. 27 API Versioning :: Versioning in Action • Use Microsoft ASP.NET Api Versioning NuGet package - Each controller should be marked with API version: - Each old version API controller should be marked as deprecated - Each API version should be stored in Version folder - Each controller should be placed in specific namespace - Unit and integration tests should be also stored separately
  • 28. 28
  • 29. 29 EF Core :: Resilient Connections public void ConfigureServices(IServiceCollection services) { services.AddDbContext<DbContext>(options => { options.UseSqlServer(Configuration["ConnectionString"], sqlServerOptionsAction: sqlOptions => { sqlOptions.EnableRetryOnFailure( maxRetryCount: 5, maxRetryDelay: TimeSpan.FromSeconds(10), errorNumbersToAdd: null); }); });
  • 30. 30 EF Core :: Resilient Connections and Transactions System.InvalidOperationException: The configured execution strategy 'SqlServerRetryingExecutionStrategy' does not support user initiated transactions. Use the execution strategy returned by 'DbContext.Database.CreateExecutionStrategy()' to execute all the operations in the transaction as a retriable unit. // Use of resiliency strategy within an explicit transaction var strategy = dbContext.Database.CreateExecutionStrategy(); await strategy.ExecuteAsync(async () => { using (var transaction = dbContext.Database.BeginTransaction()) { dbContext.Users.Update(user); await dbContext.SaveChangesAsync(); await eventLogService.SaveEventAsync(userChangedEvent); transaction.Commit(); } }); SOLUTION
  • 31. 31 EF Core :: Seeding public class Startup { // Other Startup code... public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { // Other Configure code... // Seed data through our custom class CatalogContextSeed.SeedAsync(app).Wait(); // Other Configure code... } }
  • 32. 32 EF Core :: Seeding public class CatalogContextSeed { public static async Task SeedAsync(IApplicationBuilder applicationBuilder) { var context = (AppDbContext)applicationBuilder. ApplicationServices.GetService(typeof(AppDbContext)); using (context) { context.Database.Migrate(); if (!context.Users.Any()) { context.Users.AddRange(...); await context.SaveChangesAsync(); } if (!context.Departments.Any()) { context.Departments.AddRange(...); await context.SaveChangesAsync(); } } } } }
  • 33. 33 EF Core :: Seeding Improvement • Use standard migration mechanism. • Create base class(es) for seed migrations. • Specify data context via attribute.
  • 34. 34 EF Core :: Seeding Improvement /// <summary> /// Seed Roles, RolesClaims and UserRoles /// </summary> [DbContext(typeof(MyContext))] [Migration("SEED_201709121256_AddRolesClaimsUserRoles")] public class AddRolesClaimsUserRoles : EmptyDbSeedMigration { /// <summary> /// <see cref="SeedMigrationBase.PopulateData"/> /// </summary> protected override void PopulateData() { ... } }
  • 35. 35 EF Core :: In-Memory Database public class Startup { // Other Startup code ... public void ConfigureServices(IServiceCollection services) { services.AddSingleton<IConfiguration>(Configuration); // DbContext using an InMemory database provider services.AddDbContext<AppDbContext>(opt => opt.UseInMemoryDatabase()); } // Other Startup code ... }
  • 36. 3636
  • 37. 37 Health Checks • https://github.com/aspnet/HealthChecks - src/common - src/Microsoft.AspNetCore.HealthChecks - src/Microsoft.Extensions.HealthChecks - src/Microsoft.Extensions.HealthChecks.SqlServer - src/Microsoft.Extensions.HealthChecks.AzureStorage
  • 38. 38 Health Checks :: Middleware Registration public class Program { public static void Main(string[] args) { var host = new WebHostBuilder() .UseKestrel() .UseHealthChecks("/hc) .UseContentRoot(Directory.GetCurrentDirectory()) .UseIISIntegration() .UseStartup<Startup>() .Build(); host.Run(); } }
  • 39. 39 public class Startup { public void ConfigureServices(IServiceCollection services) { // Add health checks here. services.AddHealthChecks(checks => { checks.AddUrlCheck(“URL Check" ) .AddHealthCheckGroup("servers", group => group .AddUrlCheck("https://myserviceurl::8010") .AddUrlCheck("https://tmysecondserviceurl:7777")) } services.AddMvc(); } } Health Checks :: Web Resources
  • 40. 40 checks.AddSqlCheck("MyDatabase", Configuration["ConnectionString"]); checks.AddAzureBlobStorageCheck("accountName", "accountKey"); checks.AddAzureBlobStorageCheck("accountName", "accountKey", "containerName"); checks.AddAzureTableStorageCheck("accountName", "accountKey"); checks.AddAzureTableStorageCheck("accountName", "accountKey", "tableName"); checks.AddAzureFileStorageCheck("accountName", "accountKey"); checks.AddAzureFileStorageCheck("accountName", "accountKey", "shareName"); checks.AddAzureQueueStorageCheck("accountName", "accountKey"); checks.AddAzureQueueStorageCheck("accountName", "accountKey", "queueName"); Health Checks :: Azure Resources
  • 41. 41 Health Checks :: Custom Resources checks.AddHealthCheckGroup("memory", group => group.AddPrivateMemorySizeCheck(1) .AddVirtualMemorySizeCheck(2) .AddWorkingSetCheck(1), CheckStatus.Unhealthy) .AddCheck("thrower", (Func<IHealthCheckResult>)(() => { throw new DivideByZeroException(); })) .AddCheck("long-running", async cancellationToken => { await Task.Delay(10000, cancellationToken); return HealthCheckResult.Healthy("I ran too long"); }) .AddCheck<CustomHealthCheck>("custom");
  • 42. 42 Health Checks :: Service Fabric Health Monitoring
  • 43. 43 Health Checks :: Service Fabric :: Health Hierarchy Cluster Nodes Applications Deployed Applications Deployed Service Packages Services Partitions Replicas
  • 44. 44 Health Checks :: Service Fabric :: Cluster Health Policy <FabricSettings> <Section Name="HealthManager/ClusterHealthPolicy"> <Parameter Name="ConsiderWarningAsError" Value="False" /> <Parameter Name="MaxPercentUnhealthyApplications" Value=“10" /> <Parameter Name="MaxPercentUnhealthyNodes" Value=“10" /> <Parameter Name="ApplicationTypeMaxPercentUnhealthyApplications- ControlApplicationType" Value="0" /> </Section> </FabricSettings> • Consider Warning as Error • Max Percent Unhealthy Applications • Max percent Unhealthy Nodes • Application Type Health Policy Map
  • 45. 45 Health Checks :: Service Fabric :: Health Reports private static Uri ApplicationName = new Uri("fabric:/MyApplication"); private static string ServiceManifestName = “MyApplication.Service"; private static string NodeName = FabricRuntime.GetNodeContext().NodeName; private static Timer ReportTimer = new Timer(new TimerCallback(SendReport), null, 3000, 3000); private static FabricClient Client = new FabricClient(new FabricClientSettings() { HealthOperationTimeout = TimeSpan.FromSeconds(120), HealthReportSendInterval = TimeSpan.FromSeconds(0), HealthReportRetrySendInterval = TimeSpan.FromSeconds(40)}); public static void SendReport(object obj) { // Test whether the resource can be accessed from the node HealthState healthState = TestConnectivityToExternalResource(); var deployedServicePackageHealthReport = new DeployedServicePackageHealthReport( ApplicationName, ServiceManifestName, NodeName, new HealthInformation("ExternalSourceWatcher", "Connectivity", healthState)); Client.HealthManager.ReportHealth(deployedServicePackageHealthReport); }
  • 46. 46 Service Fabric + App Insights https://github.com/DeHeerSoftware/Azure-Service-Fabric-Logging-And-Monitoring Serilog.Sinks.ApplicationInsights

Editor's Notes

  1. Page 38
  2. Page 110
  3. Page 38
  4. Page 268
  5. Page 268
  6. Page 268
  7. Page 268
  8. Page 268
  9. https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-health-introduction
  10. https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-health-introduction
  11. https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-health-introduction
  12. https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-report-health https://github.com/MicrosoftDocs/azure-docs/blob/master/articles/service-fabric/service-fabric-report-health.md
  13. https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-report-health https://github.com/MicrosoftDocs/azure-docs/blob/master/articles/service-fabric/service-fabric-report-health.md