Spring Cloud 之注册中心 Eureka 精讲

news2024/11/18 3:35:00

🍓 简介:java系列技术分享(👉持续更新中…🔥)
🍓 初衷:一起学习、一起进步、坚持不懈
🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏
🍓 希望这篇文章对你有所帮助,欢迎点赞 👍 收藏 ⭐留言 📝

🍓 更多文章请点击
在这里插入图片描述在这里插入图片描述

文章目录

  • 一、Eureka简介
  • 二、 Eureka 注册中心
    • Eureka的作用-图解
    • 2.1 首先基于Spring Boot创建父工程
      • 2.1.1 需要注意(重要)
      • 2.1.2 本项目引入主要配置
        • 第一种 (选择一种即可,区别不大)
        • 第二种
    • 2.2 搭建Eureka-Server
    • 2.3 搭建Eureka-Client(服务注册)
    • 2.4 服务拉取准备工作
      • 2.4.1 需求
      • 2.4.2 数据库表数据展示
      • 2.4.3 `消费者端`
      • 2.4.4 `提供者端`
      • 2.4.5 注册成功
  • 三、服务启动测试
    • 3.1 原始http全路径调用 及 存在问题
    • 3.2 使用Eureka注册中心的服务名调用
  • 四、总结
    • 4.1 Eureka的作用
    • 4.2 在Eureka架构中,微服务角色有两类:

在这里插入图片描述

一、Eureka简介

Spring Cloud官网:https://spring.io/projects/spring-cloud
Eureka官网:https://github.com/Netflix/eureka

Spring Cloud 是目前用于开发微服务的主流框架之一,我们都知道在微服务架构中最为基础、核心的模块,就是服务注册与发现。

Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现 服务注册和发现Eureka Server 作为 服务注册中心,系统中的 其他微服务,使用 Eureka 的 客户端 连接到 Eureka Server,并通过 心跳连接 检测服务的 存活状态

Eureka 包含两个组件:Eureka ServerEureka Client

  • Eureka Server: 作为 服务注册中心,提供 服务注册和发现,提供服务注册服务,各个节点启动后,会在 EurekaServer 中进行注册,这样 EurekaServer 中的服务注册表中将会存储所有可用服务节点的信息。

  • Eureka Client: 所有注册到 服务中心 的服务。是一个 Java 客户端,用于简化 Eureka Server 的交互,客户端同时也具备一个内置的、使用轮询 (round-robin) 负载算法的负载均衡器。在应用启动后,将会向 Eureka Server 发送心跳 (默认周期为 30 秒)。

    • Service Provider: 把 自身的服务 注册到 Eureka Server,从而使 服务消费方 能够找到。
    • Service Consumer: 从 Eureka Server 获取 服务注册列表,从而能够 消费服务。

二、 Eureka 注册中心

在微服务架构中往往会有一个注册中心,每个微服务都会向注册中心去注册自己的地址及端口信息,注册中心维护着服务名称与服务实例的对应关系。首先我们注册中心服务端:eureka-server,这必须是一个独立的微服务。下面我们来搭建搭建 eureka-server。

原始http服务调用 -存在问题:

  • 如果有多个服务提供者,消费者如何选择?
  • 消费者如何获取服务提供者地址信息?
  • 如何知晓服务提供者是否健康?

请看下图

(纯手工绘制有点瑕疵)Eureka的作用 图解:

Eureka的作用-图解

在这里插入图片描述

2.1 首先基于Spring Boot创建父工程

以Maven模块化项目方式创建,便于各个微服务的项目管理。
在这里插入图片描述

2.1.1 需要注意(重要)

来自Spring Cloud官方文档 :https://spring.io/projects/spring-cloud

概述了Spring Cloud的版本与Spring Boot的版本对应关系,需要注意最新更新可查看官方文档

在这里插入图片描述

2.1.2 本项目引入主要配置

父项目Pom文件

可以看到下文中:Spring Boot的版本是2.7.1
因此根据上图Spring Cloud 的版本为:2021.0.1
在这里插入图片描述

