• 4.微服务注册与发现


                                微服务注册与发现

    4.1. 服务注册与发现简介     

       

     服务发现组件的功能

    1)服务注册表: 

             服务注册表是一个记录当前可用服务实例的网络信息的数据库,是服务发现机制的核心。服务注册表提供查询API和管理API,使用查询API获得可用的服务实例,使用管理API实现注册和注销;

    2)服务注册

             服务注册很好理解,就是服务启动时,将服务的网络地址注册到服务注册表中;

    3)健康检查

             服务发现组件会通过一些机制定时检测已注册的服务,如果发现某服务无法访问了(可能是某几个心跳周期后),就将该服务从服务注册表中移除。

    服务发现:Eureka客户端

              服务发现是基于微服务架构的关键原则之一。尝试配置每个客户端或某种形式的约定可能非常困难,可以非常脆弱。

    Netflix服务发现服务器和客户端是Eureka。可以将服务器配置和部署为高可用性,每个服务器将注册服务的状态复制到其他服务器。

    注册Eureka

              当客户端注册Eureka时,它提供关于自身的元数据,例如主机和端口,健康指示符URL,主页等。

    Eureka从属于服务的每个实例接收心跳消息。如果心跳失败超过可配置的时间表,则通常将该实例从注册表中删除。

    如何包含Eureka客户端

              要在您的项目中包含Eureka客户端,请使用组org.springframework.cloud和工件ID spring-cloud-starter-eureka的启动器。

    有关 使用当前的Spring Cloud发布列表设置构建系统的详细信息,请参阅Spring Cloud项目页面

    服务发现方式参看地址:http://www.cnblogs.com/bjlhx/p/8796241.html

    4.2. Eureka简介

                  Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。

    Spring Cloud将它集成在其子项目spring-cloud-netflix中,以实现Spring Cloud的服务发现功能。

    Eureka 项目2.0将会带来更好的扩展性,并且使用细粒度的订阅模型取代了基于拉取的模型

    git地址:https://github.com/Netflix/Eureka

    4.3. Eureka原理

     region和zone(或者Availability Zone)均是AWS的概念。在非AWS环境下,我们可以简单地将region理解为Eureka集群,zone理解成机房。这样可理解下图——一个Eureka集群被部署在了zone1机房和zone2机房中。

      参看:https://blog.csdn.net/awschina/article/details/17639191

     

     上图是来自Eureka官方的架构图,大致描述了Eureka集群的工作过程。

    详述:  

      - Application Service 就相当于本书中的服务提供者(用户微服务),Application Client就相当于本书中的服务消费者(电影微服务);
      - Make Remote Call,可以简单理解为调用RESTful的接口;
      - us-east-1c、us-east-1d等是zone,它们都属于us-east-1这个region;

      由图可知,Eureka包含两个组件:Eureka Server 和 Eureka Client。
        Eureka Server提供服务注册服务,各个节点启动后,会在Eureka Server中进行注册,这样Eureka Server中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。
        Eureka Client是一个Java客户端,用于简化与Eureka Server的交互,客户端同时也具备一个内置的、使用轮询(round-robin)负载算法的负载均衡器。
        在应用启动后,将会向Eureka Server发送心跳(默认周期为30秒)。如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,Eureka Server将会从服务注册表中把这个服务节点移除(默认90秒)。
        Eureka Server之间将会通过复制的方式完成数据的同步。(详见Eureka高可用章节)
        Eureka还提供了客户端缓存的机制,即使所有的Eureka Server都挂掉,客户端依然可以利用缓存中的信息消费其他服务的API。
      综上,Eureka通过心跳检测、健康检查、客户端缓存等机制,确保了系统的高可用性、灵活性和可伸缩性。

    4.4. 编写Eureka Server

     pom

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

    <groupId>com.didispace</groupId>
    <artifactId>eureka-server</artifactId>
    <version>1.0.0</version>
    <packaging>jar</packaging>

    <name>eureka-server</name>
    <description>Spring Cloud In Action</description>

    <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.4.RELEASE</version>
    <relativePath/>
    </parent>

    <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <java.version>1.8</java.version>
    </properties>

    <dependencies>
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka-server</artifactId>
    </dependency>

    <!--<dependency>-->
    <!--<groupId>org.springframework.boot</groupId>-->
    <!--<artifactId>spring-boot-starter-actuator</artifactId>-->
    <!--</dependency>-->
    </dependencies>

    <dependencyManagement>
    <dependencies>
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-dependencies</artifactId>
    <version>Dalston.SR1</version>
    <type>pom</type>
    <scope>import</scope>
    </dependency>
    </dependencies>
    </dependencyManagement>

    <build>
    <plugins>
    <plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    </plugin>
    </plugins>
    </build>

    </project>

    配置类

    server:
    port: 8761
    eureka:
    client:
    register-with-eureka: false
    fetch-registry: false
    service-url:
    defaultZone: http://localhost:8761/eureka

    启动类

    package com.didispace;

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

    @EnableEurekaServer
    @SpringBootApplication
    public class Applicationeureka {

    public static void main(String[] args) {
    new SpringApplicationBuilder(Applicationeureka.class).web(true).run(args);
    }

    }

    4.5. 将微服务注册到Eureka Server上

    import org.mybatis.spring.annotation.MapperScan;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
    /**
     * 在这里我们使用@SpringBootApplication指定这是一个 spring boot的应用程序.
     * @author Angel -- 守护天使
     * @version v.0.1
     * @date 2016年12月10日
     */
      
    @SpringBootApplication
    @EnableEurekaClient
    @MapperScan("com.itmuch.cloud.*")//扫描:该包下相应的class,主要是MyBatis的持久化类.
    public class App{
     
        public static void main(String[] args) {
            SpringApplication.run(App.class, args);
        }
    }

    git代码:https://gitee.com/cyj930307/springcloud_textbook.git

    4.6. Eureka Server的高可用

    4.7. 为Eureka Server添加用户认证

            在pom.xml中添加spring-boot-starter-seurity的依赖,该依赖为Eureka Server提供用户认证的能力。

    <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-security</artifactId>
    </dependency>

             在application.yml中添加认证配置。如何不进行配置,则默认用户名是 user ,默认密码是一个随机值,会在项目启动时打印出来

    server:
      port: 8761
    
    security:
        basic: 
          enabled: true 
        user:
          name: root          
          password: 123456  
    eureka:
      client:
        register-with-eureka: false
        fetch-registry: false
        service-url:
          defaultZone: http://root:123456@localhost:8761/eureka  

             启动项目,访问 http://localhost:8761/ 即可看见身份验证的对话框,输出设置的用户名和密码即可进入。

    4.8. 理解Eureka的元数据

    Eureka的元数据有两种:标准元数据和自定义元数据。

    标准元数据:主机名、IP地址、端口号、状态页和健康检查等信息,这些信息都会被发布在服务注册表中,用于服务之间的调用。

    自定义元数据:可以使用eureka.instance.metadata-map配置,这些元数据可以在远程客户端中访问,但是一般不改变客户端行为,除非客户端知道该元数据的含义。

    1.客服端修改

    server:
     port: 7900
    eureka:
      client:
        serviceUrl:
          defaultZone: http://root:123456@localhost:8761/eureka/
      instance:
         prefer-ip-address: true
         metadata-map:
          my-metadata: CYJ
          
          
          
    spring:
      datasource:
        url: jdbc:mysql://localhost:3306/cyj?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=CONVERT_TO_NULL&serverTimezone=UTC
        username : root
        password : 123456
        driverClassName : com.mysql.jdbc.Driver
        max-active: 20
        max-idle: 8
        min-idle: 8
        initial-size: 10
    mybatis:
        mapper-locations: classpath*:mybatis/*Mapper.xml
        type-aliases-package: com.itmuch.cloud.mybatis.entity
    
     
    
    
     

    2. 访问http://localhost:8761/eureka/apps

    4.9. Eureka Server的REST端点

    Eureka Server提供了一些REST端点。

    非JVM的微服务可使用这些REST端点操作Eureka,从而实现注册和发现。

    事实上,Eureka Client就是一个使用Java编写的、操作这些REST端点的类库。

    也可分析这些REST端点,编写其他语言的Eureka Client。

    Eureka提供的REST端点,可以使用XML或者JSON与这些端点通信,默认是XML。

    4.10. Eureka的自我保护模式

    Eureka的自我保护模式

    进入自我保护模式最直观的体现就是Eureka Server首页的警告,如下图:

     默认情况下,如果Eureka Server在一定时间内没有接收到某个微服务实例的心跳,Eureka Server将会注销该实例(默认90秒)。但是当网络分区故障发生时,微服务与Eureka Server之间无法正常通信,这就可能变得非常危险了----因为微服务本身是健康的,此时本不应该注销这个微服务。

      Eureka Server通过“自我保护模式”来解决这个问题----当Eureka Server节点在短时间内丢失过多客户端时(可能发生了网络分区故障),那么这个节点就会进入自我保护模式。一旦进入该模式,Eureka Server就会保护服务注册表中的信息,不再删除服务注册表中的数据(也就是不会注销任何微服务)。当网络故障恢复后,该Eureka Server节点会自动退出自我保护模式。

     自我保护模式是一种对网络异常的安全保护措施。使用自我保护模式,而已让Eureka集群更加的健壮、稳定。

    在Spring Cloud中,可以使用eureka.server.enable-self-preservation=false来禁用自我保护模式

    4.11. 多网卡环境下的IP选择

    简述:

    指定IP在某些场景下很有用,如某台服务器有eth0、eth1和eth2三块网卡,但是eth1可以被其它的服务器访问;

    如果Eureka Client将eth0或者eth2注册到Eureka Server上,其它微服务就无法通过这个IP调用该微服务的接口。

    Spring Cloud提供了按需选择IP的能力,从而避免以上的问题。

    操作:

    方案1、忽略指定名称的网卡

    #忽略eth0,支持正则表达式

    spring.cloud.inetutils.ignored-interfaces[0]=eth0

    #注册时使用ip而不是主机名

    eureka.instance.prefer-ip-address=true

    方案2、只使用站点本地地址

    #只使用站点本地地址

    spring.cloud.inetutils.use-only-site-local-interfaces=true

    #注册时使用ip而不是主机名

    eureka.instance.prefer-ip-address=true

    方案3、手动指定IP地址

    #手动指定IP地址

    spring.cloud.inetutils.default-ip-address=127.0.0.1

    #注册时使用ip而不是主机名

    eureka.instance.prefer-ip-address=true

    4.12. Eureka的健康检查

    Eureka的健康检查

    先看下图:

     

    说明:在Status栏显示着UP,表示应用程序状态正常。其它取值DOWN、OUT_OF_SERVICE、UNKNOWN等,只有UP的微服务会被请求。

    由于Eureka Server与Eureka Client之间使用心跳机制来确定Eureka Client的状态,默认情况下,

    服务器端与客户端的心跳保持正常,应用程序就会始终保持“UP”状态,所以微服务的UP并不能完全反应应用程序的状态。

    Spring Boot Actuator提供了/health端点,该端点可展示应用程序的健康信息,只有将该端点中的健康状态传播到Eureka Server就可以了,实现这点很简单,只需为微服务配置如下内容:

    1
    2
    #开启健康检查(需要spring-boot-starter-actuator依赖)
    eureka.client.healthcheck.enabled = true

    如果需要更细粒度健康检查,可实现com.netflix.appinfo.HealthCheckHandler接口 。 EurekaHealthCheckHandler 已实现了该接口

  • 相关阅读:
    IIS7.x经典模式与集成模式
    pocketsphinx实现连续大词汇量语音识别
    js对象冒充实现的继承
    你不得不知道的HTML5的新型标签
    (译)开发优秀的虚拟现实体验:从开发I Expect You to Die中总结的六个要点
    《构建之法》阅读梳理篇读后感
    VR介绍
    推荐
    VR设备
    开发VR游戏的基本要求
  • 原文地址:https://www.cnblogs.com/caoyingjielxq/p/9466196.html
Copyright © 2020-2023  润新知