<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta />
    <article-meta>
      <title-group>
        <article-title>Analysis of Legacy Monolithic Software Decomposition into Microservices</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Justas Kazanavičius</string-name>
          <email>justas.kazanavicius@vgtu.lt</email>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Dalius Mažeika</string-name>
          <email>Dalius.Mazeika@vgtu.lt</email>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>Vilnius Gediminas Technical University</institution>
          ,
          <addr-line>Vilnius</addr-line>
          ,
          <country country="LT">Lithuania</country>
        </aff>
      </contrib-group>
      <abstract>
        <p>- Microservice architecture is becoming a standard by default in most of the enterprises because many projects have been implemented using this architecture in the last few years and results have been very positive. Extracting microservices from legacy monolithic software is an extremely complicated task. Each enterprise application is unique. This paper aims to investigate the existing methodologies of monolith decomposition into microservices. The same enterprise application was decomposed into microservices using 3 different methods. Evaluation criteria were proposed that were used to analyze advantages and disadvantages of each.</p>
      </abstract>
      <kwd-group>
        <kwd>microservice</kwd>
        <kwd>monolith decomposition</kwd>
        <kwd>cloud computing</kwd>
        <kwd>software engineering</kwd>
      </kwd-group>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>Introduction</title>
      <p>
        Microservices are entering mainstream, according to NGINX research only 30% of
companies not using them at all. NGINX researched 1800 IT professionals and results
show that nearly 70% of organizations are using or investigating a microservices
architecture, while nearly 1/3 are already using microservices architecture in
production. [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ]. One of the biggest microservices advantages is that it is a cloud-native
application [
        <xref ref-type="bibr" rid="ref2 ref3">2, 3</xref>
        ]. Because microservices are independent processes each of them could
be deployed to a separate container or virtual machine in the cloud.
      </p>
      <p>
        Migration to microservices from monolithic legacy software cannot be
implemented in a fast way. It is important to know that there is a high overall cost associated
with decomposing an existing system to microservices [
        <xref ref-type="bibr" rid="ref4 ref5">4, 5</xref>
        ]. It is not possible to say
that only one good way exists to migrate from monolith to microservices because
legacy monolith application is a very broad term and can vary in many aspects such as
programming languages, database technologies, team size and so on. [
        <xref ref-type="bibr" rid="ref6 ref7 ref8">6, 7, 8</xref>
        ].
Different organizations use different migration patterns, techniques, and methods because
microservices are still a relatively new architectural approach and widely approved
way of doing it not exist [
        <xref ref-type="bibr" rid="ref10 ref9">9, 10</xref>
        ]. A key challenge in migration process is the
extraction of microservice candidates from existing legacy monolithic code bases [
        <xref ref-type="bibr" rid="ref11">11</xref>
        ].
      </p>
      <p>
        This article's main goal is to analyze existing legacy monolith application
decomposition into microservices architecture based application methodologies. During
literature review and analysis three main directions how decomposition from
monoliths to microservices could be realized were identified [
        <xref ref-type="bibr" rid="ref15">15</xref>
        ]: Storage based methods
[
        <xref ref-type="bibr" rid="ref12">12</xref>
        ], code based methods [
        <xref ref-type="bibr" rid="ref13">13, 17</xref>
        ] and business domain based methods [
        <xref ref-type="bibr" rid="ref14 ref2">2, 14, 16</xref>
        ].
Three methods [
        <xref ref-type="bibr" rid="ref12 ref13 ref14">12, 13, 14</xref>
        ] were chosen to be analyzed because each of them best
represents a separate direction of how decomposition from monoliths to microservices
could be implemented. Other methods found during literature review and analysis use
the same directions or combining them to achieve better results [
        <xref ref-type="bibr" rid="ref15 ref2">2, 15</xref>
        ].
      </p>
      <p>A comparison between selected methodologies was done by decomposing the same
enterprise legacy monolith application, named DataProvider, into microservices three
times, using all selected methodologies. Benefits and drawbacks of each methodology
were analyzed and compared.
2</p>
    </sec>
    <sec id="sec-2">
      <title>Enterprise Monolithic Application Architecture</title>
      <p>The primary function of the DataProvider application is to provide important
organization data from one place to others information systems in an organization. Different
types of data like accounts, books, customers and so on are stored in different
mainframe systems within an organization.</p>
      <p>The DataProvider application (Figure 1) consist of three main components:
• Business logic – collecting and caching data from old mainframe systems.
Business logic writes collected data to the DataProvider local database. Entity
framework is used to communicate application and database.
• Database – MS SQL database technology is used to store collected data from
mainframe systems.
• Rest API – HTML endpoint for other information systems to access important
organization data in DataProvider. Swagger tools are used to provide Rest API
functionality.</p>
      <p>Application is written with Microsoft .NET framework and C# programing language
is used.</p>
    </sec>
    <sec id="sec-3">
      <title>Storage-Based Method Evaluation</title>
      <p>
        Alessandra Levcovitz, Ricardo Terra and Marco Tulio Valente describe a technique to
identify microservices on monolithic systems [
        <xref ref-type="bibr" rid="ref12">12</xref>
        ]. The proposed technique consists
of the following four steps.
      </p>
      <sec id="sec-3-1">
        <title>Database decomposition.</title>
        <p>The first step is mapping database tables into subsystems. Each subsystem represents
a business area of an organization. DataProvider application has 15 database tables, 9
subsystems, and 8 different business areas. This step of methodology allows
identifying a number of tables and business areas. Identify database tables is a task that
requires only technical skills. On the other hand, identify business subsystems and
assign a table to them require additional effort to understand the business process.</p>
      </sec>
      <sec id="sec-3-2">
        <title>Dependency Graph.</title>
        <p>In the second step dependency graph between facades, business functions and
database tables were created. It shows business functionality and database dependencies.
5 graphs were pretty straightforward: containing only 1 database table, 1 business
functionality layer and 0 dependencies from other database tables and business
functionality subsystems. The other 12 database tables were joined into one more complex
and complicated dependency graph. Some business functionality contains up to 4
dependencies from other database tables. Mostly 4 business functionality layers
identified for full operation from facade to the database table to be accomplished.</p>
      </sec>
      <sec id="sec-3-3">
        <title>Database tables and facades pairs.</title>
        <p>Based on the dependency graph unique pairs of facades and database tables were
identified and mapped with business subsystems functions. DataProvider application
has 68 unique pairs of database tables and facades. 15 facades were in pairs with only
1 database table. Some of the facades were in pair with different database table up to
8 times. More complicated dependency graph more unique pairs exist.</p>
      </sec>
      <sec id="sec-3-4">
        <title>Microservice candidates.</title>
        <p>In the last step candidates to be transformed into microservices were identified. For
each distinct pair obtained on the prior step, inspect the code of the facade and
business functions that are on the path from the facade to the database table in the
dependency graph.</p>
        <p>37 microservices candidates were found in the DataProvider application after
decomposition was done using method I. More functions and tables subsystem had more
microservice candidates were identified. It is a possibility that the microservice
candidate size could be very small if it contains only one business function. The method
requires identifying business subsystems, to do that business knowledge is needed
which is why the method couldn’t be implemented completely automated.</p>
      </sec>
    </sec>
    <sec id="sec-4">
      <title>Code-Based Method Evaluation</title>
      <p>
        Genc Mazlami, Jurgen Cito and Philipp Leitner created microservices extraction from
the monolithic systems model [
        <xref ref-type="bibr" rid="ref13">13</xref>
        ]. There are two transformations between the stages:
      </p>
      <sec id="sec-4-1">
        <title>Construction step.</title>
        <p>The first step is the monolith transformation into the graph representation. In the
graph, each vertex represents class from the monolith and undirected edges represent
its coupling with other classes in the monolith.</p>
        <p>DataProvider application has 273 classes at all. The biggest number of
