Eureka作为SpringCloud全家桶的注册中心,最常说到的问题就是他与zookeeper的区别是什么,我们都知道ACP(可用性、一致性、分区容错性),那么P是必须要保证的,而三者又不可能同时满足,那么在设计的时候就看各自产品的侧重点了,Eureka和Zookeeper两个都能够作为注册中心使用,他们的主要区别是zookeeper保证的是CP(一致性,分区容错性),而Eureka保证的是AP(可用性和分区容错性)!
废话说完了,直接看看怎么写一个Eureka吧!
同时附上我练习时搭建的一个简单的SpringCloud项目,其中包含了feign、swagger-ui、rabbitmq、redis、aop、定时任务、文件上传于下载、excel导出、多数据源配置等demo,该项目也包含了SpringCloud的常用组件:
下载链接://download.csdn.net/download/weixin_45417573/12104123
一、创建服务
Eureka是作为一个独立的服务存在的,所以首先我们要创建一个Eureka服务,也就是一个Springboot项目,这一部分就不做多的叙述,当然,作为微服务的一部分,自然也是作为项目的其中一个子服务存在!
二、添加依赖
这里要注意的是,Eureka服务需要添加EurekaServer依赖,其他服务也要添加EurekaClient的依赖
1、Servcer
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>
spring-cloud-starter-netflix-eureka-server
</artifactId>
</dependency>
2、Client
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>
spring-cloud-starter-netflix-eureka-client
</artifactId>
</dependency>
三、添加启动类注解
同样,这里有服务和客户端的区别
1、Server
@EnableEurekaServer
2、Client
@EnableEurekaClient
四、修改yml配置
这里依旧分为服务和客户端的区别
1、Server
这两个false至关重要,也是与client的主要区别
eureka:
server:
#关闭eureka的自我保护机制(开发阶段)
enable-self-preservation: false
instance:
#prefer-ip-address: true #以IP地址注册到服务中心,相互注册使用IP地址
hostname: eureka1 #以服务名注册到服务中心(集群之间互相区分)
#最后一次心跳后间隔多久没有心跳认定服务不可用(一次心跳30秒)
lease-expiration-duration-in-seconds: 60
client:
serviceUrl:
defaultZone: http://localhost:8000/eureka
#不将自己注册到eureka中
register-with-eureka: false
#不拉取注册信息
fetch-registry: false
关于保护机制,简单的说是eureka会与服务之间有一个心跳检测机制,心跳默认30秒发送一次,如果60秒(我们自己配置的60秒,默认是90秒)收不到心跳反馈,eureka就会认为服务是不可用的,但是eureka并不认为服务是真的不可用了,所以也就不会删除其注册信息,而是将注册信息保护起来,有时候我们看到eureka页面上出现EMERGENCY!EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT.RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEGING EXPIRED JUST TO BE SAFE
的红色警告就是这个原因,但是开发阶段由于频繁的重启服务可能导致保护机制的启用,可以暂时关闭保护机制!
2、Client
eureka:
instance:
prefer-ip-address: true #以IP地址注册到服务中心,相互注册使用IP地址
client:
serviceUrl:
defaultZone: http://localhost:8000/eureka/
五、测试
首先启动eureka服务,然后启动其他的服务,启动后在浏览器中访问eureka服务看有没有如下网页,网页中如果有你注册的相关服务即可判断eureka是否正确:
注意,访问的时候直接访问ip:端口,后面不要加eureka!!