【SpringCloud】06 Eureka 03 服务发现 & 自我保护

 

服务发现Discovery

注册在Eureka中的服务,通过服务发现来获得该服务的信息

 

暴露给对方自身的服务信息,在控制器中编写

8001模块:

package cn.dzz.springcloud.controller;

import cn.dzz.springcloud.component.JsonResult;
import cn.dzz.springcloud.entity.Payment;
import cn.dzz.springcloud.service.PaymentService;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.List;

/**
 * @author ArkD42
 * @file SpringCloud-ATGG-2020
 * @create 2020年08月24日 21:28
 */
@RestController
@Slf4j
@RequestMapping("payment")
public class PaymentController {

    @Autowired
    private DiscoveryClient discoveryClient;

    @Resource
    private PaymentService paymentService;

    @Value("${server.port}")
    private String serverPort;

    @GetMapping("discovery")
    public Object discovery() {
        List<String> serviceList = discoveryClient.getServices();
        for (String serviceElement : serviceList) {
            log.info("服务元素:" + serviceElement);
        }
        List<ServiceInstance> serviceInstanceList = discoveryClient.getInstances("PROVIDER-PAYMENT-SERVICE");
        for (ServiceInstance serviceInstance : serviceInstanceList) {
            log.info(
                "服务实例ID " + serviceInstance.getServiceId() + 
                "\t 服务主机地址 " + serviceInstance.getHost() + 
                "\t 服务端口 " + serviceInstance.getPort() +
                "\t URI地址" + serviceInstance.getUri()
            );
        }
        return this.discoveryClient;
    }

    @PostMapping("create")
    public JsonResult<Object> createPayment(@RequestBody Payment payment){
        int result = paymentService.addPayment(payment);
        log.info("插入操作结果:" + result);
        if (result > 0) return new JsonResult<Object>(200, "插入数据成功, 端口:" + serverPort, result);
        return new JsonResult<Object>(500, "插入数据失败 端口:" + serverPort, result);
    }
    @GetMapping("get/{id}")
    public JsonResult<Payment> getPaymentById(@PathVariable("id") Long id){
        Payment paymentById = paymentService.getPaymentById(id);
        log.info("查询操作结果:" + paymentById + "用来测试热部署的修改");
        if (paymentById != null) return new JsonResult<Payment>(200, "查询数据成功  端口:" + serverPort, paymentById);
        return new JsonResult<Payment>(500, "查询数据失败  端口:" + serverPort, null);
    }
}

主程序启动类,需要一个@EnableDiscoveryClient注解:

启动整个服务,访问接口地址:

http://localhost:8001/payment/discovery
{"discoveryClients":[{"services":["consumer-order-service","provider-payment-service"],"order":0},{"services":[],"order":0}],"services":["consumer-order-service","provider-payment-service"],"order":0}

结构和视频的出现的并不一样,我是出现了一个数组来包裹的两个对象

然后再查看这个日志信息:

服务元素:consumer-order-service
服务元素:provider-payment-service
服务实例ID PROVIDER-PAYMENT-SERVICE     服务主机地址 192.168.142.1     服务端口 8001     URI地址http://192.168.142.1:8001
服务实例ID PROVIDER-PAYMENT-SERVICE     服务主机地址 192.168.142.1     服务端口 8002     URI地址http://192.168.142.1:8002

Eureka自我保护机制:

保护机制就是一开始出现的红字警告内容:

百度翻译

紧急情况!EUREKA可能错误地声称实例已启动,而事实并非如此。续订小于阈值,因此实例不会过期只是为了安全。

Eureka服务将会保护服务注册表中的信息,不再删除注册表中的数据,即不会注销任何服务

出现的原因:

一组客户端和服务端之间存在的网络分区场景下的保护

某一时刻的某一个服务不可用了,Eureka并不会立刻清理,而是对该服务的信息进行保存处理

策略思路,防止Eureka执行误删操作,因为服务延迟的情况是普遍存在

 

关闭服务端的自我保护机制:

server:
  port: 7001
eureka:
  instance:
    hostname: eureka7001
  client:
    fetch-registry: false
    register-with-eureka: false
    service-url:
      defaultZone: http://eureka7002.cn:7002/eureka/
  server:
    enable-self-preservation: false # 关闭自我保护 不可用的服务立即移除
    eviction-interval-timer-in-ms:  2000 # 默认一个30秒,一个90秒

设置客户端的心跳速率:(8001)

eureka:
  client:
    service-url:
      defaultZone: http://localhost:7001/eureka/,http://eureka7002.cn:7002/eureka/
    register-with-eureka: true
    fetch-registry: true
  instance:
    instance-id: provider-payment-service-port-8001
    prefer-ip-address: true
    lease-renewal-interval-in-seconds: 1
    lease-expiration-duration-in-seconds: 2

测试步骤:

1、启动7001 & 8001

2、保证8001有被注册到

3、关闭8001服务,刷新Eurek注册界面,然后显示无任何可用的服务

 

posted @ 2020-08-25 23:33  emdzz  阅读(394)  评论(0)    收藏  举报