当前位置: 首页 > news >正文

SpringCloud系列教程:微服务的未来(十一)服务注册、服务发现、OpenFeign快速入门

本篇博客将通过实例演示如何在 Spring Cloud 中使用 Nacos 实现服务注册与发现,并使用 OpenFeign 进行服务间调用。你将学到如何搭建一个完整的微服务通信框架,帮助你快速开发可扩展、高效的分布式系统。

目录

前言

服务注册和发现

服务注册

​编辑 服务发现

OpenFeign

快速入门

总结


前言

本篇博客将通过实例演示如何在 Spring Cloud 中使用 Nacos 实现服务注册与发现,并使用 OpenFeign 进行服务间调用。你将学到如何搭建一个完整的微服务通信框架,帮助你快速开发可扩展、高效的分布式系统。


服务注册和发现

服务注册

服务注册步骤如下:

(1)引入nacos discovery依赖

<!--nacos 服务注册发现-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

(2)配置Nacos地址

spring:application:name:item-service#服务名称cloud:nacos:server-addr:虚拟机地址:8848#nacos地址(我的nacos部署在虚拟机里面)

在item-service模块中添加依赖

在item-service的application.yaml配置nacos地址

为多个服务测试,需要再配置一个item-service实例

 配置启动项,需重命名和配置端口号

 

访问nacos的服务管理,就可以发现注册成功呢

 服务发现

消费者需要连接nacos以拉取和订阅服务,因此服务发现的前两步与服务注册是一样,后面再加上服务调用即可:

(1) 引入nacos discovery依赖

...
(2)配置nacos地址
...
(3)服务发现

private final DiscoveryClient discoveryclient;private void handleCartItems(List<CartV0>vos){//1.根据服务名称,拉取服务的实例列表List<ServiceInstance>instances =         discoveryclient.getInstances("item-service");//2.负载均衡,挑选一个实例ServiceInstance instance = instances.get(RandomUtil.randomInt(instances.size()));//3.获取实例的TP和端口URI uri = instance.getUri();略...
}

将nacos依赖导入cart-service模块

在cart-service的application.yaml文件中配置nacos地址

修改购物车模块中的查询商品信息功能

package com.hmall.cart.service.impl;import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hmall.cart.domain.dto.CartFormDTO;
import com.hmall.cart.domain.dto.ItemDTO;
import com.hmall.cart.domain.po.Cart;
import com.hmall.cart.domain.vo.CartVO;
import com.hmall.cart.mapper.CartMapper;
import com.hmall.cart.service.ICartService;
import com.hmall.common.exception.BizIllegalException;
import com.hmall.common.utils.BeanUtils;
import com.hmall.common.utils.CollUtils;
import com.hmall.common.utils.UserContext;import lombok.RequiredArgsConstructor;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;/*** <p>* 订单详情表 服务实现类* </p>**/
@Service
@RequiredArgsConstructor
public class CartServiceImpl extends ServiceImpl<CartMapper, Cart> implements ICartService {private final RestTemplate restTemplate;private final DiscoveryClient discoveryClient;private void handleCartItems(List<CartVO> vos) {// 1.获取商品idSet<Long> itemIds = vos.stream().map(CartVO::getItemId).collect(Collectors.toSet());// 2.查询商品//根据服务名称获取服务的实例列表List<ServiceInstance> instances = discoveryClient.getInstances("item-service");if(CollUtils.isEmpty(instances)){return;}//手写负载均衡ServiceInstance instance = instances.get(RandomUtil.randomInt(instances.size()));//利用restTemolate发起http请求,得到http的响应ResponseEntity<List<ItemDTO>> response = restTemplate.exchange(instance.getUri()+"/items?ids={ids}",HttpMethod.GET,null,new ParameterizedTypeReference<List<ItemDTO>>() {},Map.of("ids", CollUtils.join(itemIds, ",")));//解析响应if(!response.getStatusCode().is2xxSuccessful()){//查询失败直接结束return;}List<ItemDTO> items = response.getBody();if (CollUtils.isEmpty(items)) {return;}// 3.转为 id 到 item的mapMap<Long, ItemDTO> itemMap = items.stream().collect(Collectors.toMap(ItemDTO::getId, Function.identity()));// 4.写入vofor (CartVO v : vos) {ItemDTO item = itemMap.get(v.getItemId());if (item == null) {continue;}v.setNewPrice(item.getPrice());v.setStatus(item.getStatus());v.setStock(item.getStock());}}
...}

OpenFeign

快速入门

利用Nacos现了服务的治理,利用RestTemplate实现了服务的远程调用。但是远程调用的代码太复杂了,我们可以通过OpenFeign组件来让操作更加简单。

OpenFeign是一个声明式的http客户端,是SpringCloud在Eureka公司开源的Feign基础上改造而来。官方地址:https://github.com/openFeign/feign
其作用就是基于SpringMVC的常见注解,帮我们优雅的实现http请求的发送。

