Серия Spring Cloud Netflix: классические практические примеры Eureka и анализ основополагающих принципов
Серия Spring Cloud Netflix: классические практические примеры Eureka и анализ основополагающих принципов

Предисловие

  • существоватьмикросервисыв архитектуре,Регистрация и обнаружение услуг Это базовый компонент. Весна Cloud Netflix Предоставляет мощный инструмент управления услугами — Eureka, который помогает нам осуществлять регистрацию, обнаружение и мониторинг работоспособности служб с помощью концепции центра регистрации. В этой статье будет подробно объяснено Eureka Основные принципы, регистрация службы и процесс обеспечения высокой доступности, а также общая конфигурация и использование.

Введение в Эврику

  • Eureka да Spring Netflix OSS Основные компоненты обнаружения и регистрации служб находятся в Spring Cloud 2022.0.x начало версии,Spring Netflix OSS компоненты (например, Hystrix、Zuul)Официально удалено。Spring Команда постепенно прекратила поддержку этих компонентов в пользу Spring Cloud другие решения, например Spring Cloud Gateway、Resilience4j ждать. но Eureka Он до сих пор поддерживается, что указывает на то, что он находится в разработке. Eureka Регистрация и открытие по-прежнему имеют место в качестве услуг.
  • Справочник по примечаниям к выпуску Spring Cloud

Архитектурный дизайн

  • Eureka да Netflix Компонент обнаружения служб с открытым исходным кодом, следуйте AP Разработка узора с использованием Client/Server модель. Он разделен на Eureka Server и Eureka Client Две части:
Язык кода:txt
копировать
Eureka Сервер: Являясь центром регистрации, он хранит регистрационную информацию всех услуг;
Eureka Клиент: поставщик услуг или потребитель через Eureka Server Зарегистрируйтесь или получите служебную информацию.

Рабочий процесс

  • Регистрация службы: после запуска службы ее собственная информация (например, IP, порт, имя службы и т. д.) будет зарегистрирована на сервере Eureka.
  • Продление услуги: Клиент Eureka будет регулярно отправлять контрольные сигналы на сервер Eureka для продления аренды.
  • Обнаружение службы: потребитель службы получает реестр от Eureka Server и обращается к целевой службе на основе имени службы.
  • Исключение службы: если служба больше не отправляет контрольные сигналы, Eureka Server удалит ее из списка регистрации после истечения срока аренды.

Демо-сборка проекта

Создание сервера Эврика

  • Создайте проект Spring Boot и внедрите зависимость сервера Spring Cloud Netflix Eureka.
  • pom.xml документ
Язык кода:java
копировать
<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>com.example</groupId>
    <artifactId>eureka-server</artifactId>
    <version>1.0.0</version>
    <packaging>jar</packaging>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.0</version>
    </parent>

    <properties>
        <spring-cloud.version>2021.0.1</spring-cloud.version>
    </properties>
    <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>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
    </dependencies>
</project>
  • Конфигурациядокумент application.yml
Язык кода:java
копировать
server:
  port: 8761

spring:
  application:
    name: eureka-server

eureka:
  instance:
    hostname: localhost  # Eureka Server Имя хоста, по этому адресу будут зарегистрированы другие службы.
    instance-id: ${spring.application.name}:${server.port}  # Пример ID,Уникально идентифицирует услугу Пример
  client:
    register-with-eureka: true  # давилл Eureka Server Зарегистрируйтесь как клиент регистрационного центра
    fetch-registry: false  # Eureka Server Не извлекайте реестр служб (предоставляйте только функцию регистрации служб)
    service-url:
      defaultZone: http://localhost:8761/eureka/  # Eureka Server Адрес, используемый для регистрации клиента
  server:
    enable-self-preservation: false  # Включить режим самозащиты,предотвратить обслуживание Пример Удален из-за потери сердцебиения
    eviction-interval-timer-in-ms: 60000  # Временной интервал очистки отказавших сервисов, в миллисекундах
  • Стартап-класс
Язык кода:java
копировать
package org.example;

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);
    }
}

Конфигурация клиента Эврика

  • pom.xml документ
