3.构建步骤
1.建立SpringCloud-Eureka-7001普通Maven模块
(1).第一步: 导入依赖
2.配置pom.xml依赖
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-eureka-server --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> <version>1.4.6.RELEASE</version> </dependency> <!-- 热部署工具 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency>
(2).第二步: 配置yaml
3.applocation.yaml
这里的配置主要是: 服务主机设置、设置注册中心、端口号、以及动态设置监控页面
# 配置服务端口号 server: port: 7001 #Eureka 尤瑞卡 eureka: instance: hostname: localhost #Eureka服务端的实列名称 client: register-with-eureka: false #表示是否向Eureka注册中心注册自己 fetch-registry: false #如果为false,则表示自己为注册中心 service-url: # 监控页面 defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #动态编写 http://localhost:7001/eureka/
4.源码中的端口默认值为8761,所以我们要重写这个方法
this.serviceUrl.put("defaultZone", "http://localhost:8761/eureka/");
(3).第三步: 开启服务
5.开启服务
package com.jsxs; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; @SpringBootApplication @EnableEurekaServer // 步骤三: 开启服务 public class EurekaServer_7001 { public static void main(String[] args) { SpringApplication.run(EurekaServer_7001.class,args); } }
4.项目构建四大步骤⭐
6.构建项目的思路
| 1.导入相关依赖 |
| 🔻 |
| 2.编写配置文件 (配置文件的时候,里面的内容 约定大于配置) |
| 🔻 |
| 3.开启这个功能 (@EnableXXX) |
| 🔻 |
| 4.配置类 |
5.服务注册-信息配置-自我保护机制
(1).Eureka-client (服务注册-服务端)
调整之前创建的springlouc-provider-dept-800
1.导入Eureka的依赖
这里是普通的Eureka依赖
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-eureka --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> <version>1.4.6.RELEASE</version> </dependency>
2.application中新增Eureca配置
主要解决的问题是: 服务端注册到哪一个注册中心去?
# Eureka 服务注册到哪里? eureka: client: service-url: defaultZone: http://localhost:7001/eureka/
3.开启服务
@EnableEurekaClient : 和注册中心的开启服务注解不一样
package com.jsxs; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.web.servlet.config.annotation.EnableWebMvc; //启动类 @SpringBootApplication // 开启服务 @EnableEurekaClient public class DeptProvider_8001 { public static void main(String[] args) { SpringApplication.run(DeptProvider_8001.class,args); } }
4.先启动7001服务端后启动8081客户端进行测试,然后访问监控页http://localhost:7001/ 产看结果如图,成功
首次启动7001端口—》注册中心
然后启动8081端口–服务端
刷新注册中心 7001
8081服务端的 application.yaml 修改两个配置信息配置⭐>
(2).Eureka (信息配置)
1.导入监控配置在服务端8081
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
2.进行配置数据
server: port: 8081 # Mybatis的配置 mybatis: type-aliases-package: com.jsxs.pojo mapper-locations: classpath:mybatis/mapper/*.xml # Spring的配置 spring: application: name: SpringCloud-provider-dept datasource: url: jdbc:mysql://localhost:3306/db01?useUnicode=true&characterEncoding=utf-8 username: root password: 121788 driver-class-name: com.mysql.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource # Eureka 服务注册到哪里? eureka: client: service-url: defaultZone: http://localhost:7001/eureka/ instance: instance-id: jsxs-01 # info配置 info: app.name: jsxs-springcloud company.name: pdd
3.进行启动测试: 先7001(注册中心),然后8081(服务端)
4.出现下面这个问题的一般是下载了VM ware等类似软件的,出现了多张网卡。
微服务向eureka注册中心注册时,显示的IP地址不正常全部是localhost或者主机名称。(正常情况下,应该显示的为微服务所在服务器的IP地址)
由于服务器配备了多网卡的原因,导致eureka在发现微服务时,无法确定微服务所注册的是哪张网卡,所以会默认显示为localhost或者主机名称。
需要在配置文件中忽略网卡对注册中心的影响:
正常情况下是访问不了这个网址的: 但是如果添加了以下的配置(注册中心7001),那么就可以访问了
#Npcap Loopback Adapter:为忽略的网卡名称 spring: cloud: inetutils: ignored-interfaces[0]: Npcap Loopback Adapter
http://laptop-a930e2o7:8081/actuator/info
(3).Eureka (自我保护机制: 好死不如赖活着)
这里我们关闭服务端-》也就是服务注册的过程(8081)。并不是注册中心(7001)
一句话总结就是:某时刻某一个微服务不可用,eureka不会立即清理,依旧会对该微服务的信息进行保存!
- 默认情况下,当eureka server在一定时间内没有收到某个微服务实例的心跳,eureka server便会把该实例从注册表中删除(默认是90秒),但是,如果短时间内丢失大量的实例心跳,便会触发eureka server的自我保护机制,比如在开发测试时,需要频繁地重启微服务实例,但是我们很少会把eureka server一起重启(因为在开发过程中不会修改eureka注册中心),当一分钟内收到的心跳数大量减少时,会触发该保护机制。可以在eureka管理界面看到Renews threshold和Renews(last min),当后者(最后一分钟收到的心跳数)小于前者(心跳阈值)的时候,触发保护机制,会出现红色的警告:
EMERGENCY!EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT.RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEGING EXPIRED JUST TO BE SAFE.从警告中可以看到,eureka认为虽然收不到实例的心跳,但它认为实例还是健康的,eureka会保护这些实例,不会把它们从注册表中删掉。 - 【默认情况下,如果EurekaServer在一 定时间内没有接收到某 个微服务实例的心跳,EurekaServer将会注销该实例(默认90秒)。但是当网络分区故障发生时,微服务与Eureka之间无法正常通行,以上行为可能变得非常危险了-因为微服务本身其实是健康的,此时本不应该注销这个服务。Eureka通过 自我保护机制来解决这个问题–当EurekaServer节点在短时间内丢失过多客户端时(可能发生了网络分区故障),么这个节点就会进入自我保护模式。- .旦进入该模式, EurekaServer就会保护服务注册表中的信息,不再删除服务注册表中的数据(也就是不会注销任何微服务)。当网络故障恢复后,该EurekaServer节 点会自动退出自我保护模式。】
- 该保护机制的目的是避免网络连接故障,在发生网络故障时,微服务和注册中心之间无法正常通信,但服务本身是健康的,不应该注销该服务,如果eureka因网络故障而把微服务误删了,那即使网络恢复了,该微服务也不会重新注册到eureka server了,因为只有在微服务启动的时候才会发起注册请求,后面只会发送心跳和服务列表请求,这样的话,该实例虽然是运行着,但永远不会被其它服务所感知。所以,eureka server在短时间内丢失过多的客户端心跳时,会进入自我保护模式,该模式下,eureka会保护注册表中的信息,不在注销任何微服务,当网络故障恢复后,eureka会自动退出保护模式。自我保护模式可以让集群更加健壮。
- 在自我保护模式中,EurekaServer会保护服务注册表中的信息, 不再注销任何服务实例。当它收到的心跳数重新恢复到阈值以上时,该EurekaServer节点就会自动退出自我保护模式。它的设计哲学就是宁可保留错误的服务注册信息,也不盲目注销任何可能健康的服务实例。一句话: 好死不如赖活着。
- 综上,自我保护模式是一种应对网络异常的安全保护措施。它的架构哲学是宁可同时保留所有微服务(健康的微服务和不健康的微服务都会保留), 也不盲目注销任何健康的微服务。使用自我保护模式,可以让Eureka集群更加的健壮和稳定
- 但是我们在开发测试阶段,需要频繁地重启发布,如果触发了保护机制,则旧的服务实例没有被删除,这时请求有可能跑到旧的实例中,而该实例已经关闭了,这就导致请求错误,影响开发测试。所以,在开发测试阶段,我们可以把自我保护模式关闭,只需在eureka server配置文件中加上如下配置即可:eureka.server.enable-self-preservation=false【不推荐关闭自我保护机制】
(4). 注册进来的微服务,获取一些消息(团队开发会用到=>服务端8081)
源码DiscoverClient.java
添加配置
package com.jsxs.controller; import com.jsxs.pojo.Dept; import com.jsxs.service.DeptService; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import java.util.List; // 提供Restful服务 @RestController public class DeptController { @Resource private DeptService deptService; // 获取一些配置信息: @Resource private DiscoveryClient discoveryClient; //注册进来的微服务~ ,获取一些消息。 @GetMapping("/dept/discovery") public Object Discover(){ //获取微服务列表的清单 List<String> string_list = discoveryClient.getServices(); System.out.println("Discover=>"+string_list); //得到一个具体的微服务 List<ServiceInstance> instances = discoveryClient.getInstances("SPRINGCLOUD-PROVIDER-DEPT"); for (ServiceInstance instance : instances) { System.out.println("主机: 端口号: 路径: 实列名字分别是=》"+instance.getHost()+"\t"+instance.getPort()+"\t"+instance.getUri()+"\t"+instance.getServiceId()); } return this.discoveryClient; } }










