Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Microservices in Docker implementation

We are writing our first micro services using Docker containers using Amazon fargate. We have many doubts on the implementation level using Spring Boot

We will have multiple micro services in the project, is it a good practice we are writing all the micro services in a single container or I have to create separate Docker container for separate micro services. In a cost effective way we use single container but is that make any problems for our project structure in future?

We are planning to deploy the application in AWS fargate and our application will have large option to extend in future and expecting around 100 to 150 different micro services. In this case is it cost effective if we are uploading all these microservices in different containers too?

like image 643
anoop Avatar asked Nov 25 '19 15:11

anoop


People also ask

Can Docker be used for microservices?

Using Docker Containers for MicroservicesIn a microservices architecture, the application can be made independent of the host environment by encapsulating each of them in Docker containers. It helps developers with the process of packaging applications into containers.

Why Docker is required for microservices?

And when different environments come into play, it is all in chaos. The solution to this problem is using containers to encapsulate each of the microservices. Docker helps you manage these containers. They ensure consistency through the multiple cycles of release and developments.

Do I need to know Docker for microservices?

Do Microservices require Containers/Docker/Kubernetes? No, Microservices are about logical separation, not physical.


1 Answers

The most important thing to remember with microservices is that they're not primarily about solving technical problems but organisational problems. So when we look at whether an organisation should be using microservices, and how those services are deployed, we need to look at whether the org has the problems that the microservices style solves.

The answer to your question about your architecture, then, will mostly depend on the size of your technology team, the organisational structure, the age of your product, your current deployment practices, and how those are likely to change over the medium term.

As an example, if your organisation:

  • has less than 25 tech staff,
  • organised into 1 or 2 teams,
  • each of which works on any part of the product,
  • which is less than 12 months old,
  • and is deployed all at once on a regular basis (e.g. daily, weekly, monthly),
  • and the org isn't about to grow rapidly,

then you almost definitely want to forget about microservices for now. In a situation like this, the team is still new in learning about the domain, so likely don't know everything they'd need to know to really understand what would be a great way to split the system up into a distributed architecture. That means if they split it up now, they'll probably want to change the boundaries later, and that becomes very expensive when you already have a distributed system, while being far simpler in a monolith. What's more, with only a small team who can all work on (and support) any part of the system, there's little reason to invest in building a platform where individual teams can deploy and maintain individual services. An organisation at this stage will typically be far more concerned with finding customers and iterating the product quickly, perhaps even pivoting the product, as opposed to making teams autonomous and building a high-scaling, resilient architecture. A monolithic architecture makes sense at this point, but a well-designed monolith, with clear component boundaries enforced by APIs, and encapsulated data access, making it easy to pull out services into separate processes later.

Let's look a little further on and consider an organisation that is...

  • over 50 tech staff,
  • organised into 7 teams,
  • each of which works only on specific areas of the product,
  • which is 3 years old,
  • and has teams wanting to deploy their work independently of what other teams are doing.

Such an organisation should definitely be building a distributed architecture. If they don't, and have all these teams working in a monolith instead, they will run into all kinds of organisational problems, with teams needing to coordinate their work, releases being delayed while the one team finishes QA on their new feature, patch deploys being a big hassle for staff and customers. What's more, with a mature product, the organisation should know enough about the domain to be able to sensibly split both the domain and the teams (in that order; see Conway's Law) into sensible, autonomous units that can make progress while minimising coordination.

You seem to have chosen microservices already. Depending on where you sit on the scales above, maybe you want to revisit that decision.

If you want to keep developing with microservices but deploying them all in one container, know that there's nothing wrong with that if it suits the way your organisation works at the moment. Will it make problems for your project structure in future? Well, if you're successful and your organisation grows, there will probably come a time where this single-container deployment is no longer the best fit, in particular when teams start owning services and want to deploy just their service without deploying the whole application. But that autonomy will come at the cost of extra work and complexity, and it may give you no benefit at this point in time. Just because it won't be the right approach for your system in the future doesn't mean that it isn't the right approach for today. The trick is in keeping an eye on it and knowing when to make the extra investment.

like image 86
Graham Lea Avatar answered Sep 20 '22 07:09

Graham Lea