微服务之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集群,敬请期待。。。

原文地址:https://www.cnblogs.com/gslblog/p/9910315.html