How to succeed with cloud-native applications
How to Succeed with Cloud-native Applications
The fast-paced adoption of cloud computing combined with DevOps practices enables companies to react quickly to new market requirements.
This alters the way applications are built and sow the seeds of the cloud-native application concept, which promises the straightforward creation of highly scalable applications that are optimized to run in modern cloud environments.
Everyone is talking about going #cloudnative but what does this really mean?
This article looks at the key principles associated with the design and deployment of cloud-native applications, based on both independent research(*1) and industry best practices.
10 Cloud-Native Design principles
1. Service-based Architecture
Cloud-native applications are designed as families of loosely coupled services. Each service exists independently from the other service, hence allowing their independent development and operations.
A cloud-native application architecture facilitates the seamless interaction of different services within an application through service discovery mechanisms.
The best way to realize loose coupling among services and building services for optimal modular cohesion; is a science or maybe even art on its own.
Stating that a typical microservices approach inherently leads to an optimal implementation is taking a very dangerous shortcut and is, in most cases, entirely wrong. (*2)
2. API Based Interactions
Communication between services happens via API based interactions. The services that form an application publish APIs to offer their functionalities and consume the APIs of other services in the application.
Furthermore, APIs are based on well-known standard protocols, and each component in a cloud-native application is encapsulated by offering its API.
3. State Isolation
Cloud-native applications are typically designed with a clear separation between stateless and stateful services. These two service types exist independently.
Stateless services are conceived to achieve easy scale in/out.
Stateful services are implemented using patterns that ensure the persisted data’s availability and resilience. They are typically realized using native storage services such as NoSQL databases.
4. Self-contained service deployment
The services forming a cloud-native application should be packaged in standardized, self-contained deployment units. Technologies such as containerization ensure isolation among services and run and behave consistently independently of the execution environment, whether on-premise or in a private or public cloud environment.
In addition to containerization, PaaS, and SaaS deployment of services can be key-enablers for self-contained service deployment in cloud-native applications.
5. Disposability
The actual instantiation of services should be disposable. These services’ ephemeral nature allows for fast startup and scalability and permits graceful shutdown for leaving applications in a correct state. (Lifecycle conformance principle).
Another critical characteristic of disposable services is their immutability. For a containerized application, for instance, this means that you should not store anything in your container. This not only enhances its scalability but also makes it easier to migrate them between different nodes and platforms.
A number of additional principles commonly found in container based design such as the separation of concern (SoC) or single concern (SC) principles are also considered best practices for designing evolvable (cloud-native) applications.
6. Fault-Resilience
Cloud-native applications should assume that services can fail at any time. The services forming an application are designed to tolerate failures of the other services they interact with, typically realized by using cloud-native design patterns (e.g. Circuit breakers).
Simultaneously, the platforms used to deploy and manage cloud-native applications are correctly configured to recover failed service instances automatically.
7. Infrastructure Abstraction
A cloud-native application should take full abstraction from the underlying infrastructure and operating system dependencies. This is realized by running them on a higher abstraction level.
The self-contained service deployment characteristic definitely is an enabler in this direction by distributing the services of an application over multiple, heterogeneous environments.
8.Infrastructure as Code (IaC)
Another critical characteristic of cloud-native applications is that they are highly automated. The automation characteristics are not limited to their deployment but should be implemented end-to-end, from delivery to deployment, management, scaling, and monitoring.
Such automation is commonly achieved by using Infrastructure-as-a-code principles that specify the desired state configuration for an application and its components via machine-readable files.
9.Policy Driven Elasticity
Another critical characteristic of a cloud-native application is that its services scale horizontally.
This means that each service can scale-in/out by adapting the number of replicas based on defined scaling policies that indicate how much resources should be allocated to a service based on technical and/or application sourced metrics.
10. CI/CD Compliance
Building Cloud-native applications heavily rely on DevOps principles such as Continuous Integration and Delivery. Each service is developed using its own code-base and deployment pipeline.
One of the advantages enabled by this way of working is that different services can be developed by different teams using the tools and techniques they prefer.
Service updates can be released in short and continuous delivery cycles as soon as they are available.
Deployability of Cloud Native Applications
In addition to the discussed design principles, cloud-native applications should also support a number of deployment characteristics.
Support for Multiple Cloud Providers and Platforms
A cloud-native application should support deployments to multiple hyper-scale cloud providers such as Azure, AWS, and Google cloud and to self-hosted platforms such as OpenStack.
Furthermore, it should also be possible to deploy different components of a cloud-native application across multiple public cloud providers or across different landing zones in a hybrid context.
Support for all Cloud Service Models (XaaS)
In an ideal world, a cloud-native application should not only be deployable on different IaaS platforms. It should also be possible to deploy application components using PaaS and FaaS offerings of hyper-scale cloud providers and, even to a certain extent, to use SaaS services to implement application components.
Declarative Deployment Models
End-to-end automation is a key characteristic of cloud-native applications. Deployment of such applications requires the use of declarative deployment models and tools.
A declarative deployment allows us to specify how the deployed state should look, rather than the steps to get there.
Additionally, declarative deployment models allow modeling the different deployment types, components, and the respective relations among them.
A commonly used declarative deployment tool used in a cloud-native context is Terraform. This not only allows us to perform declarative deployments but is also fully extensible, such that custom component types can be introduced.
Summary
As you might have concluded by now, running all your applications in the cloud, using micro-services or running the entire stack on Kubernetes does not necessarily mean you have a cloud-native application landscape.
The full benefits of cloud, only materialize when one maximally leverages cloud-native principles.
References
(*1) Source: https://doi.org/10.5220/0009571001710180 — Michael Wurster et al.
(*2) Source: https://dspace.cvut.cz/bitstream/handle/10467/81234/F8-DP-2019-Kolarik-Vincenc-thesis.pdf?sequence=-1&isAllowed=y
👋 Join FAUN today and receive similar stories each week in your inbox! ️ Get your weekly dose of the must-read tech stories, news, and tutorials.
Follow us on Twitter 🐦 and Facebook 👥 and Instagram 📷 and join our Facebook and Linkedin Groups 💬
If this post was helpful, please click the clap 👏 button below a few times to show your support for the author! ⬇
How to succeed with cloud-native applications was originally published in FAUN Publication on Medium, where people are continuing the conversation by highlighting and responding to this story.