• SpringCloud(三)之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
    写起来更加思路清晰和方便
    采用注解方式进行配置,配置熔断等方式方便

  • 相关阅读:
    Android实现异步处理 -- HTTP请求
    死锁 android ANR
    查看死锁原因 /data/anr/traces.txt
    Android 实现在线程中联网
    Android有效解决加载大图片时内存溢出的问题
    Android的BUG(四)
    Path和ClassPath差异
    Zero Downtime Upgrade of Oracle 10g to Oracle 11g Using GoldenGate — 3
    不再年轻,尽管如此一遍
    javascript中间preventDefault与stopPropagation角色介绍
  • 原文地址:https://www.cnblogs.com/xiaowangbangzhu/p/10397037.html
Copyright © 2020-2023  润新知