Понимание Spring Cloud Eureka Server с примером

1- Eureka Server - Почему?

OK, я уверен вы уже использовали приложение  Chat для разговоров со своими друзьями по интернету. Когда вы входите в приложение Chat на вашем компьютере, что произойдет?
  1. Вы входите в приложение Chat значит вы автоматически информировали Chat Server (Chat сервер), что вы онлайн.
  2. Chat Server предоставит вам список других людей, они будут иметь статус онлайн (online) или оффлайн (offline).
  3. Таким образом вы  "Нашли" (Discovered) список людей онлайн. И конечно же другие так же нашли вас.
На самом деле, когда количество пользоваталей приложения  Chat возрастает, количество  Chat Server так же возрастает, и они имеют способ, как поделиться друг с другом про статус пользователя.
Вы строите распределенную систему, которая состоит из разных услуг (приложений) работающих независимо на разных серверах. Чтобы данные услуги (приложения) могли разговаривать друг с другом, они должны  "Найти" друг друга. Когда они найдут друг друга, они смогут вызывать услуги друг друга. Поэтому нужно что-то похожее на Chat Server помогающее услугам (приложениям) зарегистрировать свое существование.
Это  "Service Registration" (Регистрация услуг). Все услуги (приложения) в распределенной системе (distributed system) должны зарегистрироваться с  "Service Registration". Это похоже на регистрацию свидетельство о рождении всех граждан в стране.
Есть много технологий, чтобы вы получили  "Service Registration", Spring Cloud предоставляет вам следующие технологические решения:
  1. Eureka
  2. Zookeeper
  3. Cloud Foundry
  4. Consul

2- Цель статьи

В данной статье я покажу вам как создать  Service Registration (Регистрация услуги) используя  Spring Cloud Eureka Server.
Будет лучше если вы изучите больше информации про  Netflix и Eureka представленные в следующих статьях:
  • TODO Link!
Вопросы, которые будут обсуждены в данной статье:

Щаг 1:

  • Создать Service Registration (Регистрация услуги) используя Spring Cloud Eureka Server.
  • Запустить данное приложение напрямую на Eclipse и просмотреть Eureka Monitor (Eureka монитор).

Шаг 2:

  • Создать реплики (replica) для приложения, чтобы развернуть на разных серверах, каждая реплика (replica) будет работать на отдельном доменном имени. Здесь мы предполагаем, что система имеет много пользователей поэтому нужно чтобы много реплик работали на разных серверах для уменьшения нагрузки (Reduce overload).
  • Объяснение механизма статуса деления между Eureka Server.

3- Создать проект Spring Boot

На  Eclipse создать проект  Spring Boot:
Ввести:
  • Name: SpringCloudServiceRegistrationEurekaServer
  • Group: org.o7planning
  • Artifact: SpringCloudServiceRegistrationEurekaServer
  • Description: Spring Cloud Service Registration (Eureka Server)
  • Package: org.o7planning.eurekaserver
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>

    <groupId>org.o7planning</groupId>
    <artifactId>SpringCloudServiceRegistrationEurekaServer</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>SpringCloudServiceRegistrationEurekaServer</name>
    <description>Spring Cloud Service Registration (Eureka Server)</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.9.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-cloud.version>Edgware.RELEASE</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-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>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>

4- @EnableEurekaServer

Чтобы это приложение стало  Service Registration (Регистрацией услуг) вам нужно использовать  @EnableEurekaServer, данная аннотация (Annotation) оповещает  Spring что нужно запустить услугу регистрации по технологии  Netflix (Netflix Eureka).
SpringCloudServiceRegistrationEurekaServerApplication.java
package org.o7planning.eurekaserver;

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

@EnableEurekaServer
@SpringBootApplication
public class SpringCloudServiceRegistrationEurekaServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringCloudServiceRegistrationEurekaServerApplication.class, args);
    }
    
}
application.yml
---
# This default profile is used when running a single instance completely standalone:
spring:
  profiles: default
server:
  port: 9000  
eureka:
  instance:
    hostname: my-eureka-server.com
  client:
    registerWithEureka: false
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/    

# united-states, france, and vietnam illustrate running 3 intercommunicating instances.  
# This example has them running side-by-side on localhost
# -- which is unrealistic in production
# -- but does illustrate how multiple instances collaborate.
#
# Run by opening 3 separate command prompts:
# java -jar -Dspring.profiles.active=united-states SpringCloudServiceRegistrationEurekaServer.jar
# java -jar -Dspring.profiles.active=france SpringCloudServiceRegistrationEurekaServer.jar
# java -jar -Dspring.profiles.active=vietnam SpringCloudServiceRegistrationEurekaServer.jar

