1.准备工作
-
首先我们需要构建一个空项目
-
新建一个名为parent 的Module Maven项目,管理SpringCloud的版本、SpringBoot的版本
<!--springboot作为parent--> <parent> <artifactId>spring-boot-starter-parent</artifactId> <groupId>org.springframework.boot</groupId> <version>2.4.1</version> </parent> <properties> <spring.cloud-version>2020.0.0</spring.cloud-version> </properties> <dependencyManagement> <!--维护springcloud版本--> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring.cloud-version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
2.Eureka服务端
-
首先构建一个module,maven项目,父项目指定为上面创建的parent
-
引入依赖:web依赖和eureka依赖
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> </dependencies>
这里我出现了一个问题,我没仔细看,引了一个spring-cloud-netflix-eureka-server。有这个东西也引了进来,但是就是启动报错,应该是spring-cloud-starter-netflix-eureka-server。花了挺长时间去找原因,也有了一些额外收获,确定启动类没写错之后便怀疑是eureka依赖的问题,上springcloud官网看了一下2020版的是移除了spring-cloud-netflix依赖中的很多依赖:如图
这也算是标志着这些组件的淘汰吧。。。。
-
创建启动类
package com.xp; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; @SpringBootApplication @EnableEurekaServer //作为EurekaServer启动 public class EurekaApplication { public static void main(String[] args) { SpringApplication.run(EurekaApplication.class,args); } }
-
修改配置
server.port=8761
//应用名,特别重要
spring.application.name=Eureka
//设置Eureka客户端向哪里注册,现在是服务端,可以不用写这个
eureka.client.service-url.defaultZone=http://localhost:8761/eureka
//关闭Eureka客户端注册
eureka.client.register-with-eureka=false
//关闭Eureka从服务端拉去注册信息
eureka.client.fetch-registry=false
🀄️ 说明:因为eureka的server依赖会同时把client依赖也引进来,所以启动的时候会以客户端、服务端两个身份去注册,所以作为服务端启动时应该禁止自己作为客户端注册。
🀄️ 同理作为服务端应该禁止启动的时候去注册中心拉取注册信息,因为那时候都还没有服务端
3.Eureka客户端
大体和上面一致
-
依赖:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> </dependencies>
-
启动类:
package com.xp; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; @SpringBootApplication @EnableEurekaClient public class EurekaClientApplication { public static void main(String[] args) { SpringApplication.run(EurekaClientApplication.class,args); } }
-
配置:
server.port=8083 spring.application.name=EurekaClient eureka.client.service-url.defaultZone=http://localhost:8761/eureka
ok,以上eureka客户端、服务端就写好了。跑起来:localhost:8761/
4.Eureka自我保护机制
就是一个客户端和服务端中断,Eureka服务端并不会立即将这个服务清除掉。靠的是心跳机制
❓ 什么时候将它清除呢:
首先在一定时间内(15分钟)统计心跳失败次数,如果成功比例>15%,Eureka就会将它保护起来不会被清除掉
所以有两种方式让它快速清除:
- 服务端关闭保护机制(极不推荐)
//关闭自我保护
eureka.server.enable-self-preservation=false
//超时3s清除
eureka.server.eviction-interval-timer-in-ms=3000
- 让心跳周期缩短,心跳频率变高
//小周期时长,默认90
eureka.instance.lease-expiration-duration-in-seconds=20
//多久心跳一次,默认30
eureka.instance.lease-renewal-interval-in-seconds=10
❓为啥叫小周期呢,因为大周期还是15分钟,小周期相当于一组,
指定小周期、频率后,就能计算出15分钟会发多少次心跳。缩短小周期和频率是为了更快达到失败比例,从而清除服务
5.Eureka服务端集群
首先要启动多个Eureka服务端,超简单实用的方法:
复制就行了,但是我们需要该端口号:
修改jvm参数即可指定端口号
有了服务端集群后,我们只需要在客户端的配置文件中的服务端地址:都加上就行了