前言
在上篇文章01.微服务、springcloud简介中我们已经搭建好了springcloud的初始环境,我们本节先从服务注册中心说起
什么是服务注册中心
所谓服务注册中心就是在整个的微服务架构中单独提出一个服务,这个服务不完成系统的任何的业务功能,仅仅用来完成对整个微服务系统的服务注册和服务发现,以及对服务健康状态的监控和管理功能。
服务注册中心的作用
- 对所有的微服务的信息进行存储,如微服务的名称、IP、端口等
- 在进行服务调用时通过服务发现查询可用的微服务列表及网络地址进行服务调用
- 对所有的微服务进行心跳检测,如发现某实例长时间无法访问,就会从服务注册表移除该实例。
常用的注册中心
springcloud支持的多种注册中心Eureka、Consul、Zookeeper、以及阿里巴巴推出Nacos。这些注册中心在本质上都是用来管理服务的注册和发现以及服务状态的检查的。
Eureka
Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务。SpringCloud将它集成在其子项目spring-cloud-netflix中,以实现SpringCloud的服务注册和发现功能。
Eureka包含两个组件:Eureka Server和Eureka Client,下面我们通过代码来实现
Eureka Server
1.新建Module
首先我们在springcloud_parent下面新建一个module – 01.springcloud_eureka_server,如下图然后点击finish
2.pom.xml
我们前面说过springcloud基于springboot开发,而eureka_server作为一个服务注册中心,不参与任何的业务逻辑,所以该模块的pom.xml文件中目前只需要引入spring-boot-start-web与Eureka server的依赖就可以了
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>springcloud_parent</artifactId>
<groupId>com.christy</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>01.springcloud_eureka_server</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--引入 eureka server-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
</project>
3.EurekaServerApplication
入口类是每个springboot项目必不可少的
package com.christy;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @Author Christy
* @Date 2021/5/25 20:44
**/
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
4.application.properties
# 执行服务端口,Erreka默认8761
server.port=8761
# 指定服务名称 唯一标识 建议大写 不能出现下划线 可以使用'-'连接符
spring.application.name=EUREKA-SERVER
# 指定服务注册中心的地址
eureka.client.service-url.defaultZone=http://localhost:8761/eureka
# 关闭eureka client立即注册
# eureka含有两个组件,Eureka Server 与 Eureka Client,当项目中引入eurekaserver组件时,这个组件同时将eurekaclient引入到项目中
# 因此启动时不仅会将自己作为一个服务中心启动,同时也会将自己作为客户端进行注册,默认启动时立即注册,但是注册服务还没有准备好,此时会报如下错误
# Cannot execute request on any known server
eureka.client.fetch-registry=false
# 让当前应用仅仅是服务服务注册中心
eureka.client.register-with-eureka=false
# 关闭自我保护
# eureka.server.enable-self-preservation=false
# 超时3s自动清除 60*1000 1分钟
# eureka.server.eviction-interval-timer-in-ms=3000
5.启动server
以上工作都做完以后,我们的eureka server也就开发完毕了,此时我们启动该程序
然后地址栏输入http://localhost:8761/
Eureka Client
上面我们已经将eureka server开发完成了,下面我们编写一个eureka client。这里的client其实就是我们实现业务的一个一个的微服务,比如用户管理,商品管理。对于eureka server来讲他们就是一个一个的client
1.新建module
首先我们在springcloud_parent下面新建一个module – 01.springcloud_eureka_client,如下图然后点击finish
2.pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>springcloud_parent</artifactId>
<groupId>com.christy</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>01.springcloud_eureka_client</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<!-- 引入springboot web依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 引入eureka client依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
</project>
3.EurekaClientApplication
package com.christy;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
/**
* @Author Christy
* @Date 2021/5/26 10:49
**/
@SpringBootApplication
@EnableEurekaClient
public class EurekaClientApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaClientApplication.class, args);
}
}
4.application.properties
# 指定服务端口
server.port=8989
# 指定服务名称
spring.application.name=EUREKA-CLIENT
# 指定服务注册中心地址
eureka.client.service-url.defaultZone=http://localhost:8761/eureka
# 用来修改eureka server默认接受心跳的最大时间 默认是90s
# eureka.instance.lease-expiration-duration-in-seconds=10
# 指定客户端多久向eureka server发送一次心跳 默认是30s
# eureka.instance.lease-renewal-interval-in-seconds=5
5.启动client
然后我们再去eureka server中是否注册成功了
Eureka的自我保护机制
1.概念
上面我们分别启动了Eureka server和eureka client。此时如果我们关闭client,理论上注册中心应该没有这个client的注册信息了;但是实际结果确实client的注册信息会被保存下来,这个是因为eureka默认开启了自自我保护机制
默认情况下,如果Eureka Server在一定时间内(默认90秒)没有接收到某个微服务实例的心跳,Eureka Server将会移除该实例。但是当网络分区故障发生时,微服务与Eureka Server之间无法正常通信,而微服务本身是正常运行的,此时不应该移除这个微服务,所以引入了自我保护机制。Eureka Server在运行期间会去统计心跳失败比例在 15 分钟之内是否低于 85%,如果低于 85%,Eureka Server 会将这些实例保护起来,让这些实例不会过期。这种设计的哲学原理就是"宁可信其有不可信其无!"。自我保护模式正是一种针对网络异常波动的安全保护措施,使用自我保护模式能使Eureka集群更加的健壮、稳定的运行。
2.移除服务的时机
在以下两种情况下eureka server会将丢失心跳的微服务移除
- 心跳丢失比例超过设定的阈值
- 关闭自我保护机制(不推荐)
心跳丢失比例超过设定的阈值
上面我们说了,如果15分钟内统计的心跳失败比例低于85%,eureka server会将这些示例保护起来,让这些示例不会过期。那么具体是多少次呢?从eureka的源码我们可以知道如果15分钟作为一个打的分组,每个分组里面以90s有作为一个小的分组,每个小的分组内每隔30秒会发一次心跳。15分钟也就是30次心跳。如果以85%为界的话,15分钟内心跳失败次数少于25的话实例会被保存起来,超过这个次数该实例会被移除;
关闭自我保护机制
这个官方是不建议我们关闭自我保护机制的,当然测试环境或者开发环境需要测试的话是可以暂时关闭的,将我们在eureka server和eureka client的pom文件中注释掉的代码恢复就可以了
# eureka server
# 关闭自我保护
eureka.server.enable-self-preservation=false
# 超时3s自动清除 60*1000 1分钟
eureka.server.eviction-interval-timer-in-ms=3000
# eureka client
# 用来修改eureka server默认接受心跳的最大时间 默认是90s
eureka.instance.lease-expiration-duration-in-seconds=10
# 指定客户端多久向eureka server发送一次心跳 默认是30s
eureka.instance.lease-renewal-interval-in-seconds=5
关闭自我保护机制后,server界面会出现新的警告,这个在生产环境中要注意
Eureka停止更新
eureka从2.0版本后就停止更新了,但是1.x版本目前还是活跃的,可以供大家使用的。大家可以看下官方的停更说明
Eureka的集群
通常情况下,为了系统的稳定性和安全性,springcloud中的微服务都是以集群方式存在的,所以我们来实现一下eureka server和client的集群
准备工作
对于微服务的集群,每个集群下的实例的服务名称和地址必须要一致,唯一不同的是每个实例的端口号不一样。
对于eureka server,我们准备三台机器进行集群:http://localhost:8871、http://localhost:8872、http://localhost:8873。为了组群,这三台服务注册中心需要实现相互注册和发现。
对于eureka client,我们准备两台机器集群:http://localhost:8881、http://localhost:8882。对于这两个实例必须在上述的server集群中注册,为了防止某一时刻server集群中特定的某一个实例不可用,我们将client一次性注册到上述server集群的中每个节点上
搭建步骤
eureka server
按照上述的准备工作,通常情况下我们需要克隆三个eureka server项目。但是这次我们不这样做,按照下面的步骤来实现
-
如下图所示选择
Edit Configurations…
-
我们选中
EurekaServerApplication
点击上面的复制按钮,然后将新复制出来的EurekaServerApplication改名为EurekaServerApplication8871
,然后在VM options中输入-Dserver.port=8871
,最后点击Apply -> OK
上面操作完成以后我们会在
Run Dashboard
看到刚复制的EurekaServerApplication8871
上面指定服务注册中心的地址千万别忘记了
,我们说了三个server相互注册与发现,所以8761应该像8762和8763进行注册
-
同样的方法我们依次新建8872与8873并启动他们
-
我们在浏览器中输入
http://localhost:8871/
,http://localhost:8872/
,http://localhost:8873/
eureka client
按照上述eureka server集群的方式我们将8881和8882两台client集群搭建并启动起来
上述工作做完以后我们也到了三台eureka server中已经注册了这两个实例
到这,eureka的集群我们就说完了,下一节我们来看下另外一种注册中心consul,ヾ(◍°∇°◍)ノ゙