【夯实Spring Cloud】Spring Cloud中的Eureka服务注册与发现详解

版权声明:尊重博主原创文章,转载请注明出处 https://blog.csdn.net/eson_15/article/details/85002026

本文属于【夯实Spring Cloud】系列文章,该系列旨在用通俗易懂的语言,带大家了解和学习Spring Cloud技术,希望能给读者带来一些干货。系列目录如下:

【夯实Spring Cloud】Dubbo沉睡5年,Spring Cloud开始崛起!
【夯实Spring Cloud】Spring Cloud中基于maven的分布式项目框架的搭建
【夯实Spring Cloud】Spring Cloud中的Eureka服务注册与发现详解
【夯实Spring Cloud】Spring Cloud中如何完善Eureka中的服务信息
【夯实Spring Cloud】Spring Cloud中使用Eureka集群搭建高可用服务注册中心
【夯实Spring Cloud】Spring Cloud中的Eureka和Zookeeper的区别在哪?
【夯实Spring Cloud】Spring Cloud中使用Ribbon实现负载均衡详解(上)
【夯实Spring Cloud】Spring Cloud中使用Ribbon实现负载均衡详解(下)
【夯实Spring Cloud】Spring Cloud中自定义Ribbon负载均衡策略
【夯实Spring Cloud】Spring Cloud中使用Feign实现负载均衡详
【夯实Srping Cloud】Spring Cloud中使用Hystrix实现断路器原理详解(正在写……)
【夯实Spring Cloud】Spring Cloud中使用Zuul实现路由网关详解(正在写……)
【夯实Spring Cloud】Spring Cloud分布式配置中心详解(正在写……)
【夯实Spring Cloud】未完待续


1. 什么是Eureka?官方解释

官方的解释是这样子的:Eureka 是 Netflix 的一个子模块,也是核心模块之一,Eureka 是一个基于 REST 的服务,用于定位服务,以实现云端中间层服务发现和故障转移。服务注册与发现对于微服务架构来说是非常重要的,有了服务发现与注册,只需要使用服务的标识符,就可以访问到服务,而不需要修改服务调用的配置文件了。这就类似于 Dubbo 的注册中心,比如 Zookeeper。

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

官方github:https://github.com/Netflix/eureka

2. 我的解释

我的解释:现在有很多创业公司,很多城市都有一些经济开发区,在经济开发区有很多写字楼,多个创业公司都会注册进经济开发区大楼,租一间写字楼作为办公基地。

那么这里的创业公司就相当于微服务,而开发区大楼的注册登记表就相当于 Eureka。

每个创业公司都要定期向开发区负责人或者机构交房租和物业费,如果某个创业公司不交物业费了,那么该开发区大楼负责人员就会去要,若多次不给,那么就会将其移出开发区大楼。这就是 Eureka 的心跳机制。

PS:技术解决方案,大部分源自于生活,就是这个道理,所以我们要做一个懂生活的技术人。

3. Eureka的架构

Eureka 架构本身主要包含两个组件:Eureka Server 和 Eureka Client,分别表示服务端和客户端。如下图所示

Eureka架构图

Eureka Server 提供服务注册服务,各个节点启动后,会在 Eureka Server 中进行注册,这样 Eureka Server 中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在 Eureka 的界面(下文会说明)中直观的看到。

Eureka Client 是一个 Java 客户端,用于简化 Eureka Server 的交互,客户端同时也具备一个内置的、使用轮询(roud-robin)负载算法的负载均衡器。在应用启动后,将会向 Eureka Server 发送心跳(默认周期为30秒)。如果Eureka Server 在多个心跳周期内没有接收到某个节点的心跳。Eureka Server 将会从服务注册表中把这个服务节点移除(默认90秒)。

4. Eureka 架构的代码实现

从上面的架构图中可以看出,Eureka 服务注册和发现架构主要有三个角色构成:Eureka 服务端、Eureka 客户端(微服务提供方)和服务消费端(微服务消费方)。下面结合实际项目工程,详细总结一下工程的构建。

4.1 Eureka Server 端

Eureka Server 端提供服务注册和发现。我们首先创建一个 Eureka Server工程:microservice-eureka01,之所以用01,因为后面我要搭建 Eureka 集群,所以暂且先就一个 eureka01。具体创建方式和本系列第二篇文章一样,不再赘述。

我们新创建一个服务,一般分三步走:导入依赖、配置文件、启动注解。我们一步步来分析。

首先导入依赖:我们用的 Spring Cloud 版本是 Finchley,依赖如下:

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

接下来是 Spring Boot 项目配置文件:application.yml

server:
  port: 7001

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

我们定义 Eureka Server 的服务端口为7001,然后定义了 Eureka 服务的服务名以及该服务的地址。相关信息见上面的注释。当然咯,要在hosts文件中配置 127.0.0.1 和 eureka01 的映射。

最后在 Spring Boot 工程的启动类中添加 @EnableEurekaServer 注解,表示该服务是 Eureka Server,接受其他微服务注册进来。如下:

/**
 * eureka-server
 * @author shengwu ni
 * '@EnableEurekaServer' 注解表示服务器端启动类,接受其他微服务注册进来
 */
@SpringBootApplication
@EnableEurekaServer
public class EurekaServer01 {

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

OK,接下来启动服务,在浏览器输入localhost:7001,如果出现下面的网页,说明 Eureka server 服务OK。这就是 Eureka 的可视化界面,可以监控一些注册进来的服务信息,下文我再详解。

在这里插入图片描述

4.2 Eureka Client 端

Eureka Client 端即服务的提供方,将自身服务注册到 Eureka Server,从而使服务消费方能够找到。我们将上一节Spring Cloud中基于maven的分布式项目框架的搭建中的 microservice-order-provider01(端口8001)改造成 Eureka client 端。

还是分三步走:导入依赖、配置文件、启动注解。

Eureka Client 端所依赖的注解如下:

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

项目配置文件需要添加如下信息:

spring:
  application:
    name: microservice-order # 对外暴露的服务名称

# 客户端注册进eureka服务列表里
eureka:
  client:
    service-url:
      defaultZone: http://eureka01:7001/eureka/

可以看到,我们给该服务起了个名称,该名称是服务对外暴露的名称。除此之外,我们指定了将该 Client 端注册到哪个 Eureka 服务列表里,这里的 http://eureka01:7001/eureka/ 就是上面我们定义的 Eureka Server 的服务地址。这样就可以将 Eureka Client 端和 Eureka Server 端联系起来了。

最后在 Spring Boot 工程的启动类中添加 @EnableEurekaClient 注解,表示该服务是 Eureka Client,启动后会自动注册到指定的 Eureka Server。如下:

/**
 * 订单服务
 * @author shengwu ni
 * "@EnableEurekaClient" 服务启动后会自动注册到eureka服务中心
 */
@SpringBootApplication
@EnableEurekaClient
@MapperScan("com.itcodai.springcloud.dao")
public class OrderProvider01 {

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

现在我们将 Eureka Server 和 Eureka Client 端都写好了,来测试一下,刚刚 Eureka Server 端已经启动了,现在我们来启动一下这个 OrderProvider01 服务,然后刷新一下 Eureka 可视化界面即可看到该服务已经注册进来了。

服务注册进来

可以看出,已经有个微服务注册进来了,名字为:MICROSERVICE-ORDER。这个名字从哪来的呢?还记得上面 microservice-order-provider01 中的配置文件吗?里面指定了暴露的服务名称,只不过 Eureka 里默认全部大写而已。也可以看出,该服务的端口是8001。

4.3 服务消费端

我们还使用上一篇Spring Cloud中基于maven的分布式项目框架的搭建中的 microservice-order-consumer 来测一下即可。启动该项目,在浏览器中输入:http://localhost:8080/consumer/order/get/list,如果正常获取 json 数据,说明服务OK。

[{"id":1,"name":"跟武哥一起学 Spring Boot","price":39.99,"dbSource":"microservice01"},
{"id":2,"name":"跟武哥一起学 Spring cloud","price":39.99,"dbSource":"microservice01"}]

源代码下载地址:https://gitee.com/eson15/springcloud_study


源码下载地址:https://gitee.com/eson15/springcloud_study
更多优质文章请关注我的微信公众号【程序员私房菜】,更多编程和架构等学习资源等你来获取。

程序员私房菜

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试