Язык кода:java
копировать
<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>com.example</groupId>
    <artifactId>service-demo1</artifactId>
    <version>1.0.0</version>
    <packaging>jar</packaging>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.0</version>
    </parent>

    <properties>
        <spring-cloud.version>2021.0.1</spring-cloud.version>
    </properties>
    <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>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
</project>
  • Конфигурациядокумент application.yml
Язык кода:java
копировать
server:
  port: 8081

spring:
  application:
    name: service-demo1

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/  # Eureka Server Адрес, используемый для регистрации клиента
    fetch-registry: true  # да Нет от Eureka Server Извлеките реестр служб, поставщик услуг обычно настроен на true
    register-with-eureka: true  # давилл зарегистрировался сам Eureka Сервер, поставщик услуг должен быть настроен на true
    registry-fetch-interval-seconds: 30  # Интервал извлечения реестра
  instance:
    hostname: localhost
    instance-id: ${spring.application.name}:${server.port}  # Пример ID,Уникально идентифицирует услугу Пример
    prefer-ip-address: true  # использовать IP Служба регистрации адресов, обычно устанавливается на true
    lease-renewal-interval-in-seconds: 30  # интервал сердцебиения
    lease-expiration-duration-in-seconds: 90  # Срок годности
  • Стартап-класс
Язык кода:java
копировать
package org.example;

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);
    }
}

Дополнительная информация

Язык кода:txt
копировать
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

Эффект операции

Углубленное использование

Eureka Центр регистрации добавляет сертификацию

  • Добавьте модуль Spring Security
Язык кода:txt
копировать
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
  • изменить Конфигурационный Документ application.yml
Язык кода:java
копировать
spring:
  application:
    name: eureka-security-server
  security: # Конфигурация Spring Security Логин и пароль для входа
    user:
      name: admin
      password: 123456
  • Добавить конфигурацию Java WebSecurityConfig
Язык кода:java
копировать
По умолчанию добавить Приложение вSpringSecurity требует добавления при каждом запросе вCSRF Доступ к токену возможен.
Клиент Eureka не будет зарегистрирован при регистрации. в, поэтому требуется путь Конфигурация/eureka/**, а CSRF не требуется. token。

package org.example.config;

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().ignoringAntMatchers("/eureka/**");
        super.configure(http);
    }
}
  • Эффект операции

Создайте кластер Eureka для достижения высокой доступности.

  • Регистрация и открытие услуг осуществляется через центр регистрации.,Как только центр регистрации выйдет из строя, регистрация и обнаружение всех услуг будут недоступны.,Поэтому мы можем Создайте кластер Eureka для достижения высокой доступности.,С одной стороны, кластеры могут обеспечить высокую доступность.,С другой стороны, он также может разделить нагрузку, связанную с регистрацией и обнаружением услуг.

Построение двухузлового кластера

  • Ниже мы имеем кластер центра регистрации с двумя узлами:
  • копироватьначало Конфигурация
  • изменить Конфигурационный Документ application.yml Осуществить взаимную регистрацию
Язык кода:java
копировать
# Конфигурация host документ
127.0.0.1 localhost1
127.0.0.1 localhost2

# eureka-server1

server:
  port: 8761

eureka:
  instance:
    hostname: localhost1  # Eureka Server Имя хоста, по этому адресу будут зарегистрированы другие службы.
    prefer-ip-address: false  # использовать IP Служба регистрации адресов, обычно устанавливается на true
    instance-id: ${spring.application.name}:${server.port}  # Пример ID,Уникально идентифицирует услугу Пример
  client:
    register-with-eureka: true  # Воля Eureka Server Зарегистрируйтесь как клиент регистрационного центра
    fetch-registry: false  # Eureka Server Не извлекайте реестр служб (предоставляйте только функцию регистрации служб)
    service-url:
      defaultZone: http://admin:123456@localhost2:8762/eureka/
    
# eureka-server2

server:
  port: 8762

eureka:
  instance:
    hostname: localhost2  # Eureka Server Имя хоста, по этому адресу будут зарегистрированы другие службы.
    prefer-ip-address: false  # использовать IP Служба регистрации адресов, обычно устанавливается на true
    instance-id: ${spring.application.name}:${server.port}  # Пример ID,Уникально идентифицирует услугу Пример
  client:
    register-with-eureka: true  # Воля Eureka Server Зарегистрируйтесь как клиент регистрационного центра
    fetch-registry: false  # Eureka Server Не извлекайте реестр служб (предоставляйте только функцию регистрации служб)
    service-url:
      defaultZone: http://admin:123456@localhost1:8761/eureka/

# Вышеуказанные два центра регистрации Осуществить взаимную регистрацию и изменить eureka-client Конфигурация
eureka:
  client:
    service-url:
      defaultZone: http://admin:123456@localhost:8761/eureka/,http://admin:123456@localhost:8762/eureka/  

Эффект операции

Дополнительная информация

Зачем настраивать Разные хосты

  • eureka Низкоуровневое использование isThisMyUrl Метод удаления дубликатов, если они получены host Он будет рассматриваться как хост, будет дедуплицирован и не может быть реализован. кластера。
Язык кода:java
копировать
    /**
     * Checks if the given service url contains the current host which is trying
     * to replicate. Only after the EIP binding is done the host has a chance to
     * identify itself in the list of replica nodes and needs to take itself out
     * of replication traffic.
     *
     * @param url the service url of the replica node that the check is made.
     * @return true, if the url represents the current node which is trying to
     *         replicate, false otherwise.
     */
    public boolean isThisMyUrl(String url) {
        final String myUrlConfigured = serverConfig.getMyUrl();
        if (myUrlConfigured != null) {
            return myUrlConfigured.equals(url);
        }
        return isInstanceURL(url, applicationInfoManager.getInfo());
    }

