What is Microservices Integration ?
How one microservice can talk with another? In general, the following technologies could be used: shared database, RPC, and REST. But how do we pick up the right one?
The following are general answers to the questions:
- Avoid breaking changes.
When we add a change on the server side, the client side should not be impacted unless necessary.
- Keep your APIs technology agnostic
This is to avoid integration technology that dictates what technology stacks we can use to implement the micro services.
- Make your service simple for consumers
Make it easy for the consumers to user the services.
- Hide internal implementation details
Don’t have the consumers bound to the internal implementation.
With this guideline, let’s take a look at available options.
The most common form of integration is database(DB) integration: if other services want to retrieve or update the information from another service, they reach into the database.
This integration pattern definitely breaks many of the guidelines we set put:
- It allows the external parties to view and bind to internal implementation details.
- The customers are tied to a specific technology choice. For instance, if we decided to use Postgres, the consumer has to find a way to integrate with Postgres.
- It would be very difficult to change the logic, the logic of parsing the data must be spreader across all consumers.
So in sum, shared database is never a good choice for micro service integration.
Remote Procedure Call
Remote Procedure Call(RPC) refers to the technique of making a local call and having it execute on a remote service somewhere.
The common used PRC techniques includes SOAP, Thrift, Protocol Buffers. They support separate interface definition, and client/server stub generation based on the definition.
Some of the technique bind to a specific networking protocol, while some allows you to use different type of protocols. For example, gRPC utilizes Protocol Buffer and HTTP2.
Some RPC mechanism are heavily tied to a specific platform, but some other mechanisms for example Thrift and protocol buffer support multiple languages.
So, what’s the major downside of RPC calls? The problem is, Local Calls are not like Remote Calls. The consumers often forget about one thing: the network is not reliable. The client needs to keep in mind that the remote server could be down, be slow or the request could be lost and handle these situations properly.
Representational State Transfer(REST) is another technique. The most important concept of REST is resources. The REST service creates different representations of this resource on request.
REST and HTTP
REST as a design pattern does not talk about underlying protocols, although it is most commonly used over HTTP. The major reason is HTTP itself defines some useful capabilities that works very well with REST style, for example, the HTTP verbs: GET, POST, and PUT, and HTTP error codes.
There are, of course, downside of REST over HTTP. For server to service communication, if extremely low latency or small message size is important, HTTP might not be a good choice, as the message header can be big. TCP/UDP might be a better choice in these case.
REST support many formats of data interchange framework, the most comply used one are JSON and XML. Application data are converted into JSON/XML format, and then transmitted to the other service.
JSON V.S. XML
Both JSON and XML are human readable and machine readable.
- XML supprots store the metadata information with the tag.
For example, the type of the field, while JSON has to encode these metadata as an object and associate it with the data.
- XML supports link while JSON does not.
Xlink is used to create hyperlink in XML documents, with Xlink, the link content can be defined outside the linked files. While JSON is purely data based, and does not support anything similar. For python, the objects has to be concretely rendered in multiple places even though they share the same content.
- JSON is significantly less verbose than XML.
- JSON supports array.
This make it easy to be mapped to the data structure in the programming languages, for example, array, list, hash map etc. . For example, JSON is directly interchangeable with python dict. JSON objects can be easily parsed and manipulated in almost all programming languages.