quickSpringCloudNetflix
Last updated
Last updated
JetBrains 홈페이지에서 Intellij Community 버젼을 다운 받아 설치 합니다. SDK 설정이 되어 있지않다면, Project Settings > Project 메뉴에서 SDK에서 Java8을 추가합니다.
Spring application 개발하기 위한 Eclipse 기반의 IDE STS 홈페이지에서 STS를 다운 받아 설치 합니다. (또는 기존에 사용하는 Eclipse에서 STS Plugin을 설치해서 사용합니다.)
총 네 개의 프로젝트를 생성하는 실습을 진행합니다. 각 서비스별 간략 정보는 아래와 같습니다.
Service discovery 역할을 수행하는 eureka 서비스를 설정하도록 하겠습니다.
Spring Initializer 페이지 (start.spring.io) 로 이동하여 아래와 같이 개발환경과 dependencies를 선택 합니다.
Generate...Maven Project, Java, 2.0.4
Artifact: eureka
Dependencies: eureka server 입력 후 엔터
GenerateProject를 클릭하여 zip파일을 다운 받습니다. 다운받은 파일을 원하는 경로에 압축 해제 합니다. IDE를 이용하여 해당 프로젝트를 엽니다.
프로젝트 구조는 아래와 같습니다.
pom.xml파일을 열어보면 아래와 같은 내용이 추가된 것을 확인할 수 있습니다.
src > main > resources > application.properties 파일명을 application.yml로 변경 합니다. (가독성 및 작성 편의를 위함) 해당 파일에 아래 내용을 작성합니다.
eureka-service 프로젝트의 EurekaApplication.java 파일에 @EnableEurekaServer 어노테이션을 추가합니다.
Gateway 역할을 수행하는 zuul 서비스를 설정하도록 하겠습니다.
Spring Initializer 페이지 (start.spring.io) 로 이동하여 아래와 같이 개발환경과 dependencies를 선택 합니다.
Generate...Maven Project, Java, 2.0.4
Artifact: zuul
Dependencies: zuul, eureka discovery 입력 후 엔터
GenerateProject를 클릭하여 zip파일을 다운 받습니다. 다운받은 파일을 원하는 workspace경로에서 압축 해제 합니다. IDE를 이용하여 해당 프로젝트를 엽니다.
pom.xml파일을 열어보면 아래와 같이 dependency가 추가된 것을 확인할 수 있습니다.
src > main > resources > application.properties 파일명을 application.yml로 변경 합니다. 해당 파일에 아래 내용을 작성합니다. 앞으로 만들 서비스(CUSTOMER, ORDER)에 대한 라우팅 정보를 추가합니다.
zuul-service 프로젝트의 ZuulApplication.java 파일에 @EnableZuulProxy, @EnableDiscoveryClient 어노테이션을 추가합니다.
string을 return 하는 API를 갖는 단순한 application을 만들어 보겠습니다. 이 서비스는 eureka에 자동 등록되고, 사용자가 zuul을 통한 라우팅으로 접근하게 구성될 것입니다.
Spring Initializer 페이지 (start.spring.io) 로 이동하여 아래와 같이 개발환경과 dependencies를 선택 합니다.
Generate...Maven Project, Java, 2.0.4
Artifact: customer
Dependencies: web, eureka discovery 입력 후 엔터
GenerateProject를 클릭하여 zip파일을 다운 받습니다. 다운받은 파일을 원하는 workspace경로에서 압축 해제 합니다. IDE를 이용하여 해당 프로젝트를 엽니다.
pom.xml파일을 열어보면 아래와 같은 내용이 추가된 것을 확인할 수 있습니다.
src > main > resources > application.properties 파일명을 application.yml로 변경 합니다. 해당 파일에 아래 내용을 작성합니다.
customer-service 프로젝트의 CustomerApplication.java 파일에 아래 어노테이션을 추가합니다. 그리고 /customer 로 호출 시 임의 고객명을 return 하는 API를 생성합니다.
application을 실행 합니다.
http://localhost:8000 (Eureka Server UI)로 이동하여 customer-service가 instance로 등록된 것을 확인 합니다. http://localhost:8701/customer 로 접속하여 John이 표시되는것을 확인 합니다.
Zuul Gateway에서 설정한 라우팅 정보를 통해 Customer Service를 호출 할 수 있습니다. http://localhost:8500/api/v1/customer/customer 를 호출하여 John이 표시되는것을 확인 합니다.
호출 시 Zuul을 생성하며 추가했던 아래 라우팅 정보를 이용하게 됩니다.
Order-service는 특정 API를 호출하면 customer-serivce로 부터 데이터를 가져와 가공 후 return 하도록 application을 만들어 보겠습니다.
Spring Initializer 페이지 (start.spring.io) 로 이동하여 아래와 같이 개발환경과 dependencies를 선택 합니다.
Generate...Maven Project, Java, 2.0.4
Artifact: order
Dependencies: web, eureka discovery, feign 입력 후 엔터
GenerateProject를 클릭하여 zip파일을 다운 받습니다. 다운받은 파일을 원하는 workspace경로에서 압축 해제 합니다. IDE를 이용하여 해당 프로젝트를 엽니다.
pom.xml파일을 열어보면 아래와 같은 내용이 추가된 것을 확인할 수 있습니다.
src > main > resources > application.properties 파일명을 application.yml로 변경 합니다. 해당 파일에 아래 내용을 작성합니다.
CustomerClient.java 파일 내용
CustomerService.java 파일 내용
Order-service 프로젝트의 OrderApplication.java 파일에 @EnableFeignClients 어노테이션을 추가하고, customer-service를 호출하여 값을 return 하는 API를 추가 합니다.
application을 실행 합니다. http://localhost:8000 로 접속하여 order-service가 instance로 등록된 것을 확인 합니다. http://localhost:8500/api/v1/order/orders 를 호출하여 John's order list 가 표시되는것을 확인 합니다.
지금까지 zuul -> order-service -> customer-service 호출하는 구조를 만들어 보았습니다. 만약 위 상황에서 customer-service에 장애가 발생한 경우 Hystrix를 통해 fallback처리를 해보겠습니다.
Hystrix 사용을 위한 dependency를 order-service의 pom.xml에 추가합니다.
Order-service 프로젝트의 OrderApplication.java 파일에 @EnableHystrix 어노테이션을 추가합니다.
Order-service 프로젝트의 CustomerService.java 파일에 아래와 같이 @HystrixCommnad 어노테이션을 추가하고, 해당 함수 처리 중 에러가 발생 한 경우 호출 될 fallback method를 정의하고 구현합니다.
이제 장애를 발생하여 Hystrix 가 적용되는지 테스트 해보도록 하겠습니다.
Order-service 를 재실행 합니다. Customer-serivce 를 중지 합니다.
http://localhost:8500/api/v1/order/orders 를 호출하여 fallback's order list 가 표시되는것을 확인합니다.
Hystrix 상황을 모니터링 하기 위해 Hystrix Dashboard를 사용할 수 있습니다. order-service의 pom.xml에 아래 내용을 추가합니다.
OrderApplication.java 파일에 @EnableHystrixDashboard 어노테이션을 추가합니다.
application.yml에 아래 내용을 추가합니다.
http://localhost:8500/api/v1/order/orders 를 호출해서 count 변화를 확인 할수 있습니다.
분산환경 트랜젝션의 흐름을 모니터링 하기 위한 Sleuth, Zipkin을 사용해 보겠습니다.
모니터링을 위한 Zipkin UI 서버를 실행시켜 보겠습니다. 실행창에서 공유된 zipkin.jar 가 있는 폴더로 이동하여 아래 명령어를 실행 합니다.
그리고 아래 dependency를 모든 서비스 (Zuul, Order-service, Customer-service)에 추가합니다.
Sleuth: TraceID, SpanID 를 남기기 위함
Zipkin: Zipkin 서버로 로그 이력을 전송 함
각 서비스의 application.yml 파일의 spring 항목에 아래 내용을 추가합니다.
Eureka, Zuul, Feign 등에서는 load balancing을 위한 Ribbon이 포함되어 있습니다. Customer 서비스를 이용하여 여러개의 instance를 생성하고, 이에 대한 load balancing이 자동으로 되는것을 확인해 보겠습니다.
기존 application의 instance를 여러개 실행하려면 간단하게는 port만 바꿔 주면 됩니다. 이번 실습에서는 customer project 폴더를 복사하여 customer2를 만들도록 하겠습니다. 그리고 customer2를 IDE로 열어서 아래와 같이 설정과 소스코드를 수정해 줍니다.
application을 container화 하면 instance 관리를 효율적으로 할 수 있습니다.
application.yml에서 port를 변경 합니다. application.name은 동일하게 해야 eureka에 동일 app으로 등록 됩니다.
다른 instance가 호출되는것을 구별하기 위해 CustomerApplication.java의 getCustomer 메서드 return 값을 아래와 같이 변경 합니다.
application을 실행 합니다. http://localhost:8000 로 접속하여 customer-service의 instance가 두개 등록된 것을 확인 합니다. http://localhost:8500/api/v1/order/orders 를 호출하여 John's order list, Hubert's order list 가 번갈아 표시되는 것을 확인 합니다.
Ribbon이 가지고 있는 cache가 refresh 되기 까지 30초에서 2분 정도가 걸릴 수 있습니다. 이로 인해 처음 호출 시 Jons's order list만 계속 표시 될 수 있습니다.
EurekaApplication을 실행 하고 http://localhost:8000 로 접속하여 Eureka Dashboard 화면이 열리면 정상 작동 하는것입니다. 현재는 등록된 서비스가 없어 Instances 항목이 No instances available로 표시 됩니다.
application을 실행 합니다. http://localhost:8000 로 접속하여 zuul-service가 instance로 등록된 것을 확인 합니다.
Customer-service의 API를 호출할때 feign을 사용해 보도록 하겠습니다. 아래 화면과 같이 package를 생성하고 CustomerClient interface, CustomerService 를 생성합니다.
Order-service 를 재실행 합니다. http://localhost:8702/hystrix 로 이동하여 http://localhost:8702/actuator/hystrix.stream 을 url창에 입력 후 Monitor Stream을 클릭 합니다.
http://localhost:9411/zipkin/ 으로 이동하여 zipkin ui 가 실행되는지 확인 합니다.
설정을 추가한 서비스들을 모두 재시작 합니다. API를 호출해 가며 Zipkin UI에서 해당 이력이 남는것을 확인 합니다.
Spring Starter Project 생성
Project 정보 설정 (https 접속이 불가한 경우 Service URL을 http://start.spring.io 로 변경)
Project Dependency 추가
프로젝트에 마우스 우클릭하여 Open Module Settings
Import Module을 클릭하여 다운받은 Spring Boot Project를 추가
Maven 선택 후 Next 버튼을 클릭하여 완료
[Help] - [Edit Custom VM Options...] 클릭 idea.vmoptions에서 Xms, Xmx 사이즈 변경 후 IntelliJ 재실행
서비스
포트
역할
Eureka
8000
Service Discvoery
Zuul
8500
Gateway
Customer
8701
Order
8702
Feign을 통한 Customer API 호출
Zipkin
9411
Zipkin UI 서버