1. 程式人生 > >Spring Cloud(五)Feign宣告服務呼叫

Spring Cloud(五)Feign宣告服務呼叫

Spring Cloud(五)Feign宣告服務呼叫

上節使用了RestTemplate,但是有時候某個微服務Rest風格請求需要多次呼叫,如類似上面的通過使用者編號(id)查詢使用者資訊的服務。如果多次呼叫,使用RestTemplate並非那麼友好。因為除了要編寫URL,還需要注意這些引數的組裝和結果的返回等操作。為了克服這些不友好,除了Ribbon外,spring cloud還提供了宣告式呼叫元件——Feign。

服務呼叫

1、pom包配置

和服務提供者一致

        <!-- feign 宣告過程呼叫-->
        <dependency
>
<groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>

2、啟動類

啟動類新增@EnableDiscoveryClient@EnableFeignClients註解。

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class ConsumerApplication { public static void main(String[] args) { SpringApplication.run(ConsumerApplication.class, args); } }
  • @EnableDiscoveryClient :啟用服務註冊與發現
  • @EnableFeignClients:啟用feign進行遠端呼叫

Feign是一個宣告式Web Service客戶端。使用Feign能讓編寫Web Service客戶端更加簡單, 它的使用方法是定義一個介面,然後在上面添加註解,同時也支援JAX-RS標準的註解。Feign也支援可拔插式的編碼器和解碼器。Spring Cloud對Feign進行了封裝,使其支援了Spring MVC標準註解和HttpMessageConverters。Feign可以與Eureka和Ribbon組合使用以支援負載均衡。

4、feign呼叫實現

定義feign介面

@FeignClient(value = "user",fallback = UserServiceHystirx.class)
public interface UserService {

    @GetMapping("/user/{id}")
    public UserPo getUser(@PathVariable("id") Long id);
}
  • value:遠端服務名service id,及spring.application.name配置的名稱,它指向了使用者微服務,這樣Feign就會知道使用者微服務的請求,並會實現負載均衡。

此類中的方法和遠端服務中contoller中的方法名和引數需保持一致。

5、web層呼叫遠端服務

將HelloRemote注入到controller層,像普通方法一樣去呼叫即可。

@RestController
public class ConsumerController {

    @Autowired
    HelloRemote HelloRemote;
	
    @RequestMapping("/hello/{name}")
    public String index(@PathVariable("name") String name) {
        return HelloRemote.hello(name);
    }

}

測試

簡單呼叫

不斷的進行測試下去會發現兩種結果交替出現,說明兩個服務中心自動提供了服務均衡負載的功能。如果我們將服務提供者的數量在提高為N個,測試結果一樣,請求會自動輪詢到每個服務端來處理。

總結

Ribbon相比Feign遮蔽了掉了RestTemplate的使用,提供了介面宣告式的呼叫,使得程式可讀性更高,同時在多次呼叫中更為方便。