如何集成和使用Feign的远程调用

  1. feign的简单介绍
    1. Feign是一个声明式的http客户端,可以帮助我们优雅的实现http请求的发送
      1. OpenFeign/feign: Feign makes writing java http clients easier (github.com)
      2. Spring Cloud OpenFeign 中文文档 (springdoc.cn)
      3. Spring Cloud OpenFeign
  2. 在spring cloud的基础上集成feign
    1. 新建并修改maven模块user-feign-api,定义第三方调用时需要引用的feign接口模块
      1. 在maven的pom文件中添加openfeign依赖
        1. <!-- openfeign依赖 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>
          
      2. 在模块中新建UserApi的FeignClient的接口类,其他相关的类略
        1. package com.app.user.api;import com.app.user.common.ResultBean;
          import com.app.user.pojo.User;
          import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
          import org.springframework.cloud.openfeign.FeignClient;
          import org.springframework.web.bind.annotation.*;/*** 用户API** @author Administrator*/
          @FeignClient(value = "nacos-feign-user-service", path = "/users")
          public interface UserApi {/*** 新增用户** @param user 用户信息* @return 用户信息*/@PostMappingResultBean<User> save(@RequestBody User user);/*** 根据id修改用户信息** @param user 用户信息* @return 修改提示信息*/@PutMappingResultBean<String> update(@RequestBody User user);/*** 根据id查询用户信息** @param id 用户id* @return 用户信息*/@GetMapping("/{id}")ResultBean<User> getById(@PathVariable Long id);/*** 用户信息分页** @param page     当前页* @param pageSize 每页显示条数* @param username 用户名* @return 返回分页用户信息*/@GetMapping("/page")ResultBean<Page<User>> page(@RequestParam int page, @RequestParam int pageSize, @RequestParam String username);/*** 获取用户记录数** @return 返回记录数*/@GetMapping("/count")ResultBean<Integer> count();}
          
        2. @FeignClient(value = "nacos-feign-user-service", path = "/users")
          1. 声明为feign的客户端,服务名称是nacos-feign-user-service,请求url前缀统一为/users,
        3. Feign客户端主要是基于SpringMVC的注解来声明远程调用的信息
    2. 新建并修改maven模块nacos-feign-user-service
      1. 在maven的pom文件中添加user-feign-api依赖,根据maven的依赖传递将同时也会引入了openfeign依赖
        1.         <!--引入user-feign的统一api--><dependency><groupId>com.app</groupId><artifactId>user-feign-api</artifactId><version>1.0.0</version></dependency>
      2. 在模块中新建UserController类,并实现接口UserApi,其他相关代码略
        1. package com.app.user.controller;import cn.hutool.core.util.StrUtil;
          import com.app.user.api.UserApi;
          import com.app.user.common.ResultBean;
          import com.app.user.pojo.User;
          import com.app.user.service.UserService;
          import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
          import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
          import lombok.RequiredArgsConstructor;
          import lombok.extern.slf4j.Slf4j;
          import org.springframework.web.bind.annotation.*;/*** 用户控制器** @author Administrator*/
          @RestController
          @RequestMapping("/users")
          @Slf4j
          @RequiredArgsConstructor
          public class UserController implements UserApi {/*** 结合@RequiredArgsConstructor进行构造器注入*/private final UserService userService;/*** 新增用户** @param user 用户信息* @return 用户信息*/@Overridepublic ResultBean<User> save(@RequestBody User user) {log.info("新增用户,用户信息:{}", user.toString());userService.save(user);return ResultBean.success(user);}/*** 根据id修改用户信息** @param user 用户信息* @return 修改提示信息*/@Overridepublic ResultBean<String> update(@RequestBody User user) {log.info(user.toString());userService.updateById(user);return ResultBean.success("用户信息修改成功");}/*** 根据id查询用户信息** @param id 用户id* @return 用户信息*/@Overridepublic ResultBean<User> getById(@PathVariable Long id) {log.info("根据id查询用户信息...");User user = userService.getById(id);if (user != null) {return ResultBean.success(user);}return ResultBean.error("没有查询到对应用户信息");}/*** 用户信息分页** @param page     当前页* @param pageSize 每页显示条数* @param username 用户名* @return 返回分页用户信息*/@Overridepublic ResultBean<Page<User>> page(@RequestParam int page, @RequestParam int pageSize, @RequestParam String username) {log.info("page = {},pageSize = {},username = {}", page, pageSize, username);// 1、构造简单分页模型Page<User> pageInfo = new Page<>(page, pageSize);// 2、构造条件构造器LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();// 3、添加用户名过滤条件,使用模糊匹配,不为空时才生效queryWrapper.like(StrUtil.isNotEmpty(username), User::getUsername, username);// 4、添加排序条件queryWrapper.orderByDesc(User::getId);// 5、执行查询,查询的结果将会直接存在于pageInfo对象中userService.page(pageInfo, queryWrapper);return ResultBean.success(pageInfo);}/*** 获取用户记录数** @return 返回记录数*/@Overridepublic ResultBean<Integer> count() {log.info("计算用户数目...");int i = userService.countNum();return ResultBean.success(i);}}
          
    3. 新建maven模块nacos-feign-order-service,当前的模块将会通过feign远程调用nacos-feign-user-service服务获取信息
      1. 在maven的pom文件中添加user-feign-api依赖,根据maven的依赖传递将同时也会引入了openfeign依赖
        1.         <!--引入user-feign的统一api--><dependency><groupId>com.app</groupId><artifactId>user-feign-api</artifactId><version>1.0.0</version></dependency>
      2. 在OrderController注入UserApi接口,并在方法使用处进行user远程调用,其他类信息略
        1. 
          /*** 订单控制器** @author Administrator*/
          @RestController
          @RequestMapping("/orders")
          @Slf4j
          @RequiredArgsConstructor
          @RefreshScope
          public class OrderController implements OrderApi {/*** 结合@RequiredArgsConstructor进行构造器注入*/private final OrderService orderService;/*** 注入user-feign的统一api的bean,以此可以进行声明式的http的远程调用*/private final UserApi userApi;/*** 根据id查询订单信息** @param id 订单id* @return 订单信息*/@Overridepublic ResultBean<OrderVo> getById(@PathVariable Long id) {log.info("根据id查询订单信息...");Order order = orderService.getById(id);if (order != null) {OrderVo orderVo = new OrderVo();BeanUtil.copyProperties(order, orderVo);// 远程查找用户服务获取用户名信息// 发起feign的远程调用com.app.user.common.ResultBean<User> userResult = userApi.getById(order.getUserId());User user = userResult.getData();if (user != null) {orderVo.setUsername(user.getUsername());}return ResultBean.success(orderVo);}return ResultBean.error("没有查询到对应订单信息");}}
          
    4. 在OrderApplication添加注解@EnableFeignClients,并设置注解扫描包
      1. package com.app.order;import org.springframework.boot.SpringApplication;
        import org.springframework.boot.autoconfigure.SpringBootApplication;
        import org.springframework.cloud.openfeign.EnableFeignClients;/*** spring boot启动类** @author Administrator*/
        @SpringBootApplication
        @EnableFeignClients(basePackages = "com.app.user.api")
        public class OrderApplication {public static void main(String[] args) {SpringApplication.run(OrderApplication.class, args);}
        }
        
  3. 注意
    1. controller在继承feign的接口后,其参数列表中的注解映射并不会继承,因此Controller中必须再次声明方法、参数列表、注解

    2. 在引用@FeignClient的接口进行注入到使用的类时,需要在@EnableFeignClients进行包扫描,其中有下列方式可以将指定FeignClient加载
      1. 指定Feign应该扫描的包
        1. @EnableFeignClients(basePackages = "com.app.user.api")
      2. 指定需要加载的Client接口
        1. @EnableFeignClients(clients = {UserApi.class})
    3. 当使用Feign时,如果发送的是get请求,那么必须需要在请求参数前加上@RequestParam注解修饰,Controller里面可以不加该注解修饰

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

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

相关文章

DevEco Studio 项目鸿蒙(HarmonyOS)多语言

DevEco Studio 项目鸿蒙&#xff08;HarmonyOS&#xff09;多语言 一、操作环境 操作系统: Windows 10 专业版 IDE:DevEco Studio 3.1 SDK:HarmonyOS 3.1 二、多语言 新版本IDE可以创建多语言的文件夹&#xff0c;在entry->src->main->resources下&#xff0c;修…

初级数据结构(六)——堆

文中代码源文件已上传&#xff1a;数据结构源码 <-上一篇 初级数据结构&#xff08;五&#xff09;——树和二叉树的概念 | NULL 下一篇-> 1、堆的特性 1.1、定义 堆结构属于完全二叉树的范畴&#xff0c;除了满足完全二叉树的限制之外&#xff0c;还满…

【LeetCode刷题-字符串】-- 186.反转字符串中的单词II

186.反转字符串中的单词II 方法&#xff1a;先反转整个字符串再反转单词中的字母 class Solution {public void reverseWords(char[] s) {reverseCharacters(s,0,s.length-1);reverseEachWord(s);}//反转单词中的字母public void reverseEachWord(char[] s){int length s.len…

Mybatis Plus

一、MyBatis-Plus 1.简介 MyBatis-Plus (opens new window)&#xff08;简称 MP&#xff09;是一个 MyBatis (opens new window)的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 我们的愿景是成为 MyBatis 最好的搭档&…

centOS7 安装tailscale并启用子网路由

1、在centOS7上安装Tailscale客户端 #安装命令所在官网位置&#xff1a;https://tailscale.com/download/linux #具体命令为&#xff1a; curl -fsSL https://tailscale.com/install.sh | sh #命令执行后如下图所示2、设置允许IP转发和IP伪装。 安装后&#xff0c;您可以启动…

力扣刷题-二叉树-二叉树的所有路径

257 二叉树的所有路径 给定一个二叉树&#xff0c;返回所有从根节点到叶子节点的路径。 说明: 叶子节点是指没有子节点的节点。 示例: 思路 参考&#xff1a; https://www.programmercarl.com/0257.%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E6%89%80%E6%9C%89%E8%B7%AF%E5%BE…

10天玩转Python第8天:python 文件和异常 全面详解与代码示例

今日内容 文件操作 普通文件的操作json 文件的操作[重点] 异常处理(程序代码运行时的报错) 文件介绍 计算机的 文件&#xff0c;就是存储在某种 长期储存设备 上的一段 数据 作用: 将数据长期保存下来&#xff0c;在需要的时候使用 ​ 1.计算机只认识 二进制(0 1) 2.文件中…

广受好评的开源基础大模型最全梳理,你最钟意哪一个?

2023 年即将过去。一年以来&#xff0c;各式各样的大模型争相发布。当 OpenAI 和谷歌等科技巨头正在角逐时&#xff0c;另一方「势力」悄然崛起 —— 开源。 开源模型受到的质疑一向不少。它们是否能像专有模型一样优秀&#xff1f;是否能够媲美专有模型的性能&#xff1f; 迄…

jrebel debug 启动不起来

idea更新之后jrebel debug模式启动不起来。 将下面的设置取消之后就可以了&#xff0c;希望能帮到你们… 被卡了两天… jrebel信息。 idea IntelliJ IDEA 2023.3.1 (Ultimate Edition) Build #IU-233.11799.300, built on December 12, 2023 Licensed to Alexandra Martin…

【SpringBoot零基础入门到项目实战②】安装Java和Maven,创建你的第一个项目

文章目录 导言安装JavaWindows系统macOS系统Linux系统 安装和配置 MavenWindows系统macOS系统Linux系统配置 Maven 本地仓库使用阿里镜像加速 创建第一个Spring Boot项目拓展学习&#xff08;提前了解 后面会讲到&#xff09;1. 深入理解Spring Boot的项目结构2. 学习Spring Bo…

打破多APP困境,WorkPlus统一入口让企业协同更高效

在信息时代&#xff0c;企业面临着协同与管理的挑战&#xff1a;多个应用、多套账号密码、频繁切换系统&#xff0c;这不仅增加了员工的操作负担&#xff0c;也降低了工作效率。为解决这一问题&#xff0c;WorkPlus以其超级APP的全方位功能&#xff0c;为企业提供了一个统一入口…

gin框架

1、go run 文件名 如遇上面问题&#xff1a;go mod tidy 2、查看配置信息&#xff1a;go env 3、windows用set修改配置文件&#xff0c;linux用export修改 4、中间件 (1)、全局中间件 r.Use(中间件函数名()) (2)、Next()方法 (3)、局部中间件 直接将中间件函数名用在…