【SpringCloud】微服务技术栈入门1 - 远程服务调用、Eureka以及Ribbon

目录

    • 远程服务调用
      • RestTemplate
    • Eureka
      • 简要概念
      • 配置 Eureka 环境
      • 设置 Eureka Client
      • Eureka 服务发现
    • Ribbon
      • 工作流程
      • 配置与使用 Ribbon
      • 饥饿加载

远程服务调用

RestTemplate

RestTemplate 可以模拟客户端来向另外一个后端执行请求

黑马给出的微服务项目中,有两个 boot 项目,分别是 order 与 user

我们想要在 order 中的 service 阶段对 user 给出的接口执行请求,此时就需要 RestTemplate 来进行解决


首先需要在 OrderApplication,也就是项目入口点注册一个全局的 RestTemplate
后续可以使用自动装配直接调用该对象

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

修改 OrderService 的代码,借助 RestTemplate 请求拿到 user 后,存储到对应的 orde 对象中去

@Service
public class OrderService {@Autowiredprivate OrderMapper orderMapper;// 自动装配引入resttemplate@Autowiredprivate RestTemplate restTemplate;public Order queryOrderById(Long orderId) {// 1.查询订单Order order = orderMapper.findById(orderId);// 设置后端服务器请求的URLString url = "http://localhost:10087/user/" + order.getUserId();// 请求后端服务器User forObject = restTemplate.getForObject(url, User.class);// 将请求结果保存到现有的order对象中去order.setUser(forObject);// 4.返回return order;}
}

Eureka

简要概念

服务调用关系

  • 服务提供者:暴露接口给其他微服务调用
  • 服务消费者:使用其他微服务提供的接口
  • 提供者和消费者角色是相对的,一个对象可以同时兼具这两种状态

在这里插入图片描述

Eureka 完整工作流程图及其简要步骤

Eureka 由两部分组成:Eureka-serverEureka-client
Eureka-client 又可划分为两个类别:服务消费者(consumer)与服务提供者(provider)

工作流程:

  1. 服务提供者 URL 发送给注册中心进行注册
  2. 注册中心来者不拒,一一把服务提供者的 URL 记录到表内
  3. 服务消费者从注册中心获取对应提供者 URL,进行接口请求
  4. 每隔 30s,服务提供者就会向注册中心发送心跳包来证明自己活着,否则隔一段时间不发的话就会被注册中心删除
  5. 服务消费者具备负载均衡的能力,可以选择最适合的那一个后端服务执行请求

配置 Eureka 环境

注意,请确保所有项目的编译环境均为 JDK1.8,千万不要拉的太高,不然直接编译错误恶心死你,实测 17 及以上 JDK 直接崩溃

新建空的 maven 项目

pom 添加 eureka 依赖

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

配置入口文件

代码清单:EurekaApplication.java

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

编写配置文件(配置文件直接放到 resource 文件夹下面)

特别注意!!!配置项 defaultZone 必须是以小驼峰的形式书写,不能写成蛇形 default-zone 否则永远运行不了!!!

代码清单:application.yaml

# eureka服务器执行的端口
server:port: 10001# spring名称
spring:application:name: eurekaserver# 设置eureka服务器的可视化管理平台的默认URL
eureka:client:service-url:defaultZone: http://localhost:10001/eureka

打开控制面板:http://localhost:10001/
即可看到下方的效果

在这里插入图片描述


设置 Eureka Client

随意选择一个 springboot 项目(版本 2.7.15 及以下)

pom 内添加 eureka-client 依赖

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

和设置 eureka-server 不同的是,我们无需再为入口文件顶部添加注解 @EnableEurekaClient,因为目前对于高版本 springboot 来说,eureka 已经自动帮我们完成了这一步骤,我们仅需设置配置文件就可以了!

配置文件设置好 spring 的名称,以及 eureka 配置即可

server:port: 10087spring:application:name: userservereureka:client:# 同样的,这里指向的是我们eureka-server的地址!service-url:defaultZone: http://127.0.0.1:10001/eureka

此时先重新构建 eureka-server,然后再构建当前项目,打开控制面板,即可看见目前存在了两个 eureka-client


Eureka 服务发现

之前设置的远程服务调用 RestTemplate,是直接使用了硬编码,把 URL 写死了,现在我们配置好了 Eureka 服务器,那就可以使用负载均衡的原理,直接调用对应的后端服务器

打开 OrderApplication.java ,为对应的 RestTemplate 添加负载均衡注解

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

然后修改之前的硬编码为我们设置的服务提供者 user-server对应的 URL 即可

String url = "http://user-server/user/" + order.getUserId();

与此同时,这就完成了一个完整的 Eureka 工作流程

  1. user-server 发送服务到注册中心 eureka-server
  2. order-server 从注册中心发现服务,并取回使用

