Hexagon is a microservices toolkit written in Kotlin

Overview

Hexagon
Hexagon

The atoms of your platform

GitHub Actions Coverage Maven Central Repository

Home Site | Quick Start | Developer Guide


What is Hexagon

Hexagon is a microservices' toolkit (not a framework) written in Kotlin. Its purpose is to ease the building of server applications (Web applications, APIs or queue consumers) that run inside a cloud platform.

The Hexagon Toolkit provides several libraries to build server applications. These libraries provide single standalone features and are referred to as "Ports".

The main ports are:

  • The HTTP server: supports HTTPS, HTTP/2, mutual TLS, static files (serve and upload), forms processing, cookies, sessions, CORS and more.
  • The HTTP client: which supports mutual TLS, HTTP/2, cookies, form fields and files among other features.
  • Template Processing: allows template processing from URLs (local files, resources or HTTP content) binding name patterns to different engines.

Each of these features or ports may have different implementations called "Adapters".

Hexagon is designed to fit in applications that conform to the Hexagonal Architecture (also called Clean Architecture or Ports and Adapters Architecture). Also, its design principles also fits in this architecture.

The Hexagon's goals and design principles are:

  • Put you in Charge: There is no code generation, no runtime annotation processing, no classpath based logic, and no implicit behaviour. You control your tools, not the other way around.

  • Modular: Each feature (Port) or adapter is isolated in its own module. Use only the modules you need without carrying unneeded dependencies.

  • Pluggable Adapters: Every Port may have many implementations (Adapters) using different technologies. You can swap adapters without changing the application code.

  • Batteries Included: It contains all the required pieces to make production-grade applications: logging utilities, serialization, resource handling and build helpers.

  • Kotlin First: Take full advantage of Kotlin instead of just calling Java code from Kotlin. The library is coded in Kotlin for coding with Kotlin. No strings attached to Java (as a Language).

  • Properly Tested: The project's coverage is checked in every Pull Request. It is also stress-tested at TechEmpower Frameworks Benchmark.

For more information check the Quick Start Guide or the Developer Guide.

Simple HTTP service

You can clone a starter project (Gradle Starter or Maven Starter). Or you can create a project from scratch following these steps:

  1. Configure Kotlin in Gradle or Maven.
  2. Add the dependency:
  • In Gradle. Import it inside build.gradle:

    repositories {
        mavenCentral()
    }
    
    implementation("com.hexagonkt:http_server_jetty:$hexagonVersion")
  • In Maven. Declare the dependency in pom.xml:

    <dependency>
      <groupId>com.hexagonktgroupId>
      <artifactId>http_server_jettyartifactId>
      <version>$hexagonVersionversion>
    dependency>
  1. Write the code in the src/main/kotlin/Hello.kt file:
// hello
package com.hexagonkt.http.server.jetty

import com.hexagonkt.http.server.Server

lateinit var server: Server

/**
 * Start a Hello World server, serving at path "/hello".
 */
fun main() {
    server = serve {
        get("/hello") {
            ok("Hello World!")
        }
    }
}
// hello
  1. Run the service and view the results at: http://localhost:2010/hello

Examples

Books Example

A simple CRUD example showing how to manage book resources. Here you can check the full test.

// books
data class Book(val author: String, val title: String)

private val books: MutableMap<Int, Book> = linkedMapOf(
    100 to Book("Miguel de Cervantes", "Don Quixote"),
    101 to Book("William Shakespeare", "Hamlet"),
    102 to Book("Homer", "The Odyssey")
)

