SpringCloud概述&注册中心Eureka

1.背景

2008年以后,国内互联网行业飞速发展,我们对软件系统的需求已经不再是过去”能用就行”这种很low的档次了,像**抢红包、双十一这样的活动**不断逼迫我们去突破软件系统的性能上限,传统的IT企业”能用就行”的开发思想已经不能满足互联网**高并发、大流量的性能要求**。系统架构**走向分布式**已经是服务器开发领域解决该问题唯一的出路,然而分布式系统由于天生的复杂度,并不像开发单体应用一样把框架一堆就能搞定,因此各大互联网公司都在投入技术力量研发自己的基础设施。这里面比较有名的如**阿里的开源项目dubbo, Netflix开发的一系列服务框架**。在这种“百花齐放”、重复造轮子的状况下,必然要出现一种统一的标准来简化分布式系统的开发,**Spring Cloud**应运而生。

2.系统架构的演变

2.1. 单体架构

单体架构也称之为单体系统或者是单体应用。就是一种把系统中所有的功能、模块耦合在一个应用中的架构方式。

SpringCloud概述&注册中心Eureka_第1张图片

存在的问题:

  • 代码耦合:模块的边界模糊、依赖关系不清晰,整个项目非常复杂,每次修改代码都心惊胆战

  • 迭代困难:每次功能的变更或bug的修复都会导致重新部署整个应用,随着代码的增多,构建、测试和部署的

    ​ 时间也会增加

  • 扩展受限:单体应用只能作为一个整体进行扩展,无法根据业务模块的需要进行伸缩

  • 技术债务:随着时间推移、需求变更和人员更迭,会逐渐形成应用程序的技术债务,并且“越积越多不坏不修”

  • 阻碍创新:单体应用往往使用统一的技术平台或方案解决所有的问题,要想引入新技术平台会非常困难

2.2.分布式架构

分布式:需要按照功能点把系统拆分,拆分成独立的功能,单独为某一个节点添加服务器,需要系统之间配合才能完成整个业务逻辑

SpringCloud概述&注册中心Eureka_第2张图片

存在的问题:

  • 模块之间有一些通用的业务逻辑无法共用

2.3.SOA架构

SOA:Service Oriented Architecture(面向服务的架构)。也就是把工程拆分成服务层,表现层两个工程。服务层中包含业务逻辑,只需要对外提供服务即可。表现层只需要处理和页面的交互,业务逻辑都是调用服务层的服务来实现,使用ESB(Enterparise Servce Bus企业服务总线,代表技术:Mule、WSO2)提供表现层和服务层之间的交互。

SpringCloud概述&注册中心Eureka_第3张图片

存在的问题:

  • 不支持集群、臃肿

2.4.微服务架构

微服务就是一个轻量级的服务治理方案。

代表技术:SpringCloud Eureka、dubbo 等等

SpringCloud概述&注册中心Eureka_第4张图片

3.SpringCloud概述

3.1.SpringCloud是什么?

​ Spring并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装,屏蔽掉了复杂的配置和实现原理,最终给开发者留出了套简单易懂、易部署和易维护的分布式系统开发工具包。

​ SpringCloud是一个相对比较新的微服务框架,2016年才推出1.0的release版本,虽然Spring Cloud时间最短, 但是相比Dubbo等RPC框架, Spring Cloud提供的全套的分布式系统解决方案(微服务开发的”全家桶”)。

3.2.Spring Cloud 和 Spring Boot的关系

Spring boot 是 Spring 的一套快速配置脚手架,可以基于spring boot 快速开发单个微服务。

Spring Cloud是一个基于SpringBoot实现的微服务开发方案;
在这里插入图片描述

Spring boot可以离开Spring Cloud独立使用开发项目,但是Spring Cloud离不开Spring
boot,属于依赖的关系。

3.3.Spring Cloud版本号

3.3.1.常见版本号说明

**软件版本号:**2.0.2.RELEASE

2:主版本号。当功能模块有较大更新或者整体架构发生变化时,主版本号会更新

0:次版本号。次版本表示只是局部的一些变动。

2:修改版本号。一般是 bug 的修复或者是小的变动

​ **RELEASE:**希腊字母版本号。次版本号用户标注当前版本的软件处于哪个开发阶段

3.3.1.1.希腊字母版本号

Base:设计阶段。只有相应的设计没有具体的功能实现。
Alpha:软件的初级版本。存在较多的 bug
Bate:表示相对 alpha 有了很大的进步,消除了严重的 bug,还存在一些潜在的 bug
PRE: 预览版,内部测试版. 主要是给开发人员和测试人员测试和找BUG用的,不建议使用;
SNAPSHOT: 快照版,可以稳定使用,且仍在继续改进版本
Release:该版本表示最终版
GA:官方推荐使用此版本,在国外都是用GA来说明release版本的,一般同 时标注SR1,表示第1个正式版本。

3.3.2. Spring Cloud版本号说明

采用伦敦的地铁站名称来作为版本号的命名,根据首字母排序,字母顺序靠后的版本号越大。

SpringCloud概述&注册中心Eureka_第5张图片

4.注册中心Eureka

4.1.什么是注册中心Eureka

Eureka 是 Netflix 开发的服务注册和发现组件,本身是一个基于 REST 的服务。Spring Cloud将它集成在其子项目 spring-cloud-netflix 中,以实现 Spring Cloud 的服务注册与发现,同时还提供了负载均衡、故障转移等能力。

4.2.Eureka三大角色

Ø Eureka Server:注册中心

​ 通过 Register、Get、Renew 等接口提供服务的注册和发现。

Ø Service Provider:服务提供方

​ 把自身的服务实例注册到 Eureka Server 中

Ø Service Consumer:服务调用方

​ 通过 Eureka Server 获取服务列表,消费服务。

SpringCloud概述&注册中心Eureka_第6张图片

spring-cloud-netflix-eureka-server-2.1.2.RELEASE.jar:
  InstanceRegistry.classsuper.register(info, leaseDuration, isReplication)://49ConcurrentHashMap<String, Map<String, Lease<InstanceInfo>>> registry//服务调用地址

4.3.Eureka入门

4.3.1.创建Eureka注册中心

4.3.1.1.创建工程

springcloud_eureka_server

4.3.1.2.pom.xml


<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">
    <modelVersion>4.0.0modelVersion>
    <parent>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-parentartifactId>
        <version>2.1.6.RELEASEversion>
    parent>

    <groupId>com.qfgroupId>
    <artifactId>springcloud_eureka_serverartifactId>
    <version>1.0-SNAPSHOTversion>

    <properties>
        <java.version>1.8java.version>
    properties>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-dependenciesartifactId>
                <version>Greenwich.SR2version>
                <type>pomtype>
                <scope>importscope>
            dependency>
        dependencies>
    dependencyManagement>
    <dependencies>
        
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-webartifactId>
        dependency>
        
        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-starter-netflix-eureka-serverartifactId>
        dependency>
    dependencies>
project>

4.3.1.3.App

package com.qf;

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

@EnableEurekaServer//EurekaServer服务器端启动类,接受其他微服务注册进来
@SpringBootApplication
public class EurekaApp {
	public static void main(String[] args) {
		SpringApplication.run(EurekaApp.class, args);
	}
}

4.3.1.4.application.properties

server.port=8761

#设置eureka不注册自己
eureka.client.register-with-eureka=false
#设置eureka不获取其他服务的注册信息
eureka.client.fetch-registry=false

4.3.1.4.测试

浏览器访问:http://127.0.0.1:8761/

SpringCloud概述&注册中心Eureka_第7张图片

4.3.2.创建common_pojo

4.3.2.1.创建工程

springcloud_common_pojo

4.3.2.2.pom.xml


<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">
    <modelVersion>4.0.0modelVersion>

    <groupId>com.qfgroupId>
    <artifactId>springcloud_common_pojoartifactId>
    <version>1.0-SNAPSHOTversion>


project>

4.3.2.3.pojo

package com.qf.pojo;

public class User {
    private Integer id;
    private String nam;
    private Integer age;

    public User() {
    }

    public User(Integer id, String nam, Integer age) {
        this.id = id;
        this.nam = nam;
        this.age = age;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getNam() {
        return nam;
    }

    public void setNam(String nam) {
        this.nam = nam;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

4.3.3.创建服务提供者

4.3.3.1.创建工程

springcloud_eureka_provider

4.3.3.2.pom.xml


<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">
    <modelVersion>4.0.0modelVersion>
    <parent>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-parentartifactId>
        <version>2.1.6.RELEASEversion>
    parent>

    <groupId>com.qfgroupId>
    <artifactId>springcloud_eureka_providerartifactId>
    <version>1.0-SNAPSHOTversion>

    <properties>
        <java.version>1.8java.version>
    properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-dependenciesartifactId>
                <version>Greenwich.SR2version>
                <type>pomtype>
                <scope>importscope>
            dependency>
        dependencies>
    dependencyManagement>
    <dependencies>
        
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-webartifactId>
        dependency>
        
        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
        dependency>
        <dependency>
            <groupId>com.qfgroupId>
            <artifactId>springcloud_common_pojoartifactId>
            <version>1.0-SNAPSHOTversion>
        dependency>
    dependencies>
project>

4.3.3.3.App

@EnableEurekaClient//允许向eureka注册服务
@SpringBootApplication
public class ProviderApp {
	public static void main(String[] args) {
		SpringApplication.run(ProviderApp.class, args);
	}
}

4.3.3.4.application.properties

#向注册中心注册的名字
spring.application.name=eureka-provider
server.port=8777

#设置注册中心的地址
eureka.client.serviceUrl.defaultZone=http://127.0.0.1:8761/eureka/

4.3.3.5.service

package com.qf.service;

import com.qf.pojo.User;
import org.springframework.stereotype.Service;

@Service
public class UserServiceImpl implements UserService {

	@Override
	public User getUser(Integer id) {
		return new User(id,"王粪堆",18);
	}

}

4.3.3.6.controller

package com.qf.controller;

import com.qf.pojo.User;
import com.qf.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ProviderController {
	
	@Autowired
	private UserService userService;

	@RequestMapping("user/{id}")
	public User getUser(@PathVariable Integer id){
		return userService.getUser(id);
	}
}

4.3.3.7.测试

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cACZbZOl-1640245256867)(assets\1587650428661.png)]

4.3.4.创建服务消费者

4.3.4.1.创建工程

springcloud_eureka_consumer

4.3.4.2.pom.xml


<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">
    <modelVersion>4.0.0modelVersion>
    <parent>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-parentartifactId>
        <version>2.1.6.RELEASEversion>
    parent>

    <groupId>com.qfgroupId>
    <artifactId>springcloud_eureka_consumerartifactId>
    <version>1.0-SNAPSHOTversion>

    <properties>
        <java.version>1.8java.version>
    properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-dependenciesartifactId>
                <version>Greenwich.SR2version>
                <type>pomtype>
                <scope>importscope>
            dependency>
        dependencies>
    dependencyManagement>
    <dependencies>
        
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-webartifactId>
        dependency>
        
        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
        dependency>
        <dependency>
            <groupId>com.qfgroupId>
            <artifactId>springcloud_common_pojoartifactId>
            <version>1.0-SNAPSHOTversion>
        dependency>
    dependencies>
project>

4.3.4.3.App

package com.qf;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
//允许向注册中心注册该服务,并可以获取其他服务的调用地址
@EnableEurekaClient
@SpringBootApplication
public class ConsumerApp {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApp.class, args);
    }
}

4.3.4.4.application.properties

#注册中心挂个名字
spring.application.name=eureka-consumer
server.port=8666


#设置服务注册中心地址
eureka.client.serviceUrl.defaultZone=http://127.0.0.1:8761/eureka/

4.3.4.5.config

RestTemplate是Spring提供的用于访问Rest服务的客户端,RestTemplate与httpClient类似,都是java中可以模拟http请求的封装,但是RestTemplate比httpClient更优雅,它是spring中的一个封装功能。

package com.qf.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class ConfigBean {

	@Bean
	public RestTemplate restTemplate(){
		return new RestTemplate();
	}
}

4.3.4.6.controller

package com.qf.controller;

import com.qf.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
public class UserController {
	
	//从eureka注册中心获取服务端的ip、端口、要调用的服务
	@Autowired
	private LoadBalancerClient loadBalancerClient;
    
	//访问Rest服务的客户端
	@Autowired
	private RestTemplate restTemplate;

	@RequestMapping(value="consumer/user/{id}",method= RequestMethod.GET)
	public User getUserById(@PathVariable Integer id){
		ServiceInstance si = loadBalancerClient.choose("eureka-provider");
		//指定要调用的服务
		String url = "http://"+si.getHost()+":"+si.getPort()+"/user/"+id;
		return restTemplate.getForObject(url, User.class);
	}
}

4.3.4.7.测试

SpringCloud概述&注册中心Eureka_第8张图片

4.4.集群版的Eureka注册中心

4.4.1.创建工程

springcloud_eureka_server_cluster

4.4.2.pom.xml


<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">
    <modelVersion>4.0.0modelVersion>
    <parent>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-parentartifactId>
        <version>2.1.6.RELEASEversion>
    parent>
    <groupId>com.qfgroupId>
    <artifactId>springcloud_eureka_server_clusterartifactId>
    <version>1.0-SNAPSHOTversion>

    <properties>
        <java.version>1.8java.version>
    properties>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-dependenciesartifactId>
                <version>Greenwich.SR2version>
                <type>pomtype>
                <scope>importscope>
            dependency>
        dependencies>
    dependencyManagement>
    <dependencies>
        
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-webartifactId>
        dependency>
        
        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-starter-netflix-eureka-serverartifactId>
        dependency>
    dependencies>
    <build>
        <plugins>
            <plugin>
                
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-maven-pluginartifactId>
            plugin>
        plugins>
    build>
project>

4.4.3.App

package com.qf;

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

@EnableEurekaServer//EurekaServer服务器端启动类,接受其他微服务注册进来
@SpringBootApplication
public class EurekaApp {
	public static void main(String[] args) {
		SpringApplication.run(EurekaApp.class, args);
	}
}

4.4.4.application.properties

application-eureka1.properties

spring.application.name=eureka-server
server.port=8761

#设置服务注册中心地址,指向另一个注册中心
eureka.client.serviceUrl.defaultZone=http://192.168.204.131:8761/eureka/

application-eureka2.properties

spring.application.name=eureka-server
server.port=8761

#设置服务注册中心地址,指向另一个注册中心
eureka.client.serviceUrl.defaultZone=http://192.168.204.130:8761/eureka/

4.4.5.logback.xml


 <configuration>
  
    <property name="LOG_HOME" value="${catalina.base}/logs/" />  
       
    <appender name="Stdout" class="ch.qos.logback.core.ConsoleAppender">
         
        <layout class="ch.qos.logback.classic.PatternLayout">   
              
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n   
            pattern>   
        layout>   
    appender>   
       
    <appender name="RollingFile"  class="ch.qos.logback.core.rolling.RollingFileAppender">   
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            
            <FileNamePattern>${LOG_HOME}/server.%d{yyyy-MM-dd}.logFileNamePattern>   
            <MaxHistory>30MaxHistory>
        rollingPolicy>   
        <layout class="ch.qos.logback.classic.PatternLayout">  
             
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n   
            pattern>   
       layout> 
        
       <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
         <MaxFileSize>10MBMaxFileSize>
       triggeringPolicy>
    appender>     

    
    <root level="DEBUG">   
        <appender-ref ref="Stdout" />   
        <appender-ref ref="RollingFile" />   
    root> 



  


configuration>

4.4.6.Eureka集群部署

部署环境:需要安装jdk1.8,正确配置环境变量。

注意:需要关闭 linux的防火墙,或者是开放8761 端口

4.4.6.1.将项目打jar包

SpringCloud概述&注册中心Eureka_第9张图片

4.4.6.2 上传jar包到服务器

在/usr/local/创建一个 eureka 的目录

将项目的jar 包拷贝到/usr/upload

4.4.6.3.编写启动脚本文件

注意:使用vim粘贴

SpringCloud概述&注册中心Eureka_第10张图片

SpringCloud概述&注册中心Eureka_第11张图片

4.4.6.5.启动eureka注册中心

./server.sh start #启动

./server.sh stop #停止

4.4.6.6.测试

浏览器访问:http://192.168.80.140:8761/

SpringCloud概述&注册中心Eureka_第12张图片

4.4.6.7.向集群版Eureka发布服务

4.4.5.7.2.创建provider配置文件
spring.application.name=eureka-provider
server.port=8777

#设置服务注册中心地址,指向另一个注册中心
eureka.client.serviceUrl.defaultZone=http://192.168.204.130:8761/eureka/,http://192.168.204.131:8761/eureka/
4.4.6.7.3.修改Consumer配置文件
spring.application.name=eureka-consumer
server.port=8761

#设置服务注册中心地址,指向另一个注册中心
eureka.client.serviceUrl.defaultZone=http://192.168.204.130:8761/eureka/,http://192.168.204.131:8761/eureka/

4.6.7.测试

1、开启两台服务器并且运行服务器中的server.sh

2、运行服务提供者工程

3、运行服务消费者工程

4、测试

SpringCloud概述&注册中心Eureka_第13张图片

5.Eureka集群原理

SpringCloud概述&注册中心Eureka_第14张图片

Register(服务注册):把自己的 IP 和端口注册给 Eureka。
Renew(服务续约):发送心跳包,每 30 秒发送一次。告诉 Eureka 自己还活着。
Cancel(服务下线):当 provider 关闭时会向 Eureka 发送消息,把自己从服务列表中删除。防止consumer调用到
                不存在的服务。
Get Registry(获取服务注册列表):获取服务列表。
Replicate(集群中数据同步):eureka 集群中的数据复制与同步。
Make Remote Call(远程调用):完成服务的远程调用。

6.Eureka与Zookeeper的区别

6.1.CAP原则

​ CAP原则又称CAP定理,指的是在一个分布式系统中,Consistency (一致性)、Availability (可用性)、Partition tolerance (分区容错性),三者不可兼得。

​ CAP 由 Eric Brewer 在 2000 年 PODC会议上提出。该猜想在提出两年后被证明成立,成为我们熟知的 CAP定理

SpringCloud概述&注册中心Eureka_第15张图片

一致性和可用性,为什么不可能同时成立?

答案很简单,因为G1和G2可能通信失败(即出现分区容错)。

如果保证 G2 的一致性,那么 G1 必须在写操作时,锁定 G2 的读操作和写操作。只有数据同步后,才能重新开放读写。锁定期间,G2 不能读写,可用性不成立。

如果保证 G2 的可用性,那么势必不能锁定 G2,一致性不成立。

6.2.Eureka比Zookeeper好在哪里?

zookeeper保证数据更新原子性,一次数据更新要么全部成功,要么全部失败
SpringCloud概述&注册中心Eureka_第16张图片

  • zookeeper:zookeeper的写操作由leader负责,分区部署时失去leader概率非常大。leader死了或连不上了,就要重新选举且时间是30~120s(cp),且选举期间整个zk集群是都是不可用的

  • eureka:Eureka各个节点都是平等的,几个节点挂掉不影响正常节点的工作,只不过查到的信息可能和其他节点不一样(ap)

7.Eureka的自我保护

7.1.什么是自我保护?

如果在Eureka Server的首页看到以下这段提示,则说明Eureka已经进入了保护模式:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3THHrsks-1640245256879)(assets\1587737324774.png)]

