文章目录
Eureka基础知识
服务治理
SpringCloud封装了Netflix公司开发的Eureka模块来实现服务治理
在传统的rpc远程调用框架中,管理每个服务与服务之间依赖关系比较复杂,所以需要使用服务治理,管理服务与服务之间的依赖关系,可以实现服务调用、负载均衡、容错等,实现服务发现与注册。
服务注册与发现?
Eureka采用了CS的设计架构,
Eureka Server
作为服务注册功能的服务器,它是服务注册中心
。而系统中的其他服务,使用Eureka的客户端连接到Eureka Server并维持心跳连接
。这样系统的维护人员就可以通过Eureka Server来监控系统中各个微服务是否正常运行。
在服务注册与发现中,有一个注册中心。当服务器启动的时候,会把当前服务器的信息 比如 服务器通讯地址等以别名方式注册到注册中心上,获取到实际的服务器通讯地址,然后再实现本地RPC调用。
RPC远程调用框架核心设计思想;在于注册中心,因为使用每个服务与服务之间的一个依赖关系(服务治理概念)。在任何RPC框架中都会有一个注册中心(存放服务地址相关信息(接口地址))
Eureka的两个组件?
Eureka Server和Eureka Client
Eureka Server
:
提供服务注册服务
各个微服务节点通过配置启动后,会在EurekaServer中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息
,服务节点的信息可以在界面中直观看到。
Eureka Client
:
通过注册中心进行访问
是一个java客户端,用于简化Eureka Server的交互,客户端同时也具备一个内置的、使用轮询(round-robin)负载算法的负载均衡器
。在应用启动后,将会向Eureka Server发送心跳(默认周期为30秒)
。如果Eureka Server在多个心跳周期内没有收到某个节点的心跳,Eureka Server将会从服务注册表中把这个服务节点移除(默认90秒)
启动类中
Eureka Server
使用 @EnableEurekaServer
注解
Eureka Client
使用 @EnableEurekaClient
注解
单机版Eureka实操
将cloud-eureka-server7001作为Eureka Server(服务注册中心)
引入Eureka Server的pom依赖
<!--eureka-server-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
启动类添加@EnableEurekaServer注解
@SpringBootApplication
@EnableEurekaServer
public class EurekaMain7001 {
public static void main(String[] args){
SpringApplication.run(EurekaMain7001.class, args);
}
}
application.yml
server:
port: 7001
eureka:
instance:
hostname: eureka7001.com #eureka服务端的实例名称
client:
register-with-eureka: false #false表示不向注册中心注册自己。
fetch-registry: false #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
service-url:
#集群指向其它eureka
#defaultZone: http://eureka7002.com:7002/eureka/
#单机就是7001自己
defaultZone: http://eureka7001.com:7001/eureka/
配置服务注册与发现的相关属性?
register-with-eureka
表示是否将自己注册到Eureka Server,默认为true。由于当前这个应用就是Eureka Server,故而设为false。fetch-registry
表示是否从Eureka Server获取注册信息,默认为true。因为这是一个单点的Eureka Server,不需要同步其他的Eureka Server节点的数据,故而设为false。service-url.defaultZone
设置与Eureka Server交互的地址,查询服务和注册服务都需要依赖这个地址。默认是http://localhost:8761
/eureka ;多个地址可使用 , 分隔
。单机就是自己的地址,集群指向其它eureka
- 若在本地配置了host(127.0.0.1 discovery)则地址为http://discovery:8761/eureka
访问
http://localhost:7001/
将cloud-provoder-payment8001注册进Eureka Server成为服务提供者provoder
引入Eureka Client的pom依赖
<!--eureka client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
启动类添加@EnableEurekaClient注解
@SpringBootApplication
@EnableEurekaClient
public class PaymentMain8001 {
public static void main(String[] args){
SpringApplication.run(PaymentMain8001.class, args);
}
}
application.yml中注册、配置Eureka Server地址
eureka:
client:
register-with-eureka: true #向注册中心注册自己。
fetchRegistry: true
service-url:
defaultZone: http://localhost:7001/eureka #注册中心地址
启动后,发现成功注册
将cloud-consumer-order80注册进Eureka Server成为服务消费者consumer
步骤同上,consumer和provider都是属于Eureka Client
引入Eureka Client的pom依赖
启动类添加@EnableEurekaClient注解
application.yml中注册、配置Eureka Server地址
启动,访问
集群版Eureka实操
为什么要用Eureka集群?
为了实现微服务RPC远程服务调用的核心
:高可用
Eureka集群原理?
解决办法:搭建Eureka注册中心集群,实现负载均衡+故障容错
集群注册Eureka的原则?
相互注册 相互守望
将cloud-eureka-server7001和 cloud-eureka-server7002作为Eureka Server(服务注册中心)
只需要变更application.yml,其他和单机版相同
cloud-eureka-server7001的application.yml
server:
port: 7001
eureka:
instance:
hostname: eureka7001.com #eureka服务端的实例名称
client:
register-with-eureka: false #false表示不向注册中心注册自己。
fetch-registry: false #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
service-url:
#集群指向其它eureka
defaultZone: http://eureka7002.com:7002/eureka/
cloud-eureka-server7002的application.yml
server:
port: 7002
eureka:
instance:
hostname: eureka7002.com #eureka服务端的实例名称
client:
register-with-eureka: false #false表示不向注册中心注册自己。
fetch-registry: false #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
service-url:
#集群指向其它eureka
defaultZone: http://eureka7001.com:7001/eureka/
启动后
配置了
http://eureka7002.com:7002/
将8001和80注册到Eureka
8001和80的application.yml
eureka:
client:
register-with-eureka: true #向注册中心注册自己。
fetchRegistry: true
service-url:
# defaultZone: http://localhost:7001/eureka #注册中心地址 单机版
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka #集群版
启动后
actuator微服务信息完善
服务名称修改和可看到ip
之前是这样的
修改application.yml
instance:
instance-id: payment8001 #服务名
prefer-ip-address: true #显示ip
完整
eureka:
client:
register-with-eureka: true #向注册中心注册自己。
fetchRegistry: true
service-url:
# defaultZone: http://localhost:7001/eureka #注册中心地址 单机版
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka #集群版
instance:
instance-id: payment8001 #服务名
prefer-ip-address: true #显示ip
修改后
服务发现Discovery
对于注册进Eureka的服务可以通过服务发现来获取该服务的信息
Eureka的自我保护机制?
eureka虽然收不到实例的心跳,但它认为实例还是健康的,eureka会保护这些实例,不会把它们从注册表中删掉。
默认情况下,当eureka server在一定时间内没有收到实例的心跳,便会把该实例从注册表中删除(默认是90秒)。但是,短时间内丢失大量的实例心跳,便会触发eureka server的自我保护机制,此时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。
Eureka自我保护机制的
目的是避免网络连接故障
。因为微服务只有在启动的时候才会发起注册请求,后面只会发送心跳和服务列表请求,这样的话在发生网络故障时,微服务和注册中心之间无法正常通信,此时eureka如果把微服务误删了,即使网络恢复了,该微服务也不会重新注册到eureka server了
。在自我保护模式下eureka会保护注册表中的信息,不在注销任何微服务,当网络故障恢复后,eureka会自动退出保护模式
。自我保护模式可以让集群更加健壮。
在
开发测试阶段
,需要频繁地重启发布,如果触发了保护机制,则旧的服务实例没有被删除,这时请求有可能跑到旧的实例。所以,在开发测试阶段一般把自我保护模式关闭
。生产环境需要把自我保护机制打开,否则网络一旦出现网络连接故障,就无法恢复。
eureka server
自我保护机制的开启与关闭?
enable-self-preservation
是否开启保护模式 测试时,需要关闭,线上打开
eureka:
server:
#是否开启保护模式 测试时,需要关闭,线上打开
enable-self-preservation: false
#续期时间,即eureka server扫描失效服务的间隔时间默认60000毫秒,即60秒
eviction-interval-timer-in-ms: 5000
eureka client
设置心跳时间和删除实例时间?
lease-renewal-interval-in-seconds
表示客户端向服务器发送心跳的频率,缺省为30s
lease-expiration-duration-in-seconds
表示服务器在收到最后一次心跳之后等待的持续时间,然后才能从其注册表中删除实例。缺省为90s
lease [liːs] n. (房屋、设备或土地的)租约,租契;
expiration [ekspəˈreɪʃn] n. 期满; 截止; 告终;
eureka:
instance:
lease-renewal-interval-in-seconds: 5 # 心跳时间,即服务续约间隔时间(缺省为30s)
lease-expiration-duration-in-seconds: 10 # 发呆时间,即服务续约到期时间(缺省为90s)
client:
healthcheck:
enabled: true # 开启健康检查(依赖spring-boot-starter-actuator)