如何集成和使用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.mzph.cn/news/226613.shtml

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

相关文章

Reinfocement Learning 学习笔记PartⅡ

文章目录 Reinfocement Learning六、随机近似与随机梯度下降&#xff08;Stochastic Approximation & Stochastic Gradient Descent&#xff09;6.1 Robbins-Monro Algorithm6.2 随机梯度下降 七、时序差分方法&#xff08;Temporal-Difference Learning&#xff09;7.1 TD…

TSINGSEE青犀可视化视频云平台JT/T1078接入能力在智慧物流中的应用

一、引言 随着科技的快速发展和全球贸易的蓬勃发展&#xff0c;智慧物流成为了现代物流业的重要发展方向。智慧物流通过引入先进的信息技术&#xff0c;实现了物流过程的自动化、智能化和信息化&#xff0c;从而提高了物流效率和准确性。在这个过程中&#xff0c;JT/T1078接入…

魔众文库系统v5.7.0版本文件顺序选择,短信注册支持设置密码,前端界面升级

文件顺序选择&#xff0c;短信注册支持设置密码&#xff0c;前端界面升级 [新功能] 富文本支持文档一键导入&#xff0c;支持Word文档&#xff08;docx&#xff09;、Markdown文档&#xff08;md&#xff09; [新功能] 财务中心→全部订单新增"业务订单ID"筛选条件…

【Vue】elementUI表格,导出Excel

系列文章 【Vue】vue增加导航标签 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/134965353 【Vue】Element开发笔记 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/133947977 【Vue】vue&#xff0c;在Windows IIS平台…

Jmeter分布式性能测试,80%资深测试都会遇到这个坑!

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

【C语言】动态内存管理(C语言的难点与精华,数据结构的前置知识,你真的掌握了吗?)

文章目录 引言一、为什么要动态内存分配二、动态内存分配的相关函数2.1 malloc2.2 free2.3 calloc2.4 realloc 三、常见的动态内存的错误3.1 对NULL指针的解引用3.2 对动态内存越界访问3.3 对非动态内存释放3.4 对动态内存部分释放3.5 对动态内存多次释放3.6 未对动态内存释放&…

v-md-editor高级使用之自定义目录

​ 官方给出的目录设置参见&#xff1a;https://code-farmer-i.github.io/vue-markdown-editor/zh/senior/toc.html#%E7%9B%B8%E5%85%B3%E9%85%8D%E7%BD%AE ​ 在做实际使用中往往可能需要将目录结构独立出来&#xff0c;经过近一天的研究终于明白其实现逻辑&#xff0c;并将目…

3.qml 3D-Node类学习

Node类是在View3D 中的对象基础组件&#xff0c;用于表示3D空间中的对象&#xff0c;类似于Qt Quick 2D场景中的Item&#xff0c;介绍如下所示&#xff1a; 如上图可以看到&#xff0c;Node类的子类非常多&#xff0c;比如Model类(显示3D模型)、ParticleSystem3D粒子系统类、Li…

苹果计划将全球1/4的IPhone产能转移至印度

KlipC报道&#xff1a;据相关人士报道&#xff0c;苹果希望在未来2到3年内每年在印度生产超过5000万部iphone&#xff0c;要是该计划得以实现&#xff0c;印度将占领全球iPhone产量的四分之一。 KlipC的分析师Alex Su表示&#xff1a;“此次iPhone15推出是苹果印度制造计划的一…

认知能力测验,①如何破解数字推理类测试题?

校园招聘&#xff08;秋招春招&#xff09;&#xff0c;最为常见的认知能力测验&#xff0c;在线工具网将整理分析关于认知能力测验的系列文章&#xff0c;希望能帮助大家顺利通过认知能力测评&#xff0c;找到自己心仪的工作。 数字推理测试&#xff0c;是我们在求职中经常会…

C# 获取Windows所有窗口句柄

写在前面 在做录屏或截屏操作时&#xff0c;需要获取当前正在运行中的桌面程序句柄&#xff0c;在网上查找资源的的时候&#xff0c;发现了一个工具类还不错&#xff0c;这边做个验证记录。 参考代码 public class WindowApi{//寻找目标进程窗口 [DllImport("USER…

【大数据】Hudi 核心知识点详解(二)

&#x1f60a; 如果您觉得这篇文章有用 ✔️ 的话&#xff0c;请给博主一个一键三连 &#x1f680;&#x1f680;&#x1f680; 吧 &#xff08;点赞 &#x1f9e1;、关注 &#x1f49b;、收藏 &#x1f49a;&#xff09;&#xff01;&#xff01;&#xff01;您的支持 &#x…

商用机器人,不好用是原罪

热潮褪去后&#xff0c;所有的问题都汇总成一个词&#xff0c;不好用。 从炙手可热到“大玩具” 一款产品好用与否&#xff0c;更多时候人们不会关心它先进的技术、工艺、用料&#xff0c;也不会考虑所谓的潮流趋势或前景&#xff0c;只会用最朴素的直观感受告诉你&#xff0…

【Redis】Redis.conf详解

Redis.conf详解 启动的时候&#xff0c;就通过配置文件来启动&#xff01; 工作中&#xff0c;一些小小的配置&#xff0c;可以让你脱颖而出&#xff01; 单位 配置文件 unit单位 对大小写不敏感&#xff01;include包含其他配置文件 就是好比我们学习Spring、Improt&#x…

讨论用于评估DREX的五种DR指标

概要 动态范围是已经使用了近一个世纪的用于评估接收机性能的参数。这里介绍五种动态有关指标的定义及测试方法&#xff0c;用于评估数字接收激励器&#xff08;DREX&#xff0c;digital receiver exciters&#xff09;。DREX是构成雷达的关键整部件&#xff0c;其瞬时带宽&am…

docker consul 容器的自动发现与注册

consul相关知识 什么是注册与发现 服务注册与发现是微服务架构中不可或缺的重要组件。起初服务都是单节点的&#xff0c;不保障高可用性&#xff0c;也不考虑服务的压力承载&#xff0c;服务之间调用单纯的通过接口访问。直到后来出现了多个节点的分布式架构&#xff0c;起初的…

kafka配置多个消费者groupid kafka多个消费者消费同一个partition(java)

目录 1- 单播模式&#xff0c;只有一个消费者组2- 广播模式&#xff0c;多个消费者组3- Java实践 kafka是由Apache软件基金会开发的一个开源流处理平台。kafka是一种高吞吐量的分布式发布订阅消息系统&#xff0c;它可以处理消费者在网站中的所有动作流数据。 kafka中partition…

Git忽略已经提交的文件

原理类似于 Android修改submodule的lib包名

一文搞懂OSI参考模型与TCP/IP

OSI参考模型与TCP/IP 1. OSI参考模型1.1 概念1.2 数据传输过程 2. TCP/IP2.1 概念2.2 数据传输过程 3. 对应关系4. 例子4.1 发送数据包4.2 传输数据包4.3 接收数据包 1. OSI参考模型 1.1 概念 OSI模型&#xff08;Open System Interconnection Reference Model&#xff09;&a…

MySQL,分组order by

一、创建分组 ## 创建分组 -- 返回每个发布会的参会人数 SELECT event_id,COUNT(*) as canjia_num FROM sign_guest GROUP BY event_id; 1、group by子句可以包含任意个列&#xff0c;但是但指定的所有列都是一起计算的。 group by 后2个字段一起计算的 2、group by后面可以跟…