Python Flask 관련기술

파이썬 전반적인 부분과는 별개로 Flask 사용할 때 필요한 부분들

파이썬으로 복잡한 API 는 만들지 말자. 금지기술

역겨운 부분

app.py에는 db(Flask-Sqlalchemy), flask_app(Flask), jwt(Flask-JWT)
server.py에서 app.py를 본다. server.py는 models.module을 본다. server.py에는 jwt custom이 들어간다.
routes.module에서 app.py를 본다
models.module에서 app.py를 본다

jwt custom decorator는 어디다 넣어야되나
파이썬은 규모있는 API를 만든건 처음이긴한데
파이썬은 그냥 한개파일에 쑤셔넣을 정도 사이즈로만 사용해야 하는거 아닐까

로그인

  • Flask-JWT
    업데이트 안됨. extended와 pyjwt 의존성 버전충돌
    개인적으로는 아래것들도 안쓰고 코드를 퍼다가 프로젝트에 넣고 사용함
  • Flask-JWT-Extended
  • Flask-JWT-Simple
  • flask-bcrypt
  • Flask-Login
  • Flask-User
  • Flask-Security

API

  • Flask-CORS
  • Flask-Restful
  • Flask-Restplus
  • Flask-RESTX
    위에 두는 폐기.. 해야하겠지만 의존성 문제가 있으려나

Validation

  • cerberus
  • Flask-Validator

Doc

Test

  • unittest
  • pytest

StarterKit

  • https://github.com/lingthio/Flask-User-starter-app.git

인증(로긔인)서비스

프로토콜

  • OAuth
  • SAML
  • CAS
  • LDAP
  • Kerberos

ddd

  • AmazonCognito
  • CAS https://github.com/apereo/cas
  • simplePHPSAML
  • Shibboleth
  • WSO2 identity server
  • OpenAM https://github.com/OpenIdentityPlatform/OpenAM

참고

  • https://en.wikipedia.org/wiki/Single_sign-on
  • SAML : https://bcho.tistory.com/755
  • https://www.baeldung.com/spring-security-cas-sso

Deno 서버기술

Deno

node의 창시자가 node가 쓰레기(좋게말하면 장난감)이라는 것을 알리기 위해 native TypeScript로 돌아가는 언어를 만들었다.

  • https://github.com/denoland/deno

웹프레임웤

  • https://github.com/oakserver/oak
  • https://github.com/keroxp/servest
  • https://github.com/drashland/deno-drash
  • https://github.com/zhmushan/abc
  • https://github.com/sholladay/pogo

참고

  • https://dev.to/craigmorten/what-is-the-best-deno-web-framework-2k69

파이썬 서버기술

파이썬으로 제대로된 서버개발을 한 적은 없어서 몇 가지 조사하다가 발견한것들

WebFramework

  • Django
  • Flask
  • Bottle https://bottlepy.org/docs/dev/
  • Pylons
  • Pyramit https://trypyramid.com/
  • Falcon
  • Eve https://github.com/pyeve/eve
  • CherryPy
  • FastAPI https://github.com/tiangolo/fastapi
    https://towardsdatascience.com/why-we-switched-from-flask-to-fastapi-for-production-machine-learning-765aab9b3679
  • https://github.com/juancarlospaco/faster-than-requests

엄청많다

ORM

  • SqlAlchemy
  • https://github.com/python-gino/gino
  • PonyORM
    https://ponyorm.org/
  • DjangoORM

SQL

  • PyPika
    https://pypika.readthedocs.io/en/latest/
  • https://github.com/tmuzzin/PythonSQLGenerator
  • https://github.com/hhyo/mybatis-mapper2sql
  • PyDAL
    https://github.com/web2py/pydal

비동기 기술

  • celery
  • faust
  • async
  • PyKafka
    https://pykafka.readthedocs.io/en/latest/
  • kafka-python
    https://github.com/dpkp/kafka-python
  • Winton Kafka Streams
    https://github.com/wintoncode/winton-kafka-streams

개발환경

  • anaconda
  • miniconda
  • virtualenv
    https://virtualenv.pypa.io/en/latest/
  • virtualenv wrapper
    https://virtualenvwrapper.readthedocs.io/en/latest/
  • pew
    https://github.com/berdario/pew
  • tox
    https://tox.readthedocs.io/en/latest/
  • nox
    https://nox.thea.codes/en/stable/
  • pipenv
    https://pipenv.pypa.io/en/latest/advanced/
    package.json처럼 실행환경을 지정할 수 있게 하는게 낫지 않을까? 커스텀 환경을 사용하려면 sh를 별도로 만드는게 나을 것 같다.
  • poetry
    https://python-poetry.org/docs/

