Учебное пособие по началу работы с Spring Cloud — регистрация и обнаружение службы Eureka

задняя часть Микросервисы сервер Spring

Введение

В микрослужбах регистрация и обнаружение службы играют ключевую роль в управлении каждой подсистемой микрослужбы. По мере того, как система расширяется все больше и больше по горизонтали, количество системных разбиений на микросервисы также будет соответственно увеличиваться, поэтому будет очень сложно управлять и получать URL-адреса этих микросервисов.Если мы добавим новый микросервис, мы будем необходимо вручную добавить его URL-адрес или адрес других протоколов связи в других местах, где используется этот микросервис, что часто будет допускать ошибки, а рабочая нагрузка огромна.После изменения адреса микросервиса необходимо вручную изменить все файл конфигурации микросервиса, который на него ссылается. Таким образом, сервер spring-cloud eureka решает такие проблемы.После простой настройки микросервисы могут быть автоматически зарегистрированы и обнаружены.

основная среда

  • JDK 1.8
  • Maven 3.3.9
  • IntelliJ 2018.1
  • Git

Исходный код проекта

Облако кода Gitee

Построить сервер Эврика

В прошлом блоге мы представили, как собрать центр конфигурации spring-cloud и тестовый веб-клиент для доступа к нему.На этот раз мы собираем сервер eureka на основе предыдущего, читаем конфигурацию центра конфигурации, а затем поместите веб-клиент регистрируется в службе eureka как клиент обнаружения. Сначала создайте новый проект Maven под IntelliJ:

  • groupId: cn.zxuqian
  • artifactId: registry

Затем добавьте следующий код в 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>cn.zxuqian</groupId>
    <artifactId>registry</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.1.RELEASE</version>
        <relativePath/>
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</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>Finchley.M9</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>

    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/libs-milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>

</project>

используется здесьspring-cloud-starter-netflix-eureka-serverЭта зависимость ядра eureka-server, а также клиентский компонент, который обращается к службе центра конфигурацииspring-cloud-starter-config. затем вsrc/main/resourcesСоздать подbootstrap.ymlфайл, добавьте следующую конфигурацию:

spring:
  application:
    name: eureka-server
  cloud:
    config:
      uri: http://localhost:8888

Этот файл настраивает имя приложения, используемое для чтения файла конфигурации, т.е.spring.application.name, имя которого соответствует имени файла сервисного центра. Кроме того, автоматическая регистрация и обнаружение Eureka также основаны на этом параметре. Затем настройте uri центра обслуживания конфигурации. Создайте новый класс Java,cn.zxuqian.Application, используя следующий код:

package cn.zxuqian;

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

@EnableEurekaServer
@SpringBootApplication
public class Application {

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

только здесь@EnableEurekaServerОдна аннотация настраивает приложение как Eureka Server. Затем создайте его в репозитории git в центре конфигурации.eureka-server.ymlфайл, добавьте следующую конфигурацию:

server:
  port: 8761

eureka: 
 client: 
  register-with-eureka: false
  fetch-registry: false

Этот файл настраивает порт eureka-server и закрывает саморегистрацию и обнаружение eureka, потому что, если он не закрыт, eureka попытается зарегистрироваться в процессе запуска, но сообщит об ошибке, если служба не запущена. На этом этапе сервер eureka настроен.

Обновить веб-клиент

Теперь нам нужно обновить веб-клиент, чтобы он мог быть автоматически зарегистрирован и обнаружен eureka. На домашней странице добавлена ​​зависимость клиента eureka в pom.xml:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

затем вApplicationдобавлен в класс@EnableDiscoveryClientаннотация:

@EnableDiscoveryClient
@SpringBootApplication
public class Application {

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

Наконец, мы создаем класс для проверки того, была ли служба успешно зарегистрирована и обнаружена. Создайте новый класс Javacn.zxuqian.controllers.ServiceInstanceController, добавьте следующий код:

package cn.zxuqian.controllers;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
public class ServiceInstanceController {