Принцип анализа

Подробный процесс регистрации услуги и продления контрольного сигнала

  • Eureka Client После завершения запуска статус экземпляра изменится на UP статус и попытайтесь зарегистрировать клиента. После успешной регистрации выполняются регулярные запросы подтверждения для поддержания статуса клиента. Если первая регистрация не удалась, последующие регулярные запросы возобновления подтверждения будут возвращены. 204 и повторите попытку регистрации.
  • Eureka Clientсуществовать Отправить регистрацию、Сердцебиение и другие запросы,Пойду в Eureka Server узел кластера serviceUrlList Попробуйте один за другим. Если запрос удался, он больше не будет запрашивать другие узлы. Повторная попытка будет выполнена максимум 3 раза. Если более 3 раз, будет выдано исключение.
Язык кода:java
копировать
    # com.netflix.discovery.shared.transport.decorator.RetryableEurekaHttpClient#execute
    @Override
    protected <R> EurekaHttpResponse<R> execute(RequestExecutor<R> requestExecutor) {
        List<EurekaEndpoint> candidateHosts = null;
        int endpointIdx = 0;
        // перед заказом попробуйте numberOfRetries Вы можете зарегистрировать центр Пример
        for (int retry = 0; retry < numberOfRetries; retry++) {
            EurekaHttpClient currentHttpClient = delegate.get();
            EurekaEndpoint currentEndpoint = null;
            if (currentHttpClient == null) {
                if (candidateHosts == null) {
                    candidateHosts = getHostCandidates();
                    if (candidateHosts.isEmpty()) {
                        throw new TransportException("There is no known eureka server; cluster server list is empty");
                    }
                }
                if (endpointIdx >= candidateHosts.size()) {
                    throw new TransportException("Cannot execute request on any known server");
                }

                currentEndpoint = candidateHosts.get(endpointIdx++);
                currentHttpClient = clientFactory.newClient(currentEndpoint);
            }

            try {
                EurekaHttpResponse<R> response = requestExecutor.execute(currentHttpClient);
                if (serverStatusEvaluator.accept(response.getStatusCode(), requestExecutor.getRequestType())) {
                    delegate.set(currentHttpClient);
                    if (retry > 0) {
                        logger.info("Request execution succeeded on retry #{}", retry);
                    }
                    return response;
                }
                logger.warn("Request execution failure with status code {}; retrying on another server if available", response.getStatusCode());
            } catch (Exception e) {
                logger.warn("Request execution failed with message: {}", e.getMessage());  // just log message as the underlying client should log the stacktrace
            }

            // Connection error or 5xx from the server that must be retried on another server
            delegate.compareAndSet(currentHttpClient, null);
            if (currentEndpoint != null) {
                quarantineSet.add(currentEndpoint);
            }
        }
        throw new TransportException("Retry limit reached; giving up on completing the request");
    }
    
    # org.springframework.cloud.netflix.eureka.http.RestTemplateEurekaHttpClient#register
	@Override
	public EurekaHttpResponse<Void> register(InstanceInfo info) {
		String urlPath = serviceUrl + "apps/" + info.getAppName();

		HttpHeaders headers = new HttpHeaders();
		headers.add(HttpHeaders.ACCEPT_ENCODING, "gzip");
		headers.add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE);

		ResponseEntity<Void> response = restTemplate.exchange(urlPath, HttpMethod.POST, new HttpEntity<>(info, headers),
				Void.class);

		return anEurekaHttpResponse(response.getStatusCodeValue()).headers(headersOf(response)).build();
	}
  • Из приведенного выше дизайна мы видим, что во избежание чрезмерного давления на одну точку экземпляра центра регистрации мы настраиваем service-url Все адреса должны быть настроены насколько это возможно, а порядок должен быть произвольным.
