SpringCloud —— Eureka 注册中心

前文

微服务 SpringCloud 简介

微服务 SpringCloud 版本选型

微服务 SpringCloud 工程构建

什么是 Eureka ?

Eureka 是 Netflix 的一个子模块,也是核心模块之一。Eureka 是一个基于 REST 的服务,用于定位服务,以实现云端中间层服务发现和故障转移。服务注册与发现对于微服务架构来说是非常重要的,有了服务发现与注册,只需要使用服务的标识符,就可以访问到服务,而不需要修改服务调用的配置文件了。功能类似于 dubbo 的注册中心,比如 ZookeeperNetflix 在设计 Eureka 时遵守的就是 AP 原则

Eureka 的基本架构

Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务注册与发现(请对比 Zookeeper)

Eureka 采用了 CS 的架构设计。Eureka Server 作为服务注册功能的服务器,它是服务注册中心

    而系统中的其它微服务,使用 Eureka 的客户端连接到 Eureka Server 并维持心跳连接。这样系统的维护人员就可以通过 Eureka Server 来监控系统中各个微服务是否正常运行。Spring Cloud 的一些其它模块(如 Zuul)就可以通过 Eureka Server 来发现系统中的其它微服务,并执行相关的逻辑

Eureka 与 Dubbo 的结构对比(重点)

在这里插入图片描述
在这里插入图片描述

Eureka 中的组件

Eureka 包含两个组件Eureka ServerEureka Client

  • Eureka Server (提供服务注册服务):各个节点启动后,会在 Eureka Server 中进行注册,这样 Eureka Server 中的服务注册表中将会存储所有可用的服务节点的信息,服务节点的信息可以在界面中直观的看到
  • Eureka Client 是一个 Java 客户端,用于简化 Eureka Server 的交互,客户端同时也具备一个内置的、使用轮询(round-robin)负载法的负载均衡器。在应用启动后,将会向 Eureka Server 发送心跳(默认周期为 30 s)。如果 Eureka Server 在多个心跳周期内没有接收到某个节点的心跳,Eureka Server 将会从服务注册表中把这个服务节点移除(默认周期为 90 s)

Eureka 中的三大角色

Eureka 中的三大角色有:Eureka ServerService ProviderService Consumer

  • Eureka Server:提供服务注册与发现
  • Service Provider:服务提供方将自身服务注册到 Eureka,从而使服务消费方能够找到
  • Service Consumer:服务消费方从 Eureka 获取注册服务列表,从而能够消费服务

1.x 和 2.x 的对比说明(Server)

以前老版本(2018)

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eureka</artifactId>
    </dependency>
</dependencies>

现在新版本(2020.2)

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
</dependencies>

创建工程(Server)

先创建一个 Eureka Server 工程,提供服务注册的功能

添加依赖

<dependencies>
    <!--eureka-server-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
    <!--boot web actuator-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <!--一般通用配置-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
    </dependency>
</dependencies>

编写 application.yml 文件

server:
  port: 7001

eureka:
  instance:
    hostname: localhost         # Eureka 服务端的实例名称
  client:
    register-with-eureka: false # false 表示不向注册中心注册自己
    fetch-registry: false       # false 表示自己端就是注册中心,职责就是维护服务实例,并不需要去检索服务
    service-url:
      # 设置与 Eureka Server 交互的地址查询服务和注册服务都需要依赖这个地址
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

编写启动类

package com.java.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

/**
 * @author Woo_home
 * @create 2020/3/25 11:33
 */

@SpringBootApplication
@EnableEurekaServer
public class EurekaServerMain7001 {
    public static void main(String[] args){
        SpringApplication.run(EurekaServerMain7001.class,args);
    } 
}

启动项目

在这里插入图片描述
访问 http://localhost:7001/,如下所示
在这里插入图片描述
可以发现,Eureka Server 还没有服务注册进来

1.x 和 2.x 的对比说明(Client)

同样地,Eureka Server 有对比说明,那么 Eureka Client 也有对比说明,如下:

以前的版本(不推荐使用)

<!--eureka-client-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>

现在新版本(推荐使用)

<!--eureka-client-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

创建工程(Client)

上面例子已经建好了 Server 端,既然要有服务注册,那么就得有 Client 端

添加依赖

<dependencies>
   <!--包含了sleuth+zipkin-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-zipkin</artifactId>
    </dependency>
    <!--eureka-client-->
    <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-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid-spring-boot-starter</artifactId>
        <version>1.1.10</version>
    </dependency>
    <!--mysql-connector-java-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>${mysql.version}</version>
    </dependency>
    <!--jdbc-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

编写 application.yml

server:
  port: 8001

spring:
  application:
  	# 注册的名字
    name: demo-provider-payment

eureka:
  client:
    # 表示是否将自己注册进 EurekaServer 默认为 true
    register-with-eureka: true
    # 是否从 EurekaServer 抓取已有的注册信息,默认为 true,单节点无所谓,集群必须设置为 true 才能配合 Ribbon 使用负载均衡
    fetchRegistry: true
    service-url:
      # 注册地址
      defaultZone: http://localhost:7001/eureka

编写启动类

package com.java.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

/**
 * @author Woo_home
 * @create by 2020/03/24
 */
@SpringBootApplication
@EnableEurekaClient
public class PaymentMain8001 {
    public static void main(String[] args){
        SpringApplication.run(PaymentMain8001.class,args);
    }
}

启动项目

在这里插入图片描述
注意:启动 Client 端之前先启动 Server 端
在这里插入图片描述
再次访问 http://localhost:7001/ 刷新如下:
在这里插入图片描述
可以发现 8001 这个服务已经注册进来了
在这里插入图片描述

多个服务注册

同样地,注册多个服务,只需要创建多个 Client 就可以,如下:
在这里插入图片描述

发布了227 篇原创文章 · 获赞 1032 · 访问量 24万+

猜你喜欢

转载自blog.csdn.net/Woo_home/article/details/105090495