val server: Server = Server(adapter) {
    post("/books") {
        // Require fails if parameter does not exists
        val author = queryParameters.require("author")
        val title = queryParameters.require("title")
        val id = (books.keys.maxOrNull() ?: 0) + 1
        books += id to Book(author, title)
        send(201, id)
    }

    get("/books/{id}") {
        val bookId = pathParameters.require("id").toInt()
        val book = books[bookId]
        if (book != null)
            // ok() is a shortcut to send(200)
            ok("Title: ${book.title}, Author: ${book.author}")
        else
            send(404, "Book not found")
    }

    put("/books/{id}") {
        val bookId = pathParameters.require("id").toInt()
        val book = books[bookId]
        if (book != null) {
            books += bookId to book.copy(
                author = queryParameters["author"] ?: book.author,
                title = queryParameters["title"] ?: book.title
            )

            ok("Book with id '$bookId' updated")
        }
        else {
            send(404, "Book not found")
        }
    }

    delete("/books/{id}") {
        val bookId = pathParameters.require("id").toInt()
        val book = books[bookId]
        books -= bookId
        if (book != null)
            ok("Book with id '$bookId' deleted")
        else
            send(404, "Book not found")
    }

    // Matches path's requests with *any* HTTP method as a fallback (return 404 instead 405)
    any("/books/{id}") { send(405) }

    get("/books") { ok(books.keys.joinToString(" ", transform = Int::toString)) }
}
// books
Session Example

Example showing how to use sessions. Here you can check the full test.

// session
val server: Server = Server(adapter, ServerSettings(features = setOf(SESSIONS))) {
    path("/session") {
        get("/id") { ok(session.id ?: "null") }
        get("/access") { ok(session.lastAccessedTime?.toString() ?: "null") }
        get("/new") { ok(session.isNew()) }

        path("/inactive") {
            get { ok(session.maxInactiveInterval ?: "null") }

            put("/{time}") {
                session.maxInactiveInterval = pathParameters.require("time").toInt()
            }
        }

        get("/creation") { ok(session.creationTime ?: "null") }
        post("/invalidate") { session.invalidate() }

        path("/{key}") {
            put("/{value}") {
                session.set(pathParameters.require("key"), pathParameters.require("value"))
            }

            get { ok(session.get(pathParameters.require("key")).toString()) }
            delete { session.remove(pathParameters.require("key")) }
        }

        get {
            val attributes = session.attributes
            val attributeTexts = attributes.entries.map { it.key + " : " + it.value }

            response.headers["attributes"] = attributeTexts.joinToString(", ")
            response.headers["attribute values"] = attributes.values.joinToString(", ")
            response.headers["attribute names"] = attributes.keys.joinToString(", ")

            response.headers["creation"] = session.creationTime.toString()
            response.headers["id"] = session.id ?: ""
            response.headers["last access"] = session.lastAccessedTime.toString()

            response.status = 200
        }
    }
}
// session
Error Handling Example

Code to show how to handle callback exceptions and HTTP error codes. Here you can check the full test.

578") } get("/exception") { throw UnsupportedOperationException("error message") } get("/baseException") { throw CustomException() } get("/unhandledException") { error("error message") } get("/halt") { halt("halted") } get("/588") { halt(588) } } // errors">
// errors
class CustomException : IllegalArgumentException()

val server: Server = Server(adapter) {
    error(UnsupportedOperationException::class) {
        response.headers["error"] = it.message ?: it.javaClass.name
        send(599, "Unsupported")
    }

    error(IllegalArgumentException::class) {
        response.headers["runtimeError"] = it.message ?: it.javaClass.name
        send(598, "Runtime")
    }

    // Catching `Exception` handles any unhandled exception before (it has to be the last)
    error(Exception::class) { send(500, "Root handler") }

    // It is possible to execute a handler upon a given status code before returning
    error(588) { send(578, "588 -> 578") }

    get("/exception") { throw UnsupportedOperationException("error message") }
    get("/baseException") { throw CustomException() }
    get("/unhandledException") { error("error message") }

    get("/halt") { halt("halted") }
    get("/588") { halt(588) }
}
// errors
Filters Example

This example shows how to add filters before and after route execution. Here you can check the full test.

// filters
private val users: Map<String, String> = mapOf(
    "Turing" to "London",
    "Dijkstra" to "Rotterdam"
)

