18.SpringCloud實戰項目- 整合OpenFeign實現聲明式遠程調用

SpringCloud實戰項目全套學習教程連載中

PassJava 學習教程

簡介

  • PassJava-Learning項目是PassJava(佳必過)項目的學習教程。對架構、業務、技術要點進行講解。
  • PassJava 是一款Java面試刷題的開源系統,可以用零碎時間利用小程序查看常見面試題,夯實Java基礎。
  • PassJava 項目可以教會你如何搭建SpringBoot項目,Spring Cloud項目
  • 採用流行的技術,如 SpringBoot、MyBatis、Redis、 MySql、 MongoDB、 RabbitMQ、Elasticsearch,採用Docker容器化部署。

更好的閱讀體驗

文檔連載目錄

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);
        }
    
    }
    
  • 測試接口

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

3.總結FeignClient使用方法

  • 引入OpenFeign依賴
  • 定義FeignClient接口類(註解@FeignClient),聲明這個接口類是用來遠程調用其他服務的
  • 接口類中定義要遠程調用的接口方法,指定遠程服務方法的路徑
  • Controller類中調用接口方法
  • 開啓遠程調用(註解@EnableFeignClients

代碼地址

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

公衆號

公衆號

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章