Eureka Client Недействительное выселение
  • Eureka Service Он будет периодически просматривать Пример в реестре.,Узнайте, какие из них выходят за рамки срока аренды Примери Воля Удалить его из реестра。Если уже Включить режим самозащиты, затем прекратить выселение до восстановления сердцебиения, режим самозащитызакрытие。
Язык кода:java
копировать
    # com.netflix.eureka.registry.AbstractInstanceRegistry#evict(long)
    public void evict(long additionalLeaseMs) {
        logger.debug("Running the evict task");

        // суждениережим Самозащита, запускать ли: для предотвращения нештатных ситуаций, таких как перегородки сети или временные сбои в работе сети. Eureka в больших масштабах Воля Примерошибочно подумал, что срок годности истекиизгонять,Избегайте влияния на общую доступность системы.
        if (!isLeaseExpirationEnabled()) {
            logger.debug("DS: lease expiration is currently disabled.");
            return;
        }

        // We collect first all expired items, to evict them in random order. For large eviction sets,
        // if we do not that, we might wipe out whole apps before self preservation kicks in. By randomizing it,
        // the impact should be evenly distributed across all applications.
        List<Lease<InstanceInfo>> expiredLeases = new ArrayList<>();
        for (Entry<String, Map<String, Lease<InstanceInfo>>> groupEntry : registry.entrySet()) {
            Map<String, Lease<InstanceInfo>> leaseMap = groupEntry.getValue();
            if (leaseMap != null) {
                for (Entry<String, Lease<InstanceInfo>> leaseEntry : leaseMap.entrySet()) {
                    Lease<InstanceInfo> lease = leaseEntry.getValue();
                    if (lease.isExpired(additionalLeaseMs) && lease.getHolder() != null) {
                        expiredLeases.add(lease);
                    }
                }
            }
        }

        // To compensate for GC pauses or drifting local time, we need to use current registry size as a base for
        // triggering self-preservation. Without that we would wipe out full registry.
        // Даже если закрытый режим самозащиты,Если не Воля renewalPercentThreshold установлен на 0 ,Пример Срок действия также будет истекать партиями.,Избегайте проблем с сетью, которые затрудняют восстановление служб.
        int registrySize = (int) getLocalRegistrySize();
        int registrySizeThreshold = (int) (registrySize * serverConfig.getRenewalPercentThreshold());
        int evictionLimit = registrySize - registrySizeThreshold;

        int toEvict = Math.min(expiredLeases.size(), evictionLimit);
        if (toEvict > 0) {
            logger.info("Evicting {} items (expired={}, evictionLimit={})", toEvict, expiredLeases.size(), evictionLimit);

            // 随机изгонять的方式Воля Истекший Пример的изгонять影响分布существоватьмежду различными приложениями,Предотвратите полное удаление определенного приложения.
            Random random = new Random(System.currentTimeMillis());
            for (int i = 0; i < toEvict; i++) {
                // Pick a random item (Knuth shuffle algorithm)
                int next = i + random.nextInt(expiredLeases.size() - i);
                Collections.swap(expiredLeases, i, next);
                Lease<InstanceInfo> lease = expiredLeases.get(i);

                String appName = lease.getHolder().getAppName();
                String id = lease.getHolder().getId();
                EXPIRED.increment();
                logger.warn("DS: Registry: expired lease for {}/{}", appName, id);
                internalCancel(appName, id, false);
            }
        }
    }
  • Кроме режима самозащитыкроме,Процесс «Недействительное выселение» также обеспечивает доступность системы в форме пакетных и случайных выселений.,Примеры групповых выселений:
