当前位置:   article > 正文

Spring Cloud入门+深入(四)-Eureka服务注册与发现(二)_eureka注册时间设置

eureka注册时间设置

目录

一、Eureka服务注册与发现

1、集群Eureka构建

2、actuator微服务信息完善

3、服务发现Discovery

4、Eureka的自我保护机制


一、Eureka服务注册与发现

Spring Cloud入门+深入(三)-Eureka服务注册与发现(一)

Eureka集群构建原理说明

 问题:微服务RPC远程服务调用最核心的是什么?

高可用,如果注册中心只有一个,它出故障了那就导致整个微服务环境不可用。单点故障

解决方案:搭建Eureka注册中心集群,实现负载均衡+故障容错。

实现方式:相互注册,相互守望。如下图

1、集群Eureka构建

如果在一台机器上搭建集群,需要修改hosts配置文件,防止重名。

C:\Windows\System32\drivers\etc路径下的hosts文件

  1. 127.0.0.1 eureka7001.com
  2. 127.0.0.1 eureka7002.com

1.1、EurekaServer端cloud-eureka-server7001修改

yml修改

  1. server:
  2. port: 7001
  3. eureka:
  4. instance:
  5. hostname: eureka7001.com #eureka服务端的实例名字
  6. client:
  7. register-with-eureka: false #false 表示不向注册中心注册自己
  8. fetch-registry: false #false 表示自己就是注册中心,职责是维护服务实例,并不需要去检索服务
  9. service-url:
  10. defaultZone: http://eureka7002.com:7002/eureka/ #设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址

1.2、EurekaServer端cloud-eureka-server7002新建

pom和cloud-eureka-server7001一样

主启动类内容和cloud-eureka-server7001一样

yml

  1. server:
  2. port: 7002
  3. eureka:
  4. instance:
  5. hostname: eureka7002.com #eureka服务端的实例名字
  6. client:
  7. register-with-eureka: false #false 表示不向注册中心注册自己
  8. fetch-registry: false #false 表示自己就是注册中心,职责是维护服务实例,并不需要去检索服务
  9. service-url:
  10. defaultZone: http://eureka7001.com:7001/eureka/ #设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址

启动cloud-eureka-server7001和cloud-eureka-server7002

http://eureka7001.com:7001/

 http://eureka7002.com:7002/

 上面验证集群Eureka构建成功

1.3、EurekaClient端cloud-provider-payment8001

修改yml

  1. service-url:
  2. #defaultZone: http://localhost:7001/eureka
  3. defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka #集群版

1.4、EurekaClient端cloud-consumer-order80

修改yml

  1. service-url:
  2. #defaultZone: http://localhost:7001/eureka
  3. defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka #集群版

先要启动EurekaServer,7001/7002服务

再要启动服务提供者provider,8001服务

再要启动消费者,80

1.5、EurekaClient端支付服务集群搭建--新建cloud-provider-payment8002

参考cloud-provider-payment8001,新建cloud-provider-payment8002,端口号改为8002

修改8001/8002的Controller,增加端口进行区别:

  1. package com.lwz.springcloud.controller;
  2. import com.lwz.springcloud.entities.CommonResult;
  3. import com.lwz.springcloud.entities.Payment;
  4. import com.lwz.springcloud.service.PaymentService;
  5. import lombok.extern.slf4j.Slf4j;
  6. import org.springframework.beans.factory.annotation.Value;
  7. import org.springframework.web.bind.annotation.*;
  8. import javax.annotation.Resource;
  9. @RestController
  10. @Slf4j
  11. public class PaymentController {
  12. @Resource
  13. private PaymentService paymentService;
  14. @Value("${server.port}")
  15. private String serverPort;
  16. @PostMapping(value = "/payment/create")
  17. public CommonResult create(@RequestBody Payment payment){
  18. int result = paymentService.create(payment);
  19. log.info("*****插入结果:"+result);
  20. if (result>0){ //成功
  21. return new CommonResult(200,"插入数据库成功,serverPort:"+serverPort,result);
  22. }else {
  23. return new CommonResult(444,"插入数据库失败",null);
  24. }
  25. }
  26. @GetMapping(value = "/payment/get/{id}")
  27. public CommonResult getPaymentById(@PathVariable("id") Long id){
  28. Payment payment = paymentService.getPaymentById(id);
  29. log.info("*****查询结果:"+payment);
  30. if (payment!=null){ //说明有数据,能查询成功
  31. int a=1;
  32. return new CommonResult(200,"查询成功,serverPort"+serverPort,payment);
  33. }else {
  34. return new CommonResult(444,"没有对应记录,查询ID:"+id,null);
  35. }
  36. }
  37. }