Ribbon

工作流程

在这里插入图片描述

在配置完毕 eureka 后,我们发现,虽然可以在代码中使用诸如 http://user-server/user/xxx 的形式来访问到对应的后端服务器,但是当我们直接把这段 URL 填入浏览器时,发现无法访问

而 Ribbon 的作用,简单来说,就是帮助我们把浏览器 URL 转义为对应的地址,让我们顺利访问到后端服务器(有点 DNS 那味了)

上图展示了 Ribbon 工作的基本流程

  1. 获取原始 URL,从中提取出 eureka-client 的 id
  2. 以此 id 请求 eureka-server,拿到所有相关的服务器原地址
  3. 借助 ribbon 负载均衡措施,选择一个地址并使用
  4. 转译该地址,返回

配置与使用 Ribbon

在这里插入图片描述

上图给出了可供选择的 Ribbon 负载均衡策略


Ribbon 自身通过接口 IRule 来自定义对应的负载均衡策略

OrderApplication.java 随便注入一个规则

@Bean
public IRule randomRule() {return new RandomRule();
}

定义负载均衡的方式也可以直接写在配置文件里面,这里不做演示,还是建议写在入口类,更加直观

入口类定义 IRule:全局作用;配置文件定义 IRule:局部作用


饥饿加载

ribbon 默认使用懒加载,所以当首次启用负载均衡时,会浪费很多时间实例化对象

在配置文件里面设置 ribbon 为饥饿式加载方法

ribbon:eager-load:# 当需要对多个eureka-client实现同类型加载方式的话,使用数组的写法clients:- user-server- order-serverenabled: true

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

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

相关文章

yolov5使用最新MPDIOU损失函数,有效和准确的边界盒回归的损失,优于GIoU/EIoU/CIoU/EIoU(附代码可用)

文章目录 1. 论文1.1. 主要目的1.2. 设计思路2 代码3.总结1. 论文 MPDIoU: A Loss for Efficient and Accurate Bounding Box Regression (一个有效和准确的边界框损失回归函数) 论文地址 1.1. 主要目的 当预测框与边界框具有相同的纵横比,但宽度和高度值完全不同时,大多数…

20230918使用ffmpeg将mka的音频转为AAC编码以便PR2023来识别

20230918使用ffmpeg将mka的音频转为AAC编码以便PR2023来识别 2023/9/18 20:58 ffmpeg -i 1.mka -acodec aac 1.mp4 ffmpeg -i 1.mka -vn -c:a aac 2.aac ffmpeg -i 1.mka -vn -c:a aac 2.MP4 ffmpeg mka 转 aacmp4 https://avmedia.0voice.com/?id42526 用ffmpeg将mka格式转化…

云端IDE的技术选型1

背景 考虑到以下几点&#xff0c;准备给低代码平台开发一套云端的IDE&#xff1a; 桌面端IDE&#xff1a;vs code 或 idea&#xff0c;都有需要开发人员安装ide&#xff0c;以及配置环境很多时候&#xff0c;配置开发环境是个非常曲折过程&#xff0c;经常出现版本不匹配&…

【分布式计算】副本数据Replicated Data

作用&#xff1a;可靠性、高性能、容错性 问题&#xff1a;如何保持一致、如何更新 问题&#xff1a;存在读写/写写冲突 一个简单的方法就是每个操作都保持顺序&#xff0c;但是因为网络延迟会导致问题 Data-centric models: consistency model?? ??? 读取时&#xff0c…

深入理解WPF中MVVM的设计思想

近些年来&#xff0c;随着WPF在生产&#xff0c;制造&#xff0c;工业控制等领域应用越来越广发&#xff0c;很多企业对WPF开发的需求也逐渐增多&#xff0c;使得很多人看到潜在机会&#xff0c;不断从Web&#xff0c;WinForm开发转向了WPF开发&#xff0c;但是WPF开发也有很多…

图像处理软件Photoshop 2024 mac新增功能

Photoshop 2024 mac是一款图像处理软件的最新版本。ps2024提供了丰富的功能和工具&#xff0c;使用户能够对照片、插图、图形等进行精确的编辑和设计。 Photoshop 2024 mac软件特点 快速性能&#xff1a;Photoshop 2024 提供了更快的渲染速度和更高效的处理能力&#xff0c;让用…

MyBatis 缓存模块

文章目录 前言缓存的实现Cache接口PerpetualCache 缓存的应用缓存对应的初始化一级缓存二级缓存第三方缓存 前言 MyBatis作为一个强大的持久层框架&#xff0c;缓存是其必不可少的功能之一&#xff0c;Mybatis中的缓存分为一级缓存和二级缓存。但本质上是一样的&#xff0c;都…

