Spring Cloud 学习 | - 02 - Eureka集群实现高可用

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/E09620126/article/details/88872719

Spring Cloud 学习 | - 02 - Eureka集群实现高可用

学习 Spring Cloud 之路,文中 Spring Boot 版本为 2.1.3.RELEASESpring Cloud 版本为 Greenwich.SR1 。因能力有限,难免会有不足或者错误之处,还望不吝指正,谢!

注:本文基于上一篇 Spring Cloud 学习 | - 01 - Eureka服务注册与发现 所写,前提创建Eureka注册中心及注册客户端服务到Eureka中心~

1. 启动Eureka

1.1 启动Eureka注册服务1

启动Eureka服务,端口为8761,我们注册到8762和8763上,完整配置如下:
application.yml

## app port conf
server:
  port: 8761
spring:
  application:
    name: spring-cloud-eureka
eureka:
  client:
    service-url:
      # EurekaServer的地址,现在是自己的地址,如果是集群,需要加上其它Server的地址
      defaultZone: http://localhost:8762/eureka
    register-with-eureka: false #由于该应用为注册中心,所以设置为false,代表不向注册中心注册自己
    fetch-registry: false #由于注册中心的职责就是维护服务实例,它并不需要去检索服务,所以也设置为false

启动完成后,访问http://localhost:8761/,我们看到:
在这里插入图片描述

1.2 启动Eureka注册服务2和3

  • 打开Idea运行配置,IDEA右上角运行那里:
    在这里插入图片描述
  • 选定Eureka主启动类,点击左上角,有个Copy Configuration,点击复制:
    在这里插入图片描述
  • 我们修改新复制的启动程序名称为 SpringCloudEurekaApplication-2 ,点击对话框下边的 Apply -> OK
    在这里插入图片描述
  • 修改配置文件 application.yml ,端口改为8762,注册端口那里改为8761和8763,完整配置如下:
## app port conf
server:
  port: 8762
spring:
  application:
    name: spring-cloud-eureka
eureka:
  client:
    service-url:
      # EurekaServer的地址,现在是自己的地址,如果是集群,需要加上其它Server的地址
      defaultZone: http://localhost:8761/eureka,http://localhost:8763/eureka
    register-with-eureka: false #由于该应用为注册中心,所以设置为false,代表不向注册中心注册自己
    fetch-registry: false #由于注册中心的职责就是维护服务实例,它并不需要去检索服务,所以也设置为false
  • 保存,启动 SpringCloudEurekaApplication-2 ,访问 http://localhost:8762/ ,看到如下图:
    在这里插入图片描述
  • 按照上述方式,新建一个eureka服务3,名称为: SpringCloudEurekaApplication-3,细节部分,此处略,按照上步即可。

2. 注册中心服务提供者

2.1 新建 Spring Boot 项目

利用 Spring Initializr 快速创建一个 Spring Boot 项目: user-provider,主要依赖如下:

		<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>

2.2 添加服务发现注解

在主启动类上添加 @EnableDiscoveryClient 注解:

@SpringBootApplication
@EnableDiscoveryClient
public class UserProviderApplication {

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

2.3 编写配置文件application.yml

application.yml:

server:
  port: 8080
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka,http://localhost:8762/eureka,http://localhost:8763/eureka
  instance:
    prefer-ip-address: true # 返回ip而不是host名称
#    ip-address: 127.0.0.1 # 指定自己的ip信息
spring:
  application:
    name: user-provider

2.4 启动并访问Eureka注册中心

依次访问http://localhost:8761/http://localhost:8762/http://localhost:8763/,我们发现都已经成功注册了 user-provider 服务:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.5 问题反思

在实际过程中,我们发现,user-provider 服务只注册到一个 eureka 中,三个里也是可以都访问到的,配置如下:
application.yml

server:
  port: 8080
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka
  instance:
    prefer-ip-address: true # 返回ip而不是host名称
#    ip-address: 127.0.0.1 # 指定自己的ip信息
spring:
  application:
    name: user-provider

这样,三个eureka注册中心依然是可以都访问到这个user-provider服务的,这是因为3个eureka注册中心之间两两互相注册,也就互相共享了注册到其中的实例。
但是,这样的配置是不能实现eureka的高可用的,我们试想,如果此时8761端口的eureka挂掉了,会怎么样?
PS:为了测试方便,我们关闭了 Eureka 的自我保护记住,配置如下:
application.yml

eureka:
  server:
    enable-self-preservation: false # 关闭自我保护机制

我们停掉8761端口的eureka,这时候,我们发现 user-provider 的控制台一直报异常:

com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server
	at com.netflix.discovery.shared.transport.decorator.RetryableEurekaHttpClient.execute(RetryableEurekaHttpClient.java:112) ~[eureka-client-1.9.8.jar:1.9.8]
	at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.getDelta(EurekaHttpClientDecorator.java:149) ~[eureka-client-1.9.8.jar:1.9.8]
	at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator$7.execute(EurekaHttpClientDecorator.java:152) ~[eureka-client-1.9.8.jar:1.9.8]
	at com.netflix.discovery.shared.transport.decorator.SessionedEurekaHttpClient.execute(SessionedEurekaHttpClient.java:77) ~[eureka-client-1.9.8.jar:1.9.8]
	at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.getDelta(EurekaHttpClientDecorator.java:149) ~[eureka-client-1.9.8.jar:1.9.8]
	at com.netflix.discovery.DiscoveryClient.getAndUpdateDelta(DiscoveryClient.java:1085) [eureka-client-1.9.8.jar:1.9.8]
	at com.netflix.discovery.DiscoveryClient.fetchRegistry(DiscoveryClient.java:967) [eureka-client-1.9.8.jar:1.9.8]
	at com.netflix.discovery.DiscoveryClient.refreshRegistry(DiscoveryClient.java:1479) [eureka-client-1.9.8.jar:1.9.8]
	at com.netflix.discovery.DiscoveryClient$CacheRefreshThread.run(DiscoveryClient.java:1446) [eureka-client-1.9.8.jar:1.9.8]
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_201]
	at java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:266) [na:1.8.0_201]
	at java.util.concurrent.FutureTask.run(FutureTask.java) [na:1.8.0_201]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_201]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_201]
	at java.lang.Thread.run(Thread.java:748) [na:1.8.0_201]

查看 eureka:8762eureka:8763 发现无可用实例,注册到 eureka:8761 上的应用 user-provider 已被移除。
在这里插入图片描述
在这里插入图片描述
这样自然也就达不到我们的Eureka的高可用要求。

所以,我们服务注册的时候,要注册到所有eureka的节点上,保证服务的高可用。

猜你喜欢

转载自blog.csdn.net/E09620126/article/details/88872719