【Spring Cloud】Eureka注册中心从原理到实战图文详细教程

news2024/11/26 12:14:01

本期目录

  • 1. Eureka介绍
    • 1.1 Eureka能解决的问题
  • 2. Eureka原理
  • 3. 搭建Eureka Server
    • 3.1 引入依赖
    • 3.2 编写启动类
    • 3.3 修改配置文件
    • 3.4 启动Eureka微服务
  • 4. 服务注册
    • 4.1 导入依赖
    • 4.2 修改配置文件
    • 4.3 重启微服务
    • 4.4 启动多个微服务实例
  • 5. 服务发现
    • 5.1 修改业务层代码
    • 5.2 在RestTemplate上添加负载均衡注解
    • 5.3 重启OrderApplication



1. Eureka介绍

  • Eureka 是 Spring Cloud 中的一个组件,主要是作为注册中心。

1.1 Eureka能解决的问题

  • 服务注册
  • 服务发现:服务消费者如何获取服务提供者的地址信息?
  • 负载均衡:如果有多个服务提供者,消费者应该和选择?
  • 健康检测:消费者如何得知服务提供者的健康状态?
  • 以上都是 Eureka 能家具的问题。

image-20221123152002726


2. Eureka原理

  • Eureka 是 C/S 架构。自己本身是 Server 服务端,而微服务容器实例都是客户端。
  • 每一个微服务容器实例启动的那一刻,都会把自己的信息 (微服务名称、IP 、端口) 注册给 Eureka 。
  • 此时,如果有微服务想要远程调用其他微服务,就去找 Eureka 注册中心,Eureka 查询注册列表,如果有,就把对于的微服务信息发送给消费者。
  • 消费者拿到多个提供者实例列表,就要从中挑选一个实例作为提供者,这时会采用负载均衡策略来挑选。
  • 挑选出来一个提供者后,就向这个提供者发起远程调用。
  • 如何保证服务提供者是健康的呢?在 Eureka 注册的微服务实例,每隔 30 秒都会向 Eureka 发送一次心跳续约,来确认自己的健康状态。如果有一天,Eureka 没有收到某个微服务实例的心跳,就会把它从注册列表中剔除掉。这样,消费者向 Eureka 拉取注册列表时,就不会拉取到宕机的微服务信息了。

image-20221123152151104


3. 搭建Eureka Server


3.1 引入依赖

  • 创建新的微服务,这个微服务就是专门用来做 Eureka 的服务端。

    image-20221215113155241

  • 这个微服务命名为 eureka-server ,选择 Maven 工程。

    image-20221215131910881

  • 创建完成后,在 eureka-server 微服务的 pom.xml 文件中引入 spring-cloud-starter-netflix-eureka-server 的 Maven 坐标。

  • 这个依赖中,Spring 已经把 Eureka 自动装配,几乎可以做到零配置直接用。

<!-- Eureka注册中心服务端 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
  • 可以看到,导入 Eureka 的 Maven 坐标时,并没有指定其版本。这是在 Spring Boot 中学过的内容。这是因为在 eureka-server 微服务的父工程 (cloud-demo) 中,已经把所有依赖的版本都管理好了。我们可以打开父工程 cloud-demopom.xml 文件,可以看到在 <parent> 标签下有 spring-boot-starter-parent

    image-20221215133707381

    也可以在 <properties> 标签下看到 Spring Cloud 的版本:

    image-20221215133853458

    <denpendencies> 标签下,可以看到 Spring Cloud 的依赖:

    image-20221215134006052

    点进【<artifactId>spring-cloud-dependencies</artifactId>】,可以看到在 <properties> 标签下定义好了大量的 Spring Cloud 组件的版本信息。所以当我们导入 Spring Cloud 组件时,无需指定版本。

    image-20221215134238374


3.2 编写启动类

  • 打开 eureka-server 微服务的启动类 Main.java (把它重命名为 EurekaApplication.java ) 。添加 Spring Boot 注解 @SpringBootApplication

  • 添加 @EnableEurekaServer 注解来打开 Eureka 服务。

    @SpringBootApplication
    @EnableEurekaServer
    @Slf4j
    public class EurekaApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(EurekaApplication.class, args);
            log.info("Eureka注册中心启动成功");
        }
    }
    

3.3 修改配置文件

  • src/main/resources 目录下创建配置文件 application.yml

  • 修改 application.yml 配置文件,加入下面的配置。

    server:
      port: 10086 # 服务端口
    
    spring:
      application:
        name: eurekaserver  # 微服务名称
    
    eureka:
      client:
        service-url:  # Eureka的地址信息
          defaultZone: http://localhost:10086/eureka
    

    其中,为什么要在 Eureka 的 client 客户端把 Eureka 微服务自己也配置进去呢?因为 Eureka 自己也是微服务,Eureka 启动时,也会把自己也注册进 Eureka 上。这是为了将来 Eureka 集群之间通信使用的。例如,我启动了 3 个 Eureka 服务,那么这 3 个 Eureka 服务就相互注册,这样他们就可以做数据交流了。只是因为现在只有一台 Eureka 服务,所以只配了自己。


3.4 启动Eureka微服务

  • 在 Eureka 微服务的启动类 EurekaApplication.java 中启动。

    image-20221215140120227

  • 可以在底栏 Services 中发现多了一个正在运行的微服务,那就是 Eureka 。

    image-20221215140319720

  • 此时我们可以在浏览器中输入 http://localhost:10086/ 来访问 Eureka 的主页。也可以在 IDEA 底栏的 Services 中,点击 EurekaApplication:10086/ 的端口号直接打开浏览器访问。

    image-20221215141134732

    如果你能看到这个页面,说明你的 Eureka 注册中心就搭建成功了。这个页面中,最重要的部分就是中间的 Instances currently registered with Eureka 。这里罗列了当前注册到 Eureka 的微服务实例信息。


4. 服务注册

  • 接下来,我们把用户微服务 user-service 注册到 EurekaServer 中。一共两步,与搭建 Eureka 的步骤非常相似。

4.1 导入依赖

  • 在用户微服务 user-servicepom.xml 文件中导入 spring-cloud-starter-netflix-eureka-client 的 Maven 坐标。注意这里是客户端 client

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

4.2 修改配置文件

  • 打开用户微服务 user-service 的配置文件 application.yml ,加入以下内容。

    spring:
      application:
        name: userservice  # 微服务名称
    
    eureka:
      client:
        service-url:  # Eureka的地址信息
          defaultZone: http://localhost:10086/eureka/
    
  • 经过这两步,用户微服务 user-service 就成功注册到 Eureka 中了。同理,按照同样的步骤,把订单微服务 order-service 也注册到 Eureka 中。


4.3 重启微服务

  • 重启用户微服务 user-service 和订单微服务 order-service

    image-20221215143415635

  • 此时在浏览器中输入 http://localhost:10086/ 来访问 Eureka 的主页。

    image-20221215145033950

    可以看到用户微服务 user-service 和订单微服务 order-service 都成功注册到 Eureka 中了。


4.4 启动多个微服务实例

  • 在企业的实际开发中,一个微服务往往有多个实例,以达到高可用的目的。实际开发部署中,多个微服务实例是通过 Docker 将微服务构建成镜像,然后依照这个镜像创建多个 Docker 容器实例来实现的。鉴于有一部分同学还没接触过 Docker ,这里先使用 IDEA 的功能来本地运行多个用户微服务 user-service 实例。

  • 进入 IDEA 底栏的 Services ,找到 UserApplication ,右击,选择【Copy Configuration…】。

    image-20221215145645950

  • 然后随便起个名字,点击【Modify options】。

    image-20221215145923298

  • 添加虚拟机选项【Add VM options】。

    image-20221215150014805

  • 然后换个端口,否则端口会冲突。在【VM options】一栏输入 -Dserver.port=8082

    image-20221215150216390

  • 点击【OK】后,会发现多出来一个用户微服务 UserApplication2 ,启动它。

    image-20221215150355083

  • 然后回到 Eureka 主页,发现注册列表中,用户微服务USERSERVICE 的实例个数变成 2 了,且能看到 2 个 IP:端口。

    image-20221215150658144

    到此,使用 Eureka 实现服务注册就完成了。


5. 服务发现

  • 本节,我们将设定订单微服务 order-service 为消费者,用户微服务 user-service 为提供者,订单微服务远程调用用户微服务的查询服务。
  • 本节我们将使用订单微服务 order-service 拉取服务注册列表。
  • 服务拉取是基于服务名称获取服务列表,然后再对服务列表做负载均衡选取出一个微服务实例进行远程调用。

5.1 修改业务层代码

  • 修改订单微服务 order-service 的业务层代码 OrderService.java 。修改 RestTemplate 的访问 URL 路径,用要远程调用的微服务名代替原来的 IP 和端口。

【小贴士】

  • 如果你对 RestTemplate 感到陌生,可以参考我的这篇博文《基于RestTemplate发送HTTP请求实现微服务远程调用》进行学习。
String url = "http://userservice/user/" + order.getUserId();
  • OrderService.java
@Service
public class OrderService {

    @Autowired
    private OrderMapper orderMapper;
    // 自动注入RestTemplate,用于发起HTTP请求远程调用
    @Autowired
    private RestTemplate restTemplate;

    public Order queryOrderById(Long orderId) {
        // 1.查询订单
        Order order = orderMapper.findById(orderId);
        // 2.使用RestTemplate发起HTTP请求,查询订单所属用户信息
        // 2.1 根据查询的订单order中的userId动态生成HTTP请求的url
        String url = "http://userservice/user/" + order.getUserId();
        // 2.2 发送HTTP请求,实现远程调用
        User user = restTemplate.getForObject(url, User.class);
        // 3.把远程调用获得的user封装进order对象中
        order.setUser(user);
        // 4.返回order订单信息
        return order;
    }
}

5.2 在RestTemplate上添加负载均衡注解

  • 在订单微服务 order-service 的启动类 OrderApplication.java 中的 RestTemplate 上添加 @LoadBalanced 负载均衡注解。

    image-20221215152019123

  • OrderApplication.java

// 注册RestTemplate,用来发起HTTP请求远程调用
@Bean
@LoadBalanced	// 负载均衡注解
public RestTemplate restTemplate() {
    return new RestTemplate();
}

5.3 重启OrderApplication

image-20221215153010466

  • 接下来,把两个 UserApplication 的日志清空,以便查看 OrderApplication 是如何来选取用户微服务 UserApplication 进行远程调用的。

  • 在 Postman 中,向发送 2 个请求 http://localhost:8080/order/101http://localhost:8080/order/102

    image-20221215153405576

    image-20221215153423586

  • 回到两个 UserApplication 的日志中,可以看到第一次调用了 8082 端口的用户微服务;

    image-20221215153559590

    而第二次则调用了 8081 端口的用户微服务。

    image-20221215153717689

    说明负载均衡成功实现。在使用 RestTemplate 发起 HTTP 远程调用时,我们不需要关心想要远程调用的 IP 地址和端口号,只需要把对于的微服务名写在 URL 上,Eureka 会自动帮我们在多个微服务实例中均衡地选取一个进行远程调用。

  • 以上,就称为服务发现和服务拉取。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/92508.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

A_A05_002 sscom33串口调试助手使用

目录 一、软件获取 二、软件基本功能介绍 1、接收区 2、串口通信参数配置区 3、串口打开关闭与其他设置区域 4、手动发送区域 5、多文本发送区 6、辅助区域 三、注意事项 一、软件获取 网盘链接 直戳跳转 二、软件基本功能介绍 1、接收区 接收区就是接收外部设备给串口…

【2022年终总结】总结自己的2022,展望2023

目录一、工作杭州【述职-涨薪】【项目】从0到1&#xff0c;从1到多&#xff0c;在工作中寻找方法&#xff0c;承担更多的责任【技能】丰富了技术广度武汉1. 【项目】一个人就是一个团队二、成为博客新秀&前端领域优质创作者三、生活旅行猫猫情感2023年的flag学习&#xff1…

FFmpeg- 常用的滤镜命令

下面来熟悉一下常用的对视频操作的几个命令。这次需要完成的命令也包括在其中。 视频的画面大小的剪切(crop filter) 将输入的视频的帧&#xff0c;以左上角为坐标的原点&#xff0c;剪切成x,y坐标开始的指定大小。 语法&#xff1a; # []包裹的选项是可选的 crop ow[:oh[:x[:…

3D三维地图APP

3D三维地图APP 发布时间&#xff1a;2018-07-19 版权&#xff1a; 3D地图依据高程数据等对地表进行渲染&#xff0c;实现地表的起伏&#xff0c;模拟出真实的三维场景&#xff0c;让你有如身临其境般的感觉。 &#xff08;注&#xff1a;Bigemap 3D地图是一个三维地图浏览功能…

RNA-seq 详细教程:Wald test(10)

学习目标 了解生成比较结果所需的步骤&#xff08;Wald 检验&#xff09;总结不同层次的基因过滤了解对数倍变化收缩结果探索 默认情况下&#xff0c;DESeq2 使用 Wald 检验来识别在两个样本之间差异表达的基因。给定设计公式中使用的因素&#xff0c;以及存在多少个因素水平&a…

大学生影视主题网页制作 腾龙电影网页设计模板 学生静态网页作业成品 dreamweaver电影HTML网站制作

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 文章目录一、网页介绍一…

基于WIFI无线组网的水雨情远程监测预警系统

水雨情是重要的水文资料&#xff0c;在水资源配置和管理中有重要的参考价值&#xff0c;具体是指水位、流速、流量、降雨量、降雨强度等参数。随着物联网、雷达遥测、无线通信技术的发展&#xff0c;这些数据都能实现自动感知和远程监测&#xff0c;对于防汛抗洪和日常巡检有重…

MySql explain

