Spring Cloud 之注册中心 Eureka 精讲

🍓 简介: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-servermain: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-servicemain: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 {/*** 消费者*/@Autowiredprivate 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 {@Autowiredprivate OrderMapper orderMapper;@Autowiredprivate RestTemplate restTemplate;/*** 根据id查询订单并返回*/@Overridepublic 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. 存入orderorder.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)@Beanpublic RestTemplate restTemplate(){return new RestTemplate();}}

2.4.4 提供者端

  1. controller
@RestController
@RequestMapping("/provider")
public class ProviderController {@Autowiredprivate 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 {@Autowiredprivate UserInfoMapper userMapper;/*** 根据id查询用户信息*/@Overridepublic 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@LoadBalancedpublic 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.hqwc.cn/news/3049.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【SpringCloud config分布式配置中心】—— 每天一点小知识

&#x1f4a7; S p r i n g C l o u d c o n f i g 分布式配置中心 \color{#FF1493}{SpringCloud config分布式配置中心} SpringCloudconfig分布式配置中心&#x1f4a7; &#x1f337; 仰望天空&#xff0c;妳我亦是行人.✨ &#x1f984; 个人主页——微风撞见云的…

软考A计划-系统集成项目管理工程师-项目范围管理(四)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff…

图像处理实战02-yolov5目标检测

yolov5 YOLOv5 是一种目标检测算法&#xff0c;它是 YOLO (You Only Look Once) 系列算法的最新版本。YOLOv5 采用了一种新的架构&#xff0c;它包括一个基于 CSPNet (Cross Stage Partial Network) 的主干网络以及一系列改进的技巧&#xff0c;如多尺度训练、数据增强、网络混…

chatgpt 用来取名字

Object ,array 相对 string,int 来说是什么类型, 分别用英文名称来定义他们的类型类别

自动化测试常见的三大问题及解决方案

各位小伙伴们&#xff0c;大家好&#xff0c;今天给大家带来的是关于自动化测试常见的三大问题及解决方案&#xff0c;希望给遇到这三大问题的你一些帮助 一&#xff0c;就是我们定位元素的时候&#xff0c;定位不到或有时定位得到&#xff0c;有时定位不到。 特别是喜欢复制…

Mysql数据库初体验

文章目录 MySQL数据库一.数据库的基本概念1.数据库的组成(1)数据&#xff08;Data&#xff09;(2)表(3)数据库(4)数据库管理系统&#xff08;DBMS&#xff09;(5)数据库系统 2.数据库系统发展史3.主流数据库介绍4.数据库分为关系型与非关系型(1)关系型&#xff1a;SQL(2)非关系…

node.js通过node-java库调用java接口(jar包)

node.js通过node-java库调用java接口 1、业务需要2、开发环境3、调用java包简单实例4、调用自定的jar包接口 1、业务需要 最近因项目需求&#xff0c;需要调用第三方java的打的jar包&#xff0c;但项目后端是用node.js写的&#xff0c;因此需要用node.js调用第三方jar,网上搜集…

云原生监控平台 Prometheus 的相关概念及部署

1 Prometheus简介 Prometheus 是一个开源的系统监控和报警系统&#xff0c;在 2012 年由 SoundCloud 公司创建&#xff0c;并于 2015 年正式发布。2016 年&#xff0c;Prometheus 正式加入 CNCF (Cloud Native Computing Foundation)&#xff0c;成为继kubernetes之后第二个在C…

菜鸡shader:L5 fresnel、matcap和cubemap

文章目录 Fresnelshader forge实现UE4蓝图实现 Matcapshader forge实现UE4蓝图实现 CubeMapSD和PS制作所需的贴图shader forge实现unity代码实现UE4蓝图实现(未实现) Fresnel shader forge实现 个人理解是&#xff0c;使用观察方向和法向方向点乘&#xff0c;那就相当于我们的视…

聚合函数group byhaving

聚合函数&group by group by 字段名 规定依据哪个字段分组聚合 group by核心子句是可选项&#xff0c;使用该子句是为了依据相同字段值分组后进行聚合运算&#xff0c;常和聚合函数联用 不使用group by 子句时使用聚合函数&#xff0c;select子句中只能写聚合函数和包含聚…

(16)燃油流量和液位传感器

文章目录 前言 16.1 燃油流量传感器 16.1.1 连接到自动驾驶仪 16.2 燃油液位传感器 16.2.1 PWM油位传感器 16.2.2 模拟油位传感器 前言 在 4.0 及以后的固件版本中&#xff0c;ArduPilot 提供了使用燃油流量和液位传感器的能力&#xff0c;此外还有电池监控器。支持脉冲输…

Linux入门

文章目录 一、Linux安装1.1、安装方式介绍1.2、网卡设置1.3、安装SSH连接工具1.4、Linux和windows目录结构对比1.5、Linux目录结构 2、Linux常用命令2.1、Linux命令初体验2.2、使用技巧2.3、命令格式2.4、文件目录操作命令文件目录操作命令ls小知识 文件目录操作命令cat文件目录…