Spring Cloud Eureka 详述(一)(上)

服务治理: Spring Cloud Eureka

服务治理: Spring Cloud Eureka一、简介二、 功能概述服务治理Netflix Eureka搭建服务注册中心注册服务提供者高可用配置中心服务发现与消费

一、简介

Spring cloud eurekaSpring cloud netfilx中的一部分,它基于Netflix Eureka做了二次封装,主要职责完成Eureka 中的服务治理功能

本篇主要探讨如下:

  • 服务治理和Eureka简介
  • 构建服务注册中心
  • 服务注册与服务发现
  • Eureka 基础架构
  • Eureka 的服务治理机制
  • Eureka 的配置

二、 功能概述

服务治理

服务治理可以是说微服务架构中最为核心的基础模块,它主要用来实现各个微服务实现的自动化注册与发现。在开始的时候微服务系统的服务可能并不多,我们需要一些配置来完成服务的调用。

  • 服务注册: 在服务治理框架中,通常会构建一个注册中心,由各个服务提供者来向注册中心登记并提供服务,将主机与端口号、版本号、通信协议等一些附加信息告知注册中心,注册中心按照服务名分类组织服务清单。
服务名 位置
服务A 192.168.1.101:8000, 192.168.1.102:8000
服务B 192.168.1.103:9000,192.168.1.104:9000,192.168.1.105:9000

比如我们有两个提供服务A 的进程分别位于192.168.1.101:8000, 192.168.1.102:8000 上,另外还有三个提供服务B 的进程分别位于192.168.1.103:9000,192.168.1.104:9000,192.168.1.105:9000 进程上,那么你向服务中心注册过后,服务中心就会有一个这样的服务列表,服务中心向各个注册的服务发送心跳机制,来检验服务是否可用,若不可用就会把服务剔除,来达到故障排除的效果

  • 服务发现: 由于在服务治理框架下运作,服务间的调用不再通过指定的Ip:端口号这种方式来实现 ,而是向服务名发起请求实现。所以,在服务调用方在调用服务提供方接口的时候,并不知道具体服务的位置。因此,服务调用方需要向服务中心获取服务列表,以实现对具体服务的访问。

比如一个服务调用者C想要获取服务A的ip来完成接口的调用,那么他首先应该去服务中心发起咨询你服务的请求,由注册中心的服务列表将A的位置发送给调用者C,如果按照上面服务A地址的话,那么调用者C会由两个服务A的地址来提供服务,当服务C需要调用的时候,便从服务A中的清单中采用轮询的方式取出一个位置来服务调用,这个过程也被称为负载均衡

Netflix Eureka

  • Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。SpringCloud将它集成在其子项目spring-cloud-netflix中,以实现SpringCloud的服务发现功能。
  • Eureka包含两个组件: Eureka ServerEureka Client
  • Eureka Server 简称Eureka 服务端, 主要提供服务注册功能,其实也就相当于是注册中心,和其他服务注册中心一样,提供高可用的配置,同时也支持集群部署,当集群中某一个节点发生故障时,那么Eureka就会进入自我保护模式,它允许故障的节点继续提供服务的发现与注册,当故障分片恢复运行时,集群中的其他分片会把他们的状态再同步回来。
  • Eureka Client:简称Eureka 客户端,主要处理服务的注册与发现。客户端通过注解和参数配置的方式,Eureka 客户端向注册中心注册自身的服务并周期性的发送心跳机制来更新服务租约。同时,它也能从服务端查询当前注册的服务信息并把它们缓存到本地并周期性地刷新服务状态。

搭建服务注册中心

Spring Cloud Eureka 是采用SpringBoot 进行项目的快速搭建的,如果不太了解SpringBoot的话,可以了解一下SpringBoot 入门实例。

  • 首先创建SpringBoot工程,命名为Eureka-server,也就是Eureka服务端,创建完成后在pom.xml文件中增加如下maven依赖,完整的文件如下:
<?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.eureka.server</groupId>
   <artifactId>eureka-server</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <name>eureka-server</name>
   <description>Demo project for Spring Boot</description>
   <parent>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-parent</artifactId>
       <version>1.3.7.RELEASE</version>
       <relativePath/> <!-- lookup parent from repository -->
   </parent>
   <properties>
       <java.version>1.8</java.version>
   </properties>
   <dependencies>
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-web</artifactId>
       </dependency>
       <dependency>
           <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-starter-eureka-server</artifactId>
       </dependency>
   </dependencies>
   <dependencyManagement>
       <dependencies>
           <dependency>
               <groupId>org.springframework.cloud</groupId>
               <artifactId>spring-cloud-dependencies</artifactId>
               <version>Brixton.SR5</version>
               <type>pom</type>
               <scope>import</scope>
           </dependency>
       </dependencies>
   </dependencyManagement>
</project>
• 在SpringBoot启动类,也就是@SpringBootApplication修饰的主方法中加入如下注解@EnableEurekaServer。
   @EnableEurekaServer
   @SpringBootApplication
   public class EurekaServerApplication {
       public static void main(String[] args) {
           SpringApplication.run(EurekaServerApplication.class, args);
      }
  }

加入这个注解也就标识着这是一个Eureka的服务端,可以启动服务了,但是启动服务会报错,因为你没有添加注册中心的相关配置。

  • application.properties文件中加入如下内容
server.port=8000

eureka.instance.hostname=localhost
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/

server.port 就代表着注册中心的端口号

eureka.client.service-url.defaultZone :eureka客户端默认服务url

eureka.client.register-with-eureka : 表示注册中心是否向其他注册中心注册自己,单节点注册中心不需要,设置为false

eureka.client.fetch-registry: 表示注册中心是否主动去检索服务,并不需要检索服务,设置为false

其他配置:

# 项目contextPath,一般在正式发布版本中,我们不配置

# 避免加上更目录:Cannot execute request on any known server

# 加上根目录也需要在注册地址上加入根

server.context-path=/eureka81

# 错误页,指定发生错误时,跳转的URL。请查看BasicErrorController源码便知

server.error.path=/error

# 通过spring.application.name属性,我们可以指定微服务的名称后续在调用的时候只需要使用该名称就可以进行服务的访问。

spring.application.name=eureka-server

# eureka是默认使用hostname进行注册,可通过一下项自动获取注册服务IP或者直接通过eureka.instance.ip-address指定IP

# eureka.instance.prefer-ip-address=true

# SpringBoot 在启动的时候会读配置文件,会把prefer-ip-address 默认转换为preferIpAddress驼峰命名

eureka.instance.preferIpAddress=true

# 设为false,关闭自我保护

eureka.server.enable-self-preservation=false

# 清理间隔(单位毫秒,默认是60*1000

eureka.server.eviction-interval-timer-in-ms=6000

# 开启健康检查(需要spring-boot-starter-actuator依赖)

eureka.client.healthcheck.enabled=false

# 续约更新时间间隔(默认30秒)

eureka.instance.lease-renewal-interval-in-seconds=10

# 续约到期时间(默认90秒)

eureka.instance.lease-expiration-duration-in-seconds=30

没有加入 eureka.instance.preferIpAddress=true 之前,默认本地为注册中心

Spring Cloud Eureka 详述(一)(上)

加入 eureka.instance.preferIpAddress=true 之后,圈出来的ip即为eureka.client.service-url.defaultZone指定的 ip。

Spring Cloud Eureka 详述(一)(上)

在完成了上述配置之后,应用程序启动并访问http://localhost:1111/ 可以看到如下图所示的信息版,其中Instances curently registered with Eureka 是空的,表明还没有任何服务提供者提供服务。

            </div>

服务治理: Spring Cloud Eureka

服务治理: Spring Cloud Eureka一、简介二、 功能概述服务治理Netflix Eureka搭建服务注册中心注册服务提供者高可用配置中心服务发现与消费

一、简介

Spring cloud eurekaSpring cloud netfilx中的一部分,它基于Netflix Eureka做了二次封装,主要职责完成Eureka 中的服务治理功能

本篇主要探讨如下:

  • 服务治理和Eureka简介
  • 构建服务注册中心
  • 服务注册与服务发现
  • Eureka 基础架构
  • Eureka 的服务治理机制
  • Eureka 的配置

二、 功能概述

服务治理

服务治理可以是说微服务架构中最为核心的基础模块,它主要用来实现各个微服务实现的自动化注册与发现。在开始的时候微服务系统的服务可能并不多,我们需要一些配置来完成服务的调用。

  • 服务注册: 在服务治理框架中,通常会构建一个注册中心,由各个服务提供者来向注册中心登记并提供服务,将主机与端口号、版本号、通信协议等一些附加信息告知注册中心,注册中心按照服务名分类组织服务清单。
服务名 位置
服务A 192.168.1.101:8000, 192.168.1.102:8000
服务B 192.168.1.103:9000,192.168.1.104:9000,192.168.1.105:9000

比如我们有两个提供服务A 的进程分别位于192.168.1.101:8000, 192.168.1.102:8000 上,另外还有三个提供服务B 的进程分别位于192.168.1.103:9000,192.168.1.104:9000,192.168.1.105:9000 进程上,那么你向服务中心注册过后,服务中心就会有一个这样的服务列表,服务中心向各个注册的服务发送心跳机制,来检验服务是否可用,若不可用就会把服务剔除,来达到故障排除的效果。

  • 服务发现: 由于在服务治理框架下运作,服务间的调用不再通过指定的Ip:端口号这种方式来实现 ,而是向服务名发起请求实现。所以,在服务调用方在调用服务提供方接口的时候,并不知道具体服务的位置。因此,服务调用方需要向服务中心获取服务列表,以实现对具体服务的访问。

比如一个服务调用者C想要获取服务A的ip来完成接口的调用,那么他首先应该去服务中心发起咨询你服务的请求,由注册中心的服务列表将A的位置发送给调用者C,如果按照上面服务A地址的话,那么调用者C会由两个服务A的地址来提供服务,当服务C需要调用的时候,便从服务A中的清单中采用轮询的方式取出一个位置来服务调用,这个过程也被称为负载均衡。