执行计划是SQL语句经过查询分析器后得到的 抽象语法树 和 相关表的统计信息 作出的一个查询方案&#xff0c;这个方案是由查询优化器自动分析产生的。由于是动态数据采样统计分析出来的结果&#xff0c;所以可能会存在分析错误的情况&#xff0c;也就是存在执行计划并不是最优的…

经CSDN副总裁点拨,我发现了世界杯球队与优秀开发团队的共通点

☆ 世界杯已经快要接近尾声了&#xff0c;而无论法国还是阿根廷谁能走到最后&#xff0c;无疑他们都是非常优秀的世界杯球队&#xff0c;甚至可以说&#xff0c;能进入世界杯的球队&#xff0c;都是举世瞩目的国家队阵容。 ☆ 而我最近也一直在思考&#xff0c;那么我们的开发团…

SpringBoot2核心技术(核心功能)- 05、Web开发【5.1 SpringMVC自动配置概览+5.2简单功能分析】

1、SpringMVC自动配置概览 Spring Boot provides auto-configuration for Spring MVC that works well with most applications.(大多场景我们都无需自定义配置) The auto-configuration adds the following features on top of Spring’s defaults: ● Inclusion of ContentN…

手把手教你实现一个function模板

1.实现function需要用到的相关技术 建议看本文之前&#xff0c;需要先了解C11 function或者boost::function模板的基本用法&#xff0c;也最好看一下我的另外一篇文章&#xff1a; c11 function模板&#xff1a;模板特化与可变参数函数模板 如果你使用过C11 function模板或者…

关于Linux内核中的异步IO的使用

我们都知道异步IO的作用&#xff0c;就是可以提高我们程序的并发能力&#xff0c;尤其在网络模型中。在linux中有aio的一系列异步IO的函数接口&#xff0c;但是这类函数都是glibc库中的函数&#xff0c;是基于多线程实现&#xff0c;不是真正的异步IO&#xff0c;在内核中有真正…

生成无限制微信小程序码

生成无限制的微信小程序码&#xff0c;主要是通过后端请求微信的接口&#xff0c;然后微信会把小程序码返回来。 本文不讲详细的方法了&#xff0c;只讲其中的一些关键点&#xff0c;官方文档也附上去了&#xff0c;结合这些点看官方文档会比较方便。 方法&#xff1a; 获取…

_8LeetCode代码随想录算法训练营第八天-C++字符串

_8LeetCode代码随想录算法训练营第八天-C字符串 28.实现strStr()459.重复的字字符串 28.实现 strStr() KMP算法 什么是KMP 是由三位学者发明的&#xff1a;Knuth&#xff0c;Morris和Pratt&#xff0c;所以取了三位学者名字的首字母。 KMP有什么用 KMP主要应用在字符串匹…

SuperMap iClient3D for WebGL/Cesium端性能优化

目录 一、请求优化 1.1 多子域 1.1.1 scene.open()打开场景 1.1.2 加载地形 1.1.3 加载影像 1.1.4 加载S3M 1.1.5 加载MVT 1.2 批量请求 1.2.1 地形 1.2.2 影像 二、内存优化 2.1 根节点驻留内存 2.2 自动释放缓存 2.3 内存管理 三、图层优化 3.1 LOD 3.2 空间索引 3.3 控制图层…

企业文件泄漏防不胜防?安全防护3步走!

有一些管理者认为公司从未曾发生过数据泄密事件而心存侥幸&#xff0c;但数据泄密的代价&#xff0c;只需发生过一次&#xff0c;就足以给企业带来巨大的损害。 十四五规划中&#xff0c;“数据安全”和“网络安全”多次出现&#xff0c;加上《数据安全法》、《个人信息保护法》…

Linux下printf输出字符串的颜色

基本打印格式: printf("\033[字背景颜色;字体颜色m字符串\033[0m" ); printf("\033[41;32m字体背景是红色&#xff0c;字是绿色\033[0m\n"); 41是字背景颜色, 32是字体的颜色, 字体背景是红色&#xff0c;字是绿色是要输出的字符串. 后面的\033 ...\033[0m…

推荐系统毕业设计 协同过滤商品推荐系统设计与实现

文章目录1 简介2 常见推荐算法2.1 协同过滤2.2 分解矩阵2.3 聚类2.4 深度学习3 协同过滤原理4 系统设计4.1 示例代码(py)5 系统展示5.1 系统界面5.2 推荐效果6 最后1 简介 &#x1f525; Hi&#xff0c;大家好&#xff0c;这里是学长的毕设系列文章&#xff01; &#x1f525…

redis持久化方案介绍

Redis有两种持久化方案&#xff1a;1. RDB持久化 2. AOF持久化 1 RDB持久化 RDB全称Redis Database Backup file&#xff08;Redis数据备份文件&#xff09;&#xff0c;也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后&…

[附源码]Python计算机毕业设计高校实习管理平台系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…