2019年7月20日 星期六

Feign ( SpringCloud 2.x 四)

和 Ribbon 都是客户端的負載均衡,Ribbon 用 RestTemplate 封裝 HTTP 的請求;Feign 在這個基礎上,加上大家都熟悉的接口式編程

基本的 consumer 已經很複雜了,所以複製 consumer 成為一個新 module,刪除ribbon相關的內容(兩個 class 和 @RibbonClien,連 ConfigRestTemplate也不要了)


1.api 和 consumerFeign 的 pom
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>


※這樣才有 @FeignClient 和 @EnableFeignClients 可用


2.
@FeignClient("PROVIDER1")
public interface MyService {
    @GetMapping("/testGet")
    ApiBean get();
}


※@FeignClient 指定想訪問的 spring.application.name


3.
@SpringBootApplication
@ComponentScan("controller")
@EnableEurekaClient
@EnableFeignClients("service")
public class ConsumerFeignMain {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerFeignMain.class, args);
    }
}


※@EnableFeignClients 指定 api 裡的包路徑,只要錯了,啟動時就會出現 A component required a bean of type 'service.MyService' that could not be found.


4.
@RestController
public class ConsumerController {
//    private static final String PROVIDER_URI = "http://localhost:9001";
/*    private static final String PROVIDER_URI = "http://"+ "provider1".toUpperCase(); // 網址列不分大小寫,但還是以 eureka 為準的好
    @Resource
    private RestTemplate restTemplate;
    
    @GetMapping("/xxx")
    public ApiBean get() {
        return restTemplate.getForObject(PROVIDER_URI + "/testGet", ApiBean.class);
    }
*/
    
    @Resource
    private MyService myService;
    
    @GetMapping("/xxx")
    public ApiBean get() {
        return myService.get();
    }
}


※使用 feign 後,可以不用寫服務名

※預設是輪詢算法,可以將上一篇的 MyCustomRibbonRule 複製過來,改變自己想要的算法或內鍵的其他算法

沒有留言:

張貼留言