[SpringCloud MSA]Service Discovery

zzarbttoo·2021년 9월 5일
0

이 글은 인프런 강의 "Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)"를 정리한 글입니다. 문제/오류가 있을 시 댓글로 알려주시면 감사드리겠습니다


Spring Cloud Netflix Eureka

  • Service Discovery에 서비스들을 key-value 형태로 등록해줄 것이다
  • 요청정보가 들어오면 필요한 서비스의 위치를 알려준다

Eureka Service Discovery 생성

pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.8-SNAPSHOT</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.zzarbttoo</groupId>
    <artifactId>ecoomerce</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>ecoomerce</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>8</java.version>
        <spring-cloud.version>2020.0.3</spring-cloud.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

...  
  • 시작할 때 Spring Cloud Discovery -> Eureka Server 추가
  • 2.4 대 버전을 사용해야한다

| @SpringBootApplication 부분
package com.zzarbttoo.discoveryservice;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaServer
public class DiscoveryServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(DiscoveryServiceApplication.class, args);
    }

}
  • @EnableEurekaServer 로 유레카 서버 자격으로 등록

| application.yml
server:
  port: 8761

spirng:
  application:
    name: discoveryservice

#client false 를 하지 않으면 자동으로 client로 등록되게 된다
eureka:
  client:
    register-with-eureka: false
    fetch-registry: false
  • yml 파일로 리팩토링
  • port는 8761로 설정
  • register-with-eureka false, fetch-registry false로 서버를 클라이언트로 등록하지 않도록 함

  • 실행하면 콘솔에 8761 port로 실행됐다고 뜸
  • 유레카 서버가 기동되는 것을 볼 수 있다
  • 아직 클라이언트는 등록되어있지 않다

User Service 생성

| pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.8-SNAPSHOT</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.zzarbttoo</groupId>
    <artifactId>user-service</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>user-service</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>11</java.version>
        <spring-cloud.version>2020.0.3</spring-cloud.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

... 생략 
  • SpringBootDevTools, Lombok, Web 추가
  • SpringCloudDiscovery -> Eureka Discovery Client 추가

| SpringBootApplication 부분
package com.zzarbttoo.userservice;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient
public class UserServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(UserServiceApplication.class, args);
    }

}
  • @EnableDiscoveryClient 추가로 Eureka Client로 사용가능하게 함

| application.yml
server:
  port: 0 #0번 포트는 랜덤 포트를 사용하겠다는 뜻

spring:
  application:
    name: user-service

eureka:
  instance:
    instance-id: ${spring.cloud.client.hostname}:${spring.application.instance_id:${random.value}}
  client:
    register-with-eureka: true
    fetch-registry: true #외부 검색 가능하도록
    service-url:
      defaltZone: http://192.168.0.20:8761/eureka #server의 위치 지정
  • server.port : 0으로 설정해 random port에서 실행되도록 함
  • instance-id를 설정해 같은 ip를 사용하는 다른 클라이언트와 등록id가 겹치지 않도록 했다
  • register-with-eureka, fetch-registry 를 true 로 설정해 클라이언트 등록 및 외부 검색이 가능하도록 했다
  • service-url을 지정해 유레카 서버의 위치를 지정했다(localhost 대신 ip주소로 적어놓음)

  • 위와 같이 프로젝트 실행을 하나 더 할 수 있도록 했으며 랜덤포트가 아닐 때에는 위와같이 포트 번호를 지정해주면 된다
  • 그밖에도 jar파일 실행, mvn 설치 후 mvn이용한 실행 등을 할 수 있다
  • 이후 실행을 하면 랜덤포트에서 실행되는 것을 콘솔에서 확인할 수 있다

  • 그럼 유레카 서버에 클라이언트 두개가 등록된 것을 확인할 수 있다
  • 클라이언트 실행을 중지하면 서버 등록도 초기화되는데, 이 때 초기화가 안되는 경우도 있다
Eureka에서는 각 마이크로서비스 애플리케이션이 전달한 정보를 대시보드에 출력하게 되는데, Eureka에서 다시 새로운 정보를 갱신하기까지 일정 시간이 소요될 수 있습니다. 
또는 해당 프로세스가 정상적으로 종료되지 못해서 생기는 현상(좀비 프로세스)일 수 있습니다. 
1. 일정 시간 뒤에 다시 확인, 2. Eureka를 재시작 3. 해당 프로세스를 찾아서 프로세스 삭제 등의 방법으로 처리하실 수 있습니다. 

출처 : https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C-%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4/lecture/68385?mm=close&tab=community&q=187022
profile
나는야 누워있는 개발머신

0개의 댓글