【SpringCloud】探索Eureka注册中心

在这里插入图片描述

🏡浩泽学编程:个人主页

 🔥 推荐专栏:《深入浅出SpringBoot》《java对AI的调用开发》
              《RabbitMQ》《Spring》《SpringMVC》《项目实战》

🛸学无止境,不骄不躁,知行合一

文章目录

  • 前言
  • 一、前景引入
    • 简诉微服务
    • 问题
  • 二、使用Eureka
    • 未使用Eureka前
    • 使用Eureka后
    • 测试
    • 总结
  • 总结


前言

废话不多说,一文直接快速入门实用Eureka注册中心,讲述如何搭建EurekaServer,并注册服务,探索远程调用问题。


一、前景引入

简诉微服务

  • 单体架构:首先我们需要知道,我们大多数做一个SpringBoot的项目都是所有业务功能都在一个项目中开发,然后打包部署。
    • 缺点:耦合度高,后面如果在某些业务商添加功能,面临着不小的编辑修改;例如我在会员功能中,加入获取积分功能和积分兑换功能等。
  • 微服务出现分布式架构,根据业务功能对系统进行拆分,每个业务模块作为独立项目开发,成为一个服务。
    • 优点:降低服务耦合、有利于服务升级扩展。
    • 微服务特征:
      • 单一职责:微服务拆分粒度更小,每一个服务都对应唯一的业务能力,做到单一职责,避免重复业务开发
      • 面向服务:微服务对外暴露业务接口
      • 自治:团队独立、技术独立、数据独立、部署独立
      • 隔离性强:服务调用做好隔离、容错、降级,避免出现级联问题

问题

分布式实现服务拆分:

  • 服务集群地址如何维护?
  • 服务之间如何实现远程调用?
  • 服务健康状态如何感知?

本篇文章讲诉的Eureka将会简单解决上诉问题,让你豁然开朗。

二、使用Eureka

案例实现原则

  • 单一职责:不同微服务,不要重复开发相同业务
  • 数据独立:不要访问其它微服务的数据库
  • 面向服务:将自己的业务暴露为接口,供其它微服务调用

案例:现在有两个服务:根据id查询订单,根据id查询用户。
需求:根据订单id查询订单的同时,把订单所属的用户信息一起返回
在这里插入图片描述
两个服务端口不一样,连接的数据库不一样:
在这里插入图片描述
在这里插入图片描述
每个单独服务的运行:
http://localhost:8080/order/101:
在这里插入图片描述
http://localhost:8081/user/1:
在这里插入图片描述

未使用Eureka前

正常我们实现远程调用思路:在订单查询的模块实现远程调用用户查询,再将获取的结果放到订单结果中。
微服务调用方式:

  • 基于RestTemplate发起的http请求实现远程调用
  • http请求做远程调用是与语言无关的调用,只要知道对方的ip、端口、接口路径、请求参数即可。

注入RestTemplate:
在这里插入图片描述
原来订单业务层:

