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

server/2025/1/16 12:05:49/

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

目录

前言

服务注册和发现

服务注册

​编辑 服务发现

OpenFeign-toc" style="margin-left:0px;">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)服务发现

java">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地址

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

java">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">OpenFeign

快速入门

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

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

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

java"><!--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功能

java">@EnableFeignclients
@SpringBootApplication
public class cartApplication{//...略}

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

(3)编写FeignClient

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

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

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

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

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

编写ItemClient接口

java">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);
}

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

java">@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,我们能够更加高效地构建微服务架构,实现松耦合、灵活的服务间通信。

http://www.ppmy.cn/server/158818.html

相关文章

《深入浅出HTTPS​​​​​​​​​​​​​​​​​》读书笔记(28):DSA数字签名

《深入浅出HTTPS​​​​​​​​​​》读书笔记&#xff08;28&#xff09;&#xff1a;DSA数字签名 对称加密算法有很多算法&#xff0c;标准算法是RSA机密算法&#xff0c;数字签名技术也有一个标准DSS&#xff08;Digital Signature Standard&#xff09;&#xff0c;其标准…

高斯数据库 Shell 脚本:批量执行多个 SQL 文件

高斯数据库 Shell 脚本&#xff1a;批量执行多个 SQL 文件 优化后的高斯数据库 Shell 脚本 #!/bin/bash# 数据库信息文件路径 DB_INFO_FILE"db_info.txt"# 要执行的 SQL 文件列表 SQL_LIST_FILE"sql_files.txt"# 检查数据库信息文件是否存在 if [[ ! -f …

网络安全的几种攻击方法

攻击方法 挂马: 就是在别人的网站文件里面放入网页木马或者是将代码潜入到对方正常的网页文件里&#xff0c;以使浏览者中马。 挖洞: 指漏洞挖掘。 加壳: 就是利用特殊的算法&#xff0c;将EXE可执行程序或者DLL动态连接库文件的编码进行改变&#xff08;比如实现压缩、加密&a…

SQL 详解数据库

SQL&#xff08;Structured Query Language&#xff0c;结构化查询语言&#xff09;是一种专门用于与关系型数据库进行交互的标准化语言。它可以用于查询、更新和管理数据库中的数据&#xff0c;以及定义和控制数据库的结构。 以下是 SQL 的主要功能模块及其详解&#xff1a; …

Django基础之ORM初识

一.前言 今天我们大致来了解一下django的orm&#xff0c;只是简单的了解&#xff0c;具体的会在下一期和大家来说&#xff0c;本质是关系对象映射&#xff0c;简单点来说就是翻译&#xff0c;利用类创建数据库 二.表结构 2.1 基础配置 首先在app中的models.py中按照规则编写…

mac下使用arthas分析工具报错

mac下使用arthas分析工具 依赖初次运行报错运行前的准备/usr/libexec/java_home -V 返回结果解释&#xff1a;为什么有两个版本&#xff1f;如果使用的是不带参数的命令&#xff1a;设置 JAVA_HOME / 如何选择要使用的 JVM&#xff1a;遗留的问题 依赖 在 JDK8 中&#xff0c;…

vue组件(Ⅰ)

目录 引入 一、组件基础 1.组件组成结构在components文件当中新建文件MyApp.vue 2.组件引用结构-----在App.vue当中设置如下属性 二、组件的嵌套关系 1.Header.vue 2.Main.vue 3.Aside.vue 4.Article.vue 在Main.vue当中注册 5.Itme.vue 在Aside.vue当中注册 三、组…

Jenkins-简介/安装!

一. 关于持续集成&#xff1a; 持续集成(CI ) [ Continuous Integration ]&#xff0c;通俗来讲&#xff0c;就是一个能监控版本控制系统变化的工具&#xff0c;可以自动编译和测试集成的应用程序。出现问题&#xff0c;能够及时的通知相应人员。持续集成是一种思维工具集&…