private val server: Server = Server(adapter) {
    before { attributes["start"] = nanoTime() }

    before("/protected/*") {
        val authorization = request.headers["Authorization"] ?: halt(401, "Unauthorized")
        val credentials = authorization.removePrefix("Basic ")
        val userPassword = String(Base64.getDecoder().decode(credentials)).split(":")

        // Parameters set in call attributes are accessible in other filters and routes
        attributes["username"] = userPassword[0]
        attributes["password"] = userPassword[1]
    }

    // All matching filters are run in order unless call is halted
    before("/protected/*") {
        if(users[attributes["username"]] != attributes["password"])
            halt(403, "Forbidden")
    }

    get("/protected/hi") { ok("Hello ${attributes["username"]}!") }

    // After filters are run even if request was halted before
    after { response.headers["time"] = nanoTime() - attributes["start"] as Long }
}
// filters
Files Example

The following code shows how to serve resources and receive files. Here you can check the full test.

>): List = listOf( map.map { "${it.key}:${it.value.joinToString(",")}}" }.joinToString("\n") ) val queryParams = serializeMap(queryParametersValues) val formParams = serializeMap(formParametersValues) response.headersValues["queryParams"] = queryParams response.headersValues["formParams"] = formParams } } // files">
// files
private val server: Server = Server(adapter) {
    path("/static") {
        get("/files/*", URL("classpath:assets")) // Serve `assets` resources on `/html/*`
        get("/resources/*", File(directory)) // Serve `test` folder on `/pub/*`
    }

    get("/html/*", URL("classpath:assets")) // Serve `assets` resources on `/html/*`
    get("/pub/*", File(directory)) // Serve `test` folder on `/pub/*`
    get(URL("classpath:public")) // Serve `public` resources folder on `/*`

    post("/multipart") { ok(request.parts.keys.joinToString(":")) }

    post("/file") {
        val part = request.parts.values.first()
        val content = part.inputStream.reader().readText()
        ok(content)
    }

    post("/form") {
        fun serializeMap(map: Map<String, List<String>>): List<String> = listOf(
            map.map { "${it.key}:${it.value.joinToString(",")}}" }.joinToString("\n")
        )

        val queryParams = serializeMap(queryParametersValues)
        val formParams = serializeMap(formParametersValues)

        response.headersValues["queryParams"] = queryParams
        response.headersValues["formParams"] = formParams
    }
}
// files

You can check more sample projects and snippets at the examples page.

Thanks

This project is supported by:

Status

The toolkit is properly tested. This is the coverage report:

Coverage

Performance is not the primary goal, but it is taken seriously. You can check performance numbers in the TechEmpower Web Framework Benchmarks.

Contribute

If you like this project and want to support it, the easiest way is to give it a star ✌️ .

If you feel like you can do more. You can contribute to the project in different ways:

To know what issues are currently open and be aware of the next features you can check the Project Board and the Organization Board at GitHub.

You can ask any question, suggestion or complaint at the project's Slack channel. You can be up to date of project's news following @hexagon_kt on Twitter.

Thanks to all project's contributors!

CodeTriage

License

The project is licensed under the MIT License. This license lets you use the source for free or commercial purposes as long as you provide attribution and don’t hold any project member liable.

