Spring Cloud(五)Feign宣告服務呼叫
阿新 • • 發佈:2018-12-06
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
的使用,提供了介面宣告式的呼叫,使得程式可讀性更高,同時在多次呼叫中更為方便。