Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/dotx12/fastapi-gateway
⚙️ FastAPI gateway for microservices.
https://github.com/dotx12/fastapi-gateway
api apigateway fastapi gateway python rest
Last synced: 13 days ago
JSON representation
⚙️ FastAPI gateway for microservices.
- Host: GitHub
- URL: https://github.com/dotx12/fastapi-gateway
- Owner: dotX12
- License: mit
- Created: 2021-08-18T16:00:27.000Z (about 3 years ago)
- Default Branch: master
- Last Pushed: 2023-10-24T10:37:30.000Z (about 1 year ago)
- Last Synced: 2024-10-20T08:05:01.373Z (24 days ago)
- Topics: api, apigateway, fastapi, gateway, python, rest
- Language: Python
- Homepage:
- Size: 71.3 KB
- Stars: 109
- Watchers: 1
- Forks: 26
- Open Issues: 6
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# ⚙️ fastapi-gateway is async single entry point for microservices.
#### API Gateway performs many tasks: accepts, processes and distributes requests, controls traffic, monitors and controls access and security, caching, throttling.
Initially, this project was created for myself, I needed to implement identification, authentication and authorization. In the future, there was a need to limit requests for each user on every endpoint, create API plans. There were a lot of microservices and to keep in each microservice the logic for limiting endpoints, security logic, logging etc. - meaningless. Therefore, all this functionality is located at a single entry point, which already implements all the necessary tasks with security, limiting, etc., while microservices now directly solve their tasks.
## 💿 Installation
```
pip install fastapi_gateway
```## ❗️ Benchmark
1.5k - 3k RPC.```
gitshit@git ~ % wrk -t 4 -c 40 http://gateway.localtest.me:8003/gateway_endpoint/path_param/12
Running 10s test @ http://gateway.localtest.me:8003/gateway_endpoint/path_param/12
4 threads and 40 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 30.11ms 33.65ms 312.55ms 95.98%
Req/Sec 395.03 218.80 0.89k 73.21%
15550 requests in 10.05s, 2.31MB read
Requests/sec: 1547.81
Transfer/sec: 235.81KB
```## 💻 Example
Example of use (long code)
```python3
from starlette import status
from starlette.requests import Request
from starlette.responses import Response
from fastapi_gateway import route
from fastapi import FastAPI
from pydantic import BaseModel
from fastapi import Depends
from fastapi.security import APIKeyHeader
from starlette import status
from starlette.exceptions import HTTPExceptionapp = FastAPI(title='API Gateway')
SERVICE_URL = "http://microservice.localtest.me:8002"API_KEY_NAME = "x-api-key"
api_key_header = APIKeyHeader(
name=API_KEY_NAME,
auto_error=False
)def check_api_key(key: str = Depends(api_key_header)):
if key:
return key
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="You didn't pass the api key in the header! Header: x-api-key",
)class FooModel(BaseModel):
example_int: int
example_str: str@route(
request_method=app.post,
service_url=SERVICE_URL,
gateway_path='/query_and_body_path/{path}',
service_path='/v1/query_and_body_path/{path}',
query_params=['query_int', 'query_str'],
body_params=['test_body'],
status_code=status.HTTP_200_OK,
tags=['Query', 'Body', 'Path'],
dependencies=[
Depends(check_api_key)
],
)
async def check_query_params_and_body(
path: int, query_int: int, query_str: str,
test_body: FooModel, request: Request, response: Response
):
pass
```#### See more examples here:
##### [Tests and instructions for launch](../master/tests)
##### [Souce code Gateway](../master/tests/fastapi_gateway_service)
##### [Souce code Microservice #1](../master/tests/fastapi_microservice)## 🪛 How to use?
- **request_method** - is a callable (like app.get, app.post, foo_router.patch and so on.).
- **service_url** - the path to the endpoint on another service (like "https://microservice1.example.com").
- **service_path** - the path to the method in microservice (like "/v1/microservice/users").
- **gateway_path** - is the path to bind gateway.
For example, your gateway api is located here - *https://gateway.example.com* and the path to endpoint (**gateway_path**) - "/users" then the full way to this method will be - *https://gateway.example.com/users*
- **override_headers** - Boolean value allows you to return all the headlines that were created by microservice in gateway.
- **query_params** - used to extract query parameters from endpoint and transmission to microservice
- **form_params** - used to extract form model parameters from endpoint and transmission to microservice
- **param body_params** - used to extract body model from endpoint and transmission to microservice⚠️ - **Be sure to transfer the name of the argument to the router, which is in the endpoint func!**
```
query_params - List[Query]
body_params - List[Body]
form_params - List[File, Form]
```
In more detail how to transmit body, form and query (photo)