dependencies which one class has is 96. 17 classes have 0 dependencies and are not part of a
graph. The average classes coupling is ~10. Unit, integration and manual tests classes
were excluded from the graph. More quality code has less coupled classes are, so
lower number of edges in the graph indicates a higher quality of code. It is not clear
how to treat class inheritance from the article, in this evaluation decision was made to
treat class inheritance as not dependency.</p>
      </sec>
      <sec id="sec-4-2">
        <title>Clustering step.</title>
        <p>The second and final transformation is to cut the graph in components that are going
to represent recommended microservices candidates. The authors proposed three
different strategies of how to do it: logical coupling, semantic coupling and contributor
coupling. During this comparison, semantic coupling was chosen in evaluation.</p>
        <p>8 microservices candidates were found in the DataProvider application. 180 classes
were identified for a specific business domain by class name. It was not possible to
identify the business domain by class name for 93 classes. ~33% of classes need
additional effort to review and assign manually to the specific business domain or refactor
and split into more classes. Code quality playing a vital role in how easily a
microservice candidate could be identified in the graph. If code is written following clean
code standards class should only have one responsibility, few dependencies, and
meaningful name. Automation could be used in extraction accurately only if the
monolith code has high quality. If a class has a lot of dependencies, not a meaningful
name or has too many responsibilities it is not clear to which microservice candidate
it belongs. In this case, the additional effort needed to refactor class. Code-Based
Method is very formal and requires additional tools to be implemented properly.
These tools are note available only algorithm and a mathematical model is provided,
so organizations should implement them itself.
5</p>
      </sec>
    </sec>
    <sec id="sec-5">
      <title>Business-Domain-Based Method Evaluation</title>
      <p>
        Chen-Yuan Fan and Shang-Pin proposed a migration process based on SDLC,
including all of the methods and tools required during design, development, and
implementation [
        <xref ref-type="bibr" rid="ref14">14</xref>
        ]. Two analysis methods are used in the migration of a legacy
monolithic architecture into a microservice architecture.
      </p>
      <sec id="sec-5-1">
        <title>Domain-Driven Design analysis.</title>
        <p>In first step Domain-Driven Design (DDD) was used to find microservice candidates
in the original system. The bounded context analysis results are a key tool to identify
microservice candidates in DataProvider application. The DDD was used to identify
specific domains in solution and identify domain modules in each domain. DDD
approach analysis allows extracting of low-coupling microservices.</p>
      </sec>
      <sec id="sec-5-2">
        <title>Database analysis.</title>
        <p>The second step involves the analysis of the database structure. It is common practice
that each microservice should use a discrete database. This allows to avoid high
coupling between services. On the other hand, splitting some data into separate databases
could cause data inconsistency. Foreign keys could be used as an indication of the
microservice candidate.</p>
      </sec>
      <sec id="sec-5-3">
        <title>New architecture.</title>
        <p>After Domain-Driven Design and database analysis, 8 microservices candidates
were found in the DataProvider application. 1 additional microservice should be
created. To connect all microservices into one solution new microservice was introduced.
Sync Service provides data synchronization and an interface for front-end systems.
The most important things for a successful migration from monolith to microservices
using Business-Domain-Based Method is Strong business knowledge, business
process stability in the organization and high-quality database schema.
6</p>
      </sec>
    </sec>
    <sec id="sec-6">
      <title>Extraction Methods Results Comparison</title>
      <p>This section compares the extraction methods evaluations results in different aspects.
Detailed results about evaluations present in Table I.</p>
      <sec id="sec-6-1">
        <title>Microservice candidates count.</title>
        <p>Classes</p>
        <p>Extraction Storage-Based Method found most microservice candidates in the
DataProvider application. The Storage-Based Method found 37 candidates,
CodeBased Method found 8 candidates and Business-Domain-Based Method found 8
candidates also. In Storage-Based Method microservice is extracting as a concrete
function in the application while in Business-Domain-Based Method microservice
represents the specific business domain. It is obvious that Storage-Based Method will
always provide more microservices than Business-Domain-Based Method because the
business domain always has at least one function. Code-Based Method is more
flexible than other compared methods, it provides optionality to choose the strategy on
how microservice should be extracted. Semantic coupling strategy was chosen during
this comparison, its key idea, in general, is very similar to Domain-Driven Design so
what explains why it found the same number of microservice candidates as
BusinessDomain-Based Method. Another extraction strategy is logical coupling which focuses
on concrete functions. It could be predicted that microservice candidates would be
found similar to Method I.</p>
      </sec>
      <sec id="sec-6-2">
        <title>Size of microservice.</title>
        <p>The main idea of microservice is that it should have only one responsibility.
