>
목표 :

도커 작성으로 응용 프로그램을 여러 마이크로 서비스로 나누려면

우리가 가진 것 :

4 서비스 (env vars, 포트 등과 같은 일부 세부 사항은 생략했습니다) :

services:
  server:
    build: services/server
    command: yarn start
  web_server:
    build: services/web-server
    command: somecoolcommand
  client:
    build: services/client
    command: yarn start
  ssr:
    build: services/ssr
    command: yarn serve

서버로 모든 것이 명확합니다. 노드 서버 일뿐입니다

웹 서버도 있습니다. nginx 서버입니다

클라이언트 (프런트 엔드)에는 webpack, 일부 반응 구성 요소, HTMLWebpackPlugin 용 템플릿이 있으며, 번들을 만들어 템플릿에 첨부합니다

Srr (서버 측 렌더링)은 클라이언트 소스 (리 액트 컴포넌트 및 템플릿)에서 레이아웃을 렌더링해야합니다. 또한 web_server가 렌더링 된 HTML을 요청하고 이에 응답 할 수 있도록 서버가 있어야합니다

문제 :

ssr (서버 측 렌더링)과 클라이언트 (프론트 엔드)를위한 서비스가 공통 리소스 (컴포넌트, 템플릿 등)를 가지고 있기 때문에 독립적으로 서비스를 제공하는 솔루션을 찾을 수 없습니다

또한 유지하기가 어렵 기 때문에 모든 것을 단일 서비스에 밀어 넣고 싶지 않습니다 (예 : 웹팩으로 빌드를 실행 한 다음 서버 프로세스를 시작하여 레이아웃을 제공해야 함)

또한 볼륨이없는 것을 발견했다면, 그러한 종속성을 만들고 싶지 않기 때문에 마이크로 서비스가 아닙니다.

이러한 응용 프로그램을 작성하는 가장 좋은 방법은 무엇입니까?

  • 답변 # 1

    명시 적 암시 적보다 낫다

    편리한 유지 관리는 아키텍처 솔루션에 따라 다릅니다.

    프론트 엔드 로직과 백엔드 로직을 분리하려고한다고 생각합니다. 좋은 데요 API (REST, Graphql 등)를 통해 서버 측과 클라이언트 측 사이에서 상호 작용하면 최상의 솔루션이 될 것이라고 생각합니다. 따라서 프론트 엔드와 백엔드는 다른 서비스 (= 컨테이너)가됩니다. "브릭 (bricks)"논리로 분리해서는 안됩니다. 제 생각에 SSR은 다른 컨테이너로 분리하기에 너무 빡빡합니다.

  • 답변 # 2

    I can't find a solution to make a service for ssr (server-side rendering) and client (frontend) complitely independent because they have common resources (components, template, etc.)

    Also, I don't want to shove everything to a single service because I would be difficult to maintain (for example: you'd have to run the build with webpack and then start the server process to serve the layout)

    컨테이너의 원래 고려 사항은 프로세스 격리입니다. 아이디어는 단일 프로세스를 실행하는 것이지만 컨테이너에 코드를 삽입해야한다는 제한은 없습니다. 여전히 nginx 및 정적/컴파일 된 코드 데이터가 포함 된 프론트 엔드 이미지를 보유 할 수 있으며, 동시에 해당 리포지토리 (프론트 엔드)를 ssr 이미지에 첨부 할 수 있습니다. 해당 코드는 적절한 ssr 로직 실행에 필요하기 때문입니다.

    가는 또 다른 방법은 필요한 프론트 엔드 관련 코드를 ssr 코드에 복제하여 프론트 엔드와 백엔드 (ssr)가 완전히 독립적 인 리포지토리 (프로젝트)가되는 것입니다. 이는 절충이지만 완전히 독립적 인 리포지토리/프로젝트 구조를 보관하기 위해 필요할 수 있습니다.

    와이즈 비즈

    개발 환경에있을 때는 확실히 볼륨 매핑을 수행해야하지만 프로덕션을 위해서는 볼륨이 없어야하며 이론적으로 컨테이너를 완전히 무 상태로 유지해야합니다. 경우에 따라 여전히 볼륨 연결을 수행 할 수 있지만 해당 볼륨은 로컬 스토리지가 아닌 Blob Storage와 같은 클라우드 스토리지 서비스입니다.

    Also If you noticed there are no volumes, because I don't want to make such dependencies, it won't be microservices.

관련 자료

  • 이전 java - 스프링 부트 - 역할에 따른 데이터 접근
  • 다음 kafka 주제의 파티션 수보다 많은 실행 프로그램을 스파크 작업에 할당하면 어떻게됩니까?