(二)聲明式REST客戶端Feign

Feign:一個聲明式的REST客戶端,它能讓REST調用更加簡單。

Spring cloud集成Feign

  1. 搭建Spring cloud的基本環境

參考:https://blog.csdn.net/admin_15082037343/article/details/106959438

  1. 在demo-client中添加依賴
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
  1. 啓動類添加註解@EnableFeignClients
package com.demo.client;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class ClientApplication {

    public static void main(String[] args) {
        SpringApplication.run(ClientApplication.class, args);
    }

}
  1. 新增接口UserClient
package com.demo.client.api;

import com.demo.client.entity.User;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;

@FeignClient(value = "demo-provider", path = "/user")
public interface UserClient {

    @GetMapping
    Object findUser(@RequestParam("pageNo") Integer pageNo, @RequestParam("size") Integer size);

    @PostMapping
    User save(@RequestBody User user);

    @GetMapping("/{id}")
    User findById(@PathVariable("id") String id);

    @DeleteMapping("/{id}")
    String deleteById(@PathVariable("id") String id);

}

findUser()方法返回Object在這裏只是爲了方便,可以自己封裝實體類。
@FeignClient:value代表訪問的應用,path:請求路徑的統一前綴。

  1. UserController更新如下
package com.demo.client.controller;

import com.demo.client.api.UserClient;
import com.demo.client.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserClient userClient;

    @GetMapping
    public Object findUser(@RequestParam(required = false, defaultValue = "1") Integer pageNo
            , @RequestParam(required = false, defaultValue = "10") Integer size) {
        return userClient.findUser(pageNo, size);
    }

    @RequestMapping(method = { RequestMethod.POST, RequestMethod.PUT })
    public User save(@RequestBody User user) {
        return userClient.save(user);
    }

    @GetMapping("/{id}")
    public User findById(@PathVariable String id) {
        return userClient.findById(id);
    }

    @DeleteMapping("/{id}")
    public String deleteById(@PathVariable String id) {
        userClient.deleteById(id);
        return id;
    }

}

在這裏就不使用RestTemplate對象去調用接口了,而是使用UserClient替換,替換之後代碼更簡單了。


左邊爲使用RestTemplate調用接口,右邊爲Feign調用接口。

Feign日誌配置

  1. 新建類FeignConfiguration
package com.demo.client.conf;

import feign.Logger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FeignConfiguration {

    @Bean
    public Logger.Level feignLoggerLevel() {
        return Logger.Level.FULL;
    }

}
  1. UserClient 的 @FeignClient註解指定
@FeignClient(value = "demo-provider", path = "/user", configuration = FeignConfiguration.class)
  1. application.yml配置
logging:
  level:
    com:
      demo:
        client:
          api:
            UserClient: debug

此時訪問接口發現控制檯打印日誌如下

源碼參考

https://github.com/phone15082037343/demo.git

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