 OpenFeign已经被SpringCloud自动装配,实现起来非常简单:
(1)引入依赖,包括OpenFeign和负载均衡组件SpringCloudLoadBalancer

<!--OpenFeign-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!--负载均衡-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

(2)通过@EnableFeignClients注解,启用OpenFeign功能

@EnableFeignclients
@SpringBootApplication
public class cartApplication{//...略}

OpenFeign已经被SpringCloud自动装配,实现起来非常简单:

(3)编写FeignClient

@FeignClient(value =item-service")
public interface Itemclient{@GetMapping("/items")List<ItemDT0>queryItemByIds(@RequestParam("ids")Collection<Long> ids);
}

(4)使用FeignClient,实现远程调用

List<ItemDTO>items =itemclient.queryItemByIds(List.of(1,2,3));

在cart-service模块的pom.xml文件中导入依赖

在CartApplication启动类上加@EnableFeignClients注解开启OpenFeign

编写ItemClient接口

package com.hmall.cart.client;import com.hmall.cart.domain.dto.ItemDTO;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;import java.util.List;@FeignClient("item-service")public interface ItemClient {@GetMapping("/items")List<ItemDTO> queryItemsByIds(@RequestParam("id") Collection<Long> ids);
}

修改购物车中的查询物品信息功能

@Service
@RequiredArgsConstructor
public class CartServiceImpl extends ServiceImpl<CartMapper, Cart> implements ICartService {private final ItemClient itemClient;
private void handleCartItems(List<CartVO> vos) {// 1.获取商品idSet<Long> itemIds = vos.stream().map(CartVO::getItemId).collect(Collectors.toSet());// 2.查询商品Client.queryItemsByIds(itemIds);if (CollUtils.isEmpty(items)) {return;}// 3.转为 id 到 item的mapMap<Long, ItemDTO> itemMap = items.stream().collect(Collectors.toMap(ItemDTO::getId, Function.identity()));// 4.写入vofor (CartVO v : vos) {ItemDTO item = itemMap.get(v.getItemId());if (item == null) {continue;}v.setNewPrice(item.getPrice());v.setStatus(item.getStatus());v.setStock(item.getStock());}}

 


总结

通过本篇博客的学习,我们了解了如何利用 Nacos 完成服务的注册与发现,让微服务之间可以轻松互相找到彼此并进行通信。我们还探索了如何通过 OpenFeign 简化服务间的调用,使得服务之间的交互更加便捷高效。

总结一下,本篇博客的关键点:

  1. 服务注册与发现:通过 Nacos,服务可以在启动时向 Nacos 注册自己,其他服务可以通过 Nacos 查询并发现目标服务。
  2. 服务调用:借助 OpenFeign,我们可以通过接口声明的方式来调用其他服务,而不需要直接编写 HTTP 请求,极大地提高了开发效率。
  3. 分布式架构:通过结合 Nacos 和 OpenFeign,我们能够更加高效地构建微服务架构,实现松耦合、灵活的服务间通信。

相关文章:

SpringCloud系列教程:微服务的未来(十一)服务注册、服务发现、OpenFeign快速入门

本篇博客将通过实例演示如何在 Spring Cloud 中使用 Nacos 实现服务注册与发现&#xff0c;并使用 OpenFeign 进行服务间调用。你将学到如何搭建一个完整的微服务通信框架&#xff0c;帮助你快速开发可扩展、高效的分布式系统。 目录 前言 服务注册和发现 服务注册 ​编辑 …...

物联网:七天构建一个闭环的物联网DEMO

我计划用七天的时间&#xff0c; 基于开源物联网平台&#xff0c; 打造一款物联网案例的闭环。 为了增加感观体验&#xff0c;欢迎大家与我保持亲密的沟通。 我们来看一段代码&#xff1a; Slf4j Component public class MqttSendManager {Resourceprivate MqttSendHandler m…...

景联文科技提供高质量多模态数据处理服务,驱动AI新时代

在当今快速发展的AI时代&#xff0c;多模态数据标注成为推动人工智能技术进步的关键环节。景联文科技作为行业领先的AI数据服务提供商&#xff0c;专注于为客户提供高质量、高精度的多模态数据标注服务&#xff0c;涵盖图像、语音、文本、视频及3D点云等多种类型的数据。通过专…...

c#13新特性

C# 13 即 .NET 9 按照计划会在2024年11月发布&#xff0c;目前一些新特性已经定型&#xff0c;让我们来预览一个比较大型比较重要的新特性。 正文 扩展类型 Extension types 在5月份的微软 Build 大会中的 What’s new in C# 13 会议上&#xff0c;两位大佬花了很长的篇幅来…...

LeetCode LCP17速算机器人

速算机器人&#xff1a;探索字符指令下的数字变换 在编程的奇妙世界里&#xff0c;我们常常会遇到各种有趣的算法问题&#xff0c;这些问题不仅考验我们的逻辑思维&#xff0c;还能让我们感受到编程解决实际问题的魅力。今天&#xff0c;就让我们一同探讨一个关于速算机器人的…...

杭州铭师堂的云原生升级实践

作者&#xff1a;升学e网通研发部基建团队 公司介绍 杭州铭师堂&#xff0c;是一个致力于为人的全面发展而服务的在线教育品牌。杭州铭师堂秉持“用互联网改变教育&#xff0c;让中国人都有好书读”的使命&#xff0c;致力于用“互联网教育”的科技手段让更多的孩子都能享有优…...

计算机网络之---MAC协议

MAC协议的作用 在数据链路层中&#xff0c;MAC&#xff08;媒介访问控制&#xff09;协议负责控制设备如何访问共享的通信介质&#xff08;如以太网、无线电波等&#xff09;&#xff0c;确保在多台设备共享同一传输媒介时能够有效地进行数据传输&#xff0c;避免冲突、控制流…...

微服务面试相关

Spring Cloud Spring Cloud五大组件 注册中心&#xff1a;Eureka、Nacos Ribbon负载均衡、负载均衡策略、自定义负载均衡 Ribbon负载均衡流程 Ribbon负载均衡策略 自定义负载均衡 服务雪崩、熔断降级 微服务监控-skywalking 业务相关 微服务限流&#xff08;令牌桶、漏桶算法…...

Google发布图像生成新工具Whisk:无需复杂提示词,使用图像和人工智能将想法可视化并重新混合

Whisk 是 Google Labs 的一项新实验&#xff0c;可使用图像进行快速而有趣的创作过程。Whisk不会生成带有长篇详细文本提示的图像&#xff0c;而是使用图像进行提示。只需拖入图像&#xff0c;即可开始创建。 whisk总结如下&#xff1a; Whisk 是 Google 实验室最新的生成图像实…...

docker pull(拉取镜像)的时候,无法下载或者卡在Waiting的解决方法

docker pull的时候&#xff0c;卡在Waiting的解决方法 一般情况&#xff08;大部分镜像都可以拉取&#xff09;更换镜像源 进一步&#xff08;如es等拉取不到&#xff09;在镜像同步站搜索详细步骤 还可以在挂载的时候&#xff0c;让其下载对应的版本 一般情况&#xff08;大部…...

51c~Pytorch~合集4

我自己的原文哦~ https://blog.51cto.com/whaosoft/12311033 一、Pytorch~训练-使用 这里介绍了Pytorch中已经训练好的模型如何使用 Pytorch中提供了很多已经在ImageNet数据集上训练好的模型了&#xff0c;可以直接被加载到模型中进行预测任务。预训练模型存放在Pytorch的…...

windows下,golang+vscode+delve 远程调试

1 先在远程服务器安装golang和delve golang的安装&#xff0c;通过官网直接下载安装包安装接口 go install github.com/go-delve/delve/cmd/dlvlatest 如果dlv和golang版本不匹配&#xff0c;这里把latest换成匹配的版本&#xff0c;比如1.20.0 2 编译带调试信息的程序 go bu…...

弥散张量分析开源软件 DSI Studio 简体中文汉化版可以下载了

网址&#xff1a; (63条消息) DSIStudio简体中文汉化版(2022年7月)-算法与数据结构文档类资源-CSDN文库...

视频编辑最新SOTA!港中文Adobe等发布统一视频生成传播框架——GenProp

文章链接&#xff1a;https://arxiv.org/pdf/2412.19761 项目链接&#xff1a;https://genprop.github.io 亮点直击 定义了一个新的生成视频传播问题&#xff0c;目标是利用 I2V 模型的生成能力&#xff0c;将视频第一帧的各种变化传播到整个视频中。 精心设计了模型 GenProp&…...

多维方向性增强分割通过大规模视觉模型实现|文献速递-视觉大模型医疗图像应用

Title 题目 Multidimensional Directionality-Enhanced Segmentation via large visionmodel 多维方向性增强分割通过大规模视觉模型实现 01 文献速递介绍 黄斑疾病影响全球约2亿人&#xff0c;已成为视力损害的主要原因之一。黄斑是视网膜中光感受器密度最高的区域&#…...

【Linux探索学习】第二十五弹——动静态库:Linux 中静态库与动态库的详细解析

Linux学习笔记&#xff1a; https://blog.csdn.net/2301_80220607/category_12805278.html?spm1001.2014.3001.5482 前言&#xff1a; 在 Linux 系统中&#xff0c;静态库和动态库是开发中常见的两种库文件类型。它们在编译、链接、内存管理以及程序的性能和可维护性方面有着…...

远程和本地文件的互相同步

文章目录 1、rsync实现类似git push pull功能1. 基础概念2. 示例操作3. 定制化和进阶用法4. 定时同步&#xff08;类似自动化&#xff09; 2 命令简化1. 动态传参的脚本2. Shell 函数支持动态路径3. 结合环境变量和参数&#xff08;更简洁&#xff09;4. Makefile 支持动态路径…...

自然语言处理之jieba分词和TF-IDF分析

jieba分词和TF-IDF分析 目录 jieba分词和TF-IDF分析1 jieba1.1 简介1.2 终端下载1.3 基本语法 2 TF-IDF分析2.1 什么是语料库2.2 TF2.3 IDF2.4 TF-IDF2.5 函数导入2.6 方法 3 实际测试3.1 问题解析3.2 代码测试 1 jieba 1.1 简介 结巴分词&#xff08;Jieba&#xff09;是一个…...

探索式测试

探索式测试是一种软件测试风格&#xff0c;它强调独立测试人员的个人自由和职责&#xff0c;为了持续优化其工作的价值&#xff0c;将测试学习、测试设计、测试执行和测试结果分析作为相互支持的活动&#xff0c;在整个项目实现过程中并行地执行。 选择合适的探索式测试方法我…...

服务器数据恢复—raid5故障导致上层ORACLE无法启动的数据恢复案例

服务器数据恢复环境&故障&#xff1a; 一台服务器上的8块硬盘组建了一组raid5磁盘阵列。上层安装windows server操作系统&#xff0c;部署了oracle数据库。 raid5阵列中有2块硬盘的硬盘指示灯显示异常报警。服务器操作系统无法启动&#xff0c;ORACLE数据库也无法启动。 服…...

外部系统调用SAP数据?用ABAP RFC函数搭个“桥梁”其实很简单(含Function Group创建避坑)

跨系统数据整合&#xff1a;ABAP RFC函数的设计哲学与实战指南 当企业数字化转型进入深水区&#xff0c;业务系统间的数据孤岛问题日益凸显。某零售企业的供应链总监最近就面临这样的挑战&#xff1a;"我们的电商平台需要实时获取SAP中的库存数据&#xff0c;但每次手工导…...

告别丢帧!用CANoe 12+和VN5610A搞定CSM ECAT模块高速采集(附100kHz采样率避坑要点)

突破100kHz采样率瓶颈&#xff1a;CANoe 12与VN5610A高速数据采集全攻略 在汽车电子测试领域&#xff0c;高速数据采集一直是工程师面临的重大挑战。当采样率超过100kHz时&#xff0c;传统配置方式往往会出现数据丢帧、时间戳错乱等问题。本文将深入解析CANoe 12与VN5610A硬件组…...

NAFNet实战指南:无激活函数图像修复模型的深度解析与应用

NAFNet实战指南&#xff1a;无激活函数图像修复模型的深度解析与应用 【免费下载链接】NAFNet The state-of-the-art image restoration model without nonlinear activation functions. 项目地址: https://gitcode.com/gh_mirrors/na/NAFNet NAFNet&#xff08;Nonline…...

保姆级教程:在Ubuntu 22.04上为DCU-Z100(ZiFang)安装ROCm 4.5.2驱动及完整工具链

国产AI加速卡DCU-Z100&#xff08;ZiFang&#xff09;全栈部署指南&#xff1a;从驱动安装到开发环境配置 在人工智能计算领域&#xff0c;国产硬件正逐步崭露头角。DCU-Z100&#xff08;代号ZiFang&#xff09;作为一款自主研发的深度学习计算单元&#xff0c;为开发者提供了全…...

AWorks硬件抽象层:嵌入式开发中UART、I2C、SPI、ADC接口的统一编程实践

1. 项目概述&#xff1a;当嵌入式开发遇上“万能插座”在嵌入式系统开发中&#xff0c;我们常常面临一个经典难题&#xff1a;硬件平台的碎片化。今天&#xff0c;你可能在为一块基于ARM Cortex-M4的MCU编写SPI驱动&#xff0c;用来连接一块TFT屏幕&#xff1b;明天&#xff0c…...

智能视觉瞄准系统:基于YOLOv8的高效游戏辅助解决方案

智能视觉瞄准系统&#xff1a;基于YOLOv8的高效游戏辅助解决方案 【免费下载链接】RookieAI_yolov8 基于yolov8实现的AI自瞄项目 AI self-aiming project based on yolov8 项目地址: https://gitcode.com/gh_mirrors/ro/RookieAI_yolov8 RookieAI_yolov8是一个基于先进视…...

Komanda代码嵌入功能详解:Gist、JSFiddle和Twitter无缝集成

Komanda代码嵌入功能详解&#xff1a;Gist、JSFiddle和Twitter无缝集成 【免费下载链接】komanda The IRC Client For Developers 项目地址: https://gitcode.com/gh_mirrors/ko/komanda Komanda作为一款面向开发者的IRC客户端&#xff0c;提供了强大的代码嵌入功能&…...

手把手教你用wget和迅雷搞定nuScenes数据集下载(附完整性校验命令)

高效获取nuScenes数据集的两种技术方案与完整性验证指南 在自动驾驶与计算机视觉研究领域&#xff0c;nuScenes数据集因其丰富的传感器数据和精细的标注体系已成为行业基准测试的重要资源。但对于大多数研究者而言&#xff0c;获取这个总容量超过550GB的数据集却面临着网络不稳…...

Zynq开发中XSA文件更新全流程:从硬件修改到软件调试

1. 项目概述&#xff1a;为什么需要更新XSA文件&#xff1f;在基于Xilinx Zynq系列SoC的开发流程里&#xff0c;XSA文件&#xff08;Xilinx Support Archive&#xff09;是一个承上启下的核心枢纽。它本质上是一个压缩包&#xff0c;里面封装了硬件平台&#xff08;Hardware Pl…...

Prettier配置踩坑实录:我的‘singleQuote: true’为什么不生效?深度解析VSCode格式化优先级与冲突解决

Prettier配置失效深度解析&#xff1a;VSCode格式化优先级与冲突解决实战 当你满怀期待地在.prettierrc中写下"singleQuote": true&#xff0c;保存文件后按下格式化快捷键——却发现引号依然顽固地保持双引号。这不是个例&#xff0c;而是前端开发者每天都会遇到的配…...