一、介绍
-
Spring-Cloud Euraka介绍
Spring-Cloud Euraka是Spring Cloud集合中一个组件,它是对Euraka的集成,用于服务注册和发现。Eureka是Netflix中的一个开源框架。它和 zookeeper、Consul一样,都是用于服务注册管理的,同样,Spring-Cloud 还集成了Zookeeper和Consul。
在项目中使用Spring Cloud Euraka的原因是它可以利用Spring Cloud Netfilix中其他的组件,如zull等,因为Euraka是属于Netfilix的。
-
Euraka介绍
Eureka由多个instance(服务实例)组成,这些服务实例可以分为两种:Eureka Server和Eureka Client。为了便于理解,我们将Eureka client再分为Service Provider和Service Consumer。
- Eureka Server 提供服务注册和发现 Service Provider
- 服务提供方,将自身服务注册到Eureka,从而使服务消费方能够找到 Service
- Consumer服务消费方,从Eureka获取注册服务列表,从而能够消费服务
-
Eureka与Zookeeper比较
首先介绍下cap原理,可以参考:http://www.ruanyifeng.com/blog/2018/07/cap.html。
P:Partition tolerance,网络分区容错。类似多机房部署,保证服务稳定性。
A: Availability,可用性。
C:Consistency ,一致性。
CAP定理:CAP三个属性对于分布式系统不同同时做到。如AP/CP/AC。再来看Zookeepr区别:(1)Zookeeper是CP,分布式协同服务,突出一致性。对ZooKeeper的的每次请求都能得到一致的数据结果,但是无法保证每次访问服务可用性。如请求到来时,zookeer正在做leader选举,此时不能提供服务,即不满足A可用性。
(2)Euere是AP,高可用与可伸缩的Service发现服务,突出可用性。相对于Zookeeper而言,可能返回数据没有一致性,但是保证能够返回数据,服务是可用的。
这里有篇文章介绍为什么服务发现使用Eureka,而不是Zookeeper。http://dockone.io/article/78
二、部署Eureka Server
-
新建项目,选择Eurek Server组件
-
启动类
通过@EnableEurekaSwerver来标识该服务为Eureka Server。
@SpringBootApplication @EnableEurekaServer public class CloudEurekaApplication { public static void main(String[] args) { SpringApplication.run(CloudEurekaApplication.class, args); } }
-
配置application.yml
server: port: 7900 spring: application: name: eureka eureka: client: register-with-eureka: false fetch-registry: false service-url: defaultZone: http://localhost:7900/eureka/
-
admin页面属性
启动,访问http://localhost:7900
三、部署Eureka Client
-
Eureka Client包括两个服务模块:Service Provider(服务提供方)和Service
Consumer(服务消费方)。 -
Eureka Client和Eureka Server目录类似, 不同点在于:
启动类,使用@EnableDiscoveryClient 标识该服务为Euraka Client 配置文件,需要指定Euraka
Server地址和当前服务注册时的名称。 -
问题:关于Servie Customer是否需要在Euraka Server中进行注册呢?
不一定。Service Customer只是从Eureka Serve中获取注册服务的地址信息,如果Service Customer 本身也是一个Service Porvider,那么此时就需要注册服务了。
四、eureka的一些优化
- 修改配置
server:
# 自我保护,默认为开启,在服务少时可优化为关闭。。服务多时请勿关闭(避免发生那些因为网络问题而被剔除出去的服务器本身是很”健康“)
enable-self-preservation: false
# 自我保护阈值
renewal-percent-threshold: 0.85
# 剔除服务时间间隔
eviction-interval-timer-in-ms: 1000
# 关闭从readOnly读注册表缓存
use-read-only-response-cache: false
# readwrite 和 readOnly 同步时间间隔
response-cache-update-interval-ms: 1000
五、Eureka操作
-
查看服务实例信息。格式如下
/eureka/apps/{appName}
举例如下:
方法 GET 接口 http://localhost:7900/eureka/apps/API-PASSENGER
结果为
<application> <name>API-PASSENGER</name> <instance> <instanceId>DESKTOP-5A72R4E:api-passenger:8080</instanceId> <hostName>DESKTOP-5A72R4E</hostName> <app>API-PASSENGER</app> <ipAddr>192.168.1.5</ipAddr> <status>UP</status> <overriddenstatus>UNKNOWN</overriddenstatus> <port enabled="true">8080</port> <securePort enabled="false">443</securePort> <countryId>1</countryId> <dataCenterInfo class="com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo"> <name>MyOwn</name> </dataCenterInfo> <leaseInfo> <renewalIntervalInSecs>30</renewalIntervalInSecs> <durationInSecs>90</durationInSecs> <registrationTimestamp>1621049122335</registrationTimestamp> <lastRenewalTimestamp>1621049242067</lastRenewalTimestamp> <evictionTimestamp>0</evictionTimestamp> <serviceUpTimestamp>1621049121731</serviceUpTimestamp> </leaseInfo> <metadata> <management.port>8080</management.port> </metadata> <homePageUrl>http://DESKTOP-5A72R4E:8080/</homePageUrl> <statusPageUrl>http://DESKTOP-5A72R4E:8080/actuator/info</statusPageUrl> <healthCheckUrl>http://DESKTOP-5A72R4E:8080/actuator/health</healthCheckUrl> <vipAddress>api-passenger</vipAddress> <secureVipAddress>api-passenger</secureVipAddress> <isCoordinatingDiscoveryServer>false</isCoordinatingDiscoveryServer> <lastUpdatedTimestamp>1621049122335</lastUpdatedTimestamp> <lastDirtyTimestamp>1621049121523</lastDirtyTimestamp> <actionType>ADDED</actionType> </instance> </application>
-
下线操作
2.1. 客户端直接停止服务
下线 这种方式没有办法立刻让注册中心感知到,需要注册中心等待某一时间没有收到心跳之后,才将这个服务从注册列表中移除。 恢复上线 此种方式下对应上线操作,就是重新部署。
2.2 客户端通知Eureka下线
下线 使用actuator由客户端(记住是客户端发起,不是服务端发起)发起下线。调用客户端actuator提供的/shutdown/接口。执行完此操作之后,不仅停止了服务,还从eureka下线了。 (1)在项目中引用actuator: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> (2)配置文件中添加 #启用shutdown endpoints.shutdown.enabled=true #不进行密码验证(线上环境应该设置为true) management.security.enabled=false (3)通过POST方式执行实例的http://localhost:8080/shutdown。在postman执行结果如下:
2.3 Eureka的delete操作
下线 delete格式为: 方法:DELETE 接口:/eureka/apps/{appName}/{instanceID} 例如: http://localhost:7900/eureka/apps/API-PASSENGER/DESKTOP-5A72R4E:api-passenger:8080 注意:Eureka客户端每隔一段时间(默认30秒)会发送一次心跳到注册中心。在通过delte方式下线一个服务时,如果没有停掉的该服务,那么该服务很快就又会注册到Eureka。所以在使用这种方式时,可以先kill掉服务,然后再执行delete操作,从注册中心移除改服务。
2.4 设置Eureka的服务实例状态
有时候我们下线服务实例之后,需要在不重新部署服务实例的情况下,重新上线服务实例。此时就使用这种方式。下线 接口方式如下 方法:PUT 接口:/eureka/apps/{appName}/{instanceId}/status?value=OUT_OF_SERVICE
执行结果如下图,改实例状态变为OUT_OF_SERVICE
恢复上线 接口方式如下: 方法: DELETE 接口: /eureka/apps/{appName}/{instanceId}/status?value=UP
执行后的结果为,服务实例重新上线,状态为”UP”
六、eureka的集群部署
官方给的有例子
https://docs.spring.io/spring-cloud-netflix/docs/3.0.2/reference/html/#spring-cloud-eureka-server-peer-awareness