The higher degree of independence in case of
microservices enables them to be independently
deployable from each other, i.e. specific parts of an
application can be updated and redeployed without
touching other parts. For non-trivial and more
complex applications, the number of services
involved quickly increases. Consequently, manual
deployment processes definitely do not scale
anymore for such architectures, because deployment
happens much more often and independently.
Therefore, fully automated deployment machinery
such as continuous delivery pipelines are required
(Humble and Farley, 2015).
As a side effect of the services' independence,
the underlying technologies and utilized
programming languages can be extremely diverse.
While one service may be implemented using Java
EE, another one could be implemented using .Net,
Ruby, or Node.js. This enables the usage of 'the best
tool for the job', because different technology stacks
and programming languages are optimized for
different sets of problems. The interface, however,
which is exposed by a particular service must be
technology-agnostic, e.g. based on REST over
HTTP, so different services can be integrated
without considering their specific implementation
details. Consequently, the underlying storage
technologies can also differ, because 'decentralized
data management' (Fowler, 2016) is another core
principle of microservice architectures. As outlined
by the reference application, each service has its
own data storage, so the data storage technology
(relational, key-value, document-oriented, graph-
based, etc.) can be chosen according to the specific
storage requirements of a particular service
implementation.
In addition, microservice architectures follow the
principle of 'smart endpoints and dumb pipes'
(Fowler, 2016), implying the usage of lightweight
and minimal middleware components such as
messaging systems ('dumb pipes'), while moving the
intelligence to the services themselves ('smart
endpoints'). This is confirmed by reports and surveys
such as carried out by Schermann et al.: REST in
conjunction with HTTP as transport protocol is used
by many companies today. JSON and XML are both
common data exchange formats. There is a trend to
minimize the usage of complex middleware towards
a more choreography-style coordination of services
(Schermann et al., 2015). Finally, the architectural
paradigm of self-contained systems (SCS, 2016) can
help to treat an application, which is made of a set of
microservices, in a self-contained manner.
In this context, an important fact needs to be
emphasized: most of the core principles of
microservice architectures are not new at all.
Service-oriented architectures (SOA) are established
in practice for some time already, sharing many of
the previously discussed core principles with
microservice architectures. Thus, we see
microservice architectures as one possible
opinionated approach to realize SOA, while making
each service independently deployable. This idea of
establishing independently deployable units is a
focus of microservice architectures, which was not
explicitly a core principle in most SOA-related
works and efforts. Therefore, continuous delivery
(Humble and Farley, 2015) can now be implemented
individually per service to completely decouple their
deployment.
Our previously presented approach to transition
the references application's architecture towards a
native cloud application is based on applying the
IDEAL properties. The resulting architecture owns
the previously discussed characteristics of
microservice architectures and SOA. Each part of
the reference application (account management,
marketing campaigns, etc.) now represents an
independently (re-)deployable unit. Consequently, if
an existing application is transitioned towards a
native cloud application architecture by applying the
IDEAL properties, the result typically is a
microservice architecture. To go even further and
also consider development as part of the entire
DevOps lifecycle, a separate continuous delivery
pipeline (Humble and Farley, 2015) can be
implemented for each service to perform their
automated deployment when a bug fix or new
feature is committed by a developer. Such pipelines
combined with Cloud-based development
environments such as Cloud9 (Cloud9, 2016) also
make the associated application development
processes cloud-native in addition to deploying and
running the application in a cloud-native way.
5 MOVING TOWARDS A SAAS
APPLICATION
While the IDEAL properties enable an application to
benefit from cloud environments and (micro)service-
oriented architectures, additional properties have to
be considered in case the application shall be offered
as a Service to a large number of customers
(Freemantle, 2010; Badger et al., 2011): Such
applications should own the properties clusterability,
elasticity, multi-tenancy, pay-per-use and self-
service. Clusterability summarizes the above-
mentioned isolation of state, distribution, and loose
coupling. The elasticity discussed by Freemantle and
Badger et al. is identical to the elasticity mentioned
above. The remaining properties have to be enabled
in an application-specific manner as follows.