lura

module
v1.4.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jun 8, 2021 License: Apache-2.0

README

The Lura Project framework

Go Report Card GoDoc CII Best Practices Docker Pulls Slack Widget

An open framework to assemble ultra performance API Gateways with middlewares; formerly known as KrakenD framework, and core service of the KrakenD API Gateway.

Motivation

Consumers of REST API content (specially in microservices) often query backend services that weren't coded for the UI implementation. This is of course a good practice, but the UI consumers need to do implementations that suffer a lot of complexity and burden with the sizes of their microservices responses.

Lura is an API Gateway builder and proxy generator that sits between the client and all the source servers, adding a new layer that removes all the complexity to the clients, providing them only the information that the UI needs. Lura acts as an aggregator of many sources into single endpoints and allows you to group, wrap, transform and shrink responses. Additionally it supports a myriad of middlewares and plugins that allow you to extend the functionality, such as adding Oauth authorization or security layers.

Lura not only supports HTTP(S), but because it is a set of generic libraries you can build all type of API Gateways and proxies, including for instance, an RPC gateway.

Practical Example

A mobile developer needs to construct a single front page that requires data from 4 different calls to their backend services, e.g:

1) api.store.server/products
2) api.store.server/marketing-promos
3) api.users.server/users/{id_user}
4) api.users.server/shopping-cart/{id_user}

The screen is very simple, and the mobile client only needs to retrieve data from 4 different sources, wait for the round trip and then hand pick only a few fields from the response.

What if the mobile could call a single endpoint?

1) lura.server/frontpage/{id_user}

That's something Lura can do for you. And this is how it would look like:

Gateway

Lura would merge all the data and return only the fields you need (the difference in size in the graph).

Visit the Lura Project website for more information.

What's in this repository?

The source code for the Lura project framework. It is designed to work with your own middleware and extend the functionality by using small, independent, reusable components following the Unix philosophy.

Use this repository if you want to build from source your API Gateway or if you want to reuse the components in another application.

If you need a fully functional API Gateway you can download the KrakenD binary for your architecture or build it yourself.

Library Usage

The Lura project is presented as a Go library that you can include in your own Go application to build a powerful proxy or API gateway. In order to get you started several examples of implementations are included in the examples folder.

Of course, you will need Go installed in your system to compile the code.

A ready to use example:

    package main

    import (
        "flag"
        "log"
        "os"

        "github.com/luraproject/lura/config"
        "github.com/luraproject/lura/logging"
        "github.com/luraproject/lura/proxy"
        "github.com/luraproject/lura/router/gin"
    )

    func main() {
        port := flag.Int("p", 0, "Port of the service")
        logLevel := flag.String("l", "ERROR", "Logging level")
        debug := flag.Bool("d", false, "Enable the debug")
        configFile := flag.String("c", "/etc/lura/configuration.json", "Path to the configuration filename")
        flag.Parse()

        parser := config.NewParser()
        serviceConfig, err := parser.Parse(*configFile)
        if err != nil {
            log.Fatal("ERROR:", err.Error())
        }
        serviceConfig.Debug = serviceConfig.Debug || *debug
        if *port != 0 {
            serviceConfig.Port = *port
        }

        logger, _ := logging.NewLogger(*logLevel, os.Stdout, "[LURA]")

        routerFactory := gin.DefaultFactory(proxy.DefaultFactory(logger), logger)

        routerFactory.New().Run(serviceConfig)
    }

Visit the framework overview for more details about the components of the Lura project.

Examples

You can find some implementation examples on this KrakenD repository

  1. gin router
  2. mux router
  3. gorilla router
  4. negroni middlewares
  5. dns srv service discovery
  6. jwt middlewares
  7. httpcache based proxies

Configuration file

Lura config file

Benchmarks

Check out the benchmark results of several Lura components

Contributing

We are always happy to receive contributions. If you have questions, suggestions, bugs please open an issue. If you want to submit the code, create the issue and send us a pull request for review.

Read CONTRIBUTING.md for more information.

Want more?

Enjoy Lura!

Directories

Path Synopsis
Package config defines the config structs and some config parser interfaces and implementations SPDX-License-Identifier: Apache-2.0 SPDX-License-Identifier: Apache-2.0 SPDX-License-Identifier: Apache-2.0
Package config defines the config structs and some config parser interfaces and implementations SPDX-License-Identifier: Apache-2.0 SPDX-License-Identifier: Apache-2.0 SPDX-License-Identifier: Apache-2.0
Package core contains come basic constants and variables SPDX-License-Identifier: Apache-2.0
Package core contains come basic constants and variables SPDX-License-Identifier: Apache-2.0
Package encoding provides Decoding implementations.
Package encoding provides Decoding implementations.
Package logging provides a simple logger interface SPDX-License-Identifier: Apache-2.0
Package logging provides a simple logger interface SPDX-License-Identifier: Apache-2.0
Package plugin provides tools for loading and registering plugins SPDX-License-Identifier: Apache-2.0 SPDX-License-Identifier: Apache-2.0
Package plugin provides tools for loading and registering plugins SPDX-License-Identifier: Apache-2.0 SPDX-License-Identifier: Apache-2.0
tests/app
SPDX-License-Identifier: Apache-2.0
SPDX-License-Identifier: Apache-2.0
tests/plugins
SPDX-License-Identifier: Apache-2.0
SPDX-License-Identifier: Apache-2.0
SPDX-License-Identifier: Apache-2.0 SPDX-License-Identifier: Apache-2.0 SPDX-License-Identifier: Apache-2.0 SPDX-License-Identifier: Apache-2.0 SPDX-License-Identifier: Apache-2.0 SPDX-License-Identifier: Apache-2.0 SPDX-License-Identifier: Apache-2.0 SPDX-License-Identifier: Apache-2.0 SPDX-License-Identifier: Apache-2.0 Package proxy provides proxy and proxy middleware interfaces and implementations.
SPDX-License-Identifier: Apache-2.0 SPDX-License-Identifier: Apache-2.0 SPDX-License-Identifier: Apache-2.0 SPDX-License-Identifier: Apache-2.0 SPDX-License-Identifier: Apache-2.0 SPDX-License-Identifier: Apache-2.0 SPDX-License-Identifier: Apache-2.0 SPDX-License-Identifier: Apache-2.0 SPDX-License-Identifier: Apache-2.0 Package proxy provides proxy and proxy middleware interfaces and implementations.
plugin
Package plugin provides tools for loading and registering proxy plugins SPDX-License-Identifier: Apache-2.0
Package plugin provides tools for loading and registering proxy plugins SPDX-License-Identifier: Apache-2.0
plugin/tests
SPDX-License-Identifier: Apache-2.0
SPDX-License-Identifier: Apache-2.0
Package register offers tools for creating and managing registers.
Package register offers tools for creating and managing registers.
internal
SPDX-License-Identifier: Apache-2.0
SPDX-License-Identifier: Apache-2.0
SPDX-License-Identifier: Apache-2.0 Package router defines some interfaces for router adapters SPDX-License-Identifier: Apache-2.0
SPDX-License-Identifier: Apache-2.0 Package router defines some interfaces for router adapters SPDX-License-Identifier: Apache-2.0
chi
SPDX-License-Identifier: Apache-2.0 Package chi provides some basic implementations for building routers based on go-chi/chi SPDX-License-Identifier: Apache-2.0
SPDX-License-Identifier: Apache-2.0 Package chi provides some basic implementations for building routers based on go-chi/chi SPDX-License-Identifier: Apache-2.0
gin
SPDX-License-Identifier: Apache-2.0 SPDX-License-Identifier: Apache-2.0 SPDX-License-Identifier: Apache-2.0 Package gin provides some basic implementations for building routers based on gin-gonic/gin SPDX-License-Identifier: Apache-2.0
SPDX-License-Identifier: Apache-2.0 SPDX-License-Identifier: Apache-2.0 SPDX-License-Identifier: Apache-2.0 Package gin provides some basic implementations for building routers based on gin-gonic/gin SPDX-License-Identifier: Apache-2.0
gorilla
Package gorilla provides some basic implementations for building routers based on gorilla/mux SPDX-License-Identifier: Apache-2.0
Package gorilla provides some basic implementations for building routers based on gorilla/mux SPDX-License-Identifier: Apache-2.0
httptreemux
Package httptreemux provides some basic implementations for building routers based on dimfeld/httptreemux SPDX-License-Identifier: Apache-2.0
Package httptreemux provides some basic implementations for building routers based on dimfeld/httptreemux SPDX-License-Identifier: Apache-2.0
mux
SPDX-License-Identifier: Apache-2.0 SPDX-License-Identifier: Apache-2.0 Package mux provides some basic implementations for building routers based on net/http mux SPDX-License-Identifier: Apache-2.0 SPDX-License-Identifier: Apache-2.0 Package mux provides some basic implementations for building routers based on net/http mux SPDX-License-Identifier: Apache-2.0
SPDX-License-Identifier: Apache-2.0 SPDX-License-Identifier: Apache-2.0 Package mux provides some basic implementations for building routers based on net/http mux SPDX-License-Identifier: Apache-2.0 SPDX-License-Identifier: Apache-2.0 Package mux provides some basic implementations for building routers based on net/http mux SPDX-License-Identifier: Apache-2.0
negroni
Package negroni provides some basic implementations for building routers based on urfave/negroni SPDX-License-Identifier: Apache-2.0
Package negroni provides some basic implementations for building routers based on urfave/negroni SPDX-License-Identifier: Apache-2.0
sd
SPDX-License-Identifier: Apache-2.0 SPDX-License-Identifier: Apache-2.0 Package sd defines some interfaces and implementations for service discovery SPDX-License-Identifier: Apache-2.0
SPDX-License-Identifier: Apache-2.0 SPDX-License-Identifier: Apache-2.0 Package sd defines some interfaces and implementations for service discovery SPDX-License-Identifier: Apache-2.0
dnssrv
Package dnssrv defines some implementations for a dns based service discovery SPDX-License-Identifier: Apache-2.0
Package dnssrv defines some implementations for a dns based service discovery SPDX-License-Identifier: Apache-2.0
Package test contains the integration tests for the KrakenD framework SPDX-License-Identifier: Apache-2.0
Package test contains the integration tests for the KrakenD framework SPDX-License-Identifier: Apache-2.0
transport
http/client
Package client provides some http helpers to create http clients and executors SPDX-License-Identifier: Apache-2.0 SPDX-License-Identifier: Apache-2.0
Package client provides some http helpers to create http clients and executors SPDX-License-Identifier: Apache-2.0 SPDX-License-Identifier: Apache-2.0
http/client/plugin
Package plugin provides plugin register interfaces for building http client plugins.
Package plugin provides plugin register interfaces for building http client plugins.
http/client/plugin/tests
SPDX-License-Identifier: Apache-2.0
SPDX-License-Identifier: Apache-2.0
http/server
Package server provides tools to create http servers and handlers wrapping the lura router SPDX-License-Identifier: Apache-2.0
Package server provides tools to create http servers and handlers wrapping the lura router SPDX-License-Identifier: Apache-2.0
http/server/plugin
Package plugin provides plugin register interfaces for building http handler plugins.
Package plugin provides plugin register interfaces for building http handler plugins.
http/server/plugin/tests
SPDX-License-Identifier: Apache-2.0
SPDX-License-Identifier: Apache-2.0

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL