【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.rhkb.cn/news/138275.html

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

相关文章

【深度学习实验】前馈神经网络(六):自动求导

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 三、实验内容 0. 导入必要的工具包 1. 标量求导 2. 矩阵求导 3. 计算图 一、实验介绍 PyTorch提供了自动求导机制&#xff0c;它是PyTorch的核心功能之一&#xff0c;用于计算梯度并进行反向传播。自动求…

使用Java将PPT、PPTX和PDF转换为图片

从Office到图片—使用Java实现文件格式转换 PDF转图片1. 万事第一步2. 撸代码 PPT/PPTX转图片1. 万事第一步2. 撸代码验收一下 最近小雨遇到了一个需求&#xff0c;需要在前端小程序中嵌入展示Office文件的功能。然而&#xff0c;前端使用开源组件进行在线预览会导致性能消耗较…

windows下gvim的配置

一、vim配置文件 "查看自己的vimrc所在的目录 "在命令模式下 :echo $MYVIMRC"打开自己的vimrc文件 "在命令模式下 :e $MYVIMRC 二、排版 "查看自己当前的字体及大小 "在命令模式下 :set guifont?"设置默认的字体为仿宋_GB2312&#xff…

IDEA 2019 Springboot 3.1.3 运行异常

项目场景&#xff1a; 在IDEA 2019 中集成Springboot 3.1.3 框架&#xff0c;运行异常。 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSch…

R语言贝叶斯广义线性混合(多层次/水平/嵌套)模型GLMM、逻辑回归分析教育留级影响因素数据...

全文下载链接&#xff1a;http://tecdat.cn/?p24203 本教程使用R介绍了具有非信息先验的贝叶斯 GLM&#xff08;广义线性模型&#xff09; &#xff08;点击文末“阅读原文”获取完整代码数据&#xff09;。 当前教程特别关注贝叶斯逻辑回归在二元结果和计数/比例结果场景中的…

Linux:冯诺依曼系统和操作系统的概念

文章目录 冯诺依曼体系结构冯诺依曼体系的理解 操作系统操作系统的基本定位操作系统的理解1 操作系统的理解2总结 本篇主要总结的是操作系统的基本认知和一些概念 冯诺依曼体系结构 那么上图表示的就是冯诺依曼体系结构&#xff0c;那这个体系结构是什么&#xff1f;为什么要先…

客户端和服务端信息交互模型

什么是客户端和服务端&#xff1f; 客户端&#xff1a;可以向服务器发请求&#xff0c;并接收返回的内容进行处理 服务器端&#xff1a;能够接收客户端请求&#xff0c;并且把相关资源信息返回给客户端的 当用户在地址栏中输入网址&#xff0c;到最后看到页面&#xff0c;中间都…

配置OSPFv3基本功能 华为笔记

1.1 实验介绍 1.1.1 关于本实验 OSPF协议是为IP协议提供路由功能的路由协议。OSPFv2&#xff08;OSPF版本2&#xff09;是支持IPv4的路由协议&#xff0c;为了让OSPF协议支持IPv6&#xff0c;技术人员开发了OSPFv3&#xff08;OSPF版本3&#xff09;。 无论是OSPFv2还是OSPFv…

服务器新建FTP文件备份的地址

步骤1&#xff1a;远程桌面连接 步骤2&#xff1a;输入服务器地址&#xff0c;账号&#xff0c;密码 服务器地址&#xff1a;IP地址 账号&#xff1a;Administrator 密码&#xff1a;123456 步骤3&#xff1a;点击这个一个小人的图标 步骤4&#xff1a;General–>Add–&g…

R语言进行孟德尔随机化+meta分析(1)---meta分析基础

目前不少文章用到了孟德尔随机化meta分析&#xff0c;今天咱们也来介绍一下&#xff0c;孟德尔随机化meta其实主要就是meta分析的过程&#xff0c;提取了孟德尔随机化文章的结果&#xff0c;实质上就是个meta分析&#xff0c;不过多个孟德尔随机化随机化的结果合并更加加强了结…

【数据链路层】网络基础 -- MAC帧协议与ARP协议

数据链路层认识以太网以太网帧格式(MAC帧)认识MAC地址对比理解MAC地址和IP地址认识MTUMTU对IP协议的影响MTU对UDP协议的影响MTU对于TCP协议的影响 再谈局域网转发原理&#xff08;基于协议&#xff09;ARP协议ARP协议的作用ARP协议的工作流程ARP数据报的格式 数据链路层 用于两…

《DevOps实践指南》- 读书笔记(九)

DevOps实践指南 25. 附录附录 1 DevOps 的大融合精益运动敏捷运动Velocity 大会运动敏捷基础设施运动持续交付运动丰田套路运动精益创业运动精益用户体验运动Rugged Computing 运动 附录 2 约束理论和核心的长期冲突附录 3 恶性循环列表附录 4 交接和队列的危害附录 5 工业安全…

【Java 基础篇】Java并发包详解

多线程编程是Java开发中一个重要的方面&#xff0c;它能够提高程序的性能和响应能力。然而&#xff0c;多线程编程也伴随着一系列的挑战&#xff0c;如线程安全、死锁、性能问题等。为了解决这些问题&#xff0c;Java提供了一套强大的并发包。本文将详细介绍Java并发包的各个组…

基于SpringBoot的在线商城系统设计与实现

目录 前言 一、技术栈 二、系统功能介绍 用户信息管理 商品分类管理 商品信息管理 轮播图管理 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff…

http的网站进行访问时候自动跳转至https

通常情况下我们是用的都是http的路径&#xff0c;对于https的使用也很少&#xff0c;但是随着https的普及越来越多的域名访问需要用到https的&#xff0c;这个我们就演示怎么设置在我们对一个http的网站进行访问时候自动跳转至https下。 用到的工具及软件: 系统&#xff1a;wi…

构建自动化测试环境:使用Docker和Selenium!

随着软件开发的日益复杂和迭代速度的加快&#xff0c;自动化测试被越来越广泛地应用于软件开发流程中。它能够提高测试效率、减少测试成本&#xff0c;并保证软件质量的稳定性。在构建自动化测试环境方面&#xff0c;Docker 和 Selenium 是两个非常有用的工具。下面将介绍如何使…

asp.net网站的建立及运行

点击创建新项目 在输入框中输入asp.net&#xff0c;并选择图中的 点击下一步 点击创建 然后&#xff0c;右键&#xff0c;添加&#xff0c;新建项 选择web窗体 点击添加 点击视图&#xff0c;工具箱 选择一个label&#xff0c;记住这个id 空白处右键&#xff0c;查看代码 添…

CIIS 2023丨聚焦文档图像处理前沿领域,合合信息AI助力图像处理与内容安全保障

近日&#xff0c;2023第十二届中国智能产业高峰论坛&#xff08;CIIS 2023&#xff09;在江西南昌顺利举行。大会由中国人工智能学会、江西省科学技术厅、南昌市人民政府主办&#xff0c;南昌市科学技术局、中国工程科技发展战略江西研究院承办。本次大会重点关注AI大模型、生成…

第七天:gec6818开发板QT和Ubuntu中QT安装连接sqlite3数据库驱动环境保姆教程

sqlite3数据库简介 帮助文档 SQL Programming 大多数关系型数的操作步骤&#xff1a;1&#xff09;连接数据库 多数关系型数据库都是C/S模型 (Client/Server)sqlite3是一个本地的单文件关系型数据库&#xff0c;同样也有“连接”的过程 2&#xff09;操作数据库 作为程序员&am…

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

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