@Service
public class OrderService {@Autowiredprivate OrderMapper orderMapper;@Autowiredprivate RestTemplate restTemplate;public Order queryOrderById(Long orderId) {// 查询订单Order order = orderMapper.findById(orderId);// 返回return order;}
}

现在加入远程调用:

@Service
public class OrderService {@Autowiredprivate OrderMapper orderMapper;@Autowiredprivate RestTemplate restTemplate;public Order queryOrderById(Long orderId) {// 查询订单Order order = orderMapper.findById(orderId);//发送用户请求String url = "http://127.0.0.1:8080/user/"+order.getUserId();User user = restTemplate.getForObject(url, User.class);order.setUser(user);// 返回return order;}
}

实现需求了(http://localhost:8080/order/101):
在这里插入图片描述
思考:

  • 服务消费者该如何获取服务提供者的地址信息?(上诉固定了请求地址,发生改变怎么办)
  • 如果有多个服务提供者,消费者该如何选择?
  • 消费者如何得知服务提供者的健康状态?(如果调用的服务器挂掉了,怎么知道)

使用Eureka后

Eureka的作用

  • 消费者该如何获取服务提供者具体信息?
    • 服务提供者启动时向eureka注册自己的信息
    • eureka保存这些信息
    • 消费者根据服务名称向eureka拉取提供者信息
  • 如果有多个服务提供者,消费者该如何选择?
    • 服务消费者利用负载均衡算法,从服务列表中挑选一个消费者
  • 如何感知服务提供者健康状态?
    • 服务提供者会每隔30秒向EurekaServer发送心跳请求报告健康状态
    • eureka会更新记录服务列表信息,心跳不正常会被剔除
    • 消费者就可以拉取到最新的信息

添加eureka-server模块:
在这里插入图片描述
eureka-server模块的配置文件:

server:port: 10086 # 服务端口
spring:application:name: eureka-server # eureka服务名称
eureka:client:service-url:defaultZone: http://127.0.0.1:10086/eureka # eureka地址信息

eureka-server模块添加依赖(这是服务端):

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

编写eureka-server模块启动类,添加@EnableEurekaServer注解:

/*** @version 1.0.0* @Author: dragon_王* @Date: 2024/3/24 15:26:28*/
@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {public static void main(String[] args) {SpringApplication.run(EurekaApplication.class,args);}
}

现在将需要注册的服务注册到EurekaService,步骤如下:
引入依赖
在user-service项目引入spring-cloud-starter-netflix-eureka-client的依赖

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

在user-service项目中application.yml文件配置
注意userservice就是我给这个user服务起的服务器名称,这就是前面说的——消费者该如何获取服务提供者具体信息?消费者根据服务名称向Eureka中拉取

spring:application:name: userservice # user服务的服务器名称
eureka:client:service-url: # eureka地址信息defaultZone: http://127.0.0.1:10086/eureka

order-server注册到Eureka中,步骤亦是如此,不再重复。

这样就将服务注册到EurekaServer中,现在运行order-server、user-server、eureka-server这三个服务,打开http://127.0.0.1:10086,就可以看到Eureka可视化管理界面:
在这里插入图片描述
可以看到注册的服务都在其中。

测试

  • 现在还有俩问题还没解决:
    • 如果有多个服务提供者,消费者该如何选择?
    • 如何感知服务提供者健康状态?
  • 如何感知服务提供者健康状态这个问题我不再演示,大家只需要知道:服务提供者会每隔30秒向EurekaServer发送心跳请求报告健康状态,eureka会更新记录服务列表信息,心跳不正常会被剔除。
  • 下面简单测试多个服务提供,会选择哪个。

右键UserApplication,点击Copy Configuration
在这里插入图片描述
弹出弹窗:
在这里插入图片描述
得到相同配置不同端口的user-server服务:
在这里插入图片描述
运行后,我们请求http://localhost:8080/order/101两次,看控制台打印:
在这里插入图片描述在这里插入图片描述
可以发现,请求第一次时,8081端口的服务响应的,第二次请求时,8082端口服务响应的,这也就解决了我们的疑问,当多个服务提供者时,spring会自动帮助我们从eureka-server端,根据userservice这个服务名称,获取实例列表,而后完成负载均衡(这里访问两次给均衡给不同端口的服务了)。

总结

总结一下搭建EureKa的步骤和服务注册的步骤,很简单:

搭建EurekaServer:

  • 引入eureka-server依赖
  • 添加@EnableEurekaServer注解
  • 在application.yml中配置eureka地址

服务注册:

  • 引入eureka-client依赖
  • 在application.yml中配置eureka地址

在这里插入图片描述

无论是消费者还是提供者,引入eureka-client依赖知道eureka地址后,都可以完成服务注册。


总结

以上就是Eureka的快速讲解,相信你已经会用了吧。

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

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

相关文章

Protobuf基础使用

Protobuf是什么 在我们日常编写代码的过程中&#xff0c;经常会涉及到网络传输的部分。我们通常会在网络之间传递各种各样的请求&#xff0c;但是在我们日常架构之中&#xff0c;经常会涉及后端服务器之间的通信&#xff0c;通信过程中&#xff0c;可能传递的对象就是一个类。…

【vscode打开多文件夹】

1)将文件夹添加到工作空间中 2)文件夹方式展开 3)最终效果 小技巧&#xff1a; 文件夹的位置不对的话&#xff0c;可以拖动进行调整。

Linux--动静态库的原理和使用详解

本文介绍了Linux系统中动态库与静态库的概念、原理以及使用方法。通过深入讲解动态库与静态库的区别和优劣势&#xff0c;帮助读者更好地理解并选择合适的库类型来进行软件开发。 动态库和静态库的概念 动态库&#xff08;Dynamic Link Library&#xff0c;简称DLL&#xff09…

优化金融展厅设计,细节提升客户体验与实用效能

“很赚钱”大部分公众对金融行业的第一印象&#xff0c;这足以见得金融行业在社会经济发展中的重要性&#xff0c;而为了更好的宣传和科普金融相关信息&#xff0c;金融展厅的设计和建设成为了重要措施&#xff0c;它能够充分展示金融机构的实力、品牌形象和服务优势&#xff0…

Jmeter使用BeanShell保存数据到文件

1、目的 在使用jmeter压测时&#xff0c;业务上下连贯&#xff0c;需要对一些编号进行关联操作。这里使用‘JSON提取器’将值提取出来&#xff0c;后面请求可以直接使用。其它业务想要使用就只能把值保存到文件&#xff0c;再使用文件做参数化了。 2、JSON提取器 提取请求值 提…

网站监控工具必要的功能

什么是网站监控 网站监控是持续跟踪网站在互联网上的性能和可用性&#xff0c;以确保其正常运行并提供良好的用户体验的过程&#xff0c;在当今的数字时代&#xff0c;一个表现良好的网站对公司的声誉至关重要&#xff0c;打开速度慢的网站会对用户体验产生负面影响&#xff0…

leetcode 347.前K个高频元素

题目 思路 1.统计每个数出现的次数&#xff1a;可以用HashMap。key为num,value为这个数出现的次数。 2.怎样返回HashMap中value最大的前k个key呢&#xff1f; 这里用优先队列的方法&#xff08;本质是堆&#xff09; 我们要维护一个小根堆。我们在堆中存储&#xff08;key,…

