Eureka注册中心快速入门

news2024/12/23 14:21:22

一、提供者与消费者

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

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

比如我们刚刚的案例中,我们在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: userservice

eureka:
  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 {

    @Autowired
    private OrderMapper orderMapper;

    @Autowired
    private 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);
    }

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

}

3.5.1.2 如今服务拉取代码

服务名称代替IP端口

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

String url = "http://userservice/user/" + order.getUserId();
@Service
public class OrderService {

    @Autowired
    private OrderMapper orderMapper;

    @Autowired
    private 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 总结

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

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

相关文章

如何分辨on-policy和off-policy

on-policy的定义&#xff1a;behavior policy和target-policy相同的是on-policy&#xff0c;不同的是off-policy。 behavior policy&#xff1a;采样数据的策略&#xff0c;影响的是采样出来s,a的分布。 target policy&#xff1a;就是被不断迭代修改的策略。 如果是基于深度…

JavaSE学习笔记总结day18(完结!!!)

今日内容 零、 复习昨日 一、作业 二、进程与线程 三、创建线程 四、线程的API 五、线程状态 六、线程同步 零、 复习昨日 晨考 一、作业 见答案 二、进程与线程[了解] 一个进程就是一个应用程序,进程包含线程 一个进程至少包含一个线程,大部分都是有多条线程在执行任务(多线…

Win系统蓝牙设备频繁卡顿/断连 - 解决方案

Win系统蓝牙设备频繁卡顿/断连 - 解决方案前言常见网卡Intel无线网卡&#xff08;推荐&#xff09;Realtek无线网卡总结查看本机网卡解决方案更新驱动更换网卡&#xff08;推荐&#xff09;前言 无线网卡有2个模块&#xff0c;一个是WiFi&#xff0c;一个是蓝牙&#xff0c;因…

Kubernetes之存储管理(下)

动态卷供应 上篇文章讲述的持久性存储&#xff0c;是先创建pv&#xff0c;然后才能创建pvc。如果不同的命名空间里同时要创建不同的pvc&#xff0c;那么就需要提前创建好pv&#xff0c;这样才能为pvc提供存储。但是这种方式太过繁琐&#xff0c;可以使用storageClass&#xff…

yolov5算法,训练模型,模型检测

嘟嘟嘟嘟&#xff01;工作需要&#xff0c;所以学习了下yolov5算法。是干什么的呢&#xff1f; 通俗来说&#xff0c;可以将它看做是一个小孩儿&#xff0c;通过成年人&#xff08;开发人员&#xff09;提供的大量图片的学习&#xff0c;让自己知道我看到的哪些场景需要提醒给成…

MySQL底层存储B-Tree和B+Tree原理分析

1.B-Tree的原理分析 &#xff08;1&#xff09;什么是B-Tree B-树&#xff0c;全称是 Balanced Tree&#xff0c;是一种多路平衡查找树。 一个节点包括多个key (数量看业务)&#xff0c;具有M阶的B树&#xff0c;每个节点最多有M-1个Key。 节点的key元素个数就是指这个节点能…

Andorid:关于Binder几个面试问题

1.简单介绍下binderbinder是一种进程间通讯的机制进程间通讯需要了解用户空间和内核空间每个进程拥有自己的独立虚拟机&#xff0c;系统为他们分配的地址空间都是互相隔离的。如两个进程需要进行通讯&#xff0c;则需要使用到内核空间做载体&#xff0c;内核空间是所有进程共享…

FL2440(S3C2440A 芯片) 开发板开发笔记

FL2440(S3C2440A 芯片) 开发板开发笔记 开发板的拨码开关指南&#xff1a; FL2440 改 vnfg 飞凌嵌入式 www. witech. com. cn 09. 8. 22 1 开发板使用手册 version4. 0 FL2440 保定飞凌嵌入式技术有限公司 网站&#xff1a;http: //www. witech. com. cn http: //www. he…

动态规划之买卖股票问题

&#x1f308;&#x1f308;&#x1f604;&#x1f604; 欢迎来到茶色岛独家岛屿&#xff0c;本期将为大家揭晓动态规划之买卖股票问题 &#xff0c;做好准备了么&#xff0c;那么开始吧。 &#x1f332;&#x1f332;&#x1f434;&#x1f434; 动态规划算法本质上就是穷举…

synchronized底层

Monitor概念一、Java对象头二、Monitor2.1、Monitor—工作原理2.2、Monitor工作原理—字节码角度2.2、synchronized进阶原理&#xff08;优化&#xff09;2.3、synchronized优化原理——轻量级锁2.4、synchronized优化原理——锁膨胀2.5、synchronized优化原理——自旋优化2.6、…

VUE3-Cesium(加载GeoJSON数据)

目录 一、准备工作 1、新建vue项目 解决报错&#xff1a;使用nvm后找不到vue -V找不到版本 2、安装Cesium插件 3、安装 Element Plus、unplugin-vue-components 和 unplugin-auto-import 4、按需自动导入element-plus 测试按需自动导入element-plus是否配置成功 二、项…

2023年软考中级电子商务设计师考什么?

首先&#xff0c;电子商务设计师属于软考中级&#xff0c;因此难度也不是特别大。但并不是说就完全没有难度&#xff0c;难度还是有的&#xff0c;像上午题一般把基本知识点掌握了&#xff0c;是没什么问题的&#xff0c;重点就在于下午题会比较难。 接下来我们来剖析一下考试…

408考研计算机之计算机组成与设计——知识点及其做题经验篇目1:RAM与ROM

目录 一、RAM 1、特点 2、分类 ①SRAM ②DRAM 二、ROM 1、特点 2、分类 可能是小编的学习风格和大家的不一样&#xff0c;小编喜欢由难到易的学习风格&#xff0c;所以在408计算机考研的四门课中&#xff0c;先选择了最难的计算机组成与设计进行学习。近…

【C++】初识类和对象

&#x1f3d6;️作者&#xff1a;malloc不出对象 ⛺专栏&#xff1a;C的学习之路 &#x1f466;个人简介&#xff1a;一名双非本科院校大二在读的科班编程菜鸟&#xff0c;努力编程只为赶上各位大佬的步伐&#x1f648;&#x1f648; 目录前言一、面向过程和面向对象初步认识二…

Spring核心模块—— BeanFactoryPostProcessorBeanPostProcessor(后处理器)

后置处理器前言Spring的后处理器BeanFactoryPostProcessor&#xff08;工厂后处理器&#xff09;执行节点作用基本信息经典场景子接口——BeanDefinitiRegistryPostProcessor基本介绍用途具体原理例子——注册BeanDefinition使用Spring的BeanFactoryPostProcessor扩展点完成自定…

Linux安装minio单机版

说明&#xff1a;因为前面记录了一下minio的使用&#xff0c;这里说一下minio的安装&#xff0c;只是单机版哦 环境准备&#xff1a;Linux系统 说明图&#xff1a; 1.创建文件夹命令 我的是安装在/usr/local 文件夹下面的创建文件夹命令 #进入目标文件夹 cd /usr/local#创建…

5 GateWay断言Predicate

每一个Predicate的使用&#xff0c;可以理解为&#xff1a;当满足条件后才会进行转发&#xff0c;如果十多个&#xff0c;那就是满足所有条件才会转发 断言种类 After&#xff1a;匹配在指定日期时间之后发生的请求。Before&#xff1a;匹配在指定日期之前发生的请求。Betwee…

常见摄像头接口USB、DVP、MIPI接口的对比

常见摄像头接口DVP、MIPI、USB的比较 引言 摄像头传感器已经广泛用于嵌入式设备了&#xff0c;现在的手机很多都支持多个摄像头。 在物联网领域&#xff0c;摄像头传感器也越来越被广泛使用。今天就来简单聊一聊几种常见的摄像头接口。 传感器与主控设备进行通信&#xff0…

基于S32K148快速调试TJA1101

文章目录1.前言2.TJA1101简介3.TJA1101调试3.1 硬件3.1.1 整体框图3.1.2 评估板3.1.2.1 参考原理图3.1.2.2 引脚说明3.1.3 转接板3.1.3.1 参考原理图3.1.3.2 模式配置3.1.3.3 原理介绍3.2 软件3.2.1 物理层&#xff08;TJA1101&#xff09;&#xff1a;3.2.2 数据链路层&#x…

05_Pulsar的主要组件介绍与命令使用、名称空间、Pulsar的topic相关操作、Pulsar Topic(主题)相关操作_高级操作、

1.5.Apache Pulsar的主要组件介绍与命令使用 1.5.1.多租户模式 1.5.1.1. 什么是多租户 1.5.1.2.Pulsar多租户的相关特征_安全性&#xff08;认证和授权&#xff09; 1.5.1.3.Pulsar多租户的相关特性_隔离性 1.5.1.4.Pulsar多租户的相关操作 1-获取租户列表 2-创建租户 3-获取配…