04-详解Eureka注册中心的作用,具体配置,服务注册和服务发现

Eureka注册中心的作用

Eureka架构

远程调用的两个问题

  • 服务的ip地址和端口号写死: 生产环境中服务的地址可能会随时发生变化,如果写死每次都需要重新修改代码
  • 多实例问题: 在高并发的情况下一个服务可以有多个实例形成一个集群,此时如果采用硬编码的方式只能访问服务的一个实例地址

在Eureka架构中,微服务角色分为EurekaServer和EurekaClient两类

  • EurekaServer(服务端): 可以记录服务的注册信息(包含服务名称及其相关实例地址), 对所有的服务心跳监控
  • EurekaClient(客户端): Provider(服务提供者)和consumer(服务消费者)
    在这里插入图片描述

服务提供者与消费者

在服务调用关系中包含服务的提供者和服务的消费者,这两种角色的定义并不是绝对的,因为在不同业务中有些服务既可以是服务提供者也可以是服务消费者

  • 服务提供者:一次业务中被其他微服务调用的服务(暴露接口给其他微服务)
  • 服务消费者:一次业务中调用其他微服务的服务(调用其他微服务提供的接口)

服务消费者在发起远程调用的时候,确定服务提供者实例的ip地址和端口号的过程,注意服务消费者也需要把自己注册到Eureka服务端后才能使用其提供的服务

  • 第一步服务注册: 服务提供者实例启动后会将自己的信息注册到eureka-server(Eureka服务端)
  • 第二步服务映射:Eureka服务端将所有服务提供的名称和其对应的服务实例地址的映射关系保存到Map集合当中
  • 第三步服务发现: 服务消费者根据服务提供者的名称从eureka中拉取对应信息,一个服务可能有多个服务提供者所以最终会得到一个服务实例地址列表
  • 第四步负载均衡: 服务消费者从实例地址列表中利用负载均衡算法选中一个实例地址并发起远程调用

服务消费者如何感知服务提供者健康状态即判断服务提供者是否宕机

  • 第一步: 服务提供者会每隔一段时间(默认30秒)向EurekaServer服务端发送心跳请求用来报告自己的健康状态
  • 第二步:eureka通过检查心跳请求更新服务提供者的列表信息, 发现心跳不正常就从服务列表中剔除, 这样服务消费者就可以拉取到服务提供者最新的信息

配置Eureka注册中心

搭建注册中心(EurekaServer)

第一步创建子模块: 在父工程cloud-demo中创建子模块eureka-server,然后引入SpringCloud为Eureka提供的starter服务端依赖

<!--eureka服务端依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

第二步编写启动类: 在eureka-server模块中编写一个启动类并添加@EnableEurekaServer注解,这样eureka-server服务就具有了作为注册的中心功能

  • 所有的微服务包括eureka-server服务自己都会去注册中心注册自己的信息(包含服务的名称及其相关实例地址)
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaApplication.class);
    }
}

第三步编写配置文件: 在eureka-server服务中将它自己的服务名称和相关的实例地址信息注册到eureka-server服务上,便于和其他eureka集群之间的通信

server:
  port: 10086 # 服务端口
spring:
  application:
    name: eureka-server # eureka的服务名称
# eureka服务将自己的信息注册到Eureka服务端    
eureka:
  client:
    service-url: # eureka的地址信息
      defaultZone: http://127.0.0.1:10086/eureka

第四步:启动微服务然后在浏览器访问http://localhost:10086/

在这里插入图片描述

服务注册

第一步引入依赖: 在user-service,order-service模块的pom.xml文件中引入Eureka的客户端依赖spring-cloud-starter-netflix-eureka-client

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

第二步服务注册: 在user-service,order-service模块的application.yml中配置自己的服务的名称eureka-server服务的地址信息

spring:
  application:
    name: userservice # 服务名称
# userservice服务将自己的信息注册到Eureka服务端      
eureka:
  client:
    service-url: # eureka的地址信息
      defaultZone: http://127.0.0.1:10086/eureka       
        
spring:
  application:
    name: orderservice # 服务名称
# orderservice将自己的信息注册到Eureka服务端    
eureka:
  client:
    service-url: # eureka的地址信息
      defaultZone: http://127.0.0.1:10086/eureka

第三步模拟多实例部署: 在IDEA中复制一份user-service实例的配置重新设置Name同时配合VM选项修改端口号-Dserver.port=8082多次启动

在这里插入图片描述

第四步: 查看Eureka服务端注册的服务及其相关的所有实例

