springcloud-服务治理-eureka
如果还不了解微服务的基本概念的朋友,请看上一篇博客:
一、微服务概述
二、spring cloud 技术栈
1:什么是服务治理?
微服务架构的缺点中最主要的就是由微服务数量众多导致维护成本巨大,服务治理为解决此问题而产生的。服务治理的作用是让维护人员从人工维护中解放出来,由服务自维护,微服务作为服务提供方主动向服务治理中心注册,服务消费方通过服务治理中心查询需要的服务并进行调用。
2:Eureka server 与 Eureka client
Spring cloud 中Eureka Server 作为服务治理的服务端, Eureka Client 作为服务治理的客户端,客户端需要向服务端进行注册,客户端通过服务端可以发现其他客户端并进行服务调用。
3:Eureka 服务治理调用过程
1.服务提供方会向Eureka server进行注册,然后每30秒(默认值)会向Eureka server发送一 次心跳告诉Eureka server“我还活着”,而如果Eureka server在90秒(默认值)没有收到 服务提供方发送的心跳则会根据配置对无效的服务进行剔除或保留。Eureka 的自我保护机制)
2.服务消费方从 Eureka server中获取已注册的服务列表,然后通过负载均衡的方式进行服
务的接口调用。
3.Eureka Server可以部署多台并相互注册,达到高可用的效果。
3.1 Eureka 自我保护机制
默认情况下EurekaClient 定时向 EurekaServer 端发送心跳,如果 EurekaServer 在90秒钟内没有接收到 默认情况下 EurekaClient 发送的心跳,便会直接从服务注册列表中剔除该服务。
但是在短时间丢失了大量的服务实例心跳,这时候 EurekaServer 会开启自我保护机制,不会剔除该服务。
为了防止 EurekaClient 可以正常运行,但是与 EurekaServer 通讯不通的情况下,EurekaServer 不会把 EurekaClient 服务 从服务列表中剔除。为了防止误剔除。
什么时候开启 Eureka 的自我保护机制?
开发环境关闭,自我保护机制
生产环境开启,自我保护机制
服务端的配置
eureka:
instance:
hostname: 192.168.31.xxx # 注册中心 IP 地址
server:
enable-self-preservation: false #自保护,为true时服务down掉,服务中心不会删除down掉的服务
eviction-interval-timer-in-ms: 2000 # 间隔多久剔除一次
客户端的配置
eureka:
instance:
hostname: 192.168.31.xxx # 注册中心 IP 地址
# 心跳检测 与 续约时间
# 测试时将值设置小些,保证服务关闭之后能及时剔除服务
lease-renewal-interval-in-seconds: 1 # eureka 客户端向服务端发送心跳的时间间隔,单位为秒(客户端告诉服务端子自己会按照该规则发送心跳)
lease-expiration-duration-in-seconds: 2 # eureka 服务端在收到最后一次心跳之后等待的时间上限,单位为秒,超过则剔除(客户端告诉服务端自己会按照该规则)
4:Eureka server 代码实现
4.1:新建一个springboot工程并在 pom 文件中添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
4.2:配置 application 文件
server:
port: 8085 # 指定端口
spring:
application:
name: eureka-server-demo # 服务别名
eureka:
instance:
hostname: 192.168.31.xxx # 注册中心 IP 地址
server:
enable-self-preservation: false #自保护,为true时服务down掉,服务中心不会删除down掉的服务
eviction-interval-timer-in-ms: 2000 # 间隔多久剔除一次
client:
register-with-eureka: true # 是否将自己注册到Eureka服务中
fetch-registry: true # 是否从Eureka中获取注册信息
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
4.3:在启动类中添加@EnableEurekaServer注解支持
package com.example.eurekaserverdemo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@EnableEurekaServer // 添加注解支持
@SpringBootApplication
public class EurekaServerDemoApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerDemoApplication.class, args);
}
}
完成这一步之后,一个 eureka 服务治理的服务端就已经搭建完毕了。
eureka-server UI 界面:
5:Eureka Client 代码实现
5.1:添加 jar 包依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
5.2:配置 application 文件
server:
port: 8086
spring:
application:
name: eureka-client-demo
eureka:
instance:
hostname: 192.168.31.xxx # 注册中心 IP 地址
# 心跳检测 与 续约时间
# 测试时将值设置小些,保证服务关闭之后能及时剔除服务
lease-renewal-interval-in-seconds: 1 # eureka 客户端向服务端发送心跳的时间间隔,单位为秒(客户端告诉服务端子自己会按照该规则发送心跳)
lease-expiration-duration-in-seconds: 2 # eureka 服务端在收到最后一次心跳之后等待的时间上限,单位为秒,超过则剔除(客户端告诉服务端自己会按照该规则)
client:
register-with-eureka: true
fetch-registry: true
serviceUrl:
defaultZone: http://localhost:8085/eureka/
5.3:在启动类中添加服务发现注解支持
package com.example.eurekaclientdemo01;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
@EnableDiscoveryClient // 添加服务发现注解支持
@SpringBootApplication
public class EurekaClientDemo01Application {
public static void main(String[] args) {
SpringApplication.run(EurekaClientDemo01Application.class, args);
}
}
注解使用场景:
@EnableDiscoveryClient:适用多个服务治理组件如:eureka、consul、zookeeper等
@EnableEurekaClient:只能在 eureka 作为服务治理时使用
6:多台 Eureka-server 的情况:
需要保持相同的服务名称 并且 eureka-server 之间相互注册,实现高可用。
启动 eureka 的服务端和客户端项目,可以看到客户端已经注册到服务端了。
注意:
两台 eureka-server 服务端的 UI 界面中,只有一台会显示 客户端 的注册信息,因为在注册过程当中,只会保证有一台注册中心服务有对应的服务信息数据,当有显示客户端注册信息的服务端 down 机时,启动转移数据到未 down 机的其他 eureka-server 中去,这个过程大概需要 30 秒钟的时间。这个类似于主备。
下一篇:四、负载均衡(Ribbon)