(六)基於fegin實現服務調用、負載均衡

上一篇寫到

List<ServiceInstance> instances = discoveryClient.getInstances("service-user-provider-8001");
ServiceInstance instance = instances.get(0);

只是調用第一個微服務

若是A能調用2個以上的微服務則,上述方法則不可取。

將採用ribbon負載均衡,實現調用多個服務

但是編碼風格不統一,將使用fegin進行調用微服務,負載均衡

Spring Cloud Feign幫助我們定義和實現依賴服務接口的定義。在Spring Cloud feign的實現下,只需要創建一個接口並用註解方式配置它,即可完成服務提供方的接口綁定,簡化了在使用Spring Cloud Ribbon時自行封裝服務調用客戶端的開發量。

 

1.pom.xml中加入依賴

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2.在啓動類中加入註解
@SpringBootApplication
@EnableFeignClients
public class OrderServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(OrderServiceApplication.class, args);
    }
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

}
3.創建一個接口(ProductClient)
//服務的生成者(被調用者)在註冊中心註冊的名字
@FeignClient(name = "product-service")
public interface ProductClient {
    //被調用者對應方法的路由(類和方法上的@RequestMapping)
    /**
     * 這裏需要注意的兩個地方
     * <p>
     * 1、在這裏使用的GetMapping註解要和被調用發一致,如果還有問題就用@RequestMapping
     * 2、@PathVariable需要設置value,如果不設置也不能成功啓動
   *  注意點   1、路徑
     * 2、Http方法必須對應
   * 3、使用requestBody,應該使用@PostMapping
     * 4、多個參數的時候,通過@RequestParam("id") int id)方式調用
     */
    @GetMapping("/api/v1/product/find")
    String findById(@RequestParam(value = "id") int id);
}
4.在需要的地方注入ProductClient   調用其方法
@Service
public class ProductOrderServiceImpl implements ProductOrderService {

    @Autowired
    private ProductClient productClient;
    @Override
    public ProductOrder save(int userId, int productId) {
        //通過Feign 調用返回的是字符串幾個使用json轉換工具轉成對象使用
        String product = productClient.findById(userId);
        JsonNode jsonNode = JsonUtils.stringToNode(product);
        ProductOrder productOrder = new ProductOrder();
        productOrder.setCreateTime(new Date());
        productOrder.setUserId(userId);
        productOrder.setTradeNo(UUID.randomUUID().toString());
        productOrder.setProductName(jsonNode.get("name").toString());
        productOrder.setPrice(Integer.parseInt(jsonNode.get("price").toString()));
        return productOrder;
    }
}

上面完成了,Feign 也就可以用了,如果你要配置集羣,測試默認負載策略,和上一篇文章ribbon 一模一樣。
因爲Feign整合了ribbon 而且上一篇文章對於ribbon配置負載策略的方法對於Feign也有效。

2、超時配置
默認optons readtimeout是60,但是由於hystrix默認是1秒超時,所以默認就是1秒 在調用方yml 文件中加入一下配置(1秒足以,除非項目有要求,不然不需要配置)

feign.httpclient.connection-timeout=2000
feign.httpclient.connection-timer-repeat=2000

 

3、默認使用ribbon的輪詢策略

修改消費者配置文件application.properties

#其中“service-order-provider-7001”指明對哪個微服務的調用進行配置,當前配置使用隨機策略,修改策略修改最後的類名即可
service-order-provider-7001.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
# 設置連接超時時間,單位ms
ribbon.ConnectTimeout=5000
# 設置讀取超時時間,單位ms
ribbon.ReadTimeout=5000
# 對所有操作請求都進行重試
ribbon.OkToRetryOnAllOperations=true
# 切換實例的重試次數
ribbon.MaxAutoRetriesNextServer=2
# 對當前實例的重試次數
ribbon.MaxAutoRetries=1

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章