APP信息收集思路总结(反代理,反虚拟机,反证书校验思路整理)

前言 本文是我在学习过程中的总结&#xff0c;希望可以被指导提议指正。 APP概况 app跟一个网站很像。 网站分为前端后端。 app就好像网站的前端一样&#xff0c;app不需要浏览器&#xff0c;而前端需要浏览器。 他们都需要服务器&#xff0c;也就是说&#xff0c;进行we…

实现登录拦截功能

1.4、实现登录拦截功能 温馨小贴士&#xff1a;tomcat的运行原理 当用户发起请求时&#xff0c;会访问我们像tomcat注册的端口&#xff0c;任何程序想要运行&#xff0c;都需要有一个线程对当前端口号进行监听&#xff0c;tomcat也不例外&#xff0c;当监听线程知道用户想要和…

#Linux(make工具和makefile文件以及makefile语法)

&#xff08;一&#xff09;发行版&#xff1a;Ubuntu16.04.7 &#xff08;二&#xff09;记录&#xff1a; &#xff08;1&#xff09;make为编译辅助工具&#xff0c;解决用命令编译工程非常繁琐的问题 &#xff08;2&#xff09;在终端键入make即可调用make工具&#xff0…

huawei 华为 交换机 配置 LACP 模式的链路聚合示例 (交换机之间直连)

组网需求 如 图 3-22 所示&#xff0c; SwitchA 和 SwitchB 通过以太链路分别都连接 VLAN10 和 VLAN20 的网络&#xff0c;且SwitchA 和 SwitchB 之间有较大的数据流量。用户希望 SwitchA 和 SwitchB 之间能够提供较大的链路带宽来使相同VLAN 间互相通信。在两台 Switch 设备上…

攻防演练利器:六款蓝队开源防御工具特点剖析

实战化的攻防演习活动一般具有时间短、任务急等特点&#xff0c;作为防守方&#xff0c;蓝队需要在日常安全运维工作的基础上&#xff0c;从攻击者角度出发&#xff0c;了解攻击者的思路与打法&#xff0c;并结合本单位实际网络环境、运营管理情况&#xff0c;制定相应的技术防…

性能测试丨GreatSQL TPC-H 性能测试报告正式发布!

1、测试背景概述 本次测试针对GreatSQL开源数据库基于标准 TPC-H 场景的测试。 TPC-H&#xff08;商业智能计算测试&#xff09;是美国交易处理效能委员会&#xff08;TPC&#xff0c;TransactionProcessing Performance Council&#xff09;组织制定的用来模拟决策支持类应用…

抽取CLOB字段中XML的特定元素的VALUE值

在ORACLE数据库中&#xff0c;有时XML文件会被保存在CLOB字段中。 这时候&#xff0c;若是我们要获取此字段XML中特定元素的VALUE值&#xff0c;就需要用到xmltype 这个函数。 如下面的 XML文件&#xff0c;保存在 TABLE_A 的CLOB_K 字段&#xff0c;若是我们要获取其中的 Y…

C语言从入门到精通(第5版)-----读书笔记

第一章 C语言概述 1.1 C语言的发展史 1.1.1程序语言简述 1、机器语言 低级语言&#xff0c;又称二进制代码语言。一种使用0、1表示的二进制代码编写指令以执行计算机操作的语言。 特点&#xff1a;计算机可以直接识别&#xff0c;不需要进行任何翻译。 2、汇编语言 为了减…

RDMA内核态通信测试krping学习

krping模块是一个内核可加载模块&#xff0c;它实现了客户机/服务器ping/pong程序&#xff0c;这个模块仅仅为了测试内核rdma的API&#xff08;单边的READ和Write&#xff1b;双边的SEND和RECEIVE&#xff09;。该模块允许通过一个名为/proc/krping的/proc条目建立连接并运行pi…

ElasticSearch8 - 基本操作

前言 本文记录 ES 的一些基本操作&#xff0c;就是对官方文档的一些整理&#xff0c;按自己的习惯重新排版&#xff0c;凑合着看。官方的更详细&#xff0c;建议看官方的。 下文以 books 为索引名举例。 新增 添加单个文档 (没有索引会自动创建) POST books/_doc {"n…

服务器总是宕机问题记录

博主介绍&#xff1a; 22届计科专业毕业&#xff0c;来自湖南&#xff0c;主要是在CSDN记录一些自己在Java开发过程中遇到的一些问题&#xff0c;欢迎大家一起讨论学习&#xff0c;也欢迎大家的批评指正。 文章目录 背景调整总结 背景 2核2G的服务器&#xff0c;服务器安装了t…

计算机网络:物理层中的数字传输系统全景概览解析

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

Django之Celery篇(三)

一、任务交给Celery Django任务交给Celery的方法和普通使用Celery任务的调用基本无区别,只是将执行代码的放到到View视图中 而获取结果,往往并不能把结果和第1次请求一起响应,若想获取结果是通过第2次请求获取结果 代码如下: from django.http import HttpResponsefrom …