SpringCloud集成OpenFeign(SpringCloud學習三)

SpringCloud集成OpenFeign

​ 上次講完Eureka,這次來講一下OpenFeign。

​ 之前的Eureka沒有講它的原理,後面看看能不能補上,這裏也簡單敘述一下OpenFeign的原理,後面慢慢補充。

​ OpenFeign。簡化調用服務時的工作,將複雜的請求簡化爲配置,使用動態代理來構造出需要請求的服務地址,最後發起請求和解析請求。

​ 微服務即然已經搭建起來了,但是各個微服務之前如何通訊和調用確實各問題,當然可以通過http的形式調用相應的服務,但是這樣寫的話,比較繁瑣,並且代碼的耦合度也會很高,這裏就引出了Openfeign的概念。Feign通過處理註解,將請求模板化,當實際調用的時候,傳入參數,根據參數再應用到請求上,進而轉化成真正的請求,這種請求相對而言比較直觀。所以一個插件或者組件的產生肯定是爲了解決某個問題的,不可能沒有任何用處但是仍然在使用。

​ Openfeign的原理相對於我來說還是比較複雜的,這裏我也就我自己的理解和別人的博客簡單說一下Openfeign的一次調用。

  • 在使用feign 時,會定義對應的接口類,在接口類上使用Http相關的註解,標識HTTP請求參數信息

  • 在Feign 底層,通過基於面向接口的動態代理方式生成實現類,將請求調用委託到動態代理實現類

  • 最後將方法的調用轉換爲一次http請求

​ 我的理解就是這麼個過程,可能不太對,歡迎大家指正。下面就上代碼。

生產者

​ 生產者的代碼主要就是一個controller,只要有返回就可以了。這裏就不再累述。沒有什麼可講的。主要講一下中間遇到的坑。

  • IDEA運行的時候,因爲我的結構是父模塊和子模塊的形式,所以在編譯的時候一直沒有通過,只需要先把父模塊編譯,要注意pom文件不要帶子模塊,編譯完畢在install一下就可以了,子模塊就可以編譯運行了。

  • 爲了方便後面的測試,所以在模塊中添加了swagger-ui,很簡單,添加pom文件、增加一個swagger配置類就可以了。詳細的解釋和需要添加的註解可以看下面的倆博客。

    https://www.cnblogs.com/xifengxiaoma/p/11022146.html

    https://blog.csdn.net/u012702547/article/details/88775298

    生產者代碼如下:

    package com.psq.providermysql.controller;
    
    import io.swagger.annotations.Api;
    import io.swagger.annotations.ApiOperation;
    import org.springframework.web.bind.annotation.*;
    
    import java.util.List;
    
    /**
     * UserController.java
     * Description:  User相關controller
     *
     * @author Peng Shiquan
     * @date 2020/6/16
     */
    @RequestMapping(value = "/user")
    @RestController
    @Api(value = "用戶", tags = "用戶管理相關接口")
    public class UserController {
    
        @GetMapping(value = "/")
        @ApiOperation(value = "查詢用戶接口")
        public String selectUserByID(@RequestParam List<String> ids) {
            return "hello SpringCloud";
        }
    
    
    }
    

消費者

​ 主要改動的地方就在消費者,首先消費者模塊需要添加一個feign依賴,然後消費者通過編寫一個feign接口來代表生產者的方法,controller通過@Autowired註解直接使用就可以了,啓動類也需要添加一個@EnableFeignClients註解。其他的地方就不需要改動了。代碼如下:

  • Feigin接口代碼。

    package com.psq.eurekaclient.feign;
    
    import org.springframework.cloud.openfeign.FeignClient;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    
    import java.util.List;
    
    /**
     * UserFeign.java
     * Description: User的feign
     *
     * @author Peng Shiquan
     * @date 2020/6/16
     */
    @FeignClient(name = "provider-mysql")
    public interface UserFeign {
    
        /**
         * Description: 查詢list中的id所對應的用戶信息
         *
         * @param ids
         * @return java.lang.String
         * @Author: Peng Shiquan
         * @Date: 2020/6/16
         */
        @GetMapping("/user/")
        String selectUserByID(@RequestParam List<String> ids);
    
    }
    
  • controller層代碼。

    package com.psq.eurekaclient.controller;
    
    import com.psq.eurekaclient.feign.UserFeign;
    import io.swagger.annotations.Api;
    import io.swagger.annotations.ApiOperation;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
    
    import java.util.List;
    
    /**
     * UserController.java
     * Description:  User相關controller
     *
     * @author Peng Shiquan
     * @date 2020/6/16
     */
    @RequestMapping(value = "/user")
    @RestController
    @Api(value = "用戶", tags = "用戶管理相關接口")
    public class UserController {
    
        @Autowired
        private UserFeign userFeign;
    
    
        @GetMapping(value = "/")
        @ApiOperation(value = "查詢用戶接口")
        public String selectUserByID(@RequestParam List<String> ids) {
            String result = userFeign.selectUserByID(ids);
            return result;
        }
    
    
    }
    
  • 啓動類代碼。

    package com.psq.eurekaclient;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    import org.springframework.cloud.openfeign.EnableFeignClients;
    
    /**
     * EurekaClientApplication.java
     * Description:  Eureka Client 啓動類
     *
     * @author Peng Shiquan
     * @date 2020/6/16
     */
    @EnableDiscoveryClient
    @SpringBootApplication
    @EnableFeignClients
    public class EurekaClientApplication {
        public static void main(String[] args) {
            SpringApplication.run(EurekaClientApplication.class, args);
        }
    
    }
    
  • 導入的依賴。

    <!--配置feign-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
    

​ 代碼就是上面的代碼,運行截圖如下:

image-20200616145706715

​ 難點上面都說了,也沒有啥可以說的了,感覺坑還是自己踩踩比較好,後面也會又個深入的瞭解,也會把踩到的坑說說。

​ 順帶說一下,代碼也上傳到GitHub了,大家也可以下載源碼。鏈接:https://github.com/qq1162210866/springcloud-train

​ 就這樣吧,結束。

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