修改的服务为:8001、8002两个微服务提供者
有了
actuator
我们的IP才会修改有效果
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-actuatorartifactId>
dependency>
8001、8002的配置一样,端口号根据变动修改即可
instance与client平级关系
eureka:
client:
...
instance:
instance-id: payment8001 # 主机名称
刷新Eureka查看状态
随便点击一个主机名称进入,通过下面的路径访问,检查健康状态
http://localhost:8002/actuator/health
在两个访问服务提供者下面添加
prefer-ip-address: true # 显示IP地址
配置即可如果没有配置就是主机的名称
eureka:
client:
...
instance:
instance-id: payment8001 # 主机名称
prefer-ip-address: true # 显示IP地址
效果
对于注册进eureka里面的微服务,可以通过服务发现来获得该服务的信息
通过服务发现获取到自己的信息
注意导入包
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;
}
}
注意:以后不会再使用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);
}
}
由于只修改了一个服务,通过浏览器访问创建的控制器获取到服务信息
浏览器访问: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
小结
如下一大串红色的内容就说明了Eureka进入了自我保护机制/
保护模式主要用于一组客户端和Eureka Server之间存在网络分区场景下的保护。一旦进入保护模式,Eureka Server将会尝试保护其服务注册表中的信息,不再删除服务注册表中的数据,也就是不会注销任何微服务。
为了防止EurekaClient可以正常运行,但是 与 EurekaServer网络不通情况下,EurekaServer不会立刻将EurekaClient服务剔除
默认情况下,如果EurekaServer在一定时间内没有接收到某个微服务实例的心跳,EurekaServer将会注销该实例(默认90秒)。但是当网络分区故障发生(延时、卡顿、拥挤)时,微服务与EurekaServer之间无法正常通信,以上行为可能变得非常危险了——因为微服务本身其实是健康的,此时本不应该注销这个微服务。Eureka通过“自我保护模式”来解决这个问题——当EurekaServer节点在短时间内丢失过多客户端时(可能发生了网络分区故障),那么这个节点就会进入自我保护模式
出厂默认是开启自我保护机制的
eureka:
instance:
hostname: eureka7001.com # eureka服务端的实例名称
client:
...
server:
enable-self-preservation: false # 关闭Eureka自我保护机制,默认是true
eviction-interval-timer-in-ms: 2000 # 2秒钟就清除
启动7001服务访问
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服务提供者测试
说明:修改了配置后需要重启才能生效,重启后再关闭
服务注册中心依赖
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-serverartifactId>
dependency>
服务提供者客户端依赖
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
dependency>
服务注册中心注解
@EnableEurekaServer
服务提供者客户端注解
@EnableEurekaClient
服务注册中心
集群部署,互相注册,相互守望
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 # 集群版