【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注册界面,然后显示无任何可用的服务
 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号