当前位置: 首页 > news >正文

Eureka注册中心快速入门

一、提供者与消费者

  • **服务提供者:**一次业务中,被其他微服务调用的服务。(提供接口给其他微服务)

  • **服务消费者:**一次业务中,调用其他微服务的服务。(调用其它微服务提供的接口)

比如我们刚刚的案例中,我们在order-service中调用user-service服务,所以order-service是服务消费者,user-service是服务提供者

注意!提供者和消费者角色是相对的

一个服务可能是提供者,也可能是消费者

二、Eureka注册中心

2.1 服务调用出现的问题

2.1.1 硬编码问题

我们在远程服务调用的时候将红框内的代码硬写在程序中,这样修改非常的不方便

为了应对更多的并发,我们的user服务可能会部署多实例,形成一个集群。

比如下图,我们如果还有8082,8083,那我们的硬编码就没有作用了,不知道改写谁的地址了,所以这里一定不能写成硬编码的形式。

2.1.2如果不是硬编码的形式,那这三个服务我们该怎么去获取呢?

Eureka、nacos均可以解决这个问题

2.1.3服务消费者该如何获取服务提供者的地址信息?

  • 服务提供者启动时向eureka注册自己的信息

  • eureka保存这些信息

  • 消费者根据服务名称向eureka拉去提供者信息

我们要做的就是根据服务名称向eureka拉去即可

2.1.4如果有多个服务提供者,消费者该如何选择呢?

服务消费者利用负载均衡算法,从服务列表中挑选一个

2.1.5消费者如何得知服务提供者的健康状态呢?

  • 服务提供者会每隔30秒向Eureka Server发送心跳请求,报告健康状态

  • eureka会更新记录服务列表的信息,心跳不正常会被剔除

  • 消费者就可以拉取到最新的信息

2.2 Eureka的作用

eureka-server服务端:注册中心,记录和管理这些微服务

eureka-client客户端:服务消费者、服务提供者都是微服务,所以都是客户端

对于服务提供者,每一个服务启动时都会把服务信息注册给eureka-server客户端,然后客户端会记录下来user-service名称及端口

如果这个时候有一个人想要消费,那不就不需要自己记录信息,直接在eureka-server中拉去想要的服务信息即可

但是对于上图拉去的信息而言,我们同样的东西有三种配置,我们需要挑一个,这就需要负载均衡的知识了,从三个中挑选一个(比如localhost:8081),之后在由order-service向user-service发起请求

其中我们也不用担心localhost:8081会挂掉,因为我们user-service服务每隔一段时间就会向注册中心发一次请求确认自己的状态,若一段时间没有发送请求,则注册中心就会把user-service剔除,order-service再次拉去时就不会拉取到他,所以不用担心负载均衡选取的地址失效问题

三、Eureka使用

下面进行Eureka使用的三步走:

搭建EurekaServer、将服务注册到Eureka中、

3.1 搭建EurekaServer

3.1.1 配置

新建maven工程,并添加maven坐标

注意,下面的操作都是在创建的maven工程中去实现

3.1.1.1maven坐标

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

这个地方没有指定版本,原因就是在父工程中将版本都管理好了,下图所示便是父工程中的版本管理,在下面的配置管理中,有大量的组件和版本信息,所以我们子工程引入的时候,无需引入任何版本

下面的图示可以更清楚的辨别子工程与父工程的关系

3.1.1.2 在启动类添加@EnableEurekaServer

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

3.1.2编写配置文件

# 配置微服务名称
spring:application:name: eurekaserver# eureka自己也是一个微服务,也需要一个名字
# eureka也会将自己注册到eureka上,
#   为了以后eureka集群之间通讯使用,若启动了多个eureka,他们会互相做注册,完成数据的交流
eureka:client:
#   eureka地址信息service-url:defaultZone: http://127.0.0.1:10086/eureka

3.1.3 启动Eureka

直接启动main函数

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

当我们启动之后,ctrl+单机方框内的端口号,直接打开页面,其中红框中的内容最为重要

“Instances currently registered with Eureka”翻译为“当前在Eureka上注册的实例”

那怎么理解这个实例呢?

一个服务每被部署一份,就叫做一个实例。

若部署十个user服务,那就会出现十个实例。