---
spring:
  profiles: united-states
  application:
    name: eureka-server-clustered   # ==> This is Service-Id
server:
  port: 9001  
eureka:
  instance:
    hostname: my-eureka-server-us.com    
  client:
    registerWithEureka: true
    fetchRegistry: true        
    serviceUrl:
      defaultZone: http://my-eureka-server-fr.com:9002/eureka/,http://my-eureka-server-vn.com:9003/eureka/

---
spring:
  profiles: france
  application:
    name: eureka-server-clustered   # ==> This is Service-Id   
server:
  port: 9002
eureka:
  instance:
    hostname: my-eureka-server-fr.com      
  client:
    registerWithEureka: true
    fetchRegistry: true        
    serviceUrl:
      defaultZone: http://my-eureka-server-us.com:9001/eureka/,http://my-eureka-server-vn.com:9003/eureka/

---
spring:
  profiles: vietnam
  application:
    name: eureka-server-clustered    # ==> This is Service-Id  
server:
  port: 9003
eureka:
  instance:
    hostname: my-eureka-server-vn.com    
  client:
    registerWithEureka: true
    fetchRegistry: true    
    serviceUrl:
      defaultZone: http://my-eureka-server-us.com:9001/eureka/,http://my-eureka-server-fr.com:9002/eureka/   
       
В данном приложении, я конфигурирую на файле  application.yml вместо  application.properties, вы можете изучить больше про разницу междуфайлами  *.yml и *.properties по статье ниже:
  • TODO Link!

5- Запуск приложения на Eclipse

Когда вы запускаете данное приложение напрямую на Eclipse, профайл по умолчанию (default profile) будет использоваться для конфигурации данного приложения.
Eureka Monitor (Eureka Монитор) позволяет вам видеть список услууг (приложений) работающих и зарегистрированных с данным  Eureka Server, одновременно позволяет вам видеть реплики (replica) данного приложения, которые работают на распределенной системе. Вы можете войти в Eureka Monitor по  URL ниже,
Профайл  "default" (default profile) конфигурирован для работы на доменном имени  my-eureka-server.com, с помощью конфигурации доменного имени на файле  "hosts" вы можете получить это доменное имя.
На  Windows открыть файл:
  • C:\Windows\System32\drivers\etc\hosts
Добавить следующий конфигурационный сниппет:
C:\Windows\System32\drivers\etc\hosts
127.0.0.1       my-eureka-server.com
127.0.0.1       my-eureka-server-us.com
127.0.0.1       my-eureka-server-fr.com
127.0.0.1       my-eureka-server-vn.com
Чтобы изменить файл  "hosts" в других операционных системах, вы можете просмотреть инструкции ниже:
И вы получили доменное имя  my-eureka-server.com, заметьте, что данное доменное имя работает только на вашем компьютере.

6- Запуск многих реплик (replica)

Для начала, вам нужно использовать функцию  "Maven Install" чтобы создать файл  jar. Нажать на правую кнопку мыши на проект, выбрать:
  • Run As/Maven Install
После успешного выполнения  "Maven Install", вы имеете файл  jar в папке  target у проекта.
Копировать только что созданный файл  jar в определенную папку, одновременно создать 3 файла  BAT:
  • eureka-server-us.bat
  • eureka-server-fr.bat
  • eureka-server-vn.bat
my-eureka-server-us.bat
java -jar -Dspring.profiles.active=united-states SpringCloudServiceRegistrationEurekaServer-0.0.1-SNAPSHOT.jar
my-eureka-server-fr.bat
java -jar -Dspring.profiles.active=france SpringCloudServiceRegistrationEurekaServer-0.0.1-SNAPSHOT.jar
my-eureka-server-vn.bat
java -jar -Dspring.profiles.active=vietnam SpringCloudServiceRegistrationEurekaServer-0.0.1-SNAPSHOT.jar
Мы симулируем создание 3 реплик (replica) и развертываем из на 3-х разных серверах, с 3-мя разными доменными именами.
Запустить все 3 вышеупомянутые файла  BAT.
OK, теперь вы можете получить доступ в следющие ссылки и просмотреть результаты:

7- Eureka Discovery (Eureka Client)

OK, следующая статья: