zoukankan      html  css  js  c++  java
  • 微服务之SpringCloud实战(二):SpringCloud Eureka服务治理

    服务治理

      SpringCloud Eureka是SpringCloud Netflix微服务套件的一部分,它基于Netflix Eureka做了二次封装,主要完成微服务的服务治理功能,SpringCloud通过为Eureka增加了SpringBoot自动化配置,只需要简单的依赖和配置就可完成Eureka整合搭建。

        服务治理可以说是微服务中做核心的模块,主要负责服务的自动化注册与发现,在最初开始构建微服务的时候,可能服务并不会很多,我们可以通过一些静态配置进行相互调用,但是随着业务的更新迭代,会越来越复杂,就会发现静态配置已经难以满足我们的需求了,我们的集群、服务位置、服务命名都可能发生变化,如果是人工进行维护的话将消耗很多的人力,为了解决微服务中的服务实例维护问题,产生了大量的服务治理的框架,这些框架都围绕服务注册和发现及服务实例的自动化管理。

    话不多说上代码,搭建一个单机的Eureka,首先需要创建SpringBoot项目,创建SpringBoot这里就不讲解了,不会可以看一下我搭建SpringBoot的文章,下图为目录:

    导入Eureka相关依赖信息,SpringBoot我用的是1.5.3-RELEASE版本:

     1 <parent>
     2         <groupId>org.springframework.boot</groupId>
     3         <artifactId>spring-boot-starter-parent</artifactId>
     4         <version>1.5.3.RELEASE</version>
     5     </parent>
     6     
     7     <properties>
     8         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     9         <java.version>1.8</java.version>
    10         <spring.cloud.version>Dalston.SR2</spring.cloud.version>
    11     </properties>
    12     
    13     <dependencyManagement>
    14         <dependencies>
    15             <dependency>
    16                 <groupId>org.springframework.cloud</groupId>
    17                 <artifactId>spring-cloud-dependencies</artifactId>
    18                 <version>${spring.cloud.version}</version>
    19                 <type>pom</type>
    20                 <scope>import</scope>
    21             </dependency>
    22         </dependencies>
    23     </dependencyManagement>
    24     
    25     <dependencies>
    26         <dependency>
    27             <groupId>org.springframework.cloud</groupId>
    28             <artifactId>spring-cloud-starter-eureka-server</artifactId>
    29         </dependency>
    30         <dependency>
    31             <groupId>org.springframework.boot</groupId>
    32             <artifactId>spring-boot-starter-actuator</artifactId>
    33         </dependency>
    34     </dependencies>

    EurekaServer.java代码如下,也就是EurekaServer启动入口:

     1 package cloud.eureka.server;
     2 
     3 import org.springframework.boot.SpringApplication;
     4 import org.springframework.boot.autoconfigure.SpringBootApplication;
     5 import org.springframework.boot.web.support.SpringBootServletInitializer;
     6 import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
     7 
     8 @SpringBootApplication
     9 @EnableEurekaServer
    10 public class EurekaServer extends SpringBootServletInitializer {
    11     public static void main(String[] args) {
    12         SpringApplication.run(EurekaServer.class, args);
    13     }
    14 }

    核心部分application.yml:

    #公共配置信息
    server:
      port: 9901
    
    spring:
      application:
        name: eureka-server
      profiles:  
        active: node1
    
    eureka:
      instance:
        prefer-ip-address: true
        instance-id: ${spring.cloud.client.ipAddress}:${server.port} 
      server:
        enableSelfPreservation: true                #关闭保护机制,以确保注册中心可以将不可用的实例剔除.(注意:自我保护模式是一种应对网络异常的安全保护措施,使用自我保护模式,可以让Eureka集群更加的健壮、稳定)
        evictionIntervalTimerInMs: 5000            #eureka server清理无效节点的时间间隔,默认60000毫秒,即60秒
      client:
        registerWithEureka: true
        fetchRegistry: true
     
    #用---分割不同的环境对应的配置信息(YML以"---"作为文档分割符,以"..."作为结束标志)
    ---
    spring:
      profiles: node1
      
    eureka:
      client:
        serviceUrl:
          defaultZone: http://10.200.159.22:${server.port:9902}/eureka/
    ...

    搭建结束,是不是很简单想迫不及待的运行一下了:

    运行方式:

      1.IDE直接配置启动类

      2.maven install之后执行java -jar eureka-server.jar --spring.profiles.active=node1&

      3.mvn spring-boot:run -Dspring.profiles.active=node1

     启动之后访问测试地址:http://注册中心IP:端口,访问之后就会出现下面的界面

    注册成功之后,一起来看下原理:

    服务注册:

      服务提供在启动时候会发送一个REST请求将自己注册到Eureka Server,同时会带上自身的元数据信息(主机、端口、URL等),Eureka接收到REST请求之后,将元数据信息存储到一个双层Map中,第一层的Key是服务名,第二层的Key是服务的实例名,在服务注册的时候需要确认一下eureka.client.register-with-eureka=true参数是否正确,如果为false则不启动注册操作。

    服务同步:

      服务提供者将自己注册到不同的服务注册中心上,也就是说他们的信息被两个服务注册中心所维护,由于服务注册中心之间因相互注册为服务,当服务提供者发送注册请求到其中一个服务注册中心的时候,它会将该请求转发给集群中相连的其他注册中心,从而实现注册中心之间的服务同步。

    服务续约:

      注册成功之后,服务提供者会维护一个心跳来持续告诉Eureka Server “我还活着”,防止Eureka的失效剔除将该服务实例从服务列表中排出出去。

      eureka.instance.lease-renewal-interval-in-seconds=30
      eureka.instance.lease-expiration-duration-in-seconds=90

    服务下线:

      系统运行中必然会面临关闭和重启服务的某个实例情况,在服务关闭期间我们自然不希望客户端可以继续调用关闭的实例,所以在客户端程序中,当服务实例进行正常关闭操作的时候,会触发一个服务下线的REST请求给Eureka,告诉它“我要下线了”,服务端接受到请求之后将状态置为DOWN,并且把该事件传播出去。

    服务失效剔除:

      有些时候,微服务并不一定是正常下线的,可能内存溢出、网络故障等问题的出现不能让微服务正常使用,但是服务注册中心并没有收到服务下线的请求,为了将这些出问题的微服务实例从服务列表中剔除掉,Eureka在启动的时候会创建一个定时任务,默认每隔60秒将清单中默认90秒没有服务续约的微服务剔除。

    自我保护:

      Eureka在运行期间会统计服务发送心跳失败的比例在15分钟内是否低于85%,如果出现低于的情况,Eureka就会将当前的实例信息保护起来,让这些实例不会过期。但是,在保护的这段期间如果出现问题,客户端很容易拿到实际已经不存在的服务实例,会出现调用失败的情况,所以客户端必须要有容错机制,比如请求重试、断路由等。

    之后会讲解如何搭建Eureka集群,敬请期待。。。

  • 相关阅读:
    Slim + Twig 构建PHP Web应用程序
    Slim
    nginx+php+flight 构建RESTFul API
    Redis Master/Slave 实践
    spring.net +dapper 打造简易的DataAccess 工具类.
    API文档管理工具-数据库表结构思考.
    解决oracle报 ORA-12560错误,只有服务器重启恢复正常的问题
    浮点数的编码
    Jquery.BlockUI-遮罩
    class.forname & classloader
  • 原文地址:https://www.cnblogs.com/gslblog/p/9910315.html
Copyright © 2011-2022 走看看