spring cloud 入門11-Eureka服務節點之間的調用—Feign

Eureka服務節點之間的調用—Feign

我們在使用spring cloud ribbon的時候已經使用RestTemplate完成了多服務節點之間的相互調用,而RestTemplate已經實現了對HTTP請求的封裝處理,形成了一套模板化的調用方法,但是在實際開發過程中對於微服務的依賴不止一處,往往一個接口被多處調用

使用RestTemplate並非那麼友好。因爲除了要編寫URL,還需要注意這些參數的組裝和結果的返回等操作。爲了克服這些不友好,除了Ribbon外,Spring Cloud還提供了聲明式調用組件——Feign。

Feign是一個 基於接口的編程方式,開發者只需要聲明接口和配置註解,在調度接口方法時,Spring Cloud就根據配置來調度對應的REST風格的請求,從其他微服務系統中獲取數據。使用Feign,首先需要在產品微服務中使用Maven引入依賴包

 <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

下一步:使用spring提供的註解在項目中啓用feign ,我們需要做的僅僅是在方法的啓動類上添加註解就可以完成:

@SpringBootApplication
@EnableFeignClients //啓用feignClients
public class BigsoftProductApplication {
    public static void main(String[] args) {
        SpringApplication.run(BigsoftProductApplication.class, args);
    }

}

現在我們就可以使用feign了,在使用之前,我們先回顧下user節點中提供的方法

在這裏插入圖片描述
標記位置是指user節點中提供的rest風格訪問路徑

在product節點需要使用ribbon分佈式調用這個節點中的這個方法,如果使用RestTemplat,我們就需要提供URL地址,還要關心它的返回值,這很麻煩,而使用feign我們只需要做的僅僅是聲明接口和配置註解

1:新建UserService的接口:
在這裏插入圖片描述
在接口中申明:
在這裏插入圖片描述
標記1位置這個地方主要作用就是FeignClient 需要去訪問user節點(在user節點的配置文件中配置的這個名字),如果寫錯將會報 找不到這個節點的錯誤

標記2位置是確定訪問位置,這裏是訪問user節點中GET請求下路徑爲 /user/{id}這個路徑,如果這裏寫錯了會報 在當前節點下找不到該方法(404)這個錯誤

最後在product節點提供對外的調用controller,然後去調用這個請求

 @RestController
public class UserController {
    @Autowired
    private UserService service;
    // 測試
    @GetMapping("product/getUser/{id}")
    public User getUser(@PathVariable int id) {
        User user = service.getUser(id);
        return user;
    }
}

我們還是先看一眼註冊中心,看看user節點和product節點有沒有正常註冊
在這裏插入圖片描述
發現已經註冊到了註冊中心

直接通過瀏覽器訪問http://localhost:9001/product/getUser/1(product節點路徑)
在這裏插入圖片描述
發現同過fegin找到user節點,並且正確的給我們返回了返回值

我們繼續來做一個添加用戶的操作
1:首先在user節點controller中規定好方法如下:

  @PostMapping("/addUser")
    public String addUser(@RequestBody User user){
        System.out.println(user);
        return "add--------"+user+"-----------success";
    }

這裏添加用戶並且返回了String類型的返回值

2:在product節點申明瞭@FeignClient(“user”)的類中添加接口函數

 @PostMapping("/addUser")
    public String regist(@RequestBody User user);

還是要注意:
在這裏插入圖片描述
這個標記位置一定要和user節點中添加用戶給的路徑一直,要不然找不到

3:在controller中提供對外的方法:

  @PostMapping("product/regist")
    public String regist(@RequestBody User user){
       String result=service.regist(user);
       return result;
    }

在這裏插入圖片描述
標記1位置是product對外訪問路徑,可以和user節點的訪問路徑不同
標記2位置調用剛纔什麼好的藉口方法

最後通過postman測試
在這裏插入圖片描述
我們發現已經正常返回,證明通過fegin做分佈式調用已經完成了

注意:
1:返回值問題
上述兩個實驗中我們的返回值分別爲 User(對象類型) String類型,我們僅僅在申明方法的時候同時申明方法的返回值爲上述兩種類型(可以返回任意java支持的返回類型例如Map、List等),fegin就會自動幫我們抓取相應的返回值,而在RestTemplate中就需要我們自己關心返回值,並且用泛型規範去抓取需要的數據了

2:請求路徑問題 :
同樣的在RestTemplate中我們需要自己寫URL地址欄去訪問,而在fegin中我們僅僅需要在方法頭部添加註解@FeignClient("user") 這樣就會自己去查找user這個服務節點去進行分佈式調用

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