    @Autowired
    private DiscoveryClient discoveryClient;

    @RequestMapping("/service-instances/{applicationName}")
    public List<ServiceInstance> serviceInstancesByApplicationName(
            @PathVariable String applicationName) {
        return this.discoveryClient.getInstances(applicationName);
    }

}

Это обычный RestController, который определяетDiscoveryClientпеременная типа и добавлена@Autowireаннотация. Эта аннотация представляет собой функцию внедрения зависимостей, предоставляемую инфраструктурой Spring.В контексте Spring она автоматически находитDiscoveryClientКласс реализации , вот клиент eureka. Некоторые особенности и принципы Spring будут обсуждаться в следующих сообщениях блога. Этот класс также определяетserviceInstancesByApplicationNameметод обработки/service-instances/{applicationName}просить. здесь{applicationName}совпадать с URL-адресом/service-instances/более поздняя часть, затем используйте@PathVariableАннотация, назначенная методуapplicationNameпараметр. например посетитьhttp://localhost:8080/service-instances/web-client,ТакapplicationNameЗначениеweb-client. Роль метода от DiscoverClient в соответствии сspring.application.nameИзвлекается значение соответствующей информации об экземпляре и возвращается список, который будет автоматически преобразован в массив json и возвращен в браузер.

контрольная работа

Поскольку и серверу eureka, и веб-клиенту необходимо прочитать конфигурацию из службы конфигурации, сначала запустите сервер конфигурации, затем запустите сервер eureka и, наконец, запустите веб-клиент.Сервер обнаруживает и регистрирует веб-клиент. . посетить после завершенияhttp://localhost:8080/service-instances/web-client, вы получите следующий результат:

[{"host":"xuqians-imac","port":8080,"instanceInfo":{"instanceId":"xuqians-imac:web-client","app":"WEB-CLIENT","appGroupName":null,"ipAddr":"192.168.72.31","sid":"na","homePageUrl":"http://xuqians-imac:8080/","statusPageUrl":"http://xuqians-imac:8080/actuator/info","healthCheckUrl":"http://xuqians-imac:8080/actuator/health","secureHealthCheckUrl":null,"vipAddress":"web-client","secureVipAddress":"web-client","countryId":1,"dataCenterInfo":{"@class":"com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo","name":"MyOwn"},"hostName":"xuqians-imac","status":"UP","leaseInfo":{"renewalIntervalInSecs":30,"durationInSecs":90,"registrationTimestamp":1525319124967,"lastRenewalTimestamp":1525319124967,"evictionTimestamp":0,"serviceUpTimestamp":1525319124363},"isCoordinatingDiscoveryServer":false,"metadata":{"management.port":"8080"},"lastUpdatedTimestamp":1525319124967,"lastDirtyTimestamp":1525319124297,"actionType":"ADDED","asgName":null,"overriddenStatus":"UNKNOWN"},"metadata":{"management.port":"8080"},"uri":"http://xuqians-imac:8080","serviceId":"WEB-CLIENT","secure":false,"scheme":null}]

Обратите внимание, что служба центра конфигурации не настроена для регистрации и обнаружения сервером eureka, потому что все файлы конфигурации размещены на сервере конфигурации, который имеет проблему курицы и яйца с сервером eureka, поэтому, если для конфигурации -сервер должен быть автоматически зарегистрирован и обнаружен, вам необходимо настроить сервер eureka отдельно, затем настроить eureka uri в конфигурационном сервере и установитьspring.cloud.config.discovery.enabledправда. Детали будут объяснены позже, когда это необходимо.

Суммировать

Настроить сервер eureka довольно просто, просто добавьте его@EnableEurekaServerАннотировать и отключить саморегистрацию и обнаружение в конфигурации. Затем добавьте его в класс Application клиентского приложения.@EnableDiscoveryClientПросто аннотируйте.

Добро пожаловать в гостимой блог