Springcloud 服务注册与发现 Eureka

Springcloud项目中,服务提供者对外提供服务,服务消费者进行消费服务,如果微服务很多,就需要一个服务管理中心去统一管理服务,而消费者在调用服务时就可以去这个管理中心中去查找需要调用的服务进行调用。
EurekaSpringcloud中就作为最常用的服务注册与发现的组件,下面主要记录一下Eureka的基本原理与使用方法。

Eureka是什么

EurekaNetflix的核心模块之一,它采用CS架构,基于CAP理论中的AP原则,是一种高可用的服务注册中心, 用于服务发现和故障转移。

Eureka架构

Eureka架构图
Eureka的原理简述如下:

  1. Eureka Server 启动后,当微服务客户端(Eureka Client/Application Client)启动时,根据配置将服务信息(服务主机ip、端口、服务名称等)注册到Eureka Server中;

  2. 当Eureka客户端(Eureka Client/Application Client)启动时,根据配置将服务信息(服务主机ip、端口、服务名称等)注册到Eureka Server中;

  3. Eureka Server 通过Replicate复制方式向Eureka集群中其他各个节点的Eureka Server同步服务信息;

  4. 服务消费者调用微服务时,先去Eureka Server中去查找可用的服务;

  5. Eureka Server 通过查找可用的服务信息,并返回给Eureka Client进行调用。

Eureka的自我保护机制

Eureka Server启动后,Eureka Client每隔30s便会给Eureka Server发送心跳,以表示自己的可用状态,如果在指定的心跳周期内(默认90s),没有收到某个Client的心跳,造成server没有收到client心跳的原因大体分为两种:

  1. 该Client确实已经down了,不能提供服务, 此时Eureka Server按理应该删除和注销该Client在注册中心的信息;
  2. 该Client本身服务正常,但是由于网络分区的原因导致收Server收不到该Client的心跳,此时如果删除Client的注册信息,那将是不合理而且危险的。

基于上述两点,Eureka Server无法确定是由于哪种原因导致的收不到Client的心跳,所以Eureka Server会启动自我保护机制:不再删除和注销任何微服务的注册信息,即使该服务真的不可用。当网络恢复正常(所有的Client都能正常发送心跳)时,Eureka Server将推出自我保护。

Eureka的另一种自我保护机制:当超过15分钟没有接收到85%的Client的心跳时,EurekaServer认为出现网络分区错误,则:

  1. 不再从注册中心删除任何长时间没有发送心跳的过期Client的注册信息;
  2. 如果接收到新的Client的心跳,不再进行节点同步;
  3. 如果网络恢复正常(正常接收到Client心跳)后,则同步节点信息。

Eureka的高可用性

分布式数据库系统满足CAP定理,由于网络分区原因,P(Partition Tolerance分区容错)是必须要解决而且保证的,C(Consistant强一致性)和A(Avalibale可用性)不可能同时满足,所以需要根据需要进行两者之间的权衡。Eureka是AP原则实现的,保证了集群的高可用。
Eureka集群的每个节点都是平等的,没有master-slave(主从)关系,当其中某个节点down掉之后,其他的节点是没有影响的,继续提供服务,Eureka中的负载均衡器会寻找其他的可用的节点继续提供服务,除非所有节点都不可用。

Eureka和Zookeeper的区别

Zookeeper是基于CP原则实现的,集群采用master-slave模式,当master节点出现故障后,其他的slave节点将会进行选举新的mater,这个选举过程一般在30s-120s,此段时间内,整个集群是不可用的。
Eureka是基于AP原则实现的,具有高可用性。

Eureka 在Springcloud项目中的使用

1. Eureka Server构建

  1. pom.xml:
		<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka-server</artifactId>
        </dependency>
  1. application.yml:
server:
	port: 7010
eureka:
  instance:
    hostname: eureka7001.com  		#服务主机名
  client:
    register-with-eureka: false		#不把自己注册进注册中心
    fetch-registry: false			#发现服务时不用检查自己
    service-url:
    	# 单机时只需指定自己
    	# defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka   
    	 #集群中不必指定自己,只需指定其他的节点的访问地址 ,中间用逗号分隔
      	defaultZone: http://eureka7002.com:7002/eureka,http://eureka7003.com:7003/eureka  

  1. 主启动类添加启用EurekaServer注解
@SpringBootApplication
@EnableEurekaServer             // 启用EurekaServer
public class App {
    public static void main( String[] args )  {
        SpringApplication.run(App.class, args);
    }
}
  1. 浏览器中访问所配置的地址,即可访问Eureka的注册中心页面
    Eureka的后台界面

Eureka Client构建

  1. pom.xml
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-config</artifactId>
</dependency>
  1. application.yml
eureka:
  client:
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka,http://eureka7003.com:7003/eureka
  instance:
    appname: aitao-sevice-usercenter8003    
    prefer-ip-address: true  # 可以显示微服务主机ip
  1. 启动类添加@EnableEurekaClient注解。
发布了8 篇原创文章 · 获赞 3 · 访问量 843

猜你喜欢

转载自blog.csdn.net/weixin_40203134/article/details/87941034