1. 程式人生 > >SpringCloud學習 - Feign宣告式服務呼叫客戶端//介面方式

SpringCloud學習 - Feign宣告式服務呼叫客戶端//介面方式

  1. Feign宣告式服務呼叫客戶端//介面方式

書籤:

1、小小例子

2、Get多個請求引數處理

 

  1. 小小例子

新建專案:eureka-consumer-feign

pom核心配置:

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

 

建立介面:FeignTest.java

package cn.ywj.eurekaconsumerfeign;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@FeignClient("eureka-provider")// 指定要訪問的服務提供者
public interface FeignTest {

    @RequestMapping(method = RequestMethod.GET, value = "/t")// 服務提供的請求地址
    public String t();
}

 

專案啟動類:EurekaConsumerFeignApplication.java, 核心註解:@EnableFeignClients

package cn.ywj.eurekaconsumerfeign;

import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
@EnableFeignClients
public class EurekaConsumerFeignApplication {

   @Autowired
   private FeignTest feignTest;

   @RequestMapping("/t")
   public String t(){
      return feignTest.t();
   }

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

 

執行專案訪問,一樣可以得到結果。Feign集成了Ribbon,也可以注入IRule使用各種負載均衡功能。

  1. Get多個請求引數處理

單引數請求引數時,沒什麼問題,多引數時,有會問題,,,

當FeignTest介面中新增新的方法

@RequestMapping(method = RequestMethod.GET, value = "/t2")
public User t2(User user);

 

然後Controller請求

@RequestMapping("/t2")
public String t2(User user){
   User user1 = feignTest.t2(user);
   return user1 == null ? "null" : user1.getName()+":"+user1.getAge();
}

 

http://127.0.0.1:8083/t2?name=ywj&age=17 

此時會報錯:

content:{"timestamp":"2018-10-10T09:14:43.547+0000","status":405,"error":"Method Not Allowed","message":"Request method 'POST' not supported","path":"/t2"}

 

處理方法:

  • 第一種:把user引數拆分成name,age

FeignTest.java

@RequestMapping(method = RequestMethod.GET, value = "/t3")
public User t3(@RequestParam("name") String name, @RequestParam("age") Integer age);

 

eureka-provider

@GetMapping("/t3")
public User t3(@RequestParam("name") String name, @RequestParam("age") Integer age){
   User user = new User();
   user.setName(name);
   user.setAge(age);
   return user;
}

 

  • 第二種:換成Post請求

FeignTest.java

@RequestMapping(method = RequestMethod.POST, value = "/t5")
public User t5(User user);

 

eureka-provider

@PostMapping("/t5")
public User t5(@RequestBody User user){
   return user;
}