【异常错误】detected dubious ownership in repository ****** is owned by: ‘

今天在github git的时候&#xff0c;突然出现了这种问题&#xff0c;下面的框出的部分一直显示&#xff1a; detected dubious ownership in repository at D:/Pycharm_workspace/SBDD/1/FLAG D:/Pycharm_workspace/SBDD/1/FLAG is owned by: S-1-5-32-544 but the current use…

多线程的学习第二篇

多线程 线程是为了解决并发编程引入的机制. 线程相比于进程来说,更轻量 ~~ 更轻量的体现: 创建线程比创建进程,开销更小销毁线程比销毁进程,开销更小调度线程比调度进程,开销更小 进程是包含线程的. 同一个进程里的若干线程之间,共享着内存资源和文件描述符表 每个线程被独…

外国固定资产管理系统功能有哪些

很多公司都在寻找提高自己资产管理效益的方法。为了满足这一要求&#xff0c;国外的固定资产管理系统已经发展成多种形式。以下是国外一些常见的固定资产管理系统的特点:自动化和智能化:许多现代固定资产管理系统采用自动化和数字化技术&#xff0c;以简化流程&#xff0c;减少…

网络编程day04(网络属性函数、广播、组播、TCP并发)

今日任务 对于newfd的话&#xff0c;最好是另存然后传入给分支线程&#xff0c;避免父子线程操作同一个文件描述符 1.广播&#xff1a; 接收端 代码&#xff1a; #include <stdio.h> #include <string.h> #include <stdlib.h> #include <sys/types.h&…

Databend 开源周报第 111 期

Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 理解 SHARE END…

大数据(九):数据可视化(一)

专栏介绍 结合自身经验和内部资料总结的Python教程&#xff0c;每天3-5章&#xff0c;最短1个月就能全方位的完成Python的学习并进行实战开发&#xff0c;学完了定能成为大佬&#xff01;加油吧&#xff01;卷起来&#xff01; 全部文章请访问专栏&#xff1a;《Python全栈教…

Linux_9_网络协议和管理

目录 1网络基础1.1 网络概念1.2常见的网络物理组件1.3网络应用程序1.3.1各种网络应用1.3.2应用程序对网络的要求 1.4网络的特征1.4.1速度(带宽)1.4.2网络拓扑 1.5网络1.5.1网络准和分层1.5.2开放系统互联OSI1.5.3网络的通信过程1.5.3.1数据封装和数据解封1.5.3.2协议数据单元PD…

基于javaweb的顶岗实习管理系统(jsp+servlet)

系统简介 本项目采用eclipse工具开发&#xff0c;jspservletjquery技术编写&#xff0c;数据库采用的是mysql&#xff0c;navicat开发工具。 三个角色&#xff1a;管理员&#xff0c;教师&#xff0c;学生 模块简介 管理员&#xff1a; 1、登录 2、学生管理 3、公告管理 …

如何通过一键导出导入数据实现批量重命名文件名称

在日常办公中&#xff0c;我们经常需要对大量的文件进行重命名&#xff0c;以便更好地管理和查找文件。而且&#xff0c;有时候我们还需要将文件名称翻译成其他语言&#xff0c;以适应不同的工作需求。如何高效地完成这项任务呢&#xff1f;接下来&#xff0c;我将介绍一种方法…

【李沐深度学习笔记】线性代数实现

课程地址和说明 线性代数实现p2 本系列文章是我学习李沐老师深度学习系列课程的学习笔记&#xff0c;可能会对李沐老师上课没讲到的进行补充。 这节就算之前内容的复习&#xff0c;后面以截图形式呈现 标量由只有一个元素的张量表示 import torch x torch.tensor([3.0]) y …

Spring Boot魔法:简化Java应用的开发与部署

文章目录 什么是Spring Boot&#xff1f;1. 自动配置&#xff08;Auto-Configuration&#xff09;2. 独立运行&#xff08;Standalone&#xff09;3. 生产就绪&#xff08;Production Ready&#xff09;4. 大量的起步依赖&#xff08;Starter Dependencies&#xff09; Spring …

免杀对抗-java语言-shellcode免杀-源码修改+打包exe

JAVA-ShellCode免杀-源码修改&打包EXE Shellcode-生成/上线 1.msf生成shellcode 命令&#xff1a;msfvenom -p java/meterpreter/reverse_tcp LHOSTx.x.x.x LPORTxxxx -f jar -o msf.jar 2.msf设置监听 3.执行msf生成的shellcode jar包&#xff0c;成功上线 命令&#xff1…

05_Bootstrap插件02

7 小标签 通过 .label 实现小标签&#xff0c;用于提示类。 <h1>h1标题 <span class"label label-default">标签</span></h1> <h2>h2标题<span class"label label-default">标签</span></h2> <h3&g…