Cloud Run에 Spring Boot 어플리케이션 배포
소개하다.
이제는 누구나 최신 구글 클라우드 기술로 앱을 시작해 전체 앱을 배치할 수 있다.현대 웹 응용 프로그램은 대부분의 경우 전단과 사용자가 본 내용을 분리하고 후단과 사용자가 요청한 내용을 처리해야 한다.
이 시리즈에서 우리는 어떻게 완전한 응용 프로그램을 점차적으로 배치하는지 보게 될 것이다.단계적으로 다음 항목을 다룹니다.
선결 조건
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를 사용하여 뼈대를 생성하십시오.다음은 내가 사용하는 정보입니다.
* 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) 를 실행할 수 있습니다.다음과 같은 이점이 있습니다.
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.
클라우드에 배포
이제 첫 번째 버전을 배치하고 공개할 준비가 됐습니다.
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].
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초에 시작되었다.어떤 인프라 시설에서는 너무 길 수도 있어...나는 시작 시간의 최적화를 다른 문장에 남겨 둘 것이다.요약
이 문서에서는 다음을 설명합니다.
kubernetes
다음
다음 기사에서는 다음 항목에 대해 설명합니다.
리소스
Reference
이 문제에 관하여(Cloud Run에 Spring Boot 어플리케이션 배포), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/zenika/deploying-your-spring-boot-application-in-cloud-run-59i4텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)