Язык кода:txt
копировать
гипотеза 20 аренда, в том числе 10 Срок аренды истек.
 
Начинается первый раунд исполнения
int registrySize = 20;
int registrySizeThreshold = (int) (20 * 0.85) = 17;
int evictionLimit = 20 - 17 = 3;
int toEvict = Math.min(10, 3) = 3;
Первый раунд казни заканчивается, а остальные 17 аренда, в том числе 7 Срок аренды истек.
 
Начинается второй раунд исполнения
int registrySize = 17;
int registrySizeThreshold = (int) (17 * 0.85) = 14;
int evictionLimit = 17 - 14 = 3;
int toEvict = Math.min(7, 3) = 3;
Второй раунд казни заканчивается, и остается 14 аренда, в том числе 4 Срок аренды истек.

...и так далее,или Воля renewalPercentThreshold установлен на0 , но это не рекомендуется

Как зарегистрироваться в режиме кластера & Синхронизация кластера

  • Eureka принадлежать AP Дизайн, центр регистрации полностью равноправный и независимый, а статус не полностью соответствует. Eureka Client При запросе регистрации, продления или автономного режима для экземпляра центра регистрации экземпляр синхронизирует эту информацию с другими центрами регистрации в кластере. В качестве примера можно привести код регистрации:
Язык кода:java
копировать
    # com.netflix.eureka.registry.PeerAwareInstanceRegistryImpl#register
    /**
     * Registers the information about the {@link InstanceInfo} and replicates
     * this information to all peer eureka nodes. If this is replication event
     * from other replica nodes then it is not replicated.
     *
     * @param info
     *            the {@link InstanceInfo} to be registered and replicated.
     * @param isReplication
     *            true if this is a replication event from other replica nodes,
     *            false otherwise.
     */
    @Override
    public void register(final InstanceInfo info, final boolean isReplication) {
        int leaseDuration = Lease.DEFAULT_DURATION_IN_SECS;
        if (info.getLeaseInfo() != null && info.getLeaseInfo().getDurationInSecs() > 0) {
            leaseDuration = info.getLeaseInfo().getDurationInSecs();
        }
        super.register(info, leaseDuration, isReplication);
        // Синхронизировать с другими серверами в кластере
        replicateToPeers(Action.Register, info.getAppName(), info.getId(), info, null, isReplication);
    }
    
    # com.netflix.eureka.registry.PeerAwareInstanceRegistryImpl#replicateToPeers
        /**
     * Replicates all eureka actions to peer eureka nodes except for replication
     * traffic to this node.
     *
     */
    private void replicateToPeers(Action action, String appName, String id,
                                  InstanceInfo info /* optional */,
                                  InstanceStatus newStatus /* optional */, boolean isReplication) {
        Stopwatch tracer = action.getTimer().start();
        try {
            if (isReplication) {
                numberOfReplicationsLastMin.increment();
            }
            // If it is a replication already, do not replicate again as this will create a poison replication
            if (peerEurekaNodes == Collections.EMPTY_LIST || isReplication) {
                return;
            }

            for (final PeerEurekaNode node : peerEurekaNodes.getPeerEurekaNodes()) {
                // If the url represents this host, do not replicate to yourself.
                if (peerEurekaNodes.isThisMyUrl(node.getServiceUrl())) {
                    continue;
                }
                replicateInstanceActionsToPeers(action, appName, id, info, newStatus, node);
            }
        } finally {
            tracer.stop();
        }
    }