第一种 (选择一种即可,区别不大)


    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.1</version>
        <relativePath/>
    </parent>
    
	<properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>2021.0.1</spring-cloud.version>
        <hutool.version>5.8.2</hutool.version>
    </properties>
    
    <dependencies>
        <!--web-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>${hutool.version}</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <!-- springCloud -->
        <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>

第二种

不引入parent也可以这样配置


	<properties>
        <java.version>1.8</java.version>
        <spring-boot.version>2.7.1</spring-boot.version>
        <spring-cloud.version>2021.0.1</spring-cloud.version>
        <hutool.version>5.8.2</hutool.version>
    </properties>
    
    <dependencies>
        <!--web-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>${hutool.version}</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>
    
 <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
 </dependencyManagement>

两种都可以

2.2 搭建Eureka-Server

  1. 在父工程基础上 创建eureka-server模块`
  2. 引入spring-cloud-starter-netflix-eureka-server依赖
        <!--eureka 服务端 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
  1. 在启动类上添加@EnableEurekaServer注解
  2. 添加配置
server:
  port: 10086
spring:
  application:
    name: eureka-server
  main:
    allow-bean-definition-overriding: true
eureka:
  client:
    serviceUrl:
      defaultZone: http://127.0.0.1:10086/eureka/
  #  register-with-eureka: false # 不注册自己
  #  fetch-registry: false #不拉取服务

  1. 启动服务
    然后访问:http://localhost:10086/
    看到如下页面则成功
    在这里插入图片描述

2.3 搭建Eureka-Client(服务注册)

将provider-service注册到Eureka-Server中步骤如下:

  1. 在父工程基础上 创建provider-service模块(服务提供者)
  2. 引入spring-cloud-starter-netflix-eureka-client依赖,注意后缀是client
        <!--eureka 客户端 -->
		<dependency>
		    <groupId>org.springframework.cloud</groupId>
		    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
		</dependency>
  1. 添加配置
server:
  port: 20086
spring:
  application:
    name: provider-service
  main:
    allow-bean-definition-overriding: true
eureka:
  client:
    serviceUrl:
      defaultZone: http://127.0.0.1:10086/eureka/
  1. 同理创建consumer-service模块(服务消费者)

  2. 最终项目结构如下图所示:

    我这里创建了个common公共包,无要求,非必须
    在这里插入图片描述

2.4 服务拉取准备工作

2.4.1 需求

需求:根据订单id查询订单的同时查询对应用户信息一起返回

消费者中提供订单信息 提供者提供用户信息 数据在各自对应数据库中

2.4.2 数据库表数据展示

order订单表
在这里插入图片描述
用户表
在这里插入图片描述

2.4.3 消费者端

  1. controller
@RestController
@RequestMapping("/consumer")
public class ConsumerController {
    /**
     * 消费者
     */
    @Autowired
    private ConsumerService consumerService;
    
    @GetMapping("{orderId}")
    public Order queryOrderByUserId(@PathVariable("orderId") Long orderId) {
        // 根据id查询订单并返回
        return consumerService.queryOrderById(orderId);
    }
}
  1. service
public interface ConsumerService {

    /**
     * 根据id查询订单并返回
     */
    Order queryOrderById(Long orderId);
}

  1. impl
@Service
public class ConsumerServiceImpl implements ConsumerService {

    @Autowired
    private OrderMapper orderMapper;

    @Autowired
    private RestTemplate restTemplate;
    /**
     * 根据id查询订单并返回
     */
    @Override
    public Order queryOrderById(Long orderId) {
        // 1.查询订单
        Order order = orderMapper.findById(orderId);

        //2远程查询用户信息
        String url="http://localhost:20086/provider/"+order.getUserId();
        
        //2. 发起调用
        User user = restTemplate.getForObject(url, User.class);
        //3. 存入order
        order.setUser(user);

        // 4.返回
        return order;
    }
}

  1. mapper
@Mapper
public interface OrderMapper {

    @Select("select id, name, num, user_id userId, price from `order` where id = #{id}")
    Order findById(Long orderId);
}

  1. 启动类,并配置RestTemplate
@SpringBootApplication
public class ConsumerApplication {

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

    /**
     * 没有实例化RestTemplate时,初始化RestTemplate
     * @return
     */
    @ConditionalOnMissingBean(RestTemplate.class)
    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }

}

2.4.4 提供者端

  1. controller
@RestController
@RequestMapping("/provider")
public class ProviderController {

    @Autowired
    private ProviderService providerService;


    /**
     * 根据id查询用户信息
     */
    @GetMapping("/{id}")
    public User queryById(@PathVariable("id") Long id) {
        return providerService.queryById(id);
    }

}
  1. service
public interface ProviderService {

    /**
     * 根据id查询用户信息
     */
    User queryById(Long id);
}


  1. impl
@Service
public class ProviderServiceImpl implements ProviderService {

    @Autowired
    private UserInfoMapper userMapper;

    /**
     * 根据id查询用户信息
     */
    @Override
    public User queryById(Long id) {
        return userMapper.findById(id);
    }
}
  1. mapper
@Mapper
public interface UserInfoMapper {
    
    @Select("select * from user where id = #{id}")
    User findById(@Param("id") Long id);
}
  1. 启动类
@SpringBootApplication
public class ProviderApplication {

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

2.4.5 注册成功

在这里插入图片描述

三、服务启动测试

3.1 原始http全路径调用 及 存在问题

查看上文代码消费者端是基于全路径http://localhost:20086/provider/1 调用

		//2远程查询用户信息
        String url="http://localhost:20086/provider/"+order.getUserId();

成功调用如下图
在这里插入图片描述

存在问题:

  • 如果有多个服务提供者,消费者如何选择?
  • 消费者如何获取服务提供者地址信息?
  • 如何知晓提供者是否健康 ?

可参考上文------Eureka的作用 图解

3.2 使用Eureka注册中心的服务名调用

这是成功注册的服务

基于服务名称获取服务列表,然后对服务列表做负载均衡

在这里插入图片描述

  1. 服务名代替ip,端口

  2. 使用provider-service(自己配置的服务名)代替localhost:20086

           //2远程查询用户信息
            String url="http://provider-service/provider/"+order.getUserId();
    
    
  3. 在服务消费者的启动类的RestTemplate添加@LoadBalanced负载均衡注解

    负载均衡详解后续文章中更新

        /**
         * 没有实例化RestTemplate时,初始化RestTemplate
         * @return
         */
        @ConditionalOnMissingBean(RestTemplate.class)
        @Bean
        @LoadBalanced
        public RestTemplate restTemplate(){
            return new RestTemplate();
        }
    

测试结果成功
在这里插入图片描述

四、总结

4.1 Eureka的作用

  • 消费者该如何获取服务提供者具体信息?

    • 服务提供者启动时向eureka注册自己的信息
    • eureka保存这些信息
    • 消费猪根据服务名称向eureka拉取提供者信息
  • 如果有多个服务提供者,消费者该如何选择?

    • 服务消费者利用负载均衡算法,从服务列表中选择一个
  • 消费者如何感知服务提供者健康状态?

    • 服务提供者会每隔30秒向EurekaServer发送心跳请求,报告健康状态
    • eureka会更新记录服务列表信息,心跳不正常会被剔除
    • 消费者就可以拉取到最新的信息

4.2 在Eureka架构中,微服务角色有两类:

  • EurekaServer: 服务端,注册中心
    • 记录服务信息
    • 心跳监控
  • Eurekaclient:客户端
    • Provider: 服务提供者,例如案例中的provider-service
      • 注册自己的信息到EurekaServer
      • 每隔30秒向EurekaServer发送心跳
    • consumer:服务消费者,例如案例中的 consumer-service
      • 根据服务名称从EurekaServer拉取服务列表
      • 基于服务列表做负载均衡,选中一个微服务后发起远程调用

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

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

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

相关文章

【单周期CPU】LoongArch | 立即数扩展模块Ext | 32位算术逻辑运算单元(ALU)

前言&#xff1a;本章内容主要是演示在vivado下利用Verilog语言进行单周期简易CPU的设计。一步一步自己实现模型机的设计。本章先介绍单周期简易CPU中基本组合逻辑部件的设计。 &#x1f4bb;环境&#xff1a;一台内存4GB以上&#xff0c;装有64位Windows操作系统和Vivado 201…

HarmonyOS学习路之开发篇—AI功能开发(文档检测校正)

基本概念 文档校正提供了文档翻拍过程的辅助增强功能&#xff0c;包含两个子功能&#xff1a; 文档检测&#xff1a;能够自动识别图片中的文档&#xff0c;返回文档在原图中的位置信息。这里的文档泛指外形方正的事物&#xff0c;比如书本、相片、画框等。文档校正&#xff1a…

java中如何实现字符串反转

java中如何实现字符串反转 方式1&#xff1a;通过创建StringBuilder或StringBuffer对象&#xff0c;并使用其reverse()方法实现字符串的反转 上代码&#xff1a; /*** 给定一个字符串&#xff0c;通过创建SpringBuilder对象的方式将字符串进行反转* return*/public static …

cadence从原理图到pcb

完成原理图设计后&#xff0c;需要进行如下步骤才能开始画PCB&#xff1a; 原理图规制检测(DRC)生成网表新建PCB文件&#xff0c;设置封装路径导入网表设置原点和栅格绘制PCB板框将器件导入PCB 原理图规制检测(DRC) 选中原理图文件&#xff0c;运行Tools->Design Rules C…

synchronized锁升级详细过程

目录 一、锁升级基础 1&#xff09;偏向锁 2&#xff09;轻量级锁&#xff08;自旋锁&#xff09; 3&#xff09;重量级锁 二、为什么要有锁升级过程&#xff1f; 1&#xff09;减少无竞争情况下的同步操作开销 2&#xff09;尽量避免线程切换的开销 3&#xff09;降低…

MySQL 数据库

文章目录 数据库的基本概念数据表数据库数据库管理系统数据库系统 数据库的发展史当今主流数据库介绍SQL Server &#xff08;微软公司产品&#xff09;Oracle &#xff08;甲骨文公司产品&#xff09;DB2 &#xff08;IBM公司产品&#xff09;MySQL &#xff08;甲骨文公司收购…

语法篇·Servlet基础

一、初识Servlet 1.1简介 Servlet是一种使用Java语言来开发动态网站的技术。Servlet是运行在Web服务器或应用服务器上的程序&#xff0c;它是作为来自Web浏览器或其他HTTP客户端的请求和HTTP服务器上的数据库或应用程序之间的中间层。Servlet可以收集来自网页表单的用户输入&a…

上位机与两台PLC之间无线以太网通信

本文以组态王和2台三菱FX5u PLC为例&#xff0c;介绍组态王与多台 PLC的无线以太网通信实现过程。在本方案中采用了三菱PLC无线通讯终端DTD419MB&#xff0c;作为实现无线通讯的硬件设备。 在这一无线以太网通讯系统的搭建中&#xff0c;用户无需更改网络参数和原有程序&#…

Java版本的工程项目管理系统源代码之工程项目管理系统面临的挑战 spring cloud +支持二开

管理方式 项目管理服务&#xff08;PM&#xff09; 是指工程项目管理企业按照合同约定&#xff0c;在工程项目决策阶段&#xff0c;为业主编制可行性研究报告&#xff0c;进行可行性分析和项目策划&#xff1b;在工程项目实施阶段&#xff0c;为业主提供招标代理、设计管理、采…

为什么个人项目我更推荐使用Caddy?

为什么个人项目我更推荐使用Caddy? 为什么个人项目我更推荐使用Caddy? 前言什么是Caddy?Caddy是够用且省心的简单的配置自动化 https结尾参考链接 前言 最近我把自己一些项目里面的 nginx 换成了 caddy&#xff0c;运转相当良好&#xff0c;比较开心&#xff0c;所以写了…

java 会员中心管理系统Myeclipse开发mysql数据库web结构jsp编程计算机网页项目

一、源码特点 JSP 会员中心管理系统 是一套完善的系统源码&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;以及相应配套的设计文档&#xff0c;系统主要采用B/S模式开发。 研究的基本内容是基于Web的会员中心管理系…

印刷企业使用MES生产管理系统后,会出现哪些弊端

MES生产管理系统是一种用于企业管理、控制和优化生产过程的管理软件。在印刷企业中&#xff0c;印刷MES管理系统可以帮助企业更好地管理生产过程&#xff0c;提高生产效率和质量。但是&#xff0c;在使用印刷MES管理系统时&#xff0c;也会存在一些弊端。本文将探讨这些弊端&am…

java版本Spring Cloud + Spring Boot +二次开发+企业电子招标采购系统源码

一、立项管理 1、招标立项申请 功能点&#xff1a;招标类项目立项申请入口&#xff0c;用户可以保存为草稿&#xff0c;提交。 2、非招标立项申请 功能点&#xff1a;非招标立项申请入口、用户可以保存为草稿、提交。 3、采购立项列表 功能点&#xff1a;对草稿进行编辑&#x…

基于轻量级yolov5s开发构建车道线实例分割检测识别系统

车道线实例分割检测是指利用计算机视觉技术对图像或视频中的车道线进行精确的识别和定位任务。该任务旨在区分和标记出每条独立的车道线&#xff0c;并提供它们的准确位置和形状信息。 实例分割是目标检测和语义分割的结合&#xff0c;不仅要找到目标的边界框&#xff0c;还需…

【AUTOSAR】AUTOSAR开发工具链(六)----MIL测试操作说明

1.1. 目的 - Objective 根据 ISO 26262 及本公司对基于模型开发时软件的测试要求&#xff0c; 为了使测试人员更加方便快捷地开始进行 MIL 测试&#xff0c;特编写并发布此规范。 2. MIL 测试流程概况 一、确保输入资料的齐全 二、制作测试案例&#xff0c; 并通过审查 三、制作…

最新导则下生态环评报告编制技术暨报告篇、制图篇、指数篇、综合应用篇教程

详情点击链接&#xff1a;最新导则下生态环评报告编制技术暨报告篇、制图篇、指数篇、综合应用篇 一&#xff0c;生态环评报告编制规范 结合生态环境影响评价最新导则&#xff0c;详述不同类型项目生态环评报告编制要求与规范 二&#xff0c;土地利用图 1、土地利用分类体系…

维也纳酒店资深投资人尹鹏伟:陪伴是最长情的告白!

今年以来&#xff0c;经济复苏不断加快&#xff0c;酒店行业迎来井喷式爆发。作为中国中端酒店“开山之作”&#xff0c;在中端酒店风起云涌&#xff0c;内卷加剧&#xff0c;竞争激烈的当下&#xff0c;维也纳酒店却能在全国287个大中小城市在营门店超1300家&#xff0c;在中端…

【AUTOSAR】AUTOSAR开发工具链(七)----HIL测试操作说明(1)

1. HIL 设备操作 本操作说明适用硬件 dSPACE 1006 &#xff0c;软件 dSPACE ControlDesk 3.7.4。 1.1. 硬件操作流程 打开电脑主机 插入 licence 打开 dSPACE 电源开关。 1.2. 软件操作流程 1.2.1. 模型导入与运行 点击 dSPACE ControlDesk 3.7.4 图标进入操作界面。 进入操作…

网页也能裸眼3D?只需一个电脑摄像头就能完成

和2D显示屏、手机屏幕相比&#xff0c;VR图像为什么看起来更加沉浸、立体呢&#xff1f;一方面是透镜将左右眼图像结合&#xff0c;形成3D视觉效果&#xff0c;而另一方面则归功于屏幕画面与头部追踪的同步作用。 简单来讲&#xff0c;就是VR会根据用户头部的位置和朝向来改变…

高工奖项|如何破解智能汽车「缺芯少魂」?破冰者已经出现

对于智能驾驶赛道来说&#xff0c;2023年将是至关重要的一年。芯片短缺影响正在逐步得到缓解&#xff0c;但车市不确定性正在加剧&#xff0c;同时&#xff0c;车企在智能化普及上的成本压力也在凸显。 高工智能汽车研究院监测数据显示&#xff0c;2022年度中国市场&#xff08…