application:服务名称,我们在配置文件中进行配置的
Status:IP和服务端口(由于window的原因,这个地方显示的时计算机名),其中UP代表正常状态,DOWN代表服务挂掉

3.2 将user-service服务注册到eureka中 (服务注册)

3.2.1 配置

3.2.1.1 maven坐标

我在导入坐标的时候出现了cannot reconnect ,翻译:不能连接我把idea重启了一下,解决了这个错误,我感觉我的idea有毛病

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

现在的依赖与eureka-server工程的依赖有所不同,这个是eureka的client端(客户端)

3.2.1.2 application.yml文件配置

下面除了微服务的名称与之前eureka-server工程不一样,其他配置和刚刚的是一个样子的

spring:application:name: userserviceeureka:client:service-url:defaultZone: http://127.0.0.1:10086/eureka/  

3.2.2 启动

启动下面的类即可

@MapperScan("cn.itcast.user.mapper")
@SpringBootApplication
public class UserApplication {public static void main(String[] args) {SpringApplication.run(UserApplication.class, args);}
}

观察下图,确实变成两个实例了

3.3 将order-service服务注册到eureka中(服务注册)

参照3.2 进行

3.4 实现某个服务多个实例

3.4.1 创建多个服务与实例

比如,我们可以将user-service多次启动,模拟实例部署,但为了避免端口冲突,需要修改端口设置:

“-D”代表着参数,“server.port=8082”是配置端口,这个端口覆盖了yaml文件中的配置的端口

之后点击“OK”

启动成功

查看

我们看到确实是两个,这就是服务的列表

服务注册总结

  • 引入eureka-client依赖

  • 在application.yml中配置eureka地址

3.5 服务发现(服务拉取)与负载均衡

依然是在order-service完成服务拉取

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

3.5.1 在order-service完成服务拉取

3.5.1.1 之前服务拉取代码

