写点什么

PassJava 开源 (七) :Spring Cloud 整合 OpenFeign 实现声明式远程调用

作者:悟空聊架构
  • 2021 年 12 月 26 日
  • 本文字数:2204 字

    阅读完需:约 7 分钟

PassJava (佳必过) 项目全套学习教程连载中,关注公众号第一时间获取。


文档在线地址:www.passjava.cn

Spring Cloud 整合 OpenFeign 实现声明式远程调用

1.Feign 概述

  • Feign 声明式客的 HTTP 客户端,让远程调用更简单。

  • 提供了 HTTP 请求的模板,编写简单的接口和插入注解,就可以定义好 HTTP 请求的参数、格式、地址等信息

  • 整合了 Ribbon(负载均衡组件)和 Hystix(服务熔断组件),不需要显示使用这两个组件

  • Spring Cloud Feign 在 Netflix Feign 的基础上扩展了对 SpringMVC 注解的支持

2. 远程调用示例

示例:查询用户的学习时长


用户微服务 passjava-member 调用学习微服务 passjava-study 的方法

1.引入 openfeign 依赖

passjava-member 和 passjava-study 项目的 pom 文件引入 openfeign 依赖


<dependency>    <groupId>org.springframework.cloud</groupId>    <artifactId>spring-cloud-starter-openfeign</artifactId></dependency>
复制代码

2.StudyTimeController 定义远程调用测试方法

返回某个用户学习题目的总时长


@RequestMapping("/member/list/test")public R memberStudyTimeTest() {    StudyTimeEntity studyTimeEntity = new StudyTimeEntity();    studyTimeEntity.setTotalTime(100); // 学习时长:100分钟    studyTimeEntity.setQuesTypeId(1L); // 题目类型:1 (javaBasic)
return R.ok().put("studyTime", Arrays.asList(studyTimeEntity));}
复制代码

3.member 目录下创建 feign service

  • 创建 package: com.jackson0714.passjava.member.feign

  • 创建 StudyTimeFeignService 接口

  • 添加注解@FeignClient。显示声明这个接口用来远程调用study服务。


  @FeignClient("passjava-study")  public interface StudyTimeFeignService {}
复制代码


  • 添加远程调用方法


  public R memberStudyTime();
复制代码


  • 给方法添加要远程调用的方法的路径study/studytime/member/list/test


  @RequestMapping("study/studytime/member/list/test")  public R getMemberStudyTimeListTest();
复制代码


  • 添加注解@EnableFeignClients开启远程调用服务。

  • 给类 PassjavaStudyApplication.java 添加注解@EnableFeignClients

  • basePackages 代表自动扫码指定路径下所有带有 @FeignClient 注解的接口。


  @EnableFeignClients(basePackages = "com.jackson0714.passjava.member.feign")  @EnableDiscoveryClient  @MapperScan("com.jackson0714.passjava.member.dao")  @SpringBootApplication  public class PassjavaMemberApplication {        public static void main(String[] args) {          SpringApplication.run(PassjavaMemberApplication.class, args);      }    }
复制代码


  • 测试接口

  • 启动 passjava-member 和 passjava-study 服务

  • 用 postman 工具或浏览器输入请求地址

  • http://localhost:10000/member/member/studytime/list/test

  • 返回结果如下图

  • studytime 和 member 都有数据,学习时长:100 分钟,昵称:悟空聊架构


4.测试 OpenFeign 传参

示例:用户 id 作为参数在服务间传递


MemberController


@RequestMapping("/studytime/list/test/{id}")public R getMemberStudyTimeListTest(@PathVariable("id") Long id) {    //mock数据库查到的会员信息    MemberEntity memberEntity = new MemberEntity();    memberEntity.setId(id); // 学习时长:100分钟    memberEntity.setNickname("悟空聊架构");
//远程调用拿到该用户的学习时长(学习时长是mock数据) R memberStudyTimeList = studyTimeFeignService.getMemberStudyTimeListTest(id); return R.ok().put("member", memberEntity).put("studytime", memberStudyTimeList.get("studytime"));}
复制代码


StudyTimeFeignService


@FeignClient("passjava-study")public interface StudyTimeFeignService {    @RequestMapping("study/studytime/member/list/test/{id}")    public R getMemberStudyTimeListTest(@PathVariable("id") Long id);}
复制代码


StudyTimeController


@RequestMapping("/member/list/test/{id}")public R memberStudyTimeTest(@PathVariable("id") Long id) {    StudyTimeEntity studyTimeEntity = new StudyTimeEntity();    studyTimeEntity.setTotalTime(100); // 学习时长:100分钟    studyTimeEntity.setQuesTypeId(1L); // 题目类型:1 (javaBasic)
return R.ok().put("studytime", Arrays.asList(studyTimeEntity));}
复制代码


请求地址和参数:http://localhost:10000/member/member/studytime/list/test/1


执行结果:


3.总结 FeignClient 使用方法

  • 引入 OpenFeign 依赖

  • 定义 FeignClient 接口类(注解@FeignClient),声明这个接口类是用来远程调用其他服务的

  • 接口类中定义要远程调用的接口方法,指定远程服务方法的路径

  • Controller 类中调用接口方法

  • 开启远程调用(注解@EnableFeignClients

  • 远程调用的流程:

  • @RequestBody 将这个对象转为 json

  • 找到 passjava-study 服务,给 study/studytime/member/list/test 服务发送请求

  • 将 json 放到请求体里面,发送请求

  • 对方服务收到请求,请求体里有 json 数据

  • 将请求体中的 json 数据转换成对方服务的参数类型。只需要两边的字段名称和类型是一致的。

代码地址

https://github.com/Jackson0714/PassJava-Platform


作者简介:悟空,8 年一线互联网开发和架构经验,用故事讲解分布式、架构设计、Java 核心技术。《JVM 性能优化实战》专栏作者,开源了《Spring Cloud 实战 PassJava》项目,公众号:悟空聊架构。个人网站:www.passjava.cn


发布于: 1 小时前
用户头像

用故事、大白话讲解Java、分布式、架构设计 2018.05.06 加入

公众号:「悟空聊架构」 【个人博客】www.passjava.cn 【开源项目】基于 SpringCloud 的一套面试刷题系统 【Github】https://github.com/Jackson0714/PassJava-Platform

评论

发布
暂无评论
PassJava 开源 (七) :Spring Cloud 整合 OpenFeign 实现声明式远程调用