2.3. 소스코드 빌드 및 배포
/home/centos/apigw-src
디렉토리에 API 게이트웨이 소스코드를 다운로드하고 /home/centos/apigw
디렉토리에 배포하는 것으로 가정하고 설명합니다.
2.3.1. 어플리케이션 빌드
2.3.1.1. API 게이트웨이 빌드
2.1. 사전 구성에서 Java, Maven을 설치한 서버에서 API 게이트웨이 어플리케이션을 빌드합니다.
- API 게이트웨이 Git 저장소를 복제합니다. 2.2. DB 설정에서 이미 복제한 경우 건너뜁니다.
$ cd ~
$ git clone https://github.com/IoTKETI/citydatahub_apigw_module.git apigw-src
- Maven을 이용하여 소스코드를 빌드합니다.
$ cd ~/apigw-src
$ mvn clean package
[INFO] Scanning for projects...
...
[INFO] Replacing main artifact with repackaged archive
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 03:34 min
[INFO] Finished at: 2023-01-18T16:53:12+09:00
[INFO] ------------------------------------------------------------------------
성공적으로 Maven 빌드를 수행하면 apigw-src/target/
디렉토리에 apigw-1.0.0.jar
파일이 생성된 것을 확인할 수 있습니다.
2.3.1.2. Eureka Service Registry 빌드
Eureka Service Registry는 독립적으로 동작하며 API 게이트웨이 모듈에서 제공하지 않습니다.
Eureka Service Registry의 기본 기능만 사용하는 경우 Spring Initializer (링크)를 이용하여 Eureka Server 템플릿을 다운받아 빌드합니다.
아래는 Eureka Server 템플릿을 다운받아 Linux 호스트에 업로드하고(경로: /home/centos/) 빌드하는 방법을 설명합니다.
자세한 Eureka Service Registry은 Getting Started | Service Registration and Discovery (링크)를 참조하십시오.
Spring Initializer (링크) 페이지에 접속합니다.
화면 왼쪽의 Project: Maven, Language: Java, Spring Boot: 2버전(2.7.8), Packaging: Jar, Java: 11을 선택합니다.
Project Metadata는 그대로 두거나 원하는 내용으로 입력합니다. 본 메뉴얼에서는 변경하지 않은 채로 설명합니다.
화면 오른쪽의 Dependencies 섹션에서 Add Dependencies 버튼을 클릭한 뒤, Eureka Server를 검색한 뒤 선택합니다.
- 화면 아래의 Generate 버튼을 클릭하여 프로젝트 압축파일을 다운받습니다. 모든 항목을 입력한 화면은 아래와 같습니다.
다운로드 받은 프로젝트 압축파일(위의 과정대로 진행한 경우:
demo.zip
)을 Eureka Server를 실행하려는 호스트로 복사합니다.압축 파일을 해제한 뒤
/home/centos/demo/src/main/java/com/exmaple/demo
디렉토리의DemoApplication.java
파일을 텍스트 편집기로 엽니다.아래와 같이
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer
구문과@EnableEurekaServer
구문을 입력한 뒤 저장합니다.
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@EnableEurekaServer
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
/home/centos/demo/src/main/resources
디렉토리의application.properties
파일을 삭제합니다./home/centos/demo
디렉토리로 이동한 뒤,mvn clean package
명령어를 실행하여 Eureka Server를 빌드합니다.
$ cd /home/centos/demo
$ mvn clean package
/home/centos/demo/target
디렉토리에demo-0.0.1-SNAPSHOT.jar
파일이 생성되었는지 확인합니다.
2.3.2. 어플리케이션 설정
2.3.2.1. API 게이트웨이 설정
API 게이트웨이 어플리케이션을 배포하기 전에 어플리케이션 환경설정(apigw-src/src/main/resources/application.yml
)을 해야합니다.
- 2.2. DB 설정에서 설치한 PostgreSQL 서버 정보에 맞게
spring.datasource.url
,spring.datasource.username
,spring.datasource.password
를 변경합니다. - Eureka를 사용하는 경우
eureka.client.service-url.defaultZone
를 Eureka 서버 정보로 변경합니다. security.accessToken.publicKeyRetrievalUri
에 보안 서버의 접속 정보를 기입합니다.
이외 설정은 아래 표를 참고합니다.
Property | 설명 | 설정값 예시 |
---|---|---|
server.port | API 게이트웨이 WAS(Web Application Port) Port | 8082 |
server.ssl.enabled | API 게이트웨이 HTTPS 동작 여부 | false |
server.ssl.key-store | HTTPS(TLS)를 위한 키 저장소 | keystore.p12 |
server.ssl.key-alias | HTTPS(TLS)를 위한 키 저장소 안의 Key 명칭 | keti |
server.ssl.key-store-password | HTTPS(TLS)를 위한 키 저장소 비밀번호 | ketiketi |
server.ssl.key-store-type | HTTPS(TLS)를 위한 키 저장소 타입 | PKCS12 |
spring.application.name | 어플리케이션 명칭 (Eureka에 해당 명칭 사용됨) | apigw-service |
spring.cloud.gateway.httpclient.connect-timeout | API 게이트웨이의 HTTP 클라이언트 연결 타임아웃 시간 (ms) | 10000 |
spring.cloud.gateway.httpclient.response-timeout | API 게이트웨이의 HTTP 클라이언트 응답 타임아웃 시간 | 10s |
spring.cloud.gateway.discovery.locator.enabled | API 게이트웨이가 Netflix Eureka 등의 Discovery Client를 통해서 서비스 라우팅이 가능하도록 함 | true |
spring.cloud.circuitbreaker.resilience4j.enabled | API 게이트웨이가 resilience4j를 통해 서킷 브레이크를 동작하도록 함 | true |
spring.datasource.driverClassName | JDBC 드라이버 | org.postgresql.Driver |
spring.datasource.url | JDBC 접속 주소 | jdbc:postgresql://172.20.0.77:5432/apigw |
spring.datasource.username | JDBC 연결 사용자명 | postgres |
spring.datasource.password | JDBC 연결 비밀번호 | postgres |
spring.redis.host | API 게이트웨이로 접속하는 클라이언트 요청을 클러스터 기반으로 제약하고자 할 시 사용하는 Redis 호스트 주소 (clientRateLimit.scope가 cluster 일 경우에만 유효함) | localhost |
spring.redis.port | API 게이트웨이로 접속하는 클라이언트 요청을 클러스터 기반으로 제약하고자 할 시 사용하는 Redis port 주소 (clientRateLimit.scope가 cluster 일 경우에만 유효함) | 6379 |
eureka.client.service-url.defaultZone | Discovery Server에 대한 접속 정보 | http://10.0.0.81:8888/eureka, http://10.0.0.82:8888/eureka, http://10.0.0.83:8888/eureka |
eureka.client.registerWithEureka | 자기 자신을 서비스로 Discovery Server에 등록 여부 | true |
eureka.client.fetchRegistry | Discovery Server에 등록된 서비스들의 목록을 로컬 캐쉬 여부 - true: 로컬 캐쉬 함 - false: 로컬 캐쉬 안함 | true |
eureka.client.registryFetchIntervalSeconds | Discovery Server에 등록된 서비스들의 목록에 대한 로컬 캐쉬 갱신 시간(초) | 5 |
eureka.instance.prefer-ip-address | Discovery Server에 등록 시 IP로 등록하도록 함 | true |
eureka.instance.metadata-map.management-port | 최신 라우팅 룰 전파 시 사용할 port 정보 (임의로 변경할 시 전파 안될 수 있음) | ${management.server.port} |
eureka.instance.metadata-map.management-context-path | 최신 라우팅 룰 전파 시 사용할 context-path 정보 (임의로 변경할 시 전파 안될 수 있음) | ${management.endpoints.web.base-path} |
routingRetry.retryValue | API 게이트웨이에서 라우팅 시 재시도 횟수 | 3 |
clientRateLimit.scope | API 게이트웨이로 호출하는 클라이언트의 요청 제약 여부 및 방식 - none: 제약사항 없음 - local: API 게이트웨이 어플리케이션 별 요청 제약 - cluster: API 게이트웨이 어플리케이션 클러스터 기반 요청 제약 | none |
clientRateLimit.type | API 게이트웨이로 호출하는 클라이언트의 요청 제약 기준 - clientId: OAuth 접근 토큰 내의 클라이언트 ID - ip: 클라이언트 IP - hostName: 클라이언트 hostName | clientId |
clientRateLimit.burstCapacity | 초당 최대 호출 수 | 1000 |
logging.level.ROOT | 로그 ROOT 레벨 | INFO |
propagate.serviceId | 최신 라우팅 룰 전파 시 서비스 명 | ${spring.application.name} |
propagate.refresh.path | 최신 라우팅 룰 전파할 Path | /routes/refresh |
propagate.request.timeout | 최신 라우팅 룰 전파 요청 타임아웃 시간(초) | 5 |
propagate.request.retry.Count | 최신 라우팅 룰 전파 요청 최대 재요청수 | 3 |
security.accessToken.publicKeyRetrievalUri | 접근 제어 토큰 검증을 위한 Public Key 획득 주소 | http://172.20.0.84:30000/security/publickey |
security.accessToken.defaultPublicKey | 접근 제어 토큰 검증을 위한 Public Key 획득 주소 접근이 어려울 경우 사용하는 디폴트 Public Key | -----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCp2RW1GlfbjAu5gPKgzZGbq55O 92Ub/641Vpc0TVwsEvxlgJTB+igjzkVYohJGcZrh848iNF7EER6k5C/BDsdBf/B+ q1x/tcOafC/KlLpbCQEd/1m7T/Di0ngk5XPoQ7LsUvACBJiOAXR8PfvyZMLCYI5h gsJOuYXYqH1Friy3jwIDAQAB -----END PUBLIC KEY----- |
management.server.port | 라우팅 룰 관리, 내부 서비스 관리 API 노출 port | 8081 |
management.endpoints.enabled-by-default | Spring Boot Actuator의 디폴트 엔드포인트 노출 여부 | false |
management.endpoints.web.exposure.include | 노출 Path | routes,services |
management.endpoints.web.exposure.base-path | 노출 Context Path | / |
managementInterface.security.enabled | 라우팅 룰 관리, 내부 서비스 관리 API의 접근 제어 토큰 검증 여부 | true |
managementInterface.security.allowed-access-token-roles | 라우팅 룰 관리, 내부 서비스 관리 API의 접근 제어 토큰 내 Role 리스트 | System_Admin |
2.3.2.2. Eureka Server 설정
application.yml
파일을 생성한 뒤 아래 내용을 참고하여 설정값을 입력한 뒤 저장합니다. 아래에 작성된 설정값은 기본 기능만을 사용하는 단일 Eureka Server 설정입니다.
spring:
application:
name: eureka-server
server:
port: 8888
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
# Logging
logging:
level:
ROOT: INFO
설정 항목의 구성은 아래와 같습니다.
Property | 설명 | 설정값 예시 |
---|---|---|
spring.application.name | Eureka Server 프로그램의 이름 | eureka-server |
server.port | Eureka Server에 접속하기 위한 포트 번호 | 8888 |
eureka.instance.hostname | 외부에서 Eureka Server로 접속하기 위한 주소 | localhost |
eureka.client.registerWithEureka | Eureka 서버에 자신을 등록할 지 여부 설정 | false |
eureka.client.fetchRegistry | Eureka Server의 정보를 캐싱할 지 여부 설정 | false |
eureka.client.serviceUrl.defaultZone | Eureka Serverd의 정보를 가져오기 위한 URL 설정 | http://${eureka.instance.hostname}:${server.port}/eureka/ |
logging.level.ROOT | Root Logger가 수집하는 로깅 레벨 | INFO |
2.3.3. 어플리케이션 배포
API 게이트웨이와 Eureka Server는 동일한 서버에서 실행할 수 있으며, 독립적으로 실행할 수 있습니다. 아래는 동일한 서버에 API 게이트웨이와 Eureka Server를 배포하여 실행하는 것으로 가정합니다.
2.3.3.1. Eureka Server
- Eureka Server 배포를 위한 디렉토리를 생성합니다.
$ mkdir -p /home/centos/eureka-server
- 2.3.1.2. Eureka Server 빌드에서 빌드한 Eureka Server 실행파일(JAR)를 복사합니다.
$ cp /home/centos/demo/target/demo-0.0.1-SNAPSHOT.jar /home/centos/eureka-server/
2.3.2.2. Eureka Server 설정에서 생성한
application.yml
파일을 복사합니다.Eureka Server를 실행합니다.
$ cd /home/centos/eureka-server
$ java -server -jar demo-0.0.1-SNAPSHOT.jar &
2.3.3.2. API 게이트웨이
- API 게이트웨이 어플리케이션 배포를 위한 디렉토리를 생성합니다.
$ mkdir -p /home/centos/apigw
- 어플리케이션 실행파일(2.3.1. 어플리케이션 빌드에서 생성된
apigw-1.0.0.jar
)을 복사합니다.
$ cp /home/centos/apigw-src/target/apigw-1.0.0.jar /home/centos/apigw/
- 로그 설정 파일 (
apigw-src/src/main/resources/logback-spring.xml
)
$ cp /home/centos/apigw-src/src/main/resources/logback-spring.xml /home/centos/apigw/
- 어플리케이션 설정 파일 (
apigw-src/src/main/resources/application.yml
)
$ cp /home/centos/apigw-src/src/main/resources/application.yml /home/centos/apigw/
- 기동 파일 (
apigw-src/startup.sh
)
$ cp /home/centos/apigw-src/startup.sh /home/centos/apigw/
- HTTPS를 위한 Key 파일 (
apigw-src/keystore.p12
)
$ cp /home/centos/apigw-src/keystore.p12 /home/centos/apigw/
- 로그 폴더(logs) 생성
$ mkdir /home/centos/apigw/logs/
startup.sh
에 실행 권한을 부여한다.
$ chmod +x /home/centos/apigw/startup.sh
startup.sh
파일을 실행한다.
./startup.sh