都完事后进行修改cloud-consumer-order80服务的Controller

  1. //public static final String PAYMENT_URL = "http://localhost:8001";
  2. public static final String PAYMENT_URL = "http://CLOUD-PAYMENT-SERVICE";

修改cloud-consumer-order80服务的config    @LoadBalanced //赋予RestTemplate负载均衡的能力

  1. package com.lwz.springcloud.config;
  2. import org.springframework.cloud.client.loadbalancer.LoadBalanced;
  3. import org.springframework.context.annotation.Bean;
  4. import org.springframework.context.annotation.Configuration;
  5. import org.springframework.web.client.RestTemplate;
  6. @Configuration
  7. public class ApplicationContextConfig {
  8. @Bean
  9. @LoadBalanced //赋予RestTemplate负载均衡的能力
  10. public RestTemplate getRestTemplate(){
  11. return new RestTemplate();
  12. }
  13. }

先要启动EurekaServer,7001/7002服务

再要启动服务提供者provider,8001,8002服务

再要启动消费者,80

连续访问:http://localhost/consumer/payment/get/31

结果切换:

{"code":200,"message":"查询成功,serverPort:8001","data":{"id":31,"serial":"张无忌001"}}

{"code":200,"message":"查询成功,serverPort:8002","data":{"id":31,"serial":"张无忌001"}}

到此架构图如下:

2、actuator微服务信息完善

Eureka网页服务主机名修改,和IP显示配置

实现:

pom

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-web</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-actuator</artifactId>
  8. </dependency>

yml

  1. eureka:
  2. instance:
  3. instance-id: payment8001
  4. prefer-ip-address: true #访问路径可以显示IP

全yml

  1. eureka:
  2. client:
  3. register-with-eureka: true
  4. fetchRegistry: true
  5. service-url:
  6. #defaultZone: http://localhost:7001/eureka
  7. defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka #集群版
  8. instance:
  9. instance-id: payment8002
  10. prefer-ip-address: true #访问路径可以显示IP

最终效果:

3、服务发现Discovery

服务发现Discovery:对于注册进eureka里面的微服务,可以通过服务发现来获得该服务的信息。

修改cloud-provider-payment8001的Controller

  1. @Autowired
  2. private DiscoveryClient discoveryClient;
  3. @GetMapping(value = "/payment/discovery")
  4. public Object discovery(){
  5. List<String> services = discoveryClient.getServices();
  6. for (String element : services) {
  7. log.info("***** element:"+element);
  8. }
  9. List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
  10. for (ServiceInstance instance : instances) {
  11. log.info(instance.getServiceId()+"\t"+instance.getHost()+"\t"+instance.getPort()+"\t"+instance.getUri());
  12. }
  13. return this.discoveryClient;
  14. }

8001主启动类 增加注解  @EnableDiscoveryClient

重启:

访问:http://localhost:8001/payment/discovery

结果:{"discoveryClients":[{"services":["cloud-payment-service","cloud-order-service"],"order":0},{"services":[],"order":0}],"services":["cloud-payment-service","cloud-order-service"],"order":0}

4、Eureka的自我保护机制

Eureka网页出现如下红色醒目字迹,代表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 BEING EXPIRED JUST TO BE SAFE.

什么是Eureka自我保护机制?

Eureka的自我保护机制主要是为了网络异常时保持高可用设计的,当在Eureka中注册的微服务超过设定是时间内(默认90秒)没有向Eureka服务端发送心跳,该微服务会进入自我保护模式。在自我保护模式中,Eureka会保护服务注册表中的信息,不会注销任何服务实例,直至收到的心跳数恢复至阈值以上,该微服务退出自我保护模式。

自我保护机制理解:Eureka的设计哲学是宁可保留错误的服务信息,也不盲目注销可能健康的服务。所以异常的服务不会被注销,而是进入了自我保护模式。

解释:某时刻某一个微服务不可用了,Eureka不会立刻清理,依旧会对该微服务的信息进行保存

怎么禁止自我保护?

yml

  1. eureka:
  2. server:
  3. enable-self-preservation: false # 关闭自我保护保证不可用服务被删除
  4. eviction-interval-timer-in-ms: 2000 #修改时间间隔

eureakeClient端

yml

  1. eureka:
  2. instance:
  3. lease-renewal-interval-in-seconds: 1 # Eureka客户端发送心跳的时间间隔,单位为秒 (默认30秒)
  4. lease-expiration-duration-in-seconds: 90 # Eureka服务端在收到最后一次心跳等待时间上限,单位为秒 (默认90秒)

Spring Cloud入门+深入(一)

Spring Cloud入门+深入(五)-Zookeeper服务注册与发现

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/934562
推荐阅读
相关标签
  

闽ICP备14008679号