실행환경

  • Gunicorn
  • uWSGI
  • Uvicorn(ASGI)
    https://www.uvicorn.org
  • supervisord
    http://supervisord.org/
  • honcho
    https://github.com/nickstenning/honcho
  • forever
  • pm2
  • unicorn

배포환경

  • zappa – aws lambda (반푼이)
  • serverless – aws lambda
  • https://github.com/GoogleCloudPlatform/functions-framework-python
  • https://github.com/tiangolo/uwsgi-nginx-flask-docker
  • https://github.com/tiangolo/uvicorn-gunicorn-fastapi-docker

기타 참고

  • https://dev.to/sm0ke/flask-dashboard-simple-open-source-starters-4noc

프로젝트 용어사전

프로젝트 시작할 때 하는 일

  1. 프로젝트의 목적과 목표 정의
  2. 혼용되서 사용하는 용어 통일
  3. 도메인 모델 설계

이 중에서 1번도 잘 안되는 경우가 많은게 문제인데…
그래서 2번은 엄두도 못 내는…

그래도 최소한 1,2번이 진행되야 제대로 된
완성도 있는 디비설계가 되서
프로젝트가 원활하게 진행된다

기존 프로젝트에 쓰던걸 그대로 가져와서 (은행권이나 공공기관 프로젝트…등등) 들이미는 경우도 많은데.. .
프로젝트마다 특성이 달라서 같은 용어도 다르게 불리는 경우가 많아 그냥 적용하기는 힘들다.

사례를 쓰고싶은데 여백이 부족하다.. 어쨌든 많다

실행방법

나주에

REF

MSA 에서 GW의 역할 아키텍처

Microservice-Architecture-API-Gateway-Consideration.pdf 에서 보고
https://www.globallogic.com/wp-content/uploads/2017/08/Microservice-Architecture-API-Gateway-Considerations.pdf

구조

PDF에서 그림참고
client가 oauth2로 auth server에서 accesstoken을 얻어서 gw에 접근.
gw에서는 auth server에 accesstoken 검증받고 jwt토큰발급
jwt토큰이용 내부 MS에 접근

내가 생각하고 있던 jwt의 용법과 조금 달라서… 잘못알고 있었다고 봐야될까
외부의 앱에서도 jwt토큰을 사용하려고 했는데.. 시간제한걸고 해서
생각 해보니 이렇게 하면 access token하고 다를게 없는 것 같다.
이 문서에 있는 방법이 더 좋아보인다. jwt는 신뢰할 수 있는 서버간 통신용
배포시점에서 api 버전별로 jwt 토큰 secret을 공유해줘야할 것 같다.

DDOS방어

  • 접근횟수 제어: 세번이상때리는놈 막아버린다던가
  • 커넥션 제한: 서비스 종류에따라 다르겠지만 api를 100개씩 호출하는거 금지
  • 느린커넥션 제한: 소켓 열어놓고 안닫고 도망가는 경우가 많은데 이런거 강제종류 30초
  • IPBlockList/WhiteList
  • 요청 거부: User-Agent 헤더 들고오는놈, referret 헤더 들고오는놈, header에 값 잔뜩 달고오는놈 

Secure Communication

내부 rest api도 https사용
private 서브넷 이용
안될경우 token인증??

서비스 등록과 서비스 찾기

Service Registry

MS instance가 실행될 때 자동등록. eureka

Service Discovery

api gateway에서 eureka에 접근해서 찾기
ribbon으로 부하조절

Orchestration

MS가 MS를 요청하는 경우를 말하는건가?
바로 요청할지 GW를 거칠지? 그림은 좀 다른데?

  1. Client – GW – MS – MS
    1. Client – GW- MS – GW – MS
  2. Client – GW -MS

1번은 내부에서 내부를 중복호출하는경우. 1-1도 같은구조로 봐야할 것 같다
2번은 1단계 호출만 존재

Monitoring

MSA는 모니터링이 없으면 오류가 어디서 났는지 알기 힘들다.
각 서비스별 로그수집, 헬스체크가 필수

Health Monitoring

서버 죽었나 살았나

Traffic and Data Monitoring

데이터 네트워크 사용량??

Load Balancing and Scaling

API GW로 L.B.를 달아준다. 끝?
롤링배포하라구?

High Availablility and Failover

stateless – nosession