Feign实现负载均衡的使用

一 点睛

Feign是Netflix开发的声明式、模板化的HTTP客户端, Feign可以帮助我们更快捷、优雅地调用HTTP API。

在Spring Cloud中,使用Feign非常简单——创建一个接口,并在接口上添加一些注解,代码就完成了。Feign支持多种注解,例如Feign自带的注解或者JAX-RS注解等。

Spring Cloud对Feign进行了增强,使Feign支持了Spring MVC注解,并整合了Ribbon和Eureka(在我的前两篇文章中讲过了),从而让Feign的使用更加方便。

Spring Cloud Feign是基于Netflix feign实现,整合了Spring Cloud Ribbon和Spring Cloud Hystrix,除了提供这两者的强大功能外,还提供了一种声明式的Web服务客户端定义的方式。

Spring Cloud Feign帮助我们定义和实现依赖服务接口的定义。在Spring Cloud feign的实现下,只需要创建一个接口并用注解方式配置它,即可完成服务提供方的接口绑定,简化了在使用Spring Cloud Ribbon时自行封装服务调用客户端的开发量。

Spring Cloud Feign具备可插拔的注解支持,支持Feign注解、JAX-RS注解和Spring MVC的注解。


二,怎么使用 

  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:
  client:
    config:
      default:
        connectTimeout: 2000
        readTimeout: 2000

spring cloud的Netflix中提供了两个组件实现软负载均衡调用:ribbon和feign

3.ribbon和feign两个的区别和选择

目前,在Spring cloud 中服务之间通过restful方式调用有两种方式 
- restTemplate+Ribbon 
- feign

相同点:

  :ribbon和feign都是实现软负载均衡调用

不同点:

ribbon

是一个基于 HTTP 和 TCP 客户端的负载均衡器 

它可以在客户端配置 ribbonServerList(服务端列表),然后默认以轮询请求以策略实现均衡负载,他是使用可以用restTemplate+Ribbon 使用

feign:

Spring Cloud Netflix 的微服务都是以 HTTP 接口的形式暴露的,所以可以用 Apache 的 HttpClient ,而 Feign 是一个使用起来更加方便的 HTTP 客戶端,使用起来就像是调用自身工程的方法,而感觉不到是调用远程方法

选择
选择feign
默认集成了ribbon
写起来更加思路清晰和方便
采用注解方式进行配置,配置熔断等方式方便

猜你喜欢

转载自www.cnblogs.com/xiaowangbangzhu/p/10397037.html