Responsibility could be business or functional type. Business responsibility is bigger than
functional because it contains at least one function and usually it contains much more
than one. Split by functions microservices is much smaller and has been named as
serverless. If organizations decide to split they monolith application into
microservices by business domains when they should choose Business-Domain-Based
Method or Code-Based Method with semantic coupling strategy. If the decision is
splitting into microservices by functions when Storage-Based Method or Code-Based
Method with logical coupling strategy could be used.</p>
      </sec>
      <sec id="sec-6-3">
        <title>Databases.</title>
        <p>The most common and popular practice is that each microservice should use its
private database. Business-Domain-Based Method perfectly fits this approach.
StorageBased Method splits monolith into microservices by functions and some functions
most likely going to use the same table. If the decision was made to use this method
database probably going to be shared. Methods authors do not provide any
recommendations on how to deal with this challenge. Code-Based Method authors assume
that monolith application use repository pattern and each table is represented as a
repository class in solution. Methods don’t contain any recommendation of how
databases should be adapted to microservice architecture.</p>
      </sec>
      <sec id="sec-6-4">
        <title>Automation.</title>
        <p>Code-Based Method with the contributor coupling strategy could be implemented
fully automatically. Monolith must be implemented with an object-oriented
programming language because the extraction model is based on classes as the atomic
unit of computation and the graph. Code-Based Method with a semantic coupling
strategy could be implemented semi-automatically. In this case, business domains
should be identified manually. How accurate the method will be able to identify class
relation to business domain depends on a naming convention in code. Storage-Based
Method and Business-Domain-Based Method can’t be implemented automatically.
Storage-Based Method requires manually identify business subsystems and assign
database tables to one of the subsystems. Business-Domain-Based Method requires
two manual analysis to do.</p>
      </sec>
      <sec id="sec-6-5">
        <title>Technological stack.</title>
        <p>Storage-Based Method designed to work with backend type applications. It is
programming language agnostic. Database storing data in tables must be part of the
application, because extraction use tables to generated graph. Code-Based Method is
suitable for backend type applications written with an object-oriented programming
language. The extraction model is based on classes as the atomic unit. If the
application is written with another type of language or with a few different languages when it
is not possible to use Code-Based Method for microservices extraction.
BusinessDomain-Based Method is technologically agnostic and could use with any kind of
programming languages and databases.</p>
      </sec>
      <sec id="sec-6-6">
        <title>Implementation and tools.</title>
        <p>Business-Domain-Based Method is in the least formal and most universal comparing
with other compared methods. On the other hand, it is most uncertain and requires the
implementer to have a strong knowledge of application business domain and
implementation technical details. Code-Based Method is the most formal and requires an
additional tool to generate graph representing dependencies of classes. It is not clear
what would be cheaper in time and resources: implement the tool and use it or use
other methods to do microservices extraction from the monolith. Storage-Based
Method do not require any additional tool to implement, but it requires some business
domain knowledge to identify business subsystems.</p>
      </sec>
      <sec id="sec-6-7">
        <title>Code quality.</title>
        <p>Code quality has the most impact on Code-Based Method because it creates classes’
dependencies graph. Clean and solid code generates a more accurate graph. The more
accurate graph allows extracting more accurate microservices. Code quality also has
an impact on Storage-Based Method and Business-Domain-Based Method as well.
The better code quality is, the easier it is to extract functions from it.
7</p>
      </sec>
    </sec>
    <sec id="sec-7">
      <title>Conclusions</title>
      <p>Choosing the right microservices extraction from the legacy monolith application
