Git Product home page Git Product logo

microservices's Introduction

Introduction

This is the result of my study on Microservices. It is an online shopping system and the details are here: https://lain.run/projects/Microservices/.

Implemented Concepts

  • Microservices pattern
  • CQRS
  • Event Bus
  • Event Store
  • Database per Service
  • Event Broker Pattern
  • Saga - Choreography
  • Reverse Proxy
  • RESTful services

User Stories

Template: As a [ USER ] I want to [ ACTION ] So that [ REASONING ]

User Personas:

  1. Customer
  2. Product Manager

Features:

  1. View Products
  2. Shop
  3. View Order Status
  4. View User Profile
  5. Get Invoice
  6. Modify products, prices, stocks
  7. Modify user credits
User Story Acceptance Criteria
As a customer, I want to browse for products so that I can place an order. View product categories
View Products
Ability to order each product
Get an Invoice
As a customer, I want to view my past orders so that it guides my future purposes. View orders. Display order status, product info, order date
As a customer, I want to view my profile information so that I can make adjustments. View user information and credit
Edit name, password, email
As a product manager, I want to add/edit/delete products so that customers can buy them View/Add/Edit/Delete products. Names, prices, suppliers, units in stock
As a product manager, I want to view all customer order states so that I can assist if needed View all orders and their states history in the system
As a product manager, I want to edit customer credit so that they can purchase products View all users and their credit
Edit credits

Modules

I used Python with Flask often because it is arguably one of the fastest and cleanest ways to prototype anything. I would implement everything in Python if I didn't want to introduce some variety. For Event Store, I used two docker containers. SDK to build for Linux, Runtime for deployment.

Module Category Programming Language Sdk Docker
ECommerce Website Consumer Python Flask python:alpine
Manager Website Consumer Python Flask python:alpine
Native Android Application Consumer Java Android SDK -
Accounting Database Database - - couchdb:latest
Customer Database Database - - redis:alpine
Event Store Database Database - - mongo
mongo-express
Order Database Database - - postgres:alpine
Event Bus Support Tool - - rabbitmq:management
Event Store Support Tool C# .NET Core 2.1 dotnet:2.1-sdk-alpine
dotnet:2.1-aspnetcore-runtime-alpine
Reverse Proxy Support Tool - - nginx:alpine
Accounting Web Service Web Service Javascript Node node:alpine
Customer Web Service Web Service Python Flask python:alpine
Order Web Service Web Service Java JDK-Jersey maven:3.6-jdk-8-alpine
Product Web Service Web Service Python Flask python:alpine

Api by service;

Customer (Python) Order Service(Java) Product Service(Python) Accounting Service(JS)
login-user place-order get-products get-revenue
add-user get-orders get-all-products
update-user get-product-details
get-user add-new-product
get-all-users update-product
get-credit delete-product
set-credit get-categories
add-new-category
update-category
delete-category

Communication Topography

As follows;

allsystem

Order Saga

The only Saga sample. Occurs when user places an order request for a product. Not all rollbacks are implemented. It looks messy but what happens here is: Customer places an order, If the customer has enough credit for the product price and if the product is in stock, the order succeeds.

saga

Running the Project

All modules are prepared for Docker Compose. You need to create Docker networks written inside docker compose files, then run the compose files. The classic option is running compose from terminal. You need to repeat the following process for each module.

  1. Open a terminal. Change directory to the module
  2. Type docker-compose up

That's it. Everything should install inside its own container and run in there. Aside from Docker itself, you don't need to explicitly install anything else.

Only couchDB requires the following command after it starts:

curl -X PUT http://accounting_usr:[email protected]:5984/_users

Both websites run on ports 5001 and 5002 both of which you can edit from their yml files. On Android project, you need to open the settings (upper right corner) inside the app and change the IP / Host of the reverse proxy server.

Licence

MIT

Author

Ayhan AVCI 2018

[email protected]

lain.run

microservices's People

Contributors

ayhanavci avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.