@Service
public class OrderService {@Autowiredprivate OrderMapper orderMapper;@Autowiredprivate RestTemplate restTemplate;public Order queryOrderById(Long orderId) {// 1.查询订单    从数据库中获取Order order = orderMapper.findById(orderId);//2. 利用RestTemplate发起HTTP请求,获取用户//         get请求:getForObject(url路径,返回值类型)//                 我们下面的返回值类型不需要JSON,而是需要一个User对象的形式,所以写User.class//         post请求:postForObject()String url = "http://localhost:8081/user/" + order.getUserId();User user = restTemplate.getForObject(url, User.class);//3. 封装user到Order中order.setUser(user);// 4.返回return order;}
}
@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
public class OrderApplication {public static void main(String[] args) {SpringApplication.run(OrderApplication.class, args);}@Beanpublic RestTemplate restTemplate(){return  new RestTemplate();}}

3.5.1.2 如今服务拉取代码

服务名称代替IP端口

修改OrderService的代码,修改访问的url路径,用服务名代替ip、端口:

String url = "http://userservice/user/" + order.getUserId();
@Service
public class OrderService {@Autowiredprivate OrderMapper orderMapper;@Autowiredprivate RestTemplate restTemplate;public Order queryOrderById(Long orderId) {// 1.查询订单    从数据库中获取Order order = orderMapper.findById(orderId);//2. 利用RestTemplate发起HTTP请求,获取用户//         get请求:getForObject(url路径,返回值类型)//                 我们下面的返回值类型不需要JSON,而是需要一个User对象的形式,所以写User.class//         post请求:postForObject()
//        String url = "http://localhost:8081/user/" + order.getUserId();String url = "http://userservice/user/" + order.getUserId();User user = restTemplate.getForObject(url, User.class);//3. 封装user到Order中order.setUser(user);// 4.返回return order;}
}

在order-service项目的启动类OrderApplication中的RestTemplate添加负载均衡注解:

LoadBalanced就是负载均衡的意思

@Bean
@LoadBalanced
public RestTemplate restTemplate(){   return new RestTemplate();
}

3.5.2 发送请求获取数据

发送请求获取数据

端口8080、8081存在日志信息,而8082不存在日志信息

再次发送请求

端口8080、8082会有反应

3.6 总结

相关文章:

Eureka注册中心快速入门

一、提供者与消费者**服务提供者&#xff1a;**一次业务中&#xff0c;被其他微服务调用的服务。&#xff08;提供接口给其他微服务&#xff09;**服务消费者&#xff1a;**一次业务中&#xff0c;调用其他微服务的服务。&#xff08;调用其它微服务提供的接口&#xff09;比如…...

xmu 离散数学 卢杨班作业详解【1-3章】

文章目录第一章 命题逻辑常用latex数学公式1.4.5679101113171923242627第二章 一阶逻辑1.2.3.6.9.10.12.13.一阶逻辑推理理论12.13.15.第三章 集合2478101213.第一章 命题逻辑 常用latex数学公式 符号代码∨\vee∨$\vee$∧\wedge∧$\wedge$→\rightarrow→$\rightarrow$⇒\Ri…...

mvn命令

在IDEA右侧Maven菜单中&#xff0c;有以下几种指令。 clean&#xff1a;清理&#xff0c;清除上一次构建生产的文件。执行该命令会删除项目地址下的target文件&#xff0c;但不会删除本地的maven已生成的文件。 validate&#xff1a;验证&#xff0c;验证项目是否正确且所有必…...

JS - 事件循环EventLoop

一、面试题&#xff1a;说一下事件循环&#xff08;回答思路梳理&#xff09; 首先 js 是单线程运行的&#xff08; JS 可以修改 DOM&#xff0c;如果在 JS 执行的时候 UI 线程还在工作&#xff0c;就可能导致不能安全的渲染 UI&#xff09;&#xff0c;在代码执行的时候&…...

【Java基础】30分钟Git 从入门到精通

一、 版本控制工具1、什么是版本控制系统&#xff1f;版本控制系统&#xff08;Version Control System&#xff09;:是一种记录一个或若干文件内容变化&#xff0c;以便将来查阅特定版本修订情况的系统。版本控制系统不仅可以应用于软件源代码的文本文件&#xff0c;而且可以对…...

0100 MySQL03

1.distinct关键字 把查询结果去除重复记录&#xff0c;原表数据不会被修改,只能出现在字段的最前端 select distinct job from emp; select distinct job,deptno from emp;//表示两个字段联合起来 去重 2.连接查询 从一张表中单独查询&#xff0c;称为单表查询 两张表联合…...

32- PyTorch基础 (PyTorch系列) (深度学习)

知识要点 PyTorch可以说是现阶段主流的深度学习框架 . 1 PyTorch入门 1.1 PyTorch概述 Torch是什么&#xff1f;一个火炬&#xff01;其实跟Tensorflow中Tensor是一个意思&#xff0c;可以当做是能在GPU中计算的矩阵.&#xff0c;也可以当做是ndarray的GPU版&#xff01; PyT…...

用gdb.attach()在gdb下断点但没停下的情况及解决办法

在python中&#xff0c;如果导入了pwntools&#xff0c;就可以使用里面的gdb.attach(io)的命令来下断点。 但是这一次鼠鼠遇到了一个情况就是下了断点&#xff0c;但是仍然无法在断点处开始运行&#xff0c;奇奇怪怪。 这是我的攻击脚本 我们运行一下。 可以看到其实已经运行起…...

Linux入门篇-作业(jobs)调度(本质仍然是进程)

简介 之所以叫做作业调度&#xff0c;作业是以shell为单位的&#xff0c;一个shell建立的作业&#xff0c;不会被另外一个shell看到&#xff08;包 括root&#xff09;&#xff0c;但是仍然可以看到作业对应的进程。①前台进程&#xff08;front process&#xff09; 运行在用户…...

vue 监听 取消监听

vue 的 watch 除了可以使用声明式的配置项以外&#xff0c;还可以通过命令式 this.$watch 方法。 如下是我们比较少用的命令式&#xff08;想要初始只监听一次&#xff0c;必须命令式写法&#xff09;&#xff1a; 监听只运行一次 声明式 export default{data: {showType: fa…...

0103深度优先搜索和单点连通-无向图-数据结构和算法(Java)

文章目录1.1 走迷宫1.2 图的深度优先搜索实现1.3 算法分析及性能1. 4 单点连通性后记1.1 走迷宫 简单的迷宫&#xff0c;如下图1.1-1所示&#xff1a; 探索迷宫而不迷路&#xff0c;我们需要&#xff1a; 选择一条没有标记过的通道&#xff0c;在你走过的路上铺一条绳子&…...

进销存管理系统

技术&#xff1a;Java等摘要&#xff1a;进销存管理系统是为了实现企业仓库商品管理的系统化、规范化和自动化&#xff0c;从而提高企业管理效率而设计开发的管理信息系统。它完全取代了过去一直用人工管理的工作方式&#xff0c;避免了由于管理人员手工操作上的疏忽以及管理质…...

Sonar:VSCode配置SonarLint/SonarLint连接SonarQube

需求描述 公司为项目代码配置了Sonar检测&#xff0c;希望在VSCode中开发项目时能够同步检测结果。 注意事项 SonarQube版本必须为7.9&#xff0c;否则SonarLint无法连接&#xff08;GitHub-SonarLint-Wiki第一行就有说明&#xff09;&#xff01;&#xff01;&#xff01;S…...

陀螺仪小车(Forerake-Car)

项目简介&#xff1a;搭建一辆有arduino UNO 与rnf24l01组成的小车&#xff1b;手部安装由arduino nano开发板、nrf24l01、imu构成的手势控制器&#xff0c;利用手势控制器检测手部状态、发送信号对小车进行前进&#xff0c;实现基于卡尔曼滤波的MPU6050姿态结算。 准备工作&am…...

Leetcode Day5 含有重复元素集合的组合+

1、含有重复元素集合的组合 给定一个可能有重复数字的整数数组 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用一次&#xff0c;解集不能包含重复的组合。 【题目传送门】 思…...

Mac Book pro(M1)使用总结

1、拿到电脑激活的时候&#xff0c;一定要记住账号密码及安全问题的答案。 2、显示隐藏文件夹&#xff1a; 3、显示.git或者gitignore等隐藏后缀的文件&#xff1a; 打开终端 defaults write com.apple.finder AppleShowAllFiles TRUE重启Finder在终端输入 killall Finder …...

QML集成JavaScript

在QML中可以使用现有的QML元素来创建页面&#xff0c;但QML紧密的集成了必要的JavaScript。 但QML中使用JavaScript比较严格&#xff0c;在QML中不可以添加或修改JavaScript全局对象成员&#xff0c;这样可能会使用一个未经声明的变量。 内联JavaScript 一些小型的JavaScript函…...

学习周报3.5

文章目录前言文献阅读摘要介绍方法总结相关性总结前言 本周阅读文献《Multi-step ahead probabilistic forecasting of multiple hydrological》&#xff0c;文献主要提出一种基于三维卷积神经网络、卷积最小门记忆神经网络和变分贝叶斯神经网络的混合深度学习模型&#xff08…...

java基础学习篇

java学习 多写&#xff08;代码、笔记、文章&#xff09;&#xff0c;多练&#xff08;交流、思维、技能&#xff09;&#xff0c;多分享&#xff0c;多提问、多思考 什么是计算机 由硬件和软件组成&#xff0c;广泛应用在科学计算、数据处理、自动控制&#xff0c;计算机辅…...

Go 语言基础语法及应用实践

Go语言是一门由Google开发的静态类型、编译型的开源编程语言,被设计成简单、高效、安全的语言。作为一门相对年轻的语言,Go语言的使用范围正在不断扩大,特别是在Web开发、云计算、容器化和分布式系统等领域越来越受到欢迎。 在本篇文章中,我们将探讨Go语言的基础语法及应用…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验&#xff0c;我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育&#xff0c;这并非炒作&#xff0c;而是已经发生的巨大变革。教育机构和教育者不能忽视它&#xff0c;试图简单地禁止学生使…...

GruntJS-前端自动化任务运行器从入门到实战

Grunt 完全指南&#xff1a;从入门到实战 一、Grunt 是什么&#xff1f; Grunt是一个基于 Node.js 的前端自动化任务运行器&#xff0c;主要用于自动化执行项目开发中重复性高的任务&#xff0c;例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...

Linux系统部署KES

1、安装准备 1.版本说明V008R006C009B0014 V008&#xff1a;是version产品的大版本。 R006&#xff1a;是release产品特性版本。 C009&#xff1a;是通用版 B0014&#xff1a;是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存&#xff1a;1GB 以上 硬盘&#xf…...