Showing posts with label feign. Show all posts
Showing posts with label feign. Show all posts

Thursday, December 26, 2019

Spring Cloud 微服務入門 (四) Eureka + Consumer (Feign) Rest 傳遞參數

feign 如何調用 service 且傳入參數

比較常見就是這兩種
@GetMapping
@PostMapping
這兩種又有
@RequestMappin
此文章沒討論用這個@RequestMapping 這算是比較舊的寫法,或許後續有空會補上
通常我們呼叫 restAPi可以用
@GetMapping
@PostMapping
那麼又有分
  • 無參數
  • 單參數
  • 多個參數
  • 複雜對象

單參數

無參數就不多加實作了主要針對有參數的

Provider Controller

@SpringBootApplication
@EnableEurekaClient
@RestController
public class EurekaServiceProviderApplication {
 
 @Value("${server.port}")
     String port;
  @GetMapping("/")
 public String home(@RequestParam (value="id", required = false) Integer employeeId) {
       return "Hello world" + port+ employeeId;
 }
 public static void main(String[] args) {
  SpringApplication.run(EurekaServiceProviderApplication.class, args);
 }

}

Consumer 接口

@FeignClient("eureka-provider")
public interface HomeClient {
  @GetMapping("/")
  public String home(@RequestParam (value="id", required = false) Integer employeeId) ;
}


Consumer Controller

@RestController
public class ConsumerController {
  @Autowired
     private HomeClient homeClient;

 
   @GetMapping("/hello/{id}")
     public String hello(@PathVariable(name="id") Integer employeeId) {
      System.out.print(employeeId);
         return homeClient.home(employeeId);
     }
}

多參數

Provider Controller

@SpringBootApplication
@EnableEurekaClient
@RestController
public class EurekaServiceProviderApplication {
 
 @Value("${server.port}")
     String port;
  @GetMapping("/")
  public String home(@RequestParam (value="id", required = false) Integer employeeId,@RequestParam (value="id2", required = false) Integer employeeId2)  {
       return "Hello world" + port+ employeeId+employeeId2;
 }
 public static void main(String[] args) {
  SpringApplication.run(EurekaServiceProviderApplication.class, args);
 }

}

Consumer 接口

@FeignClient("eureka-provider")
public interface HomeClient {
  @GetMapping("/")
  public String home(@RequestParam (value="id", required = false) Integer employeeId,@RequestParam (value="id2", required = false) Integer employeeId2) ;
}

Consumer Controller

@RestController
public class ConsumerController {
  @Autowired
     private HomeClient homeClient;

 
   @GetMapping("/hello/{id}/{id2}")
     public String hello(@PathVariable(name="id") Integer employeeId,@PathVariable(name="id2") Integer employeeId2) {
      System.out.print(employeeId2);
         return homeClient.home(employeeId,employeeId2);
     }
}

複雜對象

構建一個 entity
UserEntity.class
這邊好像在一個網站有看過這邊大小寫 windows 沒有限制,在linux 就嚴格 限制 大小寫,後面會來好好講解,
然後這個 Entity 同時在 Provider 和 Consumer 裡。
public class UserEntity {
 
 private Integer id;

 private String Name ;

 private Integer age;
 
 public Integer getId() {
  return id;
 }
 public void setId(Integer id) {
  this.id = id;
 }
 public String getName() {
  return Name;
 }
 public void setName(String name) {
  Name = name;
 }
 public Integer getAge() {
  return age;
 }
 public void setAge(Integer age) {
  this.age = age;
 }
}

Provider


public class UserEntity {
 
 private Integer id;

 private String Name ;

 private Integer age;
 
 public Integer getId() {
  return id;
 }
 public void setId(Integer id) {
  this.id = id;
 }
 public String getName() {
  return Name;
 }
 public void setName(String name) {
  Name = name;
 }
 public Integer getAge() {
  return age;
 }
 public void setAge(Integer age) {
  this.age = age;
 }
}

Consumer 接口

@FeignClient("eureka-provider")
public interface HomeClient {
  @GetMapping("/")
  public String home(@RequestParam (value="id", required = false) Integer employeeId,@RequestParam (value="id2", required = false) Integer employeeId2) ;
  @PostMapping("/user")
  public String aveUser(@RequestBody UserEntity user);
}

Consumer Controller

@RestController
public class ConsumerController {
  @Autowired
     private HomeClient homeClient;

 
   @GetMapping("/hello/{id}/{id2}")
     public String hello(@PathVariable(name="id") Integer employeeId,@PathVariable(name="id2") Integer employeeId2) {
      System.out.print(employeeId2);
         return homeClient.home(employeeId,employeeId2);
     }
   
  @PostMapping("/user")
   public String aveUser(@RequestBody UserEntity user) {
    return homeClient.aveUser(user);
  }

}

運行並測試

注意大小寫


大概變化就這幾種
接下來就輪到介紹我們的 Hystrix 斷路器

Spring Cloud 微服務入門 (三) Eureka + Consumer (Feign) 調用 Service

Feign簡介

Feign是一個聲明式的偽Http客戶端,它使得寫Http客戶端變得更簡單。
使用Feign,只需要創建一個接口並註解,它具有可插拔的註解特性,可使用Feign 註解和JAX-RS註解,Feign支持可插拔的編碼器和解碼器,Feign默認集成了Ribbon,並和Eureka結合,默認實現了負載均衡的效果。
Feign 具有如下特性:
可插拔的註解支持,包括Feign註解和JAX-RS註解
支持可插拔的HTTP編碼器和解碼器
支持Hystrix和它的Fallback
支持Ribbon的負載均衡
支持HTTP請求和響應的壓縮Feign是一個聲明式的Web Service客戶端,它的目的就是讓Web Service調用更加簡單。它整合了Ribbon和Hystrix,從而不再需要顯式地使用這兩個組件。 Feign還提供了HTTP請求的模板,通過編寫簡單的接口和註解,就可以定義好HTTP請求的參數、格式、地址等信息。接下來,Feign會完全代理HTTP的請求,我們只需要像調用方法一樣調用它就可以完成服務請求。
簡而言之:Feign能幹Ribbon和Hystrix的事情,但是要用Ribbon和Hystrix自帶的註解必須要引入相應的jar包才可以。

環境準備

如果已經有前面幾章跟著環境一起做大概就會有
  • Eureka Service
  • Eureka Provider *2
  • Ribbon Consumer
等等我們會來用 Feign 完成一次服務調用範例

配置設定

application.yml
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/

spring:
  application:
    name: feign-consumer

server:
  port: 9000

Feign Consumer

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class EurekaServiceFeignConsumer {
 

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

}

定義接口

HomeClient.class
這邊就是調用 eureka-provider 裡的 /,
也就是從我們的Eureka 裡面已經註冊過的service
Provider *2 裡面 home () 的方法
@FeignClient("eureka-provider")
public interface HomeClient {
 @GetMapping("/")
 String consumer();
}

Controller

讓訪問 Fegin “/home” ,能導向我們剛剛寫的接口homeClient裡面的 consumer 方法

@RestController
public class ConsumerController {
  @Autowired
     private HomeClient homeClient;

     @GetMapping(value = "/hello")
     public String hello() {
         return homeClient.consumer();
     }
}

服務啟動


下面一章就會寫
如何調用service 傳參數,本來打算在這一章解決的,後來發現也算是一個坑,我把這一篇獨立出來。