Налаштування Eureka Server

Eureka Server — це сервіс відкриття (service discovery) від Netflix, який став стандартом де-факто в екосистемі Spring Cloud для мікросервісної архітектури. У цій статті ми детально розглянемо, як правильно налаштувати Eureka Server для вашого проєкту.

Що таке Eureka і навіщо він потрібен?

В мікросервісній архітектурі сервіси потребують механізму для виявлення один одного. Замість жорсткого кодування адрес, Eureka надає динамічний реєстр сервісів, де кожен мікросервіс реєструється при запуску та може знаходити інші сервіси через Eureka Server.

Основні переваги Eureka:

  • Динамічне виявлення сервісів без жорстко закодованих URL
  • Автоматичне балансування навантаження на стороні клієнта
  • Відмовостійкість через реплікацію
  • Інтеграція з Spring Cloud екосистемою

Крок 1: Створення проєкту

Створіть новий Spring Boot проєкт та додайте необхідні Maven залежності до 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 
         http://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>3.2.0</version>
        <relativePath/>
    </parent>
    
    <groupId>com.example</groupId>
    <artifactId>eureka-server</artifactId>
    <version>1.0.0</version>
    <name>Eureka Server</name>
    
    <properties>
        <java.version>17</java.version>
        <spring-cloud.version>2023.0.0</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-security</artifactId>
        </dependency>
        
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </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>
    
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>
XML

Для Gradle

Якщо ви використовуєте Gradle, додайте до build.gradle:

plugins {
    id 'java'
    id 'org.springframework.boot' version '3.2.0'
    id 'io.spring.dependency-management' version '1.1.4'
}

group = 'com.example'
version = '1.0.0'
sourceCompatibility = '17'

ext {
    set('springCloudVersion', "2023.0.0")
}

dependencies {
    implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-server'
    implementation 'org.springframework.boot:spring-boot-starter-security'
    implementation 'org.springframework.boot:spring-boot-starter-actuator'
}

dependencyManagement {
    imports {
        mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
    }
}
TypeScript

Крок 2: Конфігурація головного класу

Створіть головний клас додатку з анотацією @EnableEurekaServer:

package com.example.eurekaserver;

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

@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
    
    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }
}
Java

Крок 3: Налаштування application.yml

Створіть файл application.yml в директорії src/main/resources:

server:
  port: 8761

spring:
  application:
    name: eureka-server

eureka:
  instance:
    hostname: localhost
    prefer-ip-address: false
  client:
    register-with-eureka: false
    fetch-registry: false
    service-url:
      defaultZone: http://localhost:${server.port}/eureka/
  server:
    enable-self-preservation: true
    eviction-interval-timer-in-ms: 60000
    renewal-percent-threshold: 0.85
    
management:
  endpoints:
    web:
      exposure:
        include: health,info,metrics
  endpoint:
    health:
      show-details: always
YAML

Пояснення ключових параметрів:

server.port — порт, на якому буде запущено Eureka Server (стандартно 8761)

eureka.client.register-with-eureka — встановлюємо false, щоб сам сервер не реєструвався як клієнт

eureka.client.fetch-registry — встановлюємо false, щоб сервер не завантажував реєстр від інших інстансів

eureka.server.enable-self-preservation — механізм самозбереження для запобігання видалення сервісів при проблемах з мережею

eureka.server.eviction-interval-timer-in-ms — інтервал очищення недоступних сервісів

Крок 4: Конфігурація безпеки

Для захисту Eureka Server додайте конфігурацію Spring Security:

package com.example.eurekaserver.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .csrf(csrf -> csrf.disable())
            .authorizeHttpRequests(auth -> auth
                .requestMatchers("/eureka/**").authenticated()
                .anyRequest().permitAll()
            )
            .httpBasic();
        
        return http.build();
    }

    @Bean
    public UserDetailsService userDetailsService() {
        UserDetails user = User.builder()
            .username("admin")
            .password(passwordEncoder().encode("admin123"))
            .roles("ADMIN")
            .build();
        
        return new InMemoryUserDetailsManager(user);
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}
Java
Додайте креденшали до application.yml:
spring:
  security:
    user:
      name: admin
      password: admin123
