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
YAMLapplication-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"]
Dockerfiledocker-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
YAMLBest Practices
- Завжди використовуйте HTTPS в production — захистіть комунікацію між сервісами
- Налаштуйте високу доступність — використовуйте мінімум 2-3 інстанси Eureka Server
- Моніторьте метрики — інтегруйте з Prometheus або інші системи моніторингу
- Налаштуйте timeouts правильно — враховуйте специфіку вашої інфраструктури
- Використовуйте service mesh для складних сценаріїв — розгляньте Istio або Linkerd для великих систем
- Регулярно оновлюйте залежності — слідкуйте за security patches
- Логуйте важливі події — налаштуйте централізоване логування
Типові проблеми та їх вирішення
Проблема: Сервіси не з’являються в 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 — потужний інструмент для організації мікросервісної архітектури. Правильна конфігурація забезпечує надійність, масштабованість та легкість підтримки вашої системи. Почніть з базової конфігурації, поступово додаючи функціональність відповідно до потреб проєкту.





