zoukankan      html  css  js  c++  java
  • SpringCloud系列三:将微服务注册到Eureka Server上

    1. 回顾

      通过上篇博客的讲解,我们知道硬编码提供者地址的方式有不少问题。要想解决这些问题,服务消费者需要一个强大的服务发现机制,服务消费者使用这种机制获取服务提供者的网络信息。不仅如此,即使服务提供者的信息发生变化,服务消费者也无须修改配置文件。

      服务提供者、服务消费者、服务发现组件这三者之间的关系大致如下:

    • 各个微服务在启动时,将自己的网络地址等信息注册到服务发现组件中,服务发现组件会存储这些信息
    • 服务消费者可从服务发现组件查询服务提供者的网络地址,并使用该地址调用服务提供者的接口
    • 各个微服务与服务发现组件使用一定机制(如心跳)通信。服务发现组件如长时间无法与某微服务实例通信,就会注销该实例。
    • 微服务网络地址发生变更(例如实例增减或IP端口发生变化时),会重新注册到服务发现组件中。

      综上,服务发现组建应具备以下功能。

    • 服务注册表:服务发现组件的核心,用来记录各个微服务的信息。服务注册组件提供查询API和管理API,查询API用于查询可用的微服务实例,管理API用于服务的注册和注销。
    • 服务注册与服务发现:服务注册是指微服务在启动时,将自己的信息注册到服务发现组件上的过程。服务发现是指查询可用微服务列表及其网络地址的机制。
    • 服务检查:服务发现组件使用一定机制定时检测已注册的服务,如发现某实例长时间无法访问,就会从服务注册表中移除该实例。

      Spring Cloud提供了多种服务发现组件的支持,例如Eureka、Consul和ZooKeeper等。本文将以Eureka为例,讲解服务注册与发现。

    2. Eureka简介

      Eureka是Netflix开源的服务发现组件,本身是一个基于REST的服务。它包含Server和Client两部分。Spring Cloud将它集成在子项目Spring Cloud Netflix中,从而实现微服务的注册与发现。

      Eureka包含两个组件:Eureka Server和Eureka Client。

    • Eureka Server提供服务发现的能力,各个微服务启动时,会向Eureka Server注册自己的信息(例如IP、端口、微服务名等),Eureka Server会存储这些信息。
    • Eureka Client是一个Java客户端,用于简化与Eureka Server的交互。
    • 微服务启动后,会周期性(默认30s)向Eureka Server发送心跳以续约自己的“租期”。
    • 如果Eureka Server在一定时间内没有接收到某个微服务实例的心跳,Eureka Server将会注销该实例(默认90s)。
    • 默认情况下,Eureka Server同时也是Eureka Client。多个Eureka Server实例,互相之间通过复制的方式,来实现服务注册表中数据的同步。
    • Eureka Client会缓存服务注册表中的信息。这种方式有一定的优势 —— 首先,微服务无须每次都查询Eureka Server,从而降低了Eureka Server的压力;其次,即时Eureka Server所有节点都宕掉,服务消费者依然可以使用缓存中的信息找到服务提供者并完成调用。

      综上,Eureka通过心跳检查、客户端缓存等机制,提供了系统的灵活性、可伸缩性和可用性。

    3. 实现单节点的Eureka Server

      开发:

      > 创建一个Spring Boot项目。pom.xml内容如下:

    <?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.itmuch.cloud</groupId>
        <artifactId>microservice-descovery-eureka</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <packaging>jar</packaging>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.0.0.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.M8</spring-cloud.version>
        </properties>
    
        <dependencies>
            <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-milestones</id>
                <name>Spring Milestones</name>
                <url>https://repo.spring.io/milestone</url>
                <snapshots>
                    <enabled>false</enabled>
                </snapshots>
            </repository>
        </repositories>
    
    
    </project>

      > 修改启动类,在启动类上添加@EnableEurekaServer注解,声明这是一个Eureka Server。

    package com.itmuch.cloud.microservicedescoveryeureka;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
    
    @EnableEurekaServer // 声明这是一个Eureka Server
    @SpringBootApplication
    public class MicroserviceDescoveryEurekaApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(MicroserviceDescoveryEurekaApplication.class, args);
        }
    }

      > 编写配置文件。将application.properties重命名为application.yml。

    server:
      port: 8761
    eureka:
      instance:
        hostname: localhost
      client:
        register-with-eureka: false # 是否将自己注册到Eureka Server,默认为true。由于当前应用就是Eureka Server,故而设为false
        fetch-registry: false # 表示是否从Eureka Sever获取注册信息,默认为true。因为这个一个单节点的Eureka Server,不需要同步其他的Eureka Server节点的数据,故而设为false
        service-url:
          defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka # 设置与Eureka Server交互的地址,查询服务和注册服务都需要依赖这个地址。

      测试:

      > 启动Spring Boot项目,访问:http://localhost:8761,如下图,则正常

      此时,还没有任何微服务实例被注册到Eureka Server上。

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

    • 改造用户微服务:microservice-simple-provider-user

      > 复制项目microservice-simple-provider-user,将ArtifactId修改为microservice-provider-user

      > 在pom.xml中添加eureka依赖。内容如下:

    <?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.itmuch.cloud</groupId>
        <artifactId>microservice-provider-user</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <packaging>jar</packaging>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.0.0.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.M8</spring-cloud.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-jpa</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>com.h2database</groupId>
                <artifactId>h2</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-client</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-milestones</id>
                <name>Spring Milestones</name>
                <url>https://repo.spring.io/milestone</url>
                <snapshots>
                    <enabled>false</enabled>
                </snapshots>
            </repository>
        </repositories>
    
    </project>

      > 在配置文件application.yml中添加如下配置:

    spring
      application:
        name: microservice-provider-user # 指定注册到Eureka Server上的应用名称
    eureka:
      client:
        service-url:
          defaultZone: http://localhost:8761/eureka/
      instance:
        prefer-ip-address: true # 将自己的IP注册到Eureka Server。若不配置或设置为false,表示注册微服务所在操作系统的hostname到Eureka Server

      > 修改启动类,在启动类上添加@EnableDiscoveryClient注解,声明这个一个Eureka Client。

        也可以使用@EnableEurekaClient注解代替@EnableDiscoveryClient。在Spring Cloud中,服务发现组件也有多种选择,例如Zookeeper、Consul等。

        @EnableEurekaClient:表明是Eureka的Client,该注解时spring-cloud-netflix项目中的注解,只能与Eureka一起工作。

        @EnableDiscoveryClient:为各个服务组件提供了支持,该注解时spring-cloud-commons项目的注解,是一个高度的抽象。

    package com.itmuch.cloud.microserviceprovideruser;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    
    @SpringBootApplication
    @EnableDiscoveryClient // 声明这是一个Eureka Client
    public class MicroserviceProviderUserApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(MicroserviceProviderUserApplication.class, args);
        }
    }
    • 改造电影微服务:microservice-simple-consumer-movie

      > 复制项目microservice-simple-consumer-movie,将ArtifactId修改为microservice-consumer-movie。

      > 在pom.xml中添加eureka依赖。同上。

      > 修改application.yml配置。将spring.application.name修改为microservice-consumer-movie,其他同上。

      > 修改启动类,在启动类上添加@EnableDiscoveryClient注解。同上。

      测试:

      > 启动microservice-discovery-eureka。(必须第一个启动

      > 启动microservice-provider-user。

      > 启动microservice-consumer-movie。

      > 访问 http://localhost:8761/,若如下图,则正常。两个微服务都已经注册到服务发现组件中。

    5. 总结

      单节点的Eureka Server并不适合线上生成环境。

      因此,下一篇博文将讲解Eureka Server的高可用。敬请期待~~~

    6. 参考:

      周立 --- 《Spring Cloud与Docker微服务架构与实战》

  • 相关阅读:
    python命令行参数处理
    linux进程管理
    hadoop
    linux进程间通信之信号
    HA for openstack
    ubutun 安装php7.1x
    php 函数小技巧(一)
    git error: RPC failed; result=56, HTTP code = 200
    php面试题汇总四(基础篇附答案)
    php面试题汇总三(基础篇附答案)
  • 原文地址:https://www.cnblogs.com/jinjiyese153/p/8610789.html
Copyright © 2011-2022 走看看