在这里插入图片描述

服务调用

服务发现

第一步引入依赖: 服务发现和服务注册统一都封装在Eureka的客户端依赖中,如果注册时已经引入了该依赖就不用重复引入了

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

第二步服务发现:只要orderservice服务注册到eureka-server服务中就可以拉取userservice服务的实例地址列表

  • orderservice模块的启动类中给注册的RestTemplate这个Bean上添加一个负载均衡的注解@LoadBalanced
  • order-service模块OrderService类中的queryOrderById方法中远程调用的访问路径中使用服务名(userservice)代替服务实例的ip和端口
  • Spring会自动帮我们从Eureka服务端根据userservice这个服务名称获取对应的实例地址列表,然后利用负载均衡算法选中一个实例地址并发起远程调用
@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
public class OrderApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}
public Order queryOrderById(Long orderId) {
    // 1.查询订单
    Order order = orderMapper.findById(orderId);
    // 2.调用userservice服务远程查询User,使用服务的名称代替服务的IP地址和端口
    //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.setUser(user);
    // 4.返回
    return order;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【代码随想录】算法训练计划41

dp 1、343. 整数拆分 题目&#xff1a; 给定一个正整数 n &#xff0c;将其拆分为 k 个 正整数 的和&#xff08; k > 2 &#xff09;&#xff0c;并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 输入: n 10 输出: 36 解释: 10 3 3 4, 3 3 4 36。 思路…

揭秘字符串的奥秘:探索String类的深层含义与源码解读

文章目录 一、导论1.1 引言&#xff1a;字符串在编程中的重要性1.2 目的&#xff1a;深入了解String类的内部机制 二、String类的设计哲学2.1 设计原则&#xff1a;为什么String类如此重要&#xff1f;2.2 字符串池的概念与作用 三、String类源码解析3.1 成员变量3.2 构造函数3…

【小聆送书第二期】人工智能时代之AIGC重塑教育

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;网络奇遇记、数据结构 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;正文&#x1f4dd;活动参与规则 参与活动方式文末详见。 &#x1f4cb;正文 AI正迅猛地…

ubuntu 20.04 server 安装 zabbix

ubuntu 20.04 server 安装 zabbix 参考文档 zabbix没用过&#xff0c;用过prometheus&#xff0c; 因为现在很多应用都支持直接接入prometheus监控&#xff0c; 而且大部分语言都都有sdk支持&#xff0c; 可以直接接入自己的业务数据监控。 https://www.zabbix.com/cn/downlo…

激光打标机在智能手表上的应用:科技与时尚的完美结合

随着科技的飞速发展&#xff0c;智能手表已经成为我们日常生活中不可或缺的智能设备。而在智能手表制造中&#xff0c;激光打标机扮演着至关重要的角色。本文将详细介绍激光打标机在智能手表制造中的应用&#xff0c;以及其带来的优势和影响。 ​ 一、激光打标机在智能手表制…

MySql-substring函数和substring_index函数的使用及练习

目录 13.2.1 substring函数 1. 概述 2. 使用格式 3. 参数列表 4. 实例练习 13.2.2 substring_index函数 1. 概述 2. 格式 3. 参数说明 4. 返回值 5. 实例练习1 6. 实例练习2 13.3 牛客练习题 13.2.1 substring函数 1. 概述 substring函数是文本处理函数&#xf…

C语言 占位符 + 转义字符 + ASCLL 表 + 缓冲区

整型 占位符 取值范围 浮点型 占位符 转义字符 注意&#xff1a;绿色字体标注的为不可打印字符。 printf 常用占位符&#xff1a; printf 附加格式 ASCII 表 标准ASCII码的范围是0&#xff5e;127&#xff0c;只需7位二进制数即可表示。 缓冲区 缓冲区分类&#xff1a; sizeof(…

【数据结构】——排序篇(中)

前面我们已经了解了几大排序了&#xff0c;那么我们今天就来再了解一下剩下的快速排序法&#xff0c;这是一种非常经典的方法&#xff0c;时间复杂度是N*logN。 快速排序法&#xff1a; 基本思想为&#xff1a;任取待排序元素序列中的某元素作为基准值&#xff0c;按照该排序码…

自动驾驶学习笔记(十六)——目标跟踪

#Apollo开发者# 学习课程的传送门如下&#xff0c;当您也准备学习自动驾驶时&#xff0c;可以和我一同前往&#xff1a; 《自动驾驶新人之旅》免费课程—> 传送门 《Apollo 社区开发者圆桌会》免费报名—>传送门 文章目录 前言 匹配关联 轨迹记录 状态预测 总结 前…

C++使用策略模式,减少使用switch...case...

目录 原理函数类模板函数使用switch...case...不使用switch...case... 知识点decltypestd::remove_reference 原理 函数 #include <iostream> #include <functional> #include <map>void fun1(int a, int b) {std::cout << "fun1 : a "<…

uniApp项目的创建,运行到小程序

一、项目创建 1. 打开 HBuilder X 2. 右击侧边栏点击新建&#xff0c;选择项目 3. 填写项目名&#xff0c;点击创建即可 注&#xff1a;uniapp中如果使用生命周期钩子函数&#xff0c;建议使用哪种 ?(建议使用Vue的) 二、运行 1. 运行前先登录 2. 登录后点击 manifest.js…

Linux和Windows环境下如何使用gitee?

1. Linux 1.1 创建远程仓库 1.2 安装git sudo yum install -y git 1.3 克隆远程仓库到本地 git clone 地址 1.4 将文件添加到git的暂存区&#xff08;git三板斧之add&#xff09; git add 文件名 # 将指定文件添加到git的暂存区 git add . # 添加新文件和修改过的…

golang开发之个微机器人的二次开发

简要描述&#xff1a; 下载消息中的文件 请求URL&#xff1a; http://域名地址/getMsgFile 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-Type&#xff1a;application/jsonAuthorization&#xff1a;login接口返回 参数&#xff1a; 参数名必选类型…

测试用文章2

clion编辑器安装注意事项 clion是个非常优秀的cIDE&#xff0c;能大幅度提高我们写c的效率&#xff0c;最重要的是开箱即用。不过有些设置和注意事项&#xff0c;能让我们更好地使用clion 安装ideavim插件 vim插件&#xff0c;可以设置快捷键开启和关闭&#xff0c;推荐altf&am…

Windows下nginx的启动,重启,关闭等功能bat脚本

echo off rem 提供Windows下nginx的启动&#xff0c;重启&#xff0c;关闭功能echo begincls ::ngxin 所在的盘符 set NGINX_PATHG:::nginx 所在目录 set NGINX_DIRG:\projects\nginx-1.24.0\ color 0a TITLE Nginx 管理程序增强版CLSecho. echo. ** Nginx 管理程序 *** echo.…

文心ERNIE Bot SDK+LangChain:基于文档、网页的个性化问答系统

现在各行各业纷纷选择接入大模型&#xff0c;其中最火且可行性最高的形式无异于智能文档问答助手&#xff0c;而LangChain是其中主流技术实现工具&#xff0c;能够轻松让大语言模型与外部数据相结合&#xff0c;从而构建智能问答系统。ERNIE Bot SDK已接入文心大模型4.0能力&am…

平衡二叉树

AVL简称平衡二叉树&#xff0c;缩写为BBST&#xff0c;由苏联数学家 Adelse-Velskil 和 Landis 在 1962 年提出。 二叉树是动态查找的典范&#xff0c;但在极限情况下&#xff0c;二叉树的查找效果等同于链表&#xff0c;而平衡二叉树可以完美的达到 log ⁡ 2 n \log_2 n log2…

JVM 内存分析工具 Memory Analyzer Tool(MAT)的深度讲解

目录 一. 前言 二. MAT 使用场景及主要解决问题 三. MAT 基础概念 3.1. Heap Dump 3.2. Shallow Heap 3.3. Retained Set 3.4. Retained Heap 3.5. Dominator Tree 3.6. OQL 3.7. references 四. MAT 功能概述 4.1. 内存分布 4.2. 对象间依赖 4.3. 对象状态 4.4…

docker容器配置MySQL与远程连接设置(纯步骤)

以下为ubuntu20.04环境&#xff0c;默认已安装docker&#xff0c;没安装的网上随便找个教程就好了 拉去mysql镜像 docker pull mysql这样是默认拉取最新的版本latest 这样是指定版本拉取 docker pull mysql:5.7查看已安装的mysql镜像 docker images通过镜像生成容器 docke…

Git的安装以及SSH配置

前言 近期工作需要&#xff0c;所以版本管理工具要用到Git&#xff0c;某些操作需要ssh进行操作&#xff0c;在某次操作中遇到&#xff1a;git bash报错&#xff1a;Permission denied, please try again。经排查是ssh没有配置我的key&#xff0c;所以就借着这篇文章整理了一下…