Spring Cloud(3) - 服务治理: Spring Cloud Eureka

什么是Spring Cloud Eureka

Spring Cloud Eureka 是 Spring Cloud 中的一个组件,它是基于 Netflix Eureka 作了二次封装,主要是负责完成微服务框架中服务治理的功能。Spring Cloud经过为 Eureka 增长了 Spring Boot 风格的自动化配置,咱们只须要经过简单的引用依赖和注解就能让 Spring Boot 够将的微服务应用轻松的与 Eureka 服务治理体系进行整合。java

服务治理

服务治理是微服务框架中最为核心和基础的模块,它主要是用来实现各个微服务实例的自动化注册与发现。
最初开始,可能构建的微服务系统服务并非不少,咱们能够经过一些静态配置来完成服务的调用。好比有两个服务 A 和 B,其中 A 服务须要调用 B 服务来完成一个业务操做时,为了实现 B 服务的高可用,不管咱们采用服务端的复杂均衡,仍是客户端的负载均衡,咱们都须要手工的来维护一份 B 的实例列表。可是随着业务的发展,系统功能愈来愈复杂,相应的微服务也是愈来愈多,这种静态手工维护的难度会愈来愈高。
为了解决这种问题,产生了大量的服务治理的框架和产品。这些框架其实都是围绕着服务注册和服务发现机制来完成对微服务应用实例的自动化管理。git

  • 服务注册

在服务治理框架中,一般都会构建一个服务注册中心,每一个服务实例单元向注册中心登记本身的服务,将实例主机位置、端口号、版本号、通讯协议等一系列附加信息告诉注册中心,注册中心按服务名分类组织服务清单。github

  • 服务发现

因为在服务治理框架下操做,服务间的通讯与调用再也不是经过指定具体的实例地址来实现,而是经过向服务名发起请求调用实现。因此,服务调用方在调用服务提供方的接口时,并不知道具体的服务实例位置。所以,须要先向注册中心发起查询请求,获取实例清单,以实现对具体服务实例的访问。web

搭建 Eureka 注册中心服务

搭建单中心 Eureka

  • Spring Cloud 版本:Finchley.BUILD-SNAPSHOT
  • Spring Boot 版本:2.0.2.RELEASE

咱们以后的全部开发都会基于以上版本进行操做,须要注意的是:Sring Cloud 使用的是 SNAPSHOT 版,因此须要在 pom 文件中指定仓库的地址。
首先,咱们新建一个 Spring Boot 工程,命名为:spring-cloud-eureka,并在 pom 中添加必要的依赖,具体 pom 文件以下:spring

<?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.sagesource</groupId>
    <artifactId>spring-cloud-eureka</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>
    <name>spring-cloud-eureka</name>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-cloud.version>Finchley.BUILD-SNAPSHOT</spring-cloud.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-netflix-eureka-server</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</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>

    <repositories>
        <repository>
            <id>spring-snapshots</id>
            <name>Spring Snapshots</name>
            <url>https://repo.spring.io/snapshot</url>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>
</project>

经过 @EnableEurekaServer 注解启动一个服务注册中心提供给其余应用进行对话。这一步很是简单,只需在一个普通的 Spring Boot 应用中添加这个注解就能开启此功能:apache

@SpringBootApplication
@EnableEurekaServer
public class ApplicationEurekaServer {

    public static void main(String[] args) {
        SpringApplication.run(ApplicationEurekaServer.class, args);
    }

}

在默认的配置下,注册中心服务端也会将本身做为一个客户端来注册自身,通常状况下,咱们须要禁用这个功能,修改后的 application.yml 以下:安全

# spring config
spring:
  application:
    name: spring-boot-eureka

# server config
server:
  port: 9871

# eureka config
eureka:
  instance:
    hostname: localhost
  client:
    register-with-eureka: false #不向注册中心注册本身
    fetch-registry: false #不检索服务
    service-url:
          defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

因为咱们都是在本地运行,为了后续的服务区分,咱们将服务注册中心的端口经过 server.port 设置运行端口为:9871
在完成上述配置后,启动应用并访问 http://localhost:9871。能够看到以下页面,其中 Instance currently registered with Eureka 的列表是空的,说明尚未服务注册到该注册中心。网络

clipboard.png
我想你们都注意到上面那两行醒目的红字:app

EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.

缘由:自我保护机制。Eureka Server在运行期间,会统计心跳失败的比例在15分钟以内是否低于85%,若是出现低于的状况(在单机调试的时候很容易知足,实际在生产环境上一般是因为网络不稳定致使),Eureka Server会将当前的实例注册信息保护起来,同时提示这个警告。
因为在单机状况下很容易出现该问题,按照网上的配置关闭掉自我保护后,Eureka 仍会报警,提示安全模式关闭,没法保证明例正确性。因此,咱们暂时忽略该问题,后期集群部署时便可解决。负载均衡

注册服务提供者

在完成了注册中心服务的搭建后,接下来咱们能够尝试将一个既有的 Spring Boot 应用加入到Eureka 的服务治理体系中去。
咱们仍然以以前的 spring-cloud-server 为例,咱们只须要修改 application.yml如下配置:

# 应用名称
spring:
  application:
    name: spring-cloud-server

# eureka 注册中心位置
eureka:
  client:
    service-url:
      defaultZone: http://localhost:9871/eureka/

修改完成后,便可启动服务,这时咱们在刷新 eureka 的管理页面,看到Instance currently registered with Eureka的列表信息以下:

clipboard.png
这代表,咱们的服务已经成功注册在注册中心。

相关实例代码:https://github.com/sagesource...

相关文章
相关标签/搜索