Part 2 of this article earlier, described microservices versus monolithic architecture. With the introduction of microservices, it became easy to host not only a dedicated database but also a dedicated database server instance and separate the concerns for each functionality that the user interface comprised of. When we use microservices with Mesos-based clusters and shared volumes, we can even have many copies of the server for high availability and failover. This is possibly great for small and segregated data but larger companies often require massive investments in their data, often standardizing tools, processes, and workflows to better manage their data. In such cases, consumers of the data don't talk to the database directly but via a service that sits behind say even a message bus. If the consumers proliferate, they end up creating and sharing many different instances of services for the same data each with its own view rather than the actual table. APIs for these services are more domain-based rather than implementing a query-friendly interface that lets you directly work with the data. As services are organized, data may get translated or massaged as it makes its way from one to another. It is possible to have a ring of microservices that can take care of most data processing for business requirements. Data may even be at most one or two fields of an entity along with its identifier for such services. This works very well to alleviate the onus and rigidity that comes with organization, the interactions between the components, and the various chores that need to be taken to keep it flexible to suit changing business needs. The microservices are independent so they stand by themselves as if spreading out from data for their respective functionalities. This is already business-friendly because each service can now be modified and tested independently of others.
The transition to
microservices from legacy monolithic code is not straightforward. The
functionalities must be separated beyond components. And in the process of
doing so, we cannot risk regression. Tests become a way to scope out behavior
at boundaries such as interface and class interactions. Adequate coverage
of tests will guarantee backward compatibility for the system as it is
refactored. The microservices are independently testable both in terms of unit
tests as well as end-to-end tests. Services usually have a REST interface which
makes it easy to invoke them from clients and comes with the benefits of using browser-based
developer tools. The data store does not need to be divided between services.
In some cases, only a data access service is required which other microservices
can call. The choice and design of microservices stem from the minimal
functionalities that need to be separated and articulated. If the services
don’t need to be refactored at a finer level, they can remain encapsulated in a
singleton.
The rule of thumb for
the refactoring of the code is the follow-up of the Don’t Repeat Yourself or
(DRY) principle which is defined as “Every piece of knowledge must have a
single, unambiguous, authoritative representation within a system”. This calls
for every algorithm or logic that is cut and pasted for different usages to be
consolidated at a single point of maintenance. This improves flexibility
because enhancements such as the use of a new data structure can be replaced in
one place and it also reduces the bugs that come by when similar changes must
be made in several places. This principle also reduces the code when it is
refactored especially if the old code had several duplications. It provides a
way to view the minimal skeleton of the microservices when aimed at the
appropriate scope and breadth. Even inter-service calls can be reduced with
this principle.
Good microservices are
not only easy to discover from their APIs but also easy to read from their
documentation which can be autogenerated from the code with markdowns.
Different tools are available for this purpose and both the approach of using microservices
as well as the enhanced comments describing the APIs provide sufficient
information for the documentation.
No comments:
Post a Comment