Введение
В микрослужбах регистрация и обнаружение службы играют ключевую роль в управлении каждой подсистемой микрослужбы. По мере того, как система расширяется все больше и больше по горизонтали, количество системных разбиений на микросервисы также будет соответственно увеличиваться, поэтому будет очень сложно управлять и получать URL-адреса этих микросервисов.Если мы добавим новый микросервис, мы будем необходимо вручную добавить его URL-адрес или адрес других протоколов связи в других местах, где используется этот микросервис, что часто будет допускать ошибки, а рабочая нагрузка огромна.После изменения адреса микросервиса необходимо вручную изменить все файл конфигурации микросервиса, который на него ссылается. Таким образом, сервер spring-cloud eureka решает такие проблемы.После простой настройки микросервисы могут быть автоматически зарегистрированы и обнаружены.
основная среда
- JDK 1.8
- Maven 3.3.9
- IntelliJ 2018.1
- Git
Исходный код проекта
Построить сервер Эврика
В прошлом блоге мы представили, как собрать центр конфигурации 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
Просто аннотируйте.
Добро пожаловать в гостимой блог