Spring Cloud 学习 | - 02 - Eureka集群实现高可用
文章目录Spring Cloud 学习 | - 02 - Eureka集群实现高可用1. 启动Eureka1.1 启动Eureka注册服务11.2 启动Eureka注册服务2和32. 注册中心服务提供者2.1 新建 `Spring Boot` 项目2.2 添加服务发现注解2.3 编写配置文件`application.yml`2.4 启动并访问Eureka注册中心2.5 问题反思Spring Cl.
文章目录
Spring Cloud 学习 | - 02 - Eureka集群实现高可用
学习
Spring Cloud
之路,文中Spring Boot
版本为2.1.3.RELEASE
,Spring 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:8762
和 eureka:8763
发现无可用实例,注册到 eureka:8761
上的应用 user-provider
已被移除。
这样自然也就达不到我们的Eureka的高可用要求。
所以,我们服务注册的时候,要注册到所有eureka的节点上,保证服务的高可用。
更多推荐
所有评论(0)