YAML

Крок 5: Профілі для різних середовищ

Створіть окремі конфігураційні файли для різних середовищ.

application-dev.yml (dev)

server:
  port: 8761

eureka:
  server:
    enable-self-preservation: false
  instance:
    hostname: localhost

logging:
  level:
    com.netflix.eureka: DEBUG
    com.netflix.discovery: DEBUG
YAML

application-prod.yml (prod)

server:
  port: 8761

eureka:
  instance:
    hostname: eureka-server.company.com
    prefer-ip-address: false
  server:
    enable-self-preservation: true
    renewal-percent-threshold: 0.85
  client:
    service-url:
      defaultZone: http://eureka1.company.com:8761/eureka/,http://eureka2.company.com:8761/eureka/

logging:
  level:
    com.netflix: WARN
YAML

Крок 6: Налаштування High Availability

Для production середовища рекомендується налаштувати кілька інстансів Eureka Server.

Конфігурація для першого сервера (peer1):

spring:
  application:
    name: eureka-server
  profiles:
    active: peer1

server:
  port: 8761

eureka:
  instance:
    hostname: peer1
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://peer2:8762/eureka/
YAML

Конфігурація для другого сервера (peer2):

spring:
  application:
    name: eureka-server
  profiles:
    active: peer2

server:
  port: 8762

eureka:
  instance:
    hostname: peer2
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://peer1:8761/eureka/
YAML

Крок 7: Моніторинг та метрики

Додайте Spring Boot Actuator для моніторингу:

package com.example.eurekaserver.config;

import org.springframework.boot.actuate.health.Health;
import org.springframework.boot.actuate.health.HealthIndicator;
import org.springframework.stereotype.Component;

@Component
public class EurekaHealthIndicator implements HealthIndicator {

    @Override
    public Health health() {
        // Додайте вашу логіку перевірки здоров'я
        boolean eurekaIsHealthy = checkEurekaHealth();
        
        if (eurekaIsHealthy) {
            return Health.up()
                .withDetail("status", "Eureka Server is running")
                .build();
        }
        
        return Health.down()
            .withDetail("status", "Eureka Server is down")
            .build();
    }
    
    private boolean checkEurekaHealth() {
        // Ваша логіка перевірки
        return true;
    }
}
Java

Крок 8: Dockerизація

Створіть Dockerfile для контейнеризації:

FROM eclipse-temurin:17-jre-alpine

WORKDIR /app

COPY target/eureka-server-1.0.0.jar app.jar

EXPOSE 8761

ENV JAVA_OPTS="-Xms256m -Xmx512m"

ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar app.jar"]
Dockerfile

docker-compose.yml

version: '3.8'

services:
  eureka-server:
    build: .
    ports:
      - "8761:8761"
    environment:
      - SPRING_PROFILES_ACTIVE=dev
    networks:
      - microservices-network
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8761/actuator/health"]
      interval: 30s
      timeout: 10s
      retries: 3

networks:
  microservices-network:
    driver: bridge
YAML

Крок 9: Запуск і тестування

Запуск локально

mvn spring-boot:run

Або для Gradle:

gradle bootRun

Доступ до dashboard

Відкрийте браузер і перейдіть за адресою:

http://localhost:8761

Введіть креденшали (admin/admin123) для доступу до веб-інтерфейсу Eureka.

Крок 10: Реєстрація клієнтів

Приклад конфігурації клієнта, який реєструється в Eureka:

spring:
  application:
    name: my-service

eureka:
  client:
    service-url:
      defaultZone: http://admin:admin123@localhost:8761/eureka/
  instance:
    prefer-ip-address: true
    lease-renewal-interval-in-seconds: 30
    lease-expiration-duration-in-seconds: 90
