SpringCloud——(二)组件:eureka

Spring-Cloud项目的搭建 


因为spring-cloud是基于spring-boot项目来的,所以我们项目得是一个spring-boot项目,这里要注意的一个点是spring-cloud的版本与spring-boot的版本要对应下图:

参考:https://spring.io/projects/spring-cloud-alibaba 或 https://spring.io/projects/spring-cloud

SpringCloud常用组件 

服务发现——Netflix Eureka

客服端负载均衡——Netflix Ribbon

断路器——Netflix Hystrix

服务网关——Netflix Zuul

分布式配置——Spring Cloud Config 

本文使用版本

SpringBoot :2.2.6

SpringCloud: Hoxton.SR3

<!--SpringBoot-->
<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.2.6.RELEASE</version>
        </dependency>
</dependencies>

<!--SpringCloud-->
<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR3</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
</dependencyManagement>

一、Spring-Cloud-Netflix组件:Eureka

作用:实现服务治理(服务注册与发现)

简介:

Eureka是Netflix(https://spring.io/projects/spring-cloud-netflix)的子模块之一,也是一个核心的模块,Eureka里有2个组件:

1、EurekaServer 用作服务注册中心。支持集群部署。

这个是用于定位服务以实现中间层服务器的负载平衡和故障转移

2、EurekaClient 是一个java客户端,用来处理服务注册与发现。

用于与Server交互的,可以使得交互变得非常简单:只需要通过服务标识符即可  拿到服务。

与spring-cloud的关系:

Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务注册和发现(可以对比Zookeeper)。

Eureka 采用了 C-S 的设计架构。Eureka Server 作为服务注册功能的服务器,它是服务注册中心。

而系统中的其他微服务,使用 Eureka 的客户端连接到 Eureka Server并维持心跳连接。这样系统的维护人员就可以通过 Eureka Server 来监控系统中各个微服务是否正常运行。(在应用启动时,Eureka客户端向服务端注册自己的服务信息,同时将服务端的服务信息缓存到本地。客户端会和服务端周期性的进行心跳交互,以更新服务租约和服务信息。)

SpringCloud 的一些其他模块(比如Zuul)就可以通过 Eureka Server 来发现系统中的其他微服务,并执行相关的逻辑。

角色关系图:

二、搭建一个简单的Eureak (单机版)

1、EurekaServer加入依赖 :

    <dependencies>      
        <!--服务端-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
    </dependencies>

EurekaServer服务端配置:application.yml

例如: 

server:
  port: 3000
eureka:
  server:
    enable-self-preservation: false  #关闭自我保护机制
    eviction-interval-timer-in-ms: 4000 #设置清理间隔(单位:毫秒 默认是60*1000)
  instance:
    hostname: localhost


  client:
    registerWithEureka: false #表示是否注册自身到eureka服务器,因为当前这个应用就是eureka服务器,没必要注册自身
    fetchRegistry: false  #不需要从服务端获取注册信息(因为在这里自己就是服务端,而且已经禁用自己注册了)
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka

在spring-boot启动项目上 加入注解:@EnableEurekaServer 就可以启动项目了

如果看见这个图片,那么说明你就搭建好了:

注意:这个警告只是说你把他的自我保护机制关闭了。(因为.yml文件中设置了enable-self-preservation: false)

打开自我保护机制:如果某台机器宕机,Eureka会认为是自己问题。

2、EurekaClient加入依赖 :

    <dependencies>
        <!--客户端-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>     
    </dependencies>

EurekaClient客户端配置:application.yml

例如:

server:
  port: 6000
eureka:
  client:
    serviceUrl:
        defaultZone: http://localhost:3000/eureka/  #eureka服务端提供的注册地址 参考服务端配置的这个路径
  instance:
  	
    instance-id: power-1 #此实例注册到eureka服务端的唯一的实例ID 
    prefer-ip-address: true #是否显示IP地址
    leaseRenewalIntervalInSeconds: 10 #eureka客户需要多长时间发送心跳给eureka服务器,表明它仍然活着,默认为30 秒 (与下面配置的单位都是秒)
    leaseExpirationDurationInSeconds: 30 #Eureka服务器在接收到实例的最后一次发出的心跳后,需要等待多久才可以将此实例删除,默认为90秒

spring:
  application:
    name: server-power #此实例注册到eureka服务端的name 

在客户端的spring-boot启动项目上 加入注解:@EnableEurekaClient 就可以启动项目了

看效果图:

如果配置多个EurekaClient,那么如下图:

三、Eureka集群

Eureka集群原理

服务启动后向Eureka注册,Eureka Server会将注册信息向其他Eureka Server进行同步,当服务消费者要调用服务提供者,则向服务注册中心获取服务提供者地址,然后会将服务提供者地址缓存在本地,下次再调用时,则直接从本地缓存中取,完成一次调用。

此处单台机器模拟集群:修改文件【C:\Windows\System32\drivers\etc 中的 hosts】增加 域名的映射

注意:集群配置与单体不同的点在于 原来是把服务注册到自己身上,而现在是注册到其它服务身上。Why?

Eureka的server会把自己的注册信息与其他的server同步,所以这里我们不需要注册到自己身上,因为另外两台服务器会配置本台服务器。

1、配置服务端 EurekServer

假设我们有3个Eureka Server 模块如图: 

配置时注意:是注册到其他的服务上 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

配置服务端子模块 eureka3000:application.yml

server:
  port: 3000
eureka:
  server:
    enable-self-preservation: false  #关闭自我保护机制
    eviction-interval-timer-in-ms: 4000 #设置清理间隔(单位:毫秒 默认是60*1000)
  instance:
    hostname: eureka3000.com


  client:
#    registerWithEureka: false #表示是否注册自身到eureka服务器,因为当前这个应用就是eureka服务器,没必要注册自身
#    fetchRegistry: false  #不需要从服务端获取注册信息(因为在这里自己就是服务端,而且已经禁用自己注册了)
    serviceUrl:
      defaultZone: http://eureka3001.com:3001/eureka,http://eureka3002.com:3002/eureka

配置服务端子模块 eureka3001:application.yml

server:
  port: 3001
eureka:
  server:
    enable-self-preservation: false  #关闭自我保护机制
    eviction-interval-timer-in-ms: 4000 #设置清理间隔(单位:毫秒 默认是60*1000)
  instance:
    hostname: eureka3001.com


  client:
#    registerWithEureka: false #表示是否注册自身到eureka服务器,因为当前这个应用就是eureka服务器,没必要注册自身
#    fetchRegistry: false  #不需要从服务端获取注册信息(因为在这里自己就是服务端,而且已经禁用自己注册了)
    serviceUrl:
      defaultZone: http://eureka3000.com:3000/eureka,http://eureka3002.com:3002/eureka

配置服务端子模块 eureka3002:application.yml

server:
  port: 3002
eureka:
  server:
    enable-self-preservation: false  #关闭自我保护机制
    eviction-interval-timer-in-ms: 4000 #设置清理间隔(单位:毫秒 默认是60*1000)
  instance:
    hostname: eureka3002.com


  client:
#    registerWithEureka: false #表示是否注册自身到eureka服务器,因为当前这个应用就是eureka服务器,没必要注册自身
#    fetchRegistry: false  #不需要从服务端获取注册信息(因为在这里自己就是服务端,而且已经禁用自己注册了)
    serviceUrl:
      defaultZone: http://eureka3000.com:3000/eureka,http://eureka3001.com:3001/eureka

配置完毕后,全部启动查看:

http://eureka3000.com:3000/

 

http://eureka3001.com:3001/

 

http://eureka3002.com:3002/

 

2、配置客户端 EurekClient

配置客户端子模块 user:application.yml

server:
  port: 5000
eureka:
  client:
    serviceUrl:
      defaultZone: http://eureka3000.com:3000/eureka/,http://eureka3001.com:3001/eureka/,http://eureka3002.com:3002/eureka/  #eureka服务端提供的注册地址 参考服务端配置的这个路径
  instance:
    instance-id: user-1 #此实例注册到eureka服务端的唯一的实例ID
    prefer-ip-address: true #是否显示IP地址
    leaseRenewalIntervalInSeconds: 10 #eureka客户需要多长时间发送心跳给eureka服务器,表明它仍然活着,默认为30 秒 (与下面配置的单位都是秒)
    leaseExpirationDurationInSeconds: 30 #Eureka服务器在接收到实例的最后一次发出的心跳后,需要等待多久才可以将此实例删除,默认为90秒

spring:
  application:
    name: client-user #此实例注册到eureka服务端的name

注意:原来是注册到一个地址上面,现在是要写三个eureka注册地址,但是不是代表他会注册三次,因为我们eureka server的注册信息是同步的,这里只需要注册一次就可以了,但是为什么要写三个地址呢?????????因为这样就可以做到高可用的配置:比如有3台服务器,突然宕机了一台, 但是其他2台还健在,依然可以注册我们的服务,换句话来讲, 只要有一台服务还建在,那么就可以注册服务。

总结:服务随便注册到哪个eureka server上,其他的eureka server上都有该服务的注册信息。

3、 测试

先启动EurekaServer中的一个服务:比如【eureka3000】 ,再启动客户端 user

 

接着启动EurekaServer中的一个服务:比如【eureka3001】


四、Eureka对比Zookeeper:

Zookeeper

Eureka

 Zookeeper在设计的时候遵循的是CP原则,即一致性。Eureka在设计的时候遵循的是AP原则,即可用性。

Zookeeper会出现这样一种情况:当master节点因为网络故障与其他节点失去联系时,剩余节点会重新进行leader选举,问题在于,选举leader的时间太长:30~120s,且选举期间整个Zookeeper集群是不可用的,这就导致在选举期间注册服务处于瘫痪状态,在云部署的环境下,因网络环境使Zookeeper集群失去master节点是较大概率发生的事情,虽然服务能够最终恢复,但是漫长的选举时间导致长期的服务注册不可用是不能容忍的。

Eureka各个节点(服务)是平等的, 没有主从之分,几个节点down掉不会影响正常工作,剩余的节点(服务) 依然可以提供注册与查询服务,而Eureka的客户端在向某个Eureka注册或发现连接失败,则会自动切换到其他节点,也就是说,只要有一台Eureka还在,就能注册可用(保证可用性), 只不过查询到的信息不是最新的(不保证强一致);

除此之外,Eureka还有自我保护机制,如果在15分钟内超过85%节点都没有正常心跳,那么eureka就认为客户端与注册中心出现了网络故障,此时会出现以下情况:

1:Eureka 不再从注册列表中移除因为长时间没有收到心跳而过期的服务。

2:Eureka 仍然能够接收新服务的注册和查询请求,但是不会被同步到其它节点上(即保证当前节点可用)

3:当网络稳定后,当前实例新的注册信息会被同步到其它节点中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值