开始学习微服务(二)

Eureka

1. 来源 

Netflix公司开发,不是Spring公司

2.组件 

EurekaServer(独立项目)用于定位服务,实现中间层服务器负载均衡和故障转移。 EurekaClient(微服务)和Server交互,简化交互,通过服务标识符获得服务

3. 关系

用来实现服务的注册与发现,C-S架构(客户端和服务端)

 4. 使用小坑

2.0之前依赖的名称不一样

新版本的依赖如下:

<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>

注意:

这里我用的是springboot 2.0.2

spring clound 是Finchley.SR2

版本记得配套使用

5. 测试(只有核心和改动的代码

1. 简单的Eureka注册完成

user、power、power中因为在yml中已经配置,可以注释

//    @Bean
//    public TomcatServletWebServerFactory tomcat(){
//        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
//        tomcat.setPort(6000);
//        return  tomcat;
//    }

Eureka服务中心配置yml(这里类名Eureka3000)

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


  client:
    registerWithEureka: false #不把自己作为一个客户端注册到自己身上
    fetchRegistry: false  #不需要从服务端获取注册信息(因为在这里自己就是服务端,而且已经禁用自己注册了)
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka

启动项前加注解

@SpringBootApplication
@EnableEurekaServer
public class AppEureka3000 {
    public static void main(String[] args) {
        SpringApplication.run(AppEureka3000.class);
    }
}

测试:访问网址localhost:3000看能否成功,我是成功了,接下去配置客户端 

客户端(user、power、power1)yml

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

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

spring:
  application:
    name: server-power #此实例注册到eureka服务端的name
server:
  port: 5000
eureka:
  client:
    serviceUrl:
        defaultZone: http://localhost:3000/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

同时在每个user、power、power1启动项前加入注解

@EnableEurekaClient

如:

@SpringBootApplication
@EnableEurekaClient
public class AppUserClient {
    public static void main(String[] args) {
        SpringApplication.run(AppUserClient.class);
    }
}

全部启动,先启动服务中心Eureka3000(注册中心)那个,访问网址

localhost:3000得到如下图

服务通信会有网络波动,从而引出自我保护机制

自我保护机制的工作机制是:如果在15分钟内超过85%的客户端节点都没有正常的心跳,那么Eureka就认为客户端与注册中心出现了网络故障,Eureka Server自动进入自我保护机制,此时会出现以下几种情况:

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

  2. Eureka Server仍然能够接受新服务的注册和查询请求,但是不会被同步到其它节点上,保证当前节点依然可用。

  3. 当网络稳定时,当前Eureka Server新的注册信息会被同步到其它节点中。

因此Eureka Server可以很好的应对因网络故障导致部分节点失联的情况,而不会像ZK那样如果有一半不可用的情况会导致整个集群不可用而变成瘫痪。

但本次测试实现服务失效能自动移除,所以需要关闭自我保护机制。

服务端

enable-self-preservation: false  #关闭自我保护机制
eviction-interval-timer-in-ms: 4000 #设置清理间隔(单位:毫秒 默认是60*1000),即服务端多久清理一下宕机的服务

客户端

leaseRenewalIntervalInSeconds: 10 #eureka客户需要多长时间发送心跳给eureka服务器,表明它仍然活着,默认为30 秒 (与下面配置的单位都是秒)

leaseExpirationDurationInSeconds: 30 #Eureka服务器在接收到实例的最后一次发出的心跳后,需要等待多久才可以将此实例删除,默认为90秒。即:客户端发送心跳后30秒后没有发送心跳就告诉服务端我凉了,可以踢我走了。最坏剔除时间 = leaseExpirationDurationInSeconds + 服务端的eviction-interval-timer-in-ms时间,因为客户端告诉服务端可以踢,但服务端每隔这么久(eviction-interval-timer-in-ms)才清理

 大致意思

2. 集群服务注册

        首先去C:\Windows\System32\drivers\etc修改host文件,在底部插入如下映射

127.0.0.1       eureka3000.com
127.0.0.1       eureka3001.com
127.0.0.1       eureka3002.com

我们先建立一个eureka集群eureka3000,eureka3001,eureka3002,和之前建立eureka3000一样,相当于副本,有一点点改动

serviceUrl:写除自己外的其他服务器,因为信息同步,所以可以不写

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 #不把自己作为一个客户端注册到自己身上
#    fetchRegistry: false  #不需要从服务端获取注册信息(因为在这里自己就是服务端,而且已经禁用自己注册了)
    serviceUrl:
      defaultZone: http://eureka3001.com:3001/eureka,http://eureka3002.com:3002/eureka
server:
  port: 3001
eureka:
  server:
    enable-self-preservation: false  #关闭自我保护机制
    eviction-interval-timer-in-ms: 4000 #设置清理间隔(单位:毫秒 默认是60*1000)
  instance:
    hostname: eureka3001.com


  client:
#    registerWithEureka: false #不把自己作为一个客户端注册到自己身上
#    fetchRegistry: false  #不需要从服务端获取注册信息(因为在这里自己就是服务端,而且已经禁用自己注册了)
    serviceUrl:
      defaultZone: http://eureka3000.com:3000/eureka,http://eureka3002.com:3002/eureka
server:
  port: 3002
eureka:
  server:
    enable-self-preservation: false  #关闭自我保护机制
    eviction-interval-timer-in-ms: 4000 #设置清理间隔(单位:毫秒 默认是60*1000)
  instance:
    hostname: eureka3002.com


  client:
#    registerWithEureka: false #不把自己作为一个客户端注册到自己身上
#    fetchRegistry: false  #不需要从服务端获取注册信息(因为在这里自己就是服务端,而且已经禁用自己注册了)
    serviceUrl:
      defaultZone: http://eureka3001.com:3001/eureka,http://eureka3000.com:3000/eureka

eureka客户端(userClient如下,powerServer,powerServer同理)

serviceUrl需全部注册

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

 大致意思

补充

CAP定理三大指标

分区容错性(无法避免):由于网络波动,通信可能失败。如外地服务器和本地服务器通信失败

一致性:服务器数据一致。如用户向一台服务器a写数据,从另外一台服务器b读,如果要保证一致性,必须要等a向b同步数据完成后,才能给用户响应,不能满足可用性。

可用性 :只要收到用户请求必须给出回应。如用户向一台服务器a写数据,从另外一台服务器b读,如果要保证可用性,无论a向b同步数据同步是否完成,必须给用户响应,不能满足一致性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值