YAML

Best Practices

  1. Завжди використовуйте HTTPS в production — захистіть комунікацію між сервісами
  2. Налаштуйте високу доступність — використовуйте мінімум 2-3 інстанси Eureka Server
  3. Моніторьте метрики — інтегруйте з Prometheus або інші системи моніторингу
  4. Налаштуйте timeouts правильно — враховуйте специфіку вашої інфраструктури
  5. Використовуйте service mesh для складних сценаріїв — розгляньте Istio або Linkerd для великих систем
  6. Регулярно оновлюйте залежності — слідкуйте за security patches
  7. Логуйте важливі події — налаштуйте централізоване логування

Типові проблеми та їх вирішення

Проблема: Сервіси не з’являються в Eureka

Рішення: Перевірте, чи правильно вказано defaultZone у клієнтів, чи немає проблем з мережею, чи увімкнено eureka.client.enabled=true.

Проблема: Self-preservation mode активований

Рішення: Це нормально для production, але в dev можна вимкнути через eureka.server.enable-self-preservation=false.

Проблема: Повільна реєстрація сервісів

Рішення: Зменшіть eureka.instance.lease-renewal-interval-in-seconds та eureka.client.registry-fetch-interval-seconds.

Висновок

Eureka Server — потужний інструмент для організації мікросервісної архітектури. Правильна конфігурація забезпечує надійність, масштабованість та легкість підтримки вашої системи. Почніть з базової конфігурації, поступово додаючи функціональність відповідно до потреб проєкту.

javaadmin

Супер крутий Dev

Related Posts

Dependency Injection у Spring: пояснюємо на пальцях

Коли програміст-початківець вперше відкриває документацію до Spring Framework, на нього одразу висипається купа грізних термінів: Dependency Injection (DI), Inversion of Control (IoC), ApplicationContext, Bean. Здається, що це вища математика. Ми вже розглядали DI в минулих матеріалах але цю дуже не просту тему краще розібрати по болтиках для повного розуміння. Насправді за цими розумними словами ховається надзвичайно проста та красива ідея. Це історія про те, як перестати збирати складні речі вручну й довірити…

JBang: Як вивчати Java легко

Java довгий час мала репутацію мови, яка потребує занадто багато «ритуалів»: створення структури каталогів, налаштування Maven або Gradle, написання довгих pom.xml лише для того, щоб протестувати одну ідею. JBang — це інструмент, який змінює правила гри, дозволяючи запускати Java-код так само легко, як скрипти на Python або Bash. Що таке JBang? JBang — це утиліта для командного рядка, яка дозволяє створювати, редагувати та запускати самодостатні Java-скрипти. Основна ідея…

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *

Цікаве

Dependency Injection у Spring: пояснюємо на пальцях

  • Автор javaadmin
  • 31 Липня, 2026
  • 16 views
Dependency Injection у Spring: пояснюємо на пальцях

Java Collections Framework: List, Set чи Map?

  • Автор javaadmin
  • 31 Липня, 2026
  • 30 views
Java Collections Framework: List, Set чи Map?

Оптимізуємо це: GraalVM Native Image, Leyden та CRaC

  • Автор javaadmin
  • 17 Липня, 2026
  • 57 views
Оптимізуємо це: GraalVM Native Image, Leyden та CRaC

JBang: Як вивчати Java легко

  • Автор javaadmin
  • 12 Травня, 2026
  • 131 views
JBang: Як вивчати Java легко

Agent Skills: Що це таке і чому про це варто знати

  • Автор javaadmin
  • 13 Квітня, 2026
  • 235 views
Agent Skills: Що це таке і чому про це варто знати

Dependency Injection в Java

  • Автор javaadmin
  • 9 Грудня, 2025
  • 408 views
Dependency Injection в Java