Cloud Run에 Spring Boot 어플리케이션 배포

소개하다.


이제는 누구나 최신 구글 클라우드 기술로 앱을 시작해 전체 앱을 배치할 수 있다.현대 웹 응용 프로그램은 대부분의 경우 전단과 사용자가 본 내용을 분리하고 후단과 사용자가 요청한 내용을 처리해야 한다.
이 시리즈에서 우리는 어떻게 완전한 응용 프로그램을 점차적으로 배치하는지 보게 될 것이다.단계적으로 다음 항목을 다룹니다.
  • 클라우드 런에 docker 컨테이너를 호스팅합니다.저예산과 기업 수요가 있을 때 매우 유용하다.
  • 지속적인 배포클라우드 구축을 사용하여 터치 구축을 하고 환경에 이전 버전을 배치합니다.
  • Firebase ID를 사용하여 Spring 기반 응용 프로그램의 응용 프로그램 보안을 구성합니다.JWT를 사용하여 사용자 인증을 처리하는 방법
  • Firebase에서 Vue 애플리케이션을 호스팅합니다.Firebase CDN을 즐기며 수욕센터를 손쉽게 배치해 국제 관객을 노린다.
  • 선결 조건


    Github 계정


    만약 네가 없다면, 나는 네가 지금 하나를 만들 것을 강력히 건의한다.내 계정에 위탁 관리되는 공공 저장소를 사용할 것이다.나의 예는 명령에서 나의 저장소를 사용할 것이지만, 우리가 클라우드 저장소와 통신할 때, 당신은 당신의 저장소가 필요할 것입니다.Click here to create an account on Github
    또한 기계에 Git가 설치되어 있고 git clone... 등의 명령을 실행할 수 있는지 확인한다

    곡가운 플랫폼 계정


    이러한 예는 GCP 환경에 애플리케이션을 배치합니다.이를 위해서는 GCP 계정이 필요합니다.
    이 계좌를 만들면 300달러(270유로)의 신용대출을 받아 1년 안에 그들의 인프라를 사용할 수 있다.신용카드로 구글에 계정을 만들어야 한다는 것을 주의하세요.Click here to sign up on GCP
    만약 당신이 이미 계좌를 가지고 있다면, 우리가 함께 하는 일은 당신의 계좌에 매우 적은 비용을 발생시킬 수 있으니 주의하십시오.만약 당신이 모든 조항을 엄격히 준수한다면, 월말까지 당신의 계산서 계좌에 1유로를 초과하지 않을 것이다.
    글에서 만든 자원을 포함하는 첫 번째 프로젝트를 만들었는지 확인하십시오.

    gcloud CLI 설치


    Cloud Shell을 사용할 수 있는 경우에도 시스템gcloud CLI를 사용하는 것이 좋습니다.나를 믿어라, 그것은 정말 편리하다.To install the CLI, click here
    gcloud version에서 실행하여 컴퓨터에 CLI가 설치되어 있는지 확인합니다.
    그리고 다음 명령을 실행하여 정확한 항목을 가리키도록 하세요
    gcloud config set core/project ${PROJECT_ID}
    

    로컬 Docker 설치


    Docker는 100% 강제적이지 않지만, 저는 개인적으로 로컬에서 제 개발이나 Dockerfile이 정확한지 테스트하는 것을 좋아합니다.그것은 피드백 순환을 단축시켜서 내가 일이 순조롭지 않을 때 더욱 유연하게 적응할 수 있게 한다.
    따라서 로컬에 Docker를 설치하는 것이 좋습니다.Here are the resources to do so

    Spring 응용 프로그램 작성


    이제 첫 번째 응용 프로그램을 구축할 수 있습니다.단점을 공개하는 Hello world 프로그램을 만들 것입니다.
    응용 프로그램은 이후에 발전할 수 있지만, 우리는 간단명료하게, 한 걸음 한 걸음 그것을 구축할 수 있다.소프트웨어 개발이 차근차근 진행되어야 하는 것처럼 비교적 짧은 교체 배치 응용 프로그램으로 피드백 순환을 단축시킬 수 있다.일단 버그가 발생하면 복구에 필요한 시간을 줄이기 위해 즉시 그것들을 검사합니다.

    응용 프로그램 백엔드 만들기


    Spring Initializer website를 사용하여 뼈대를 생성하십시오.다음은 내가 사용하는 정보입니다.
  • 마문 프로젝트
  • 자바
  • 스프링 부츠 버전: 2.4.0
  • 그룹: dev.truaro.블로그
  • 공작물: gcpcloudrunback
  • 이름: GCP 클라우드 실행 백엔드
  • 설명: Cloud Run
  • 에 의해 관리되는 뛰어난 백그라운드
  • 패키지 이름: dev.truaro.블로그gcpcloudrunback
  • 종속성: Spring Web
  • 이것은 압축을 풀 수 있는 zip 파일을 만들 것입니다.본문 이후의 내용을 고려하여 다음과 같은 폴더 구조를 사용하는 것을 권장합니다.
    * gcpapplication
    |--- gcpcloudrunback <- unzipped folder
    |--- gcpfirebasefront <- will come in another article
    
    본문의 나머지 부분에 대해 루트 폴더는 gcpapplication/gcpcloudrunback입니다.
    이제 중요한 부분을 살펴보겠습니다./pom.xml에서 spring-boot-starter-web와 플러그인spring-boot-maven-plugin에 대한 의존 관계를 확인하십시오.이렇게 하면 Tomcat에 포함하도록 Spring Boot의 자동 구성이 활성화되고 Fat JAR 생성이 활성화됩니다.
    ...
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    ...
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
    
    src/main/java/dev/truaro/blog/gcpcloudrunback/GcpCloudRunBackendApplication.java
    @SpringBootApplication
    public class GcpCloudRunBackendApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(GcpCloudRunBackendApplication.class, args);
        }
    }
    
    Classic@SpringBootApplication 클래스는 Spring 및 응용 프로그램 컨텍스트를 시작합니다.

    첫 번째 컨트롤러 추가

    Hello World의 GET 요청에 표시되는 간단한 컨트롤러를 추가합니다/.
    파일 생성src/main/java/dev/truaro/blog/gcpcloudrunback/HelloWorldController.java
    @RestController
    public class HelloWorldController {
    
        @GetMapping("/")
        public String helloWorld() {
            return "Hello World";
        }
    
    }
    
    쉽게 말하면 이 클래스는 일반 텍스트의 본문Hello World을 포함하는 200HTTP 응답을 보냅니다.
  • @RestController-> 이 클래스는 클라이언트에게만 데이터를 반환합니다.이 주석은 보기 해상도 Spring MVC 를 건너갑니다.
  • @GetMapping-> 엔드포인트의 GET 요청 수신/.
  • 서버 포트 구성


    Cloud Run의 권장 사항 중 하나는 포트 환경 변수(for more information, check this link가 제공하는 포트를 응용 프로그램에서 수신할 수 있도록 하는 것입니다.
    Spring을 사용하여 이 작업을 수행하려면 파일의 등록 정보 중 하나만application.properties:
    server.port=${PORT:8080}
    

    If you want to set a property based on an environment variable with a default, use this: ${MY_ENV_VARIABLE:my default value}. Here, we get the PORT from the environment, or we fall back to 8080.


    접두어가 914인 URL을 개발하는 것은 일반적인 방법입니다.Spring을 사용하여 /api에 새 속성을 추가합니다.
    server.servlet.context-path=/api
    

    서버에 작업 여부를 요청합니다


    다음 명령을 실행하여 컨트롤러가 제공된 포트를 사용하여 요청을 처리할 수 있는지 확인합니다.
    ./mvnw install
    PORT=8088 java -jar target/gcpcloudrunback-0.0.1-SNAPSHOT.jar
    
    사이트 주소application.properties를 살펴보면 http://localhost:8088/api가 표시됩니다.

    개술


    이 단계는 많지 않지만, 최소한 계속할 수 있는 기반이 있습니다. GCP에 이 자원을 배치하려면 클라우드 런을 사용하십시오.

    클라우드에 어플리케이션 배포


    지속적인 배치를 논의하기 전에 클라우드 실행에 응용 프로그램을 수동으로 배치합시다.

    구름 위의 속보.


    클라우드 실행 '완전 관리' 는 GCP가 제공하는 서비스로 구글 인프라 시설에서 용기 (예를 들어 Docker) 를 실행할 수 있습니다.다음과 같은 이점이 있습니다.
  • 원가가 매력적이다.실제로 할당된 CPU에 대해서만 비용을 지불하고 컨테이너에서 HTTP 요청을 받은 경우에만 CPU를 할당할 수 있습니다.다시 말하면, 너는 너의 컨테이너가 사용될 때만 돈을 지불할 수 있다.
  • 사용자가 용기를 실행하면 구글이 제공하는 실행 환경, 예를 들어 응용 프로그램 엔진 표준에 독립할 수 있습니다.이 밖에 로컬 테스트 용기도 쉽다.
  • 용기로서 다른 곳에서 프로그램을 쉽게 위탁 관리할 수 있습니다. 예를 들어 다른 공급자에서.
  • See the resources part for full resources URL on Cloud Run.


    응용 프로그램 컨테이너


    응용 프로그램의 루트 디렉토리에 이 Dockerfile을 추가합니다.우리는 다단계 구축을 사용할 것이다. 왜냐하면 그것은 더욱 이식 가능한 해결 방안이기 때문이다.
    FROM maven:3.6.3-openjdk-11-slim as builder
    
    WORKDIR /app
    COPY pom.xml .
    # Use this optimization to cache the local dependencies. Works as long as the POM doesn't change
    RUN mvn dependency:go-offline
    
    COPY src/ /app/src/
    RUN mvn package
    
    # Use AdoptOpenJDK for base image.
    FROM adoptopenjdk/openjdk11:jre-11.0.8_10-alpine
    
    # Copy the jar to the production image from the builder stage.
    COPY --from=builder /app/target/*.jar /app.jar
    
    # Run the web service on container startup.
    CMD ["java", "-jar", "/app.jar"]
    
    로컬에서 이미지를 구축한 다음 실행하여 원하는 대로 작동하는지 확인합니다.
    docker build -t gcr.io/truaro-resources/gcp-cloudrun-back:latest .
    docker run -d -p 8080:8080 gcr.io/truaro-resources/gcp-cloudrun-back:latest
    > 6b7fd5ca6136af33589c100d6d45884c304cdaf2299b9f1416a33dc607db08e2
    curl http://localhost:8080/
    > Hello World
    docker stop 6b7fd5ca6136af33589c100d6d45884c304cdaf2299b9f1416a33dc607db08e2
    
    그런 다음 저장소로 밀어 넣어야 합니다.다음 명령을 실행합니다.
    # Connect docker to google registry. This put your credentials for Cloud Registry into your Docker configuration to authenticate on GCP
    gcloud auth configure-docker
    # Enable the repository API for your project
    gcloud services enable containerregistry.googleapis.com
    # Push the image to the google registry
    docker push gcr.io/truaro-resources/gcp-cloudrun-back:latest
    

    클라우드 실행 서비스 설명 파일 만들기


    만약 Hello World 에 익숙하다면,kubernetes 설명 파일을 보았을 수도 있습니다.구름이 운행하는 과정은 유사하다.Google 클라우드 운행 서비스에 대한 설명 파일을 만들고 한 걸음 한 걸음 소개합니다.
    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: gcp-cloudrun-back
      labels:
        cloud.googleapis.com/location: europe-west1
      annotations:
    spec:
      template:
        metadata:
          annotations:
            autoscaling.knative.dev/maxScale: '3'
        spec:
          serviceAccountName: gcp-cloudrun-back
          containerConcurrency: 80
          timeoutSeconds: 300
          containers:
          - image: gcr.io/${PROJECT_ID}/gcp-cloudrun-back:latest
            resources:
              limits:
                cpu: 1000m
                memory: 256Mi
      traffic:
        - percent: 100
          latestRevision: true
    

    Please update the ${PROJECT_ID} with your own project ID


    우리 각 중요한 부분을 설명해 봅시다.
    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: gcp-cloudrun-back
      labels:
        cloud.googleapis.com/location: europe-west1
    
    • metadata.name: the name of the service being deployed in Cloud Run. You can then use this name to get your Cloud Run service.
    • metadata.labels.cloud.googleapis.com/location: The region in which you want to deploy your application. I chose europe/west1, but you can choose another one if you want to.

    spec:
      template:
        metadata:
          annotations:
            autoscaling.knative.dev/maxScale: '3'
    
    • Here we define the maximum number of instances Cloud Run is allowed to generate if your service is handling lots of requests. The limit we set is 3, making sure you won't get a nice surprise at the end of month on your GCP invoice.

      spec:
        serviceAccountName: gcp-cloudrun-back
        containerConcurrency: 80
        timeoutSeconds: 300
    
    • serviceAccountName: It is a good practice to use specific service account in order to respect more easily the Principle of least privilege. Gives this service account only access to what it is allowed.
    • containerConcurrency: The number of request to handle on a single instance before scaling up. 80 is the default value.
    • timeoutSeconds: The time within a response must be returned by your service. Failure to do so will result in a 504 error sent to the client.

        containers:
          - image: gcr.io/${PROJECT_ID}/gcp-cloudrun-back:latest
    
    • image: The image name the container will execute. As you guessed it, the image needs to be accessible by Cloud Run. We will see later how to add the image to Container registry.

        resources:
              limits:
                cpu: 1000m
                memory: 256Mi
    
    • cpu: We allocate the equivalence of 1 CPU to our service. Read more here.
    • memory: We allocate 256Mi to the container. Please consider this carefully, as your container can run out of memory on production. Read more here.

      traffic:
        - percent: 100
          latestRevision: true
    
    • At each revision, the new one takes 100% of the incoming traffic.

    클라우드에 배포


    이제 첫 번째 버전을 배치하고 공개할 준비가 됐습니다.
  • 클라우드 실행 API를 활성화합니다.
  • gcloud services enable run.googleapis.com
    
  • 클라우드 운영 서비스를 위한 서비스 계정을 생성합니다.이것은 최저 특권 원칙에 대한 존중을 확보했다.
  • gcloud iam service-accounts create gcp-cloudrun-back \
        --description="Service account that executes the gcp-cloudrun-back application" \
        --display-name="GCP Cloudrun Back service account"
    
  • 클라우드에 배포(몇 분 정도 소요될 수 있음)
  • gcloud beta run services replace gcp-cloudrun-back.yaml \
      --platform=managed \
      --region=europe-west1
    

    Applying new configuration to Cloud Run service [gcp-cloudrun-back] in project [truaro-resources] region [europe-west1]
    New configuration has been applied to service [gcp-cloudrun-back].

    URL: https://gcp-cloudrun-back-a75acdipmq-ew.a.run.app

  • 공공 방문을 통해 귀하의 서비스를 호출할 수 있습니다.
  • gcloud run services add-iam-policy-binding gcp-cloudrun-back \
      --platform=managed \
      --region=europe-west1 \
      --member="allUsers" \
      --role="roles/run.invoker"
    

    Updated IAM policy for service [gcp-cloudrun-back]

  • 서비스가 응답했는지 확인합니다(시작 시간 때문에 첫 번째 요청이 좀 길어질 수 있습니다).
  • curl https://gcp-cloudrun-back-a75acdipmq-ew.a.run.app/api/
    

    Hello World


    용기 로그 검사 (Follow this.이것은 나의 것이다.
    2020-11-16 21:14:01.573 CET . ____ _ __ _ _
    2020-11-16 21:14:01.573 CET /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
    2020-11-16 21:14:01.573 CET( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
    2020-11-16 21:14:01.573 CET \\/ ___)| |_)| | | | | || (_| | ) ) ) )
    2020-11-16 21:14:01.573 CET ' |____| .__|_| |_|_| |_\__, | / / / /
    2020-11-16 21:14:01.573 CET =========|_|==============|___/=/_/_/_/
    2020-11-16 21:14:01.574 CET :: Spring Boot :: (v2.4.0)
    2020-11-16 21:14:01.574 CET
    2020-11-16 21:14:01.856 CET2020-11-16 20:14:01.853 INFO 1 --- [ main] d.t.b.g.GcpSkeletonApplication : Starting GcpSkeletonApplication v0.0.1-SNAPSHOT using Java 11.0.8 on localhost with PID 1 (/app.jar started by root in /)
    2020-11-16 21:14:01.857 CET2020-11-16 20:14:01.857 INFO 1 --- [ main] d.t.b.g.GcpSkeletonApplication : No active profile set, falling back to default profiles: default
    2020-11-16 21:14:05.265 CET2020-11-16 20:14:05.265 INFO 1 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
    2020-11-16 21:14:05.284 CET2020-11-16 20:14:05.284 INFO 1 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
    2020-11-16 21:14:05.284 CET2020-11-16 20:14:05.284 INFO 1 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.39]
    2020-11-16 21:14:05.473 CET2020-11-16 20:14:05.473 INFO 1 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
    2020-11-16 21:14:05.473 CET2020-11-16 20:14:05.473 INFO 1 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 3394 ms
    2020-11-16 21:14:06.778 CET2020-11-16 20:14:06.777 INFO 1 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor'
    2020-11-16 21:14:07.391 CET2020-11-16 20:14:07.390 INFO 1 --- [ main] d.t.b.g.GcpSkeletonApplication : Started GcpSkeletonApplication in 7.221 seconds (JVM running for 8.938)
    2020-11-16 21:14:07.653 CET2020-11-16 20:14:07.652 INFO 1 --- [nio-8080-exec-9] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet'
    2020-11-16 21:14:07.653 CET2020-11-16 20:14:07.652 INFO 1 --- [nio-8080-exec-9] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'
    2020-11-16 21:14:07.654 CET2020-11-16 20:14:07.654 INFO 1 --- [nio-8080-exec-9] o.s.web.servlet.DispatcherServlet : Completed initialization in 0 ms
    
    보시다시피, 내 프로그램은 7.221초에 시작되었다.어떤 인프라 시설에서는 너무 길 수도 있어...나는 시작 시간의 최적화를 다른 문장에 남겨 둘 것이다.

    요약


    이 문서에서는 다음을 설명합니다.
  • 보호되지 않은 단일 엔드포인트가 있는 Spring 부트 응용 프로그램을 만드는 방법
  • 어떻게 사용하나요kubernetes
  • 구글 API 활성화
  • Spring Boot 어플리케이션을 다단계 빌드에 연결하는 방법
  • 컨테이너 등록을 어떻게 추진하는가
  • 설명 파일
  • 을 사용하여 클라우드에서 실행할 때 이미지를 배치하는 방법

    다음


    다음 기사에서는 다음 항목에 대해 설명합니다.
  • 클라우드로 구축
  • 연속 배치 파이프 설정
  • Firebase 및 Spring security
  • 로 어플리케이션 보호
  • 정적 VueJS 응용 프로그램을 개발하여 클라우드 운행 서비스를 요청
  • Firebase 호스트에 애플리케이션 배포
  • 애플리케이션 시작 시간을 최적화하여 확장성 향상
  • 리소스

  • See the entire code on Github
  • Documentation for Cloud Run
  • Pricing of Cloud Run
  • Caching Maven dependencies in a multistage build
  • Docker build command
  • Docker run command
  • 좋은 웹페이지 즐겨찾기