режим самозащиты

эффект

  • Eureka Зарегистрируйтесь, получив регулярные Пример Сигнал пульса отправлен(Запрос на продление)Приходитьсуждение Служитьда Выжить ли。когда Пример Когда сигнал Heartbeat не отправляется вовремя,Eureka встреча Воля Он отмечен как“Нет в наличии”,и исключен из регистрационного списка. Но да,При обнаружении сетевых разделов, задержек или временных сбоев,может привести к нормальной работе Пример Невозможно отправить сигнал пульса,привести к Eureka Неправильный перевод этих экземпляров в автономный режим приведет к отключению большого количества служб, что повлияет на стабильность системы.
  • Чтобы предотвратить это, Эврика Цель механизма самозащиты:
Язык кода:txt
копировать
Избегайте массового оффлайна: когда количество сердцебиений внезапно падает,Прекратите удалять Пример слишком быстро.
Повышение доступности системы:существовать Дрожание сети или кратковременные проблемы с подключением Вниз,Гарантийное обслуживание в системе Примердержи как можно большесуществовать Проволока。
  • Недостатки: если экземпляр службы действительно недоступен, реестр Eureka может не обновляться вовремя, что влияет на точность обнаружения службы.

Принцип работы

  • Рассчитайте ожидаемую частоту обновления пульса: Eureka вычисляет ожидаемое общее количество продлений пульса на основе количества текущих экземпляров службы в реестре.
Язык кода:java
копировать
    protected void updateRenewsPerMinThreshold() {
        this.numberOfRenewsPerMinThreshold = (int) (this.expectedNumberOfClientsSendingRenews
                * (60.0 / serverConfig.getExpectedClientRenewalIntervalSeconds())
                * serverConfig.getRenewalPercentThreshold());
    }


# Возьмите Пример выше в качестве примера
int(3 (Примерчисло) * (60.0 / 30(время продления))* 0.85) = 5
  • Фактическая частота продления ниже ожидаемого порога: если фактическое количество полученных импульсных продлений ниже ожидаемого. 85 % (порог по умолчанию), Эврика автоматически запустится режим самозащиты, думая, что, возможно, возникла проблема с сетью или узел недоступен.
  • пауза Примерофлайн:существоватьрежим самозащиты Вниз,Eureka Приостановите отбраковку необновленных экземпляров до тех пор, пока частота сердечных сокращений не вернется к нормальному уровню.

Справочная документация

Профиль

👋 привет, я Lorin Лорейн, один Java Разработчик бэкэнд-технологий!девиз:Technology has the power to make the world a better place.

🚀 Моя страсть к технологиям — это моя мотивация продолжать учиться и делиться ими. Мой блог — это место, посвященное экосистеме Java, серверной разработке и новейшим технологическим тенденциям.

🧠 Будучи энтузиастом серверных технологий Java, я не только с энтузиазмом изучаю новые возможности языка и глубину технологий, но также с энтузиазмом делюсь своими идеями и передовым опытом. Я верю, что обмен знаниями и сотрудничество с сообществом могут помочь нам расти вместе.

💡 В моем блоге вы найдете подробные статьи об основных концепциях Java, базовой технологии JVM, часто используемых платформах, таких как Spring и Mybatis, управлении базами данных, таких как MySQL, промежуточном программном обеспечении для обработки сообщений, таком как RabbitMQ и Rocketmq, оптимизации производительности и т. д. Я также поделюсь некоторыми советами по программированию и методами решения проблем, которые помогут вам лучше освоить программирование на Java.

🌐 Я поощряю взаимодействие и создание сообщества, поэтому, пожалуйста, оставляйте свои вопросы, предложения или запросы по темам и дайте мне знать, что вас интересует. Кроме того, я буду делиться последними новостями Интернета и технологий, чтобы вы всегда были в курсе последних событий в мире технологий. Я с нетерпением жду возможности вместе с вами двигаться вперед по пути технологий и исследовать безграничные возможности мира технологий.

📖 Следите за обновлениями моего блога и давайте вместе стремиться к техническому совершенству.

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose