【SpringCloud微服务--Eureka服务注册中心】

SpringCloud微服务全家桶学习笔记【持续更新】

gitee仓库
内容:SpringCloud + SpringCloud alibaba

技术栈:Java8+maven+git,github+Nginx+RabbitMQ+SpringBoot2.0

微服务架构概述

微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。每个服务运行在其独立的进程中,服务与服务间采用轻量级的通信机制互相协作(通常是基于HTTP协议的RESTful API)。每个服务都围绕具体业务进行构建,并且能够被独立的部署到生产环境、类生产环境等。另外,应当尽量避免统一的、集中式的服务管理机制,对具体的一个服务而言应根据业务上下文,选择合适的语言、工具对其进行构建
【SpringCloud微服务--Eureka服务注册中心】_第1张图片
主流技术框架

功能 框架
服务注册中心 Eureka,Zookeeper,Consul,Nacos
服务调用 Ribbon,LoadBalancer
服务调用2 Feign,OpenFeign
服务降级 Hydtrix,Resilience4j,Sentienl
服务网关 Zuul,Zuul2,GateWay
服务配置 Config,Nacos
服务总线 Bus,Nacos

开发环境及相关框架版本

框架 版本
cloud Hoxton.SR1
boot 2.2.2.RELEASE
cloud alibaba 2.1.0.RELEASE
java 1.8
maven 3.8.2,3.5以上即可
mysql 5.7及以上

项目搭建

新建project工作空间和项目结构及父工程pom依赖版本声明
在搭建项目时:
约定>配置>编码
在父工程pom文件中声明依赖版本等约束

父工程pom文件配置

dependencyManagement里只是声明依赖,并不实现引入,因此子项目需要显示的声明需要用的依赖。


  <properties>
      <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
      <maven.compiler.source>1.8maven.compiler.source>
      <maven.compiler.target>1.8maven.compiler.target>
      <junit.version>4.12junit.version>
      <log4j.version>1.2.17log4j.version>
      <lombok.version>1.16.18lombok.version>
      <mysql.version>5.1.47mysql.version>
      <druid.version>1.1.16druid.version>
      <mybatis.spring.boot.version>1.3.0mybatis.spring.boot.version>
  properties>

  <dependencyManagement>
    <dependencies>
      
      <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-dependenciesartifactId>
        <version>2.2.2.RELEASEversion>
        <type>pomtype>
        <scope>importscope>
      dependency>

      <dependency>
        <groupId>org.springframework.cloudgroupId>
        <artifactId>spring-cloud-dependenciesartifactId>
        <version>Hoxton.SR1version>
        <type>pomtype>
        <scope>importscope>
      dependency>

      <dependency>
        <groupId>com.alibaba.cloudgroupId>
        <artifactId>spring-cloud-alibaba-dependenciesartifactId>
        <version>2.1.0.RELEASEversion>
        <type>pomtype>
        <scope>importscope>
      dependency>
      <dependency>
        <groupId>mysqlgroupId>
        <artifactId>mysql-connector-javaartifactId>
        <version>${mysql.version}version>
      dependency>
      <dependency>
        <groupId>com.alibabagroupId>
        <artifactId>druidartifactId>
        <version>${druid.version}version>
      dependency>
      <dependency>
        <groupId>org.mybatis.spring.bootgroupId>
        <artifactId>mybatis-spring-boot-starterartifactId>
        <version>${mybatis.spring.boot.version}version>
      dependency>
      <dependency>
        <groupId>junitgroupId>
        <artifactId>junitartifactId>
        <version>${junit.version}version>
      dependency>
      <dependency>
        <groupId>log4jgroupId>
        <artifactId>log4jartifactId>
        <version>${log4j.version}version>
      dependency>
      <dependency>
        <groupId>org.projectlombokgroupId>
        <artifactId>lombokartifactId>
        <version>${lombok.version}version>
        <optional>trueoptional>
      dependency>
    dependencies>
  dependencyManagement>

1.构建微服务模块流程

  1. 建module
  2. 改pom
  3. 写yml
  4. 主启动类
  5. 业务类

2.微服务搭建

Eureka基础知识

1.什么是服务治理

​ Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务治理

在传统的rpc远程调用框架中,管理每个服务与服务之间依赖关系比较复杂,管理比较复杂,所以需要使用服务治理,管理服务于服务之间依赖关系,可以实现服务调用、负载均衡、容错等,实现服务发现与注册。

2.什么是服务注册与发现

Eureka采用了CS的设计架构,Eureka Server 作为服务注册功能的服务器,它是服务注册中心。而系统中的其他微服务,使用 Eureka的客户端连接到 Eureka Server并维持心跳连接。这样系统的维护人员就可以通过 Eureka Server 来监控系统中各个微服务是否正常运行。
在服务注册与发现中,有一个注册中心。当服务器启动的时候,会把当前自己服务器的信息 比如 服务地址通讯地址等以别名方式注册到注册中心上。另一方(消费者|服务提供者),以该别名的方式去注册中心上获取到实际的服务通讯地址,然后再实现本地RPC调用RPC远程调用框架核心设计思想:在于注册中心,因为使用注册中心管理每个服务与服务之间的一个依赖关系(服务治理概念)。在任何rpc远程框架中,都会有一个注册中心(存放服务地址相关信息(接口地址))
【SpringCloud微服务--Eureka服务注册中心】_第2张图片

3.Eureka包含两个组件:Eureka Server和Eureka Client
Eureka Server提供服务注册服务

各个微服务节点通过配置启动后,会在EurekaServer中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观看到。

EurekaClient通过注册中心进行访问

是一个Java客户端,用于简化Eureka Server的交互,客户端同时也具备一个内置的、使用轮询(round-robbin)负载算法的负载均衡器。在应用启动后,将会向Eureka Server发送心跳(默认周期为30秒)。如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,EurekaServer将会从服务注册表中把这个服务节点移除(默认90秒)

4.Eureka集群管理原理

【SpringCloud微服务--Eureka服务注册中心】_第3张图片

5.Eureka模拟集群

修改C:\Windows\System32\drivers\etc中hosts文件
【SpringCloud微服务--Eureka服务注册中心】_第4张图片

在文件中添加

【SpringCloud微服务--Eureka服务注册中心】_第5张图片

以此来模拟集群,服务将可以注册到三个服务注册中心中,当某一个注册中心宕机后,并不影响业务

6.负载均衡

【SpringCloud微服务--Eureka服务注册中心】_第6张图片

将处理同一业务的服务部署在不同的服务器上,当访问量过大时,可分流访问不同的服务器

订单服务访问地址不能写死
在这里插入图片描述

使用@LoadBalanced注解赋予RestTemplate负载均衡的能力

【SpringCloud微服务--Eureka服务注册中心】_第7张图片
先要启动EurekaServer,7001/7002服务

再要启动服务提供者provider,8001/8002服务

使用客户端8080端口访问:http://localhost:8080/consumer/payment/get/3

访问结果:每一次请求都轮循访问8001/8002

Ribbon和Eureka整合后Consumer可以直接调用服务而不用再关心地址和端口号,且该服务还有负载功能了。O(∩_∩)O

7.服务发现discovery

主启动类配置@EnableDiscoveryClient注解

控制类添加字段 private DiscoveryClient discoveryClient;
【SpringCloud微服务--Eureka服务注册中心】_第8张图片
通过访问可以验证,此方法可获得服务相关信息

8.Eureka自我保护机制

概述
保护模式主要用于一组客户端和Eureka Server之间存在网络分区场景下的保护。一旦进入保护模式,
Eureka Server将会尝试保护其服务注册表中的信息,不再删除服务注册表中的数据,也就是不会注销任何微服务。

如果在Eureka Server的首页看到以下这段提示,则说明Eureka进入了保护模式:
在这里插入图片描述

为什么会产生Eureka自我保护机制?
为了防止EurekaClient可以正常运行,但是 与 EurekaServer网络不通情况下,EurekaServer不会立刻将EurekaClient服务剔除

什么是自我保护模式?
默认情况下,如果EurekaServer在一定时间内没有接收到某个微服务实例的心跳,EurekaServer将会注销该实例(默认90秒)。但是当网络分区故障发生(延时、卡顿、拥挤)时,微服务与EurekaServer之间无法正常通信,以上行为可能变得非常危险了——因为微服务本身其实是健康的,此时本不应该注销这个微服务。Eureka通过“自我保护模式”来解决这个问题——当EurekaServer节点在短时间内丢失过多客户端时(可能发生了网络分区故障),那么这个节点就会进入自我保护模式。

【SpringCloud微服务--Eureka服务注册中心】_第9张图片

在自我保护模式中,Eureka Server会保护服务注册表中的信息,不再注销任何服务实例。
它的设计哲学就是宁可保留错误的服务注册信息,也不盲目注销任何可能健康的服务实例。一句话讲解:好死不如赖活着

综上,自我保护模式是一种应对网络异常的安全保护措施。它的架构哲学是宁可同时保留所有微服务(健康的微服务和不健康的微服务都会保留)也不盲目注销任何健康的微服务。使用自我保护模式,可以让Eureka集群更加的健壮、稳定。

你可能感兴趣的:(SpringCloud全家桶,eureka,spring,cloud,微服务)