Discovery服务发现与Eureka自我保护机制及总结步骤
Discovery服务发现与Eureka自我保护机制及总结步骤
规范要求:
- 只暴露服务名称不保留主机名称
- 访问详细有IP地址显示(方便排错)
先看原来的实例内容
修改的服务为:8001、8002两个微服务提供者
注意依赖【web与actuator】最好放在一起(图形化展示和监控),是标配
有了
actuator
我们的IP才会修改有效果
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--分割web与actuator常绑定一块-->
1、主机名称修改和IP信息提示
1.1、修改YAML配置文件
8001、8002的配置一样,端口号根据变动修改即可
instance与client平级关系
eureka:
client:
...
instance:
instance-id: payment8001 # 主机名称
刷新Eureka查看状态
1.2、页面检查状态
随便点击一个主机名称进入,通过下面的路径访问,检查健康状态
http://localhost:8002/actuator/health
1.3、访问信息有IP显示
在两个访问服务提供者下面添加
prefer-ip-address: true # 显示IP地址
配置即可如果没有配置就是主机的名称
eureka:
client:
...
instance:
instance-id: payment8001 # 主机名称
prefer-ip-address: true # 显示IP地址
效果
2、服务发现Discovery
对于注册进eureka里面的微服务,可以通过服务发现来获得该服务的信息
2.1、修改8001模块的控制器
通过服务发现获取到自己的信息
注意导入包
import com.zcl.springcloud.entities.CommonResult;
@Slf4j
@RestController
@RequestMapping("/payment")
public class PaymentController {
/**
* Discovery服务发现
*/
@Resource
private DiscoveryClient discoveryClient;
@GetMapping("/discovery")
public Object getDiscovery(){
// 获取到Eureka服务列表
List<String> services = discoveryClient.getServices();
for (String service : services) {
log.info("-----service-----"+service);
}
// 获取指定微服务名称的列表
List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
for (ServiceInstance instance : instances) {
log.info(instance.getServiceId()+"\t"+instance.getHost() + "\t"+instance.getPort()+"\t"+instance.getUri());
}
return this.discoveryClient;
}
}
2.2、添加【@EnableDiscoveryClient】注解到启动类
注意:以后不会再使用Erueka当是会经常使用到
@EnableDiscoveryClient
注解
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* 描述:项目启动类
*
* @author zhong
* @date 2022-09-14 10:43
*/
@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
public class PaymentMain8001 {
public static void main(String[] args) {
SpringApplication.run(PaymentMain8001.class, args);
}
}
2.3、重启8001服务测试
由于只修改了一个服务,通过浏览器访问创建的控制器获取到服务信息
-
浏览器访问:http://localhost:8001/payment/discovery
-
浏览器输出内容
下面的内容就是Eureka的注册实例列表,以及排序
{ "services": [ "cloud-payment-service", "cloud-order-service" ], "order": 0 }
-
IDEA日志输出
- 输出了当前的两个微服务实例名称
- 输出了
CLOUD-PAYMENT-SERVICE
同一个服务实例名称的详细信息
2022-09-18 19:24:58.610 INFO 3100 --- [nio-8001-exec-2] c.z.s.controller.PaymentController : -----service-----cloud-payment-service 2022-09-18 19:24:58.610 INFO 3100 --- [nio-8001-exec-2] c.z.s.controller.PaymentController : -----service-----cloud-order-service 2022-09-18 19:24:58.610 INFO 3100 --- [nio-8001-exec-2] c.z.s.controller.PaymentController : CLOUD-PAYMENT-SERVICE 192.168.26.1 8002 http://192.168.26.1:8002 2022-09-18 19:24:58.610 INFO 3100 --- [nio-8001-exec-2] c.z.s.controller.PaymentController : CLOUD-PAYMENT-SERVICE 192.168.26.1 8001 http://192.168.26.1:8001
-
小结
- 只要将上面创建的控制器向外暴露出去,消费者就可以通过访问获取到服务提供者的详细信息
3、Eureka自我保护机制(保证高可用)【属于CAP里面的AP分支】
如下一大串红色的内容就说明了Eureka进入了自我保护机制/
3.1、保护机制概述【微服务不可用,不会立即清除】
保护模式主要用于一组客户端和Eureka Server之间存在网络分区场景下的保护。一旦进入保护模式,Eureka Server将会尝试保护其服务注册表中的信息,不再删除服务注册表中的数据,也就是不会注销任何微服务。
3.2、导致原因
1、为什么会产生自我保护机制
为了防止EurekaClient可以正常运行,但是 与 EurekaServer网络不通情况下,EurekaServer不会立刻将EurekaClient服务剔除
2、什么是自我保护机制
默认情况下,如果EurekaServer在一定时间内没有接收到某个微服务实例的心跳,EurekaServer将会注销该实例(默认90秒)。但是当网络分区故障发生(延时、卡顿、拥挤)时,微服务与EurekaServer之间无法正常通信,以上行为可能变得非常危险了——因为微服务本身其实是健康的,此时本不应该注销这个微服务。Eureka通过“自我保护模式”来解决这个问题——当EurekaServer节点在短时间内丢失过多客户端时(可能发生了网络分区故障),那么这个节点就会进入自我保护模式
3.3、禁止自我保护
1、修改服务注册中心7001YAML配置文件
出厂默认是开启自我保护机制的
eureka:
instance:
hostname: eureka7001.com # eureka服务端的实例名称
client:
...
server:
enable-self-preservation: false # 关闭Eureka自我保护机制,默认是true
eviction-interval-timer-in-ms: 2000 # 2秒钟就清除
启动7001服务访问
2、修改生产者客户端8001YAML配置文件
eureka:
client:
...
instance:
instance-id: payment8001 # 主机名称
prefer-ip-address: true # 显示IP地址
lease-renewal-interval-in-seconds: 1 # Eureka客户端向服务端发送心跳的时间间隔,单位为秒(默认是30秒)
lease-expiration-duration-in-seconds: 2 # Eureka服务端在收到最后一次心跳后等待时间上限,单位为秒(默认90秒),超时Eureka注册中心清理服务提供者
关闭8001服务提供者测试
说明:修改了配置后需要重启才能生效,重启后再关闭
4、总结Eureka使用步骤
4.1、引入依赖
服务注册中心依赖
<!--eureka-server-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
服务提供者客户端依赖
<!--eureka-client客户端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
4.2、启动类配置注解
服务注册中心注解
@EnableEurekaServer
服务提供者客户端注解
@EnableEurekaClient
4.3、YAML配置文件
服务注册中心
集群部署,互相注册,相互守望
eureka:
instance:
hostname: eureka7001.com # eureka服务端的实例名称
client:
register-with-eureka: false # false表示不向注册中心注册自己
fetch-registry: false # false表示自己端就是注册中心,维护服务实例
service-url:
# 设置与EurekaServer交互的地址查询服务和注册服务都需要依赖这个地址
defaultZone: http://eureka7002.com:7002/eureka/ # 集群模式,指向其他的注册中心 1中有2的服务注册中心
客户端
eureka:
client:
register-with-eureka: true # 表示是否将自己注册进EurekaServer服务中心,默认是true
fetchRegistry: true # 是否从EurekaServer抓取已有的注册学习,默认为true,单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
service-url:
# defaultZone: http://localhost:7001/eureka/ # 单机版eureka地址
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka # 集群版