Всем привет, мы снова встретились, я ваш друг Цюаньчжаньцзюнь.
Примерно в прошлом году я обнаружил, что при использовании эврики в производственной среде я часто обнаруживал, что служба приостановлена и эврика не запускается. Тогда мне пришла в голову идея попробовать другой центр регистрации. Потом я узнал о nacos. , который оказался интегрирован с центром конфигурации. Однако из-за опасений по поводу нестабильной производственной среды и потери данных во время переключения я так и не переключился. Однако в этой статье я поменяю центр регистрации последующих проектов. смоделировать, как плавно переключить эврику на нако.
Здесь я создал отдельный родительский проект внутри родительского проекта и смоделировал старый и новый микросервисы в Alibaba-cloud и Netflix-cloud соответственно.
<?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>top.fate</groupId>
<artifactId>nacoAndEureka</artifactId>
<packaging>pom</packaging>
<version>1.0.0</version>
<modules>
<module>netflix-cloud</module>
<module>alibaba-cloud</module>
</modules>
</project>
netflix-cloud Пом выглядит следующим образом ,Потому что это имитация старого сервиса,Так что все используют старую версию
<?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">
<parent>
<artifactId>nacoAndEureka</artifactId>
<groupId>top.fate</groupId>
<version>1.0.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>netflix-cloud</artifactId>
<packaging>pom</packaging>
<modules>
<module>eureka</module>
<module>eureka-provider</module>
<module>eureka-consumer</module>
</modules>
<properties>
<spring.boot.version>2.1.2.RELEASE</spring.boot.version>
<spring.cloud.version>Greenwich.SR5</spring.cloud.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- springBoot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring.boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- springCloud -->
<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>
</project>
<?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">
<parent>
<artifactId>netflix-cloud</artifactId>
<groupId>top.fate</groupId>
<version>1.0.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>eureka</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
</project>
package top.fate.eureka;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
server:
port: 8761
spring:
application:
name: eureka-service
eureka:
instance:
# Установите имя хоста центра регистрации услуг.
hostname: 127.0.0.1
client:
# Мы создаем центр регистрации сервиса, а не обычное приложение. Это приложение само зарегистрируется в центре регистрации.
# установите значение false, чтобы запретить себе регистрацию.
register-with-eureka: false
# Не извлекайте другие сервисы, поскольку ответственность за обслуживание экземпляров сервиса лежит на самом центре регистрации.
fetch-registry: false
# Определить местонахождение центра регистрации услуг
service-url.defaultZone: http://${
eureka.instance.hostname}:${
server.port}/eureka/
<?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">
<parent>
<artifactId>netflix-cloud</artifactId>
<groupId>top.fate</groupId>
<version>1.0.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>eureka-provider</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
</project>
package top.fate.eurekaprovider;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/** * @auther:Wangxl * @Emile:18335844494@163.com * @Time:2022/6/16 14:23 */
@SpringBootApplication
@EnableEurekaClient
@RestController
public class EurekaProviderApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaProviderApplication.class, args);
}
@GetMapping("/info")
public String info(){
return "this is eureka-service";
}
}
server:
port: 8081
spring:
application:
name: provider
eureka:
client:
service-url:
defaultZone: "http://localhost:8761/eureka"
<?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">
<parent>
<artifactId>netflix-cloud</artifactId>
<groupId>top.fate</groupId>
<version>1.0.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>eureka-consumer</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
</project>
package top.fate.eurekaconsumer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import top.fate.eurekaconsumer.client.EurekaProviderClient;
/** * @auther:Wangxl * @Emile:18335844494@163.com * @Time:2022/6/16 14:43 */
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients(clients = EurekaProviderClient.class)
public class EurekaConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaConsumerApplication.class, args);
}
}
package top.fate.eurekaconsumer.client;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
/** * @auther:Wangxl * @Emile:18335844494@163.com * @Time:2022/6/16 14:48 */
@FeignClient(value = "provider")
public interface EurekaProviderClient {
@GetMapping("info")
String info();
}
package top.fate.eurekaconsumer.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import top.fate.eurekaconsumer.client.EurekaProviderClient;
import javax.annotation.Resource;
/** * @auther:Wangxl * @Emile:18335844494@163.com * @Time:2022/6/16 14:48 */
@RestController
public class ConsumerController {
@Resource
private EurekaProviderClient eurekaProviderClient;
@GetMapping("getProvider")
public String getProvider(){
return eurekaProviderClient.info();
}
}
Здесь все три моих сервиса запускаются нормально, я напрямую обращаюсь к 8091consumer для тестирования. Как показано на рисунке ниже, потребитель может получить доступ к провайдеру.
alibaba-cloud Пом выглядит следующим образом,Используйте последнюю версию стека технологий
<?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">
<parent>
<artifactId>nacoAndEureka</artifactId>
<groupId>top.fate</groupId>
<version>1.0.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>alibaba-cloud</artifactId>
<packaging>pom</packaging>
<modules>
<module>nacos-consumer</module>
<module>nacos-provider</module>
</modules>
<properties>
<spring.boot.version>2.6.3</spring.boot.version>
<spring.cloud.version>2021.0.1</spring.cloud.version>
<spring.cloud.alibaba.version>2021.0.1.0</spring.cloud.alibaba.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- springBoot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring.boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- springCloud -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring.cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- spring-cloud-alibaba -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring.cloud.alibaba.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
Можно обратиться кSpringCloudAlibaba (2) Интеграция центра конфигурации регистрации Nacos Я не буду повторять действия, описанные в этой статье.
<?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">
<parent>
<artifactId>alibaba-cloud</artifactId>
<groupId>top.fate</groupId>
<version>1.0.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>nacos-provider</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2021.0.1.0</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
</project>
package top.fate.nacosprovider;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationProperties;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/** * @auther:Wangxl * @Emile:18335844494@163.com * @Time:2022/6/16 16:55 */
@SpringBootApplication
@RestController
@EnableConfigurationProperties(AutoServiceRegistrationProperties.class)
public class NacosProviderApplication {
public static void main(String[] args) {
SpringApplication.run(NacosProviderApplication.class, args);
}
@GetMapping("/info")
public String info() {
return "this is nacos-service";
}
}
spring.autoconfigure.exclude=org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationAutoConfiguration
url:
nacos: localhost:8848
server:
port: 8082
spring:
application:
name: provider
profiles:
active: dev
cloud:
nacos:
discovery:
#Изоляция среды кластера
cluster-name: shanghai
#пространство имен
namespace: ${
spring.profiles.active}
#Экземпляр персистентности Правда — это временный экземпляр false — постоянный экземпляр Если исключение возникает во временном экземпляре, оно будет удалено напрямую. пока постоянный экземпляр ожидает восстановления
ephemeral: true
#Адрес регистрационного центра
server-addr: ${
url.nacos}
eureka:
client:
service-url:
defaultZone: "http://localhost:8761/eureka"
<?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">
<parent>
<artifactId>alibaba-cloud</artifactId>
<groupId>top.fate</groupId>
<version>1.0.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>nacos-consumer</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2021.0.1.0</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
</project>
package top.fate.nacosconsumer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationProperties;
import org.springframework.cloud.openfeign.EnableFeignClients;
import top.fate.nacosconsumer.client.EurekaProviderClient;
import top.fate.nacosconsumer.client.NacosProviderClient;
import top.fate.nacosconsumer.client.ProviderClient;
/** * @auther:Wangxl * @Emile:18335844494@163.com * @Time:2022/6/16 16:39 */
@SpringBootApplication
@EnableFeignClients(clients = {
EurekaProviderClient.class, NacosProviderClient.class, ProviderClient.class})
@EnableConfigurationProperties(AutoServiceRegistrationProperties.class)
public class NacosConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(NacosConsumerApplication.class, args);
}
}
package top.fate.nacosconsumer.client;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
/** * @auther:Wangxl * @Emile:18335844494@163.com * @Time:2022/6/16 18:24 */
@FeignClient(value = "provider")
public interface ProviderClient {
@GetMapping("info")
String info();
}
package top.fate.nacosconsumer.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import top.fate.nacosconsumer.client.ProviderClient;
import javax.annotation.Resource;
/** * @auther:Wangxl * @Emile:18335844494@163.com * @Time:2022/6/16 14:48 */
@RestController
public class ConsumerController {
@Resource
private ProviderClient providerClient;
@GetMapping("getProvider")
public String getProvider(){
return providerClient.info();
}
}
spring.autoconfigure.exclude=org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationAutoConfiguration
url:
nacos: localhost:8848
server:
port: 8092
spring:
application:
name: nacos-consumer
profiles:
active: dev
cloud:
nacos:
discovery:
#Изоляция среды кластера
cluster-name: shanghai
#пространство имен
namespace: ${
spring.profiles.active}
#Экземпляр персистентности Правда — это временный экземпляр false — постоянный экземпляр Если исключение возникает во временном экземпляре, оно будет удалено напрямую. пока постоянный экземпляр ожидает восстановления
ephemeral: true
#Адрес регистрационного центра
server-addr: ${
url.nacos}
eureka:
client:
service-url:
defaultZone: "http://localhost:8761/eureka"
Сначала запустите nacosProviderApplication.
Как показано на рисунке ниже, мы реализовали двойную регистрацию, и службы были зарегистрированы как в nacos, так и в eureka. Накос
eureka
Здесь я посещаю8091старая версияNetflixКлиент
eureka-consumer
,Посмотрите, как называется8081 eureka Еще 8082 nacos , Здесь я вызывал его неоднократно более десяти раз, и возвращаемый результат:
8091
Только клиентeurekaClient
,тогда нашУ провайдера есть два экземпляра в реестре eureka.
,Так это спровоцировалобалансировка нагрузки
,Здесь мы используем значение по умолчаниюРежим опроса
,Текущий процесс показан ниже.Теперь мы можем начать сглаживать одно за другим
Сменить регистрационный центр
Понятно,Старый провайдер может быть отключен,выключатьстарый провайдер На этом этапе процесс будет таким: показано ниже Понятно
Мы приедем снова в это время
старый потребитель
вернется только this is nacos-service, потому что старый провайдер не в сети , сменился новый провайдер!
Запустите nacoConsumerApplication
Посетите 8092, чтобы проверить, нормальный ли доступ. Продолжайте получать доступ к интерфейсу getProvider. Как показано на рисунке ниже, доступ нормальный. Затем мы можем отключить старую потребительскую службу.
Теперь у нас есть сомнения. Центров регистрации сейчас два, открытие сервиса делать через эврику или накос? С этой целью я провёл эксперимент и запустил.
старый провайдер
、новый провайдер
、новый потребитель
В настоящее время услуги центра двойной регистрации
теперь япроходитьconsumer8092
Клиент по запросу,Единственный полученный результат this is nacos-service , поэтому считается, что центр регистрации по умолчанию использует nacos.
Из-за уходаnacos
вернется толькоthis is nacos-service
, Есть только один экземпляр нако.
если пойтиЕсли используется эврика, она опросит и вернет это nacos-service, это eureka-service
, у эврики есть два экземпляра.
Схема движения на данный момент
Пунктирная линия означает, что линия свободна.
Здесь я нашел исходный код CompositeDiscoveryClient,Точка останова была установлена при вызове,Создание системы обнаружения Понятно
Три открытия Клиенты
,nacos
первый в очереди,Если он доступен, он вернется напрямую, поэтому можно понять, что по умолчанию используется nacos.
Здесь я подумал, что у nacos есть функция автономного обслуживания. Если я отключу сервис в nacos, мне придется перейти на эврику.
Подождав несколько секунд,проходитьconsumer8092
Клиент по запросу,получать Понятнорезультат, который я хочу
Опрос вернулся отдельно this is nacos-service
、this is eureka-service
,Это доказывает, что эврика использовалась
График движения на данный момент
Пунктирная линия означает, что линия свободна.В настоящее время мы производим вышеуказанное новый потребитель、новый провайдер、eureka、nacos,Поскольку мы переходим на накос, эврика тоже будет остановлена.,мы можем
Доверия и настройки эврики будут удалены из следующей версии сервиса.
,Оставь только нако,После развертывания этой новой версии вы можете остановить эврику.
Как показано ниже
Если вы напрямую введете eureka-client и nacos-client, будет сообщено об ошибке следующим образом:
Field autoServiceRegistration in org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationAutoConfiguration required a single bean, but 2 were found:
- nacosAutoServiceRegistration: defined by method 'nacosAutoServiceRegistration' in class path resource [com/alibaba/cloud/nacos/registry/NacosServiceRegistryAutoConfiguration.class]
- eurekaAutoServiceRegistration: defined by method 'eurekaAutoServiceRegistration' in class path resource [org/springframework/cloud/netflix/eureka/EurekaClientAutoConfiguration.class]
spring.autoconfigure.exclude=org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationAutoConfiguration
@EnableConfigurationProperties(AutoServiceRegistrationProperties.class)
Издатель: Лидер стека программистов полного стека, укажите источник для перепечатки: https://javaforall.cn/171872.html Исходная ссылка: https://javaforall.cn