perf: 增加redis 和 mysql 连接配置生成

This commit is contained in:
= 2021-12-31 12:52:45 +08:00
parent bdb665cf47
commit 0e966586b5
5 changed files with 77 additions and 25 deletions

View File

@ -11,7 +11,7 @@ MYSQL_PASSWORD=123456
MYSQL_DB=mall
# redis
REDIS_ADDRESS=localhost:6379
REDIS_ADDRESS=127.0.0.1:6379
#rabbitMQ
RABBITMQ_ADDRESS=localhost:5672

View File

@ -1,7 +1,32 @@
import secrets
from typing import Optional
from typing import Dict
from typing import Any
from pydantic import BaseSettings, HttpUrl
from pydantic import BaseSettings
from pydantic import HttpUrl
from pydantic import validator
from pydantic import AnyUrl
class MysqlDsn(AnyUrl):
allowed_schemes = {'mysql'}
user_required = True
class RedisDsn(AnyUrl):
allowed_schemes = {'redis'}
@classmethod
def validate_parts(cls, parts: Dict[str, str]) -> Dict[str, str]:
defaults = {
'domain': 'localhost' if not (parts['ipv4'] or parts['ipv6']) else '',
'port': '6379'
}
for key, value in defaults.items():
if not parts[key]:
parts[key] = value
return super().validate_parts(parts)
class Settings(BaseSettings):
@ -18,9 +43,33 @@ class Settings(BaseSettings):
MYSQL_USER: str
MYSQL_PASSWORD: str
MYSQL_DB: str
MYSQL_DATABASE_URL: Optional[MysqlDsn] = None
@validator("MYSQL_DATABASE_URL", pre=True)
def assemble_db_connection(cls, v: Optional[str], values: Dict[str, Any]) -> Any:
if isinstance(v, str):
return v
return MysqlDsn.build(
scheme="mysql",
user=values.get("MYSQL_USER"),
password=values.get("MYSQL_PASSWORD"),
host=values.get("MYSQL_ADDRESS"),
path=f"/{values.get('MYSQL_DB') or ''}",
)
# redis, ip + 端口
REDIS_ADDRESS: str
REDIS_URL: Optional[RedisDsn] = None
@validator("REDIS_URL", pre=True)
def assemble_redis_connection(cls, v: Optional[str], values: Dict[str, Any]) -> Any:
if isinstance(v, str):
return v
return RedisDsn.build(
scheme="redis",
host=values.get("REDIS_ADDRESS")
)
# rabbitMQ
RABBITMQ_ADDRESS: str
...

View File

@ -0,0 +1,15 @@
import sentry_sdk
from sentry_sdk.integrations.asgi import SentryAsgiMiddleware
from fastapi.middleware.cors import CORSMiddleware
from common.config import settings
sentry_sdk.init(settings.SENTRY_DSN)
middlewares = [
SentryAsgiMiddleware,
CORSMiddleware(allow_origins=['*'], allow_methods=['*'], allow_headers=['*'])
]
__all__ = [middlewares]

View File

@ -3,8 +3,7 @@ from typing import List
from typing import NoReturn
from typing import Optional
import sentry_sdk
from sentry_sdk.integrations.asgi import SentryAsgiMiddleware
from aioredis import Redis
from aioredis import from_url
from fastapi import FastAPI
@ -13,23 +12,6 @@ from tortoise.contrib.fastapi import register_tortoise
from common.config import settings
sentry_sdk.init(settings.SENTRY_DSN)
def mysql_cdn():
"""mysql cdn 完整地址"""
return f'mysql://{settings.MYSQL_USER}:{settings.MYSQL_PASSWORD}@{settings.MYSQL_ADDRESS}/{settings.MYSQL_DB}'
def redis_cdn():
"""redis cdn"""
return f'redis://{settings.REDIS_ADDRESS}'
def register_middleware(app: FastAPI):
"""注册 日志错误收集 中间件"""
app.add_middleware(SentryAsgiMiddleware)
def register_orm(app: FastAPI, modules: Optional[Dict[str, List[str]]] = None) -> NoReturn:
"""注册orm"""
@ -37,14 +19,14 @@ def register_orm(app: FastAPI, modules: Optional[Dict[str, List[str]]] = None) -
modules = {"models": ["models"]}
register_tortoise(
app,
db_url=mysql_cdn(),
db_url=settings.MYSQL_DATABASE_URL,
modules=modules
)
def redis_pool() -> Dict[int, Redis]:
"""redis 16个db 每个创建池"""
return {db: from_url(redis_cdn(), db=db, max_connections=10, encoding="utf-8", decode_responses=True)
return {db: from_url(settings.REDIS_URL, db=db, max_connections=10, encoding="utf-8", decode_responses=True)
for db in range(16)
}
@ -74,7 +56,7 @@ def register_redis(app: FastAPI):
# orm 迁移生成表
# https://tortoise.github.io/migration.html
TORTOISE_ORM = {
"connections": {"default": mysql_cdn()},
"connections": {"default": settings.MYSQL_DATABASE_URL},
"apps": {
"models": {
"models": ["models", "aerich.models"],
@ -82,3 +64,5 @@ TORTOISE_ORM = {
},
}
}

View File

@ -0,0 +1,4 @@
from common.config import settings
print(settings.MYSQL_DATABASE_URL)
print(settings.REDIS_URL)