保护模式主要用于一组客户端和Eureka Server之间存在网络分区场景下的保护。一旦进入保护模式,Eureka Server将会保护超过 60 秒没有发送心跳服务不再删除服务注册表中的数据。

  1. 自我保护的条件

​ 微服务在 Eureka 上注册后,会每 30 秒发送心跳包,每分钟 2 个心跳的固定频率因子

​ 自我保护模式被激活的条件是:在 1 分钟后,Renews (last min) < Renews threshold

  1. 有两种情况会导致 EurekaServer 收不到微服务的心跳

​ a.微服务的自身的故障关闭:只会导致个别服务出现故障,一般不会出现大面积故障

​ b.网络故障:通常会导致 Eureka Server 在短时间内无法收到大批心跳。考虑到这个原因,Eureka 设置了一

​ 个阀值,当判断挂掉的服务的数量超过阀值时,Eureka Server 认为很大程度上出现了网络故障,将不再删

​ 除心跳过期的服务。

  1. 自我保护的机制(阀值)

​ Eureka Server 在运行期间,会统计心跳失败的比例是否低于 85%

SpringCloud概述&注册中心Eureka_第17张图片

	1、低于85%:不在从注册列表中移除服务(网络故障)
	2、不低于85%:删除超过90秒没有发送心跳的服务(非网络故障)

    心跳阀值的公式:
			Renews threshold:(n*2)*0.85
			Renews (last min):n*2
	
	实验1:
		1、开启集群版的eureka
		2、注册5个服务到eureka中
		3、校对心跳阀值的公式
				Renews threshold:(7*2)*0.85=11
				Renews (last min):7*2=14
		4、关闭一个服务,等待60秒,观察该服务是否删除

	实验2:
		1、开启集群版的eureka
		2、注册2个服务到eureka中
		3、校对心跳阀值的公式
				Renews threshold:(4*2)*0.85=6
				Renews (last min):4*2=8
		4、关闭一个服务,等待自我保护的开启

7.2.为什么要启动自我保护

1、网络波动时保留“坏数据”(服务端没挂,但收不到心跳),consumer仍然能从eureka中获得provide的调用地址
2、网络恢复后会退出自我保护模式
3、微服务的负载均衡策略会剔除死亡的节点

7.3.如何关闭自我保护

1、修改 Eureka Server 配置文件

#关闭自我保护:会删除收不到心跳的服务
eureka.server.enable-self-preservation=false

2、重新启动服务,然后关闭客户端进行测试:

此时我们发现,红色警告变成了自我保护被关闭的警告,且一分钟后实例被注册中心剔除,表明此时自我保护机制被关闭

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bN4eW0nq-1640245256881)(assets\1587739032709.png)]

8.注册信息完善与actuator

8.1.注册信息完善

修改前:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F8ewSGnw-1640245256882)(assets\1587718603124.png)]

修改consumer的application.properties:

#该微服务在eureka上的显示名
eureka.instance.instance-id=${spring.cloud.client.ipaddress}:${spring.application.name}:${server.port}
#访问路径可以使用IP地址
eureka.instance.prefer-ip-address= true

修改后:

SpringCloud概述&注册中心Eureka_第18张图片

8.2.actuator

修改前: 点击超链接服务报告ErrorPage

SpringCloud概述&注册中心Eureka_第19张图片

修改:

1、添加依赖

        
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-actuatorartifactId>
        dependency>

2、修改application.properties

#info页面展现配置
info.app.name=springcloud-eureka-provider
info.company.name=www.qf.cn
info.build.artifactId=springcloud_eureka_provider
info.build.version=1.0-SNAPSHOT

完善info信息

SpringCloud概述&注册中心Eureka_第20张图片

监控服务的健康状况:

http://192.168.142.1:8771/actuator/health

SpringCloud概述&注册中心Eureka_第21张图片

你可能感兴趣的:(Spring,Cloud,eureka,系统架构,java,spring,cloud,经验分享)