Comments
  • Fix API documentation edit link

    Fix API documentation edit link

    Edit link doesn't lead to the file with the documentation and title is always Home.

    Take this generated page as an example: https://hexagonkt.com/port_http_server/com.hexagonkt.http.server The edit button (the one with a pencil icon on top right position) doesn't take you to the correct file to edit that documentation.

    Also, the title of the page is Home where it should be the package name (and in the case of a class or a method, its name).

    This is a tricky issue and involves a little bit of research, and maybe requires some unavailable features in the tools used to generate the documentation Dokka, MkDocs and MkDocs Material Theme.

    To give a little bit of context: the site generation is done from source code files and extra Markdown files. Dokka generates the Markdown for API classes, packages and modules, these are processed to fit in MkDocs using Gradle build scripts, and finally the documentation is compiled using the MkDocs Material Theme to a static site. This processing is done in the hexagon_site module (check the module for further reference).

    The purpose of this process is to keep the source of the documentation close to the code and with the bare minimum number of files to be able to keep it up to date with the minimum effort.

    To fix this issue, I haven't got a good solution yet, but a proposal would be:

    1. Check if MkDocs allows front matter data (key/value pairs in .md files) passed to the rendering engine.
    2. Find out if MkDocs Material Theme checks one of those keys to render the edit button.
    3. If so, add Kotlin or Gradle code in the build logic to obtain the class file to which the .md belongs and set it in the .md file (maybe Dokka can do this though).
    4. Check everything works smoothly and go for a beer.

    If you read this issue and you came up with a better solution... I'm all ears!

    help wanted hacktoberfest 
    opened by jaguililla 21
  • Simple command line arguments parsing

    Simple command line arguments parsing

    The purpose of this task would be to implement a minimum set of features to handle command line arguments properly without having to rely on a third party library like picocli or jopt-simple.

    The goal would be to provide the most used features to be used out of the box. Users who need all features, could go for an external library, but at Hexagon core there should be a minimum to parse arguments and display help messages and errors.

    The features would be:

    • Allow the definition of cli arguments. I.e., data class Option<T : Any>(val shortName: Char?, val longName: String?, val description: String, val optional: Boolean, val type: KClass<T> = String::class, val defaultValue: T)
    • A function to parse an array of arguments with a given array of options: fun parse(options: List<Option<*>>, vararg args: String): Map<Option, List<*>).
    • Parse should fail if unkown parameter is passed.
    • Another function to generate a help message based on the defined options (maybe on a class with the function described above).
    • The allowed options format would be a subset of posix standard
      • Long parameters with values: --name value or --name
      • Short parameters clustered: -alts > -a -l -t -s
      • Short parameters with values: -a value

    Things to consider:

    • Does the OS takes care of the parameters scaping always? I.e., 'value with spaces', "another value with $variable"?

    Previous work:

    • In the settings processing, there was a very limited parameter parsing. You can check it out here.

    Requirements:

    • No external libraries.
    • Short and simple (3 or 4 classes in a package at most).
    • Extensive test set to cover all cases (there is a lot of corner cases).

    If requirements are too complex to achieve, we can always discard this task and don't provide that functionality. I'm not sure 100% if the toolkit should including this. Trade offs are:

    • Allow minimum features to develop a wide range of programs but adding more complexity and not being able to provide a viable alternative to 3rd party libraries.
    • Focus on do the least features (don't be a bloated toolkit) and let the user select other specialized libraries for things not covered by Hexagon.

    What do you think?

    help wanted 
    opened by jaguililla 19
  • Upgrade MkDocs Material

    Upgrade MkDocs Material

    Upgrade to MkDocs Material 5. To do so, you can check the theme's documentation: https://squidfunk.github.io/mkdocs-material/upgrading/

    We can take advantage of the new version to add Dev.to link as blog/news using this icon: https://fontawesome.com/icons/dev?style=brands

    Use also a Web app manifest and service worker may be another improvement.

    help wanted hacktoberfest 
    opened by jaguililla 12
  • Port Gradle build scripts to Kotlin

    Port Gradle build scripts to Kotlin

    Build logic is written in Groovy (all *.gradle files).

    The goal of this task is to port those build scripts to Gradle kotlin DSL (*.gradle.kts).

    This task can be completed with different PRs (one by each .gradle file migrated).

    EDIT: The missing scripts right now are:

    • Helper scripts located inside gradle directory. These ones should be ported in a kts folder before deleting the Groovy ones.
    help wanted 
    opened by jaguililla 10
  • Develop Twitter clone example

    Develop Twitter clone example

    This could be a perfect task to start working on the project. If you would like to get involved or just play with a different toolkit for HTTP services, keep reading!

    Your task will be to code a Twitter clone example following the very same Spark tutorial.

    To get familiar with the project and set things up, you should read the contributing document first. If something is not clear or doesn't work right, don't worry and post a comment, I will help you with that (and fix the document for the next one :wink:).

    This exercise will give you a grasp on the project to further propose or develop improvements (if you are willing to continue committing code).

    To complete this task:

    • [ ] Code the service following this Spark tutorial
    • [ ] Create a Pull Request to https://github.com/hexagonkt/twitter_clone from your project
    • [ ] As an optional addition, you can add Codecov test coverage report inside the Travis CI pipeline

    For reference, you can check this other example: https://github.com/hexagonkt/real_world. And of course, I will help you with it if you ask me (as I already did developments like this).

    Have fun, and happy coding!

    help wanted easy 
    opened by jaguililla 9
  • Add application structure example

    Add application structure example

    This could be a perfect task to start working on the project. If you would like to get involved or just play with a different toolkit for HTTP services, keep reading!

    Your task will be to code an example demonstrating the structure of a simple application following this Spark tutorial.

    To get familiar with the project and set things up, you should read the contributing document first. If something is not clear or doesn't work right, don't worry and post a comment, I will help you with that (and fix the document for the next one :wink:).

    This exercise will give you a grasp on the project to further propose or develop improvements (if you are willing to continue committing code).

    To complete this task:

    • [ ] Code the service following this Spark tutorial
    • [ ] Create a Pull Request to https://github.com/hexagonkt/application_structure from your project
    • [ ] As an optional addition, you can add Codecov test coverage report inside the Travis CI pipeline

    For reference, you can check this other example: https://github.com/hexagonkt/real_world. And of course, I will help you with it if you ask me (as I already did developments like this).

    Have fun, and happy coding!

    help wanted wontdo easy 
    opened by jaguililla 9
  • Add compression support

    Add compression support

    Implement compression support in port_http_server and port_http_client.

    The goal would be to add a configuration parameter in the (Server|Client)Settings classes and force the compression headers to be sent accordingly.

    The proper encoding and sending/receiving bodies must be checked by tests in the Ports' tests suites (the test classes used to validate adapters modules).

    As a reference, you can check the fabulous MDN documentation regarding the subject:

    • https://developer.mozilla.org/en-US/docs/Web/HTTP/Compression
    • https://developer.mozilla.org/es/docs/Web/HTTP/Headers/Content-Encoding
    help wanted 
    opened by jaguililla 9
  • Add XML serialization format

    Add XML serialization format

    As Jackson supports the XML datatype: https://github.com/FasterXML/jackson-dataformat-xml , the scope of this task would be to create a Content Format module to support it.

    As a reference you can check the YAML Content format implementation in the serialization_yaml module.

    help wanted 
    opened by jaguililla 8
  • WebSockets support

    WebSockets support

    When completed, create an example project like this one: http://sparkjava.com/tutorials/websocket-chat to show the feature.

    Check Javalin implementation: https://javalin.io/documentation#websockets

    This task is composed of two big areas:

    1. Define the DSL to handle Websockets

    The DSL will implement methods to add routes of WS type inside the router. I.e.:

    Router {
        webSocket("/path") {
            onConnect {
                send("Message back")
            }
            onError {
                send("Message back")
            }
            onMessage {
                send("Message back")
            }
            onClose {
                send("Message back")
            }
        }
    }
    

    All callbacks will have a context to send/receive data to the client. This context will hold methods to get/set attributes, headers, etc.

    2. Implement the routes on adapters

    The above step will add a list of routes to the router. On the adapters implementations, these routes will be converted into the adapter's library format in the fun startup(server: Server) method.

    You can check the implementation of this method on the http_server_jetty/src/main/kotlin/JettyServletAdapter.kt file, but the actual logic is also on the http_server_servlet/src/main/kotlin/ServletFilter.kt file.

    hacktoberfest 
    opened by jaguililla 8
  • Error parsing query parameters

    Error parsing query parameters

    If a query parameter is defined with an empty value (I.e.: ?status=) a 500 error is returned.

    In that scenario we should assume it is a single element list with an empty string (as if you pass ?status).

    bug help wanted hacktoberfest 
    opened by jaguililla 7
  • Benchmark multiple configurations in single JVM [#97]

    Benchmark multiple configurations in single JVM [#97]

    This way one server can be used to test against different database and template engines and doesn't need to be restarted to test a different engine.

    Remove unnecessary combinations of docker based benchmark servers, it is now enough to have one per web engine (Resin, Jetty, Undertow). Also remove links definitions as they are not needed in compose v2+ (services in a stack are by default addressable by their name).

    Close #97

    opened by jitakirin 7
  • Complete SSE implementation

    Complete SSE implementation

    Partially implemented.

    Check https://www.baeldung.com/jetty-reactivestreams-http-client for client side implementation.

    Check the feature/sse branch.


    Detailed description.

    Reason for the change or new development.

    Acceptance criteria to verify the development. A list of requirements with the following format:

    When *action* then *result*

    For example:

    When this is done then that other thing should happen

    opened by jaguililla 0
  • Add Netty HTTP client

    Add Netty HTTP client

    Implement a HTTP client adapter using Netty.

    The http_client_jetty module can be used as a guide.

    http_client_jetty integration tests are located in http_test/src/test/kotlin/com/hexagonkt/http/test/AdapterExamplesTest.kt, the Netty adapter should copy them into its module tests and make them pass with the new adapter.

    help wanted good first issue 
    opened by jaguililla 6
  • Add HTTP server cheat sheet to documentation

    Add HTTP server cheat sheet to documentation

    Create a cheat sheet like: https://gist.github.com/jaguililla/ff8e671bb770478253553f5fb7a8ff5d

    Link it to the project site on the main menu (below HTTP server reference).

    help wanted easy good first issue 
    opened by jaguililla 0
  • Check worthy examples to implement

    Check worthy examples to implement

    I.e.:

    • https://javalin.io/tutorials/websocket-example
    • https://javalin.io/tutorials/realtime-collaboration-example
    • https://javalin.io/tutorials/openapi-example
    • https://javalin.io/tutorials/serving-protobuf-with-javalin
    help wanted good first issue 
    opened by jaguililla 0
Releases(2.4.1)
  • 2.4.1(Jan 6, 2023)

    What's Changed

    • Fix Jetty Loom problem (still needs work though)

    Full Changelog: https://github.com/hexagonkt/hexagon/compare/2.4.0...2.4.1

    Source code(tar.gz)
    Source code(zip)
  • 2.4.0(Jan 6, 2023)

  • 2.3.1(Dec 30, 2022)

  • 2.3.0(Dec 28, 2022)

    What's Changed

    • Add TOML serialization format
    • Add maps merge functionality
    • Add checking utilities in core
    • Move Handlers to its own module
    • Add CI action to mark stale issues

    Full Changelog: https://github.com/hexagonkt/hexagon/compare/2.2.8...2.3.0

    Source code(tar.gz)
    Source code(zip)
Owner
Hexagon
Hexagon Microservices Toolkit
Hexagon
APIKit:Discovery, Scan and Audit APIs Toolkit All In One.

APIKit:Discovery, Scan and Audit APIs Toolkit All In One.

APISecurity Community 976 Jan 9, 2023
A proof-of-concept Android application to detect and defeat some of the Cellebrite UFED forensic toolkit extraction techniques.

LockUp An Android-based Cellebrite UFED self-defense application LockUp is an Android application that will monitor the device for signs for attempts

levlesec 300 Dec 4, 2022
A Toolkit for Modeling and Simulation of Resource Management Techniques in Internet of Things, Edge and Fog Computing Environments

The iFogSimToolkit (with its new release iFogSim2) for Modeling and Simulation of Resource Management Techniques in Internet of Things, Edge and Fog Computing Environments. In the new release Mobili Management, Microservice Management, and Dynamic Clustering mechanisms are added as new features.

The Cloud Computing and Distributed Systems (CLOUDS) Laboratory 69 Dec 17, 2022
Easy-Es is a powerfully enhanced toolkit of RestHighLevelClient for simplify development

Easy-Es is a powerfully enhanced toolkit of RestHighLevelClient for simplify development. This toolkit provides some efficient, useful, out-of-the-box features for ElasticSearch. By using Easy-Es, you can use MySQL syntax to complete Es queries. Use it can effectively save your development time.

dromara 772 Dec 31, 2022
Saga pattern with Java => order -> payment -> stock microservices are ready to use

Order_Payment_Stock_Saga_Pattern Saga pattern with Java => order -> payment -> stock microservices are ready to use Docker-compose.yaml You can see th

Gurkan İlleez 5 Dec 27, 2022
How To Implement Fault Tolerance In Microservices Using Resilience4j

springboot-resilience4j-demo How To Implement Fault Tolerance In Microservices Using Resilience4j? Things todo list: Clone this repository: git clone

Hendi Santika 4 Mar 30, 2022
Spring Boot microservices app with Spring Cloud, Robust and resilient backend managing e-Commerce app

e-Commerce-boot μServices Important Note: This project's new milestone is to move The whole system to work on Kubernetes, so stay tuned. Introduction

Selim Horri 65 Dec 23, 2022
Tzatziki - Decathlon library to ease and promote Test Driven Development of Java microservices!

Tzatziki Steps Library This project is a collection of ready-to-use Cucumber steps making it easy to TDD Java microservices by focusing on an outside-

Decathlon 32 Dec 15, 2022
A base repo for creating RPC microservices in Java with gRPC, jOOQ, and Maven.

Wenower Core OSX local installation Install Protocol Buffer $ brew install protobuf Install Postgresql and joopc database and user $ brew install pos

Hamidreza Soleimani 1 Jan 9, 2022
A boilerplate project designed to work as a template for new microservices and help you get in touch with various useful concepts.

Microservice Reference Project This project is inspired by the idea to quickly create a production ready project with all the required infrastructure

Innovation & Tech 4 Dec 17, 2022
Java libraries for writing composable microservices

Apollo Status: Archived ⚠️ Apollo is heavily used within Spotify, however, most of its development has recently been done internally leveraging Apollo

Spotify 1.6k Dec 6, 2022
A fast, lightweight and more productive microservices framework

A fast, lightweight and cloud-native microservices framework. Stack Overflow | Google Group | Gitter Chat | Subreddit | Youtube Channel | Documentatio

null 3.5k Jan 5, 2023
Microservices with Spring Boot and Kafka Demo Project

Example microservices showing how to use Kafka and Kafka Streams with Spring Boot on the example of distributed transactions implementations with the SAGA pattern

Piotr Mińkowski 98 Jan 7, 2023
Example project of Spring Boot Microservices with the following services School and Student

SpringBootMicroservicesWithDiscoveryGatewayConfig Example project of Spring Boot Microservices with the following services School and Student, additio

Gábor Hutya 2 Nov 28, 2022
🏋️‍♀️ Construindo Uma Arquitetura Baseada em Microservices

A prova de Arquitetura de Software consiste nas seguintes atividades: - Utilizando-se Spring Cloud, implementar uma arquitetura baseada em microservice - Deve ter um API Gateway, Service Discovery (Eureka) e ao menos 3 Microservices - Cada um dos 3 microservices deve ter uma REST API - Para a REST API, deve criar a documentação com Swagger - Deve ser enviado printscreen do Eureka e do funcionamento dos 3 Microservices

Giovane A. Tiburcio 3 Mar 31, 2022
A fast, light and cloud native OAuth 2.0 authorization microservices based on light-4j

A fast, light weight and cloud native OAuth 2.0 Server based on microservices architecture built on top of light-4j and light-rest-4j frameworks. Stac

null 291 Dec 17, 2022
The repository is created to showcase examples of microservices patterns using different technologies.

Repository Objective The goal of this repository is to demonstrate coding examples in different languages mainly Java and .NET core. These examples wi

Roland Salloum 13 Nov 17, 2022
Text to Speech Project for Spring Boot and Kotlin, Auth Server, Python with Fast API (gTTS)

TTS-App Text to Speech Project for Spring Boot Module (etc Resource, Auth Server, Python with Fast API (gTTS)) Python의 gTTS lib를 활용하여 텍스트를 음성으로 변환하는 서

Seokhyun 7 Dec 21, 2021
Desafios-bootcamps-dio - Desafios em C#, Java, JavaScript, Kotlin, Python e Ruby dos Bootcamps da Digital Innovation One

Desafios dos Bootcamps da Digital Innovation One Aqui você vai encontrar todos os desafios dos bootcamps que realizei da Digital Innovation One. Os có

Pleiterson Amorim 443 Dec 31, 2022