Netflix Eureka

  • Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。SpringCloud将它集成在其子项目spring-cloud-netflix中,以实现SpringCloud的服务发现功能。
  • Eureka包含两个组件: Eureka ServerEureka Client
  • Eureka Server 简称Eureka 服务端, 主要提供服务注册功能,其实也就相当于是注册中心,和其他服务注册中心一样,提供高可用的配置,同时也支持集群部署,当集群中某一个节点发生故障时,那么Eureka就会进入自我保护模式,它允许故障的节点继续提供服务的发现与注册,当故障分片恢复运行时,集群中的其他分片会把他们的状态再同步回来。
  • Eureka Client:简称Eureka 客户端,主要处理服务的注册与发现。客户端通过注解和参数配置的方式,Eureka 客户端向注册中心注册自身的服务并周期性的发送心跳机制来更新服务租约。同时,它也能从服务端查询当前注册的服务信息并把它们缓存到本地并周期性地刷新服务状态。

搭建服务注册中心

Spring Cloud Eureka 是采用SpringBoot 进行项目的快速搭建的,如果不太了解SpringBoot的话,可以了解一下SpringBoot 入门实例。

  • 首先创建SpringBoot工程,命名为Eureka-server,也就是Eureka服务端,创建完成后在pom.xml文件中增加如下maven依赖,完整的文件如下:
<?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.eureka.server</groupId>
   <artifactId>eureka-server</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <name>eureka-server</name>
   <description>Demo project for Spring Boot</description>
   <parent>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-parent</artifactId>
       <version>1.3.7.RELEASE</version>
       <relativePath/> <!-- lookup parent from repository -->
   </parent>
   <properties>
       <java.version>1.8</java.version>
   </properties>
   <dependencies>
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-web</artifactId>
       </dependency>
       <dependency>
           <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-starter-eureka-server</artifactId>
       </dependency>
   </dependencies>
   <dependencyManagement>
       <dependencies>
           <dependency>
               <groupId>org.springframework.cloud</groupId>
               <artifactId>spring-cloud-dependencies</artifactId>
               <version>Brixton.SR5</version>
               <type>pom</type>
               <scope>import</scope>
           </dependency>
       </dependencies>
   </dependencyManagement>
</project>
• 在SpringBoot启动类,也就是@SpringBootApplication修饰的主方法中加入如下注解@EnableEurekaServer。
   @EnableEurekaServer
   @SpringBootApplication
   public class EurekaServerApplication {
       public static void main(String[] args) {
           SpringApplication.run(EurekaServerApplication.class, args);
      }
  }

加入这个注解也就标识着这是一个Eureka的服务端,可以启动服务了,但是启动服务会报错,因为你没有添加注册中心的相关配置。

  • application.properties文件中加入如下内容
server.port=8000

eureka.instance.hostname=localhost
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/

server.port 就代表着注册中心的端口号

eureka.client.service-url.defaultZone :eureka客户端默认服务url

eureka.client.register-with-eureka : 表示注册中心是否向其他注册中心注册自己,单节点注册中心不需要,设置为false

eureka.client.fetch-registry: 表示注册中心是否主动去检索服务,并不需要检索服务,设置为false

其他配置:

# 项目contextPath,一般在正式发布版本中,我们不配置

# 避免加上更目录:Cannot execute request on any known server

# 加上根目录也需要在注册地址上加入根

server.context-path=/eureka81

# 错误页,指定发生错误时,跳转的URL。请查看BasicErrorController源码便知

server.error.path=/error

# 通过spring.application.name属性,我们可以指定微服务的名称后续在调用的时候只需要使用该名称就可以进行服务的访问。

spring.application.name=eureka-server

# eureka是默认使用hostname进行注册,可通过一下项自动获取注册服务IP或者直接通过eureka.instance.ip-address指定IP

# eureka.instance.prefer-ip-address=true

# SpringBoot 在启动的时候会读配置文件,会把prefer-ip-address 默认转换为preferIpAddress驼峰命名

eureka.instance.preferIpAddress=true

# 设为false,关闭自我保护

eureka.server.enable-self-preservation=false

# 清理间隔(单位毫秒,默认是60*1000

eureka.server.eviction-interval-timer-in-ms=6000

# 开启健康检查(需要spring-boot-starter-actuator依赖)

eureka.client.healthcheck.enabled=false

# 续约更新时间间隔(默认30秒)

eureka.instance.lease-renewal-interval-in-seconds=10

# 续约到期时间(默认90秒)

eureka.instance.lease-expiration-duration-in-seconds=30

没有加入 eureka.instance.preferIpAddress=true 之前,默认本地为注册中心

Spring Cloud Eureka 详述(一)(上)

加入 eureka.instance.preferIpAddress=true 之后,圈出来的ip即为eureka.client.service-url.defaultZone指定的 ip。

Spring Cloud Eureka 详述(一)(上)

在完成了上述配置之后,应用程序启动并访问http://localhost:1111/ 可以看到如下图所示的信息版,其中Instances curently registered with Eureka 是空的,表明还没有任何服务提供者提供服务。