method is a very hard task and crucial for a successful migration. Each legacy
monolithic application is unique and creates unique challenges. One best methodology on
how to extract microservices from monolith does not exist. Each case is different and
the organization should choose which method or combination of methods best suits
for its migration from monolith to microservices. Selected methodology or
combination of methodologies should be: able to extract microservices by selected factors and
compatible with technological stack and database technologies used in application.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          1. NGINX, “
          <article-title>The Future of Application Development</article-title>
          and Delivery Is Now” [Online]. Available: https://www.nginx.com/resources/library/app-dev-survey/
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          2.
          <string-name>
            <given-names>O.</given-names>
            <surname>Pozdniakova</surname>
          </string-name>
          and
          <string-name>
            <given-names>D.</given-names>
            <surname>Mažeika</surname>
          </string-name>
          , “
          <article-title>Systematic Literature Review of the Cloud-ready Software Architecture</article-title>
          .
          <source>” Baltic J. Modern Computing</source>
          , vol.
          <volume>5</volume>
          , pp .
          <fpage>124</fpage>
          -
          <lpage>135</lpage>
          ,
          <year>March</year>
          2017
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          3.
          <string-name>
            <given-names>O.</given-names>
            <surname>Pozdniakova</surname>
          </string-name>
          and
          <string-name>
            <given-names>D.</given-names>
            <surname>Mažeika</surname>
          </string-name>
          , “
          <article-title>A cloud software isolation and crossplatform portability methods</article-title>
          .
          <source>” 2017 Open Conference of Electrical, Electronic and Information Sciences (eStream)</source>
          , Vilnius,
          <year>2017</year>
          , pp.
          <fpage>1</fpage>
          -
          <lpage>6</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          4.
          <string-name>
            <given-names>M.</given-names>
            <surname>Fowler</surname>
          </string-name>
          and
          <string-name>
            <given-names>J.</given-names>
            <surname>Lewis</surname>
          </string-name>
          , “Microservices.” [Online]. Available: http://martinfowler.com/articles/microservices.html
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          5.
          <string-name>
            <given-names>Z.</given-names>
            <surname>Dehghani</surname>
          </string-name>
          , “
          <article-title>How to break a Monolith into Microservices</article-title>
          .” [Online]. Available: https://martinfowler.com/articles/break-monolith-intomicroservices.html
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          6.
          <string-name>
            <given-names>D.</given-names>
            <surname>Linthicum</surname>
          </string-name>
          , “
          <article-title>From containers to microservices: Modernizing legacy applications</article-title>
          .” [Online]. Available: https://techbeacon.com/enterpriseit/containers-microservicesmodernizing
          <article-title>-legacy-applications</article-title>
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          7.
          <string-name>
            <given-names>N.</given-names>
            <surname>Vennaro</surname>
          </string-name>
          , “
          <article-title>How to introduce microservices in a legacy environment</article-title>
          .” [Online]. Available: https://www.infoworld.com/article/3237175/howto-introduce
          <article-title>-microservices-in-alegacy-environment</article-title>
          .html
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          8.
          <string-name>
            <given-names>S.</given-names>
            <surname>Koltovich</surname>
          </string-name>
          , “
          <article-title>How to Modernize Legacy Applications for a Microservices-Based Deployment</article-title>
          .” [Online]. Available: https://thenewstack.io
          <article-title>/modernize-legacy-applicationskeepupdate-re-write-needs-re-written/</article-title>
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          9.
          <string-name>
            <given-names>A.</given-names>
            <surname>Furda</surname>
          </string-name>
          ,
          <string-name>
            <given-names>C.</given-names>
            <surname>Fidge</surname>
          </string-name>
          ,
          <string-name>
            <given-names>O.</given-names>
            <surname>Zimmermann</surname>
          </string-name>
          ,
          <string-name>
            <given-names>W.</given-names>
            <surname>Kelly</surname>
          </string-name>
          and
          <string-name>
            <given-names>A.</given-names>
            <surname>Barros</surname>
          </string-name>
          ,
          <article-title>"Migrating Enterprise Legacy Source Code to Microservices: On Multitenancy, Statefulness, and Data Consistency,"</article-title>
          <source>in IEEE Software</source>
          , vol.
          <volume>35</volume>
          , no.
          <issue>3</issue>
          , pp.
          <fpage>63</fpage>
          -
          <lpage>72</lpage>
          , May/June 2018.
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          10.
          <string-name>
            <surname>M. Mishra</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          <string-name>
            <surname>Kunde</surname>
            and
            <given-names>M.</given-names>
          </string-name>
          <string-name>
            <surname>Nambiar</surname>
          </string-name>
          , “
          <article-title>Cracking the Monolith: Challenges in Data Transitioning to Cloud Native Architectures</article-title>
          .”
          <source>ECSA '18 Proceedings of the 12th European Conference on Software Architecture: Companion Proceedings</source>
          , Madrid,
          <year>2018</year>
          , pp.
          <fpage>1</fpage>
          -
          <lpage>4</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          11.
          <string-name>
            <given-names>A.</given-names>
            <surname>Carrasco</surname>
          </string-name>
          ,
          <string-name>
            <given-names>B. V.</given-names>
            <surname>Bladel</surname>
          </string-name>
          and
          <string-name>
            <given-names>S.</given-names>
            <surname>Demeyer</surname>
          </string-name>
          , “
          <article-title>Migrating towards Microservices: Migration and Architecture Smells</article-title>
          .”
          <source>In Proceedings of the 2nd International Workshop on Refactoring (IwoR '18), September 4</source>
          ,
          <year>2018</year>
          , Montpellier, France. ACM, New York, NY, USA, 6 pages. https://doi.org/0.1145/3242163.3242164
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          12.
          <string-name>
            <given-names>A.</given-names>
            <surname>Levcovitz</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Terra</surname>
          </string-name>
          , M. T. Valente, “
          <article-title>Towards a Technique for Extracting Microservices from Monolithic Enterprise Systems</article-title>
          .
          <source>” 3rd Brazilian Workshop on Software Visualization, Evolution and Maintenance (VEM)</source>
          , p.
          <fpage>97</fpage>
          -
          <lpage>104</lpage>
          ,
          <year>2015</year>
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          13. G. Mazlami,
          <string-name>
            <given-names>J.</given-names>
            <surname>Cito</surname>
          </string-name>
          and
          <string-name>
            <given-names>P.</given-names>
            <surname>Leitner</surname>
          </string-name>
          ,
          <article-title>"Extraction of Microservices from Monolithic Software Architectures,"</article-title>
          <source>2017 IEEE International Conference on Web Services (ICWS)</source>
          , Honolulu,
          <string-name>
            <surname>HI</surname>
          </string-name>
          ,
          <year>2017</year>
          , pp.
          <fpage>524</fpage>
          -
          <lpage>531</lpage>
          . Sdf
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          14.
          <string-name>
            <given-names>C.</given-names>
            <surname>Fan</surname>
          </string-name>
          and
          <string-name>
            <given-names>S.</given-names>
            <surname>Ma</surname>
          </string-name>
          , "Migrating Monolithic Mobile Application to Microservice
          <source>Architecture: An Experiment Report," 2017 IEEE International Conference on AI &amp; Mobile Services (AIMS)</source>
          , Honolulu,
          <string-name>
            <surname>HI</surname>
          </string-name>
          ,
          <year>2017</year>
          , pp.
          <fpage>109</fpage>
          -
          <lpage>112</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          15.
          <string-name>
            <given-names>J.</given-names>
            <surname>Kazanavičius</surname>
          </string-name>
          and
          <string-name>
            <given-names>D.</given-names>
            <surname>Mažeika</surname>
          </string-name>
          , “ Migrating Legacy Software to Microservices Architecture2019 Open Conference of Electrical,
          <source>Electronic and Information Sciences (eStream)</source>
          , Vilnius, Lithuania,
          <year>2019</year>
          , pp.
          <fpage>1</fpage>
          -
          <lpage>5</lpage>
          .
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>