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>
代碼就是上面的代碼,運行截圖如下:
難點上面都說了,也沒有啥可以說的了,感覺坑還是自己踩踩比較好,後面也會又個深入的瞭解,也會把踩到的坑說說。
順帶說一下,代碼也上傳到GitHub了,大家也可以下載源碼。鏈接:https://github.com/qq1162210866/springcloud-train
就這樣吧,結束。