Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

什么是服务注册中心

定义

服务注册中心就是在整个服务架构单独抽取一个服务,这个服务不完成项目中任何业务功能,仅仅用来在微服务中记录微服务已经对整个系统微服务健康状态检查,以及服务元数据信息存储。

服务注册中心组件:eureka、zookeeper、consul、nacos

Eureka

Eureka是Netflix开发的服务发现框架,SpringCloud将它集成在spring-cloud-netfix中,Eureka包括两个组件Eureka ServerEureka Client

image-20210803140510299

SpringCloud集成Eureka

Eureka Server

首先在我们的SpringCloud项目中创建一个新的SpringBoot项目,当然这里我们首先创建一个maven,让然后将添加SpringBoot依赖启动类,因为需要依赖我们的父项目中的pom。

image-20210803141224824

就是想创建普通的maven项目一样,但是记得选择父项目

image-20210803141704363

然后再这个项目中添加SpringBoot Web依赖

1
2
3
4
5
<!--引入springbootweb-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

因为我们SpringBoot 的版本是依赖父项目所以在项目中无需说明

然后添加配置文件application.yaml(啥也不写,先确保Springboot项目添加成功)

然后添加SpringBoot主启动类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package bestrookie;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

/**
* @author bestrookie
* @date 2021/8/2 10:25 上午
*/
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class,args);
}
}

然后启动一下,试试SpringBoot项目能否跑起来。

好了 下面进入正题

首先我们引入EurekaServer的依赖

1
2
3
4
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

然后编写配置文件

1
2
3
4
5
6
7
8
9
10
11
12
server:
port: 8761 #默认就是8761
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka #这个地址是客户端注册的地址
fetch-registry: false #关闭eureka 立即注册 等启动完在注册
register-with-eureka: false #让当前服务仅仅是注册中心,不会注册
#这时这个SpringBoot服务的名字
spring:
application:
name: eurekaserver

然后再主启动类 加入注解@EnableEurekaServer

然后再次运行,访问http://localhost:8761

出现下面窗口,代表配置成功

image-20210803143413237

还记得记得配置文件中

1
2
fetch-registry: false #关闭eureka 立即注册 等启动完在注册
register-with-eureka: false #让当前服务仅仅是注册中心,不会注册

如果不配置这个属性,EurekaServer在启动的时候,会将自己作为一个服务客户端进行注册,当时注册的时候,自己还没有准备完成,所以会出现报错,当自己准备完成,才会注册成功。

Eureka Client

当然这个Eureka Client 在真是的场景下就是一个一个的业务模块,不过在这个我们没有业务代码只是简单的学习配置。

首先步骤同Eureka Server一样创建一个maven项目,创建配置文件,创建主启动类

然后再pom文件中引入依赖

1
2
3
4
5
<!--        引入eureka client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

然后编写配置类

1
2
3
4
5
6
7
8
9
10
11
server:
port: 8989
#指定服务名称
spring:
application:
name: EUREKACLIENT #在注册网址中的名称
#指定服务注册中心地址
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka

然后运行Eureka Server 然后再运行我们的Eureka Client,出现下图所示表示配置成功

image-20210803144845539

注意:我们配置名字的时候没有大小写区分,一律显示大写

Eureka 的自我保护机制

如果你现在断掉你的client服务,然后去查看注册的服务,我们发现,这个被我们断掉的服务并没有删除掉,这个就是Eureka的自我保护机制

自我保护机制是默认开启的,并且SpringCloud不建议我们关闭

目的

这样做是为了确保灾难性的网络事件不会清楚eureka注册表的数据,并将其传播到下游的所有客户端

自我保护机制的具体

默认情况下,如果Eureka Server在一定时间(默认90秒)没有接受到某个微服务实例的心跳,Eureka Server将会移除该实例。但是当网络分区故障发生时,微服务与Eureka Server之间无法进行正常的通信,而为微服务本身是正常运行的,此时不应该移除这个微服务,所以引入了自我保护机制。Eureka Server在运行期间会统计心跳失败比例,在15分钟之内是否低于85%,如果低于85%,Eureka Server会将这些实例保护起来,让这些实例不会过期。

在server端关闭自我保护机制

1
2
eureka.server.enable-self-preservation=false #关闭自我保护
eureka.server.eviction-interval-timer-in-ms=3000 #超时3秒自动清除

在client端关闭自我保护机制

1
2
eureka.instance.lease-expiration-duration-in-seconds=10 #用来修改eureka server 默认接受心跳的最大时间,默认为90秒
eureka.instance.lease-renewal-interval-in-seconds=5 #指定客户端多久向eureka server发送一次心跳 默认是30s

集群搭建

集群创建的目的是,防止但以服务宕机之后,这个项目就被迫停机,同一个服务的集群,其中的内容是完全一样的,只需要修改我们的配置文件即可

举个例子

我们的server 是三个服务构成

1
2
3
4
5
6
7
8
9
10
11
12
server:
port: 8761
eureka:
client:
service-url:
defaultZone: http://localhost:8762/eureka,http://localhost:8763/eureka
fetch-registry: false #关闭eureka 立即注册 等启动完在注册
register-with-eureka: false #让当前服务仅仅是祖册中心,不会注册
#这时这个SpringBoot服务的名字
spring:
application:
name: eurekaserver

首先要保证三个的配置文件端口号不要重复

其次注册地址,要写其余两个的地址

client举例,其实和server同理,不过只是要将所有的地址都写上

1
2
3
4
5
6
7
8
9
10
11
server:
port: 8989
#指定服务名称
spring:
application:
name: EUREKACLIENT
#指定服务注册中心地址
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka,http://localhost:8762/eureka,http://localhost:8763/eureka

评论