上一篇寫到
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