• Spring Cloud Alibaba系列(三)使用feign进行服务调用


    什么是Feign

    Feign是spring cloud提供的一个声明式的伪http客户端,它使得调用远程服务就像调用本地服务一样简单,只需要创建一个接口并添加一天注解即可。

    Nacos很好的兼容了Feign,Feign默认默认继承了Ribbon,所以在nacos下使用Feign默认就实现了负载均衡的效果。

    Ribbon支持的负载均衡策略

    负载均衡就是将请求分摊给多个实例进行进行处理。

    根据负载均衡发生位置的不同,一般分为服务端负载均衡和客户端负载均衡。

    服务端负载均衡指的是发生在服务提供者一方,比如常见的nginx负载均衡。

    客户端负载均衡指的是发生在服务请求的一方,也就是在服务请求之前已经选好了由哪个实例进行处理。

    我们在微服务中一般会选择客户端负载均衡,Ribbon就是在客户端进行了负载。

    Ribbon内置了多种负载均衡策略,内部负载均衡的顶级接口为:com.netflix.loadbalancer.IRule,具体的负载策略如下图所示:

    策略类 命名 描述
    RandomRule 随机策略 随机选择server
    RoundRobinRule 轮询策略 按照顺序选择server(ribbon默认策略)
    RetryRule 重试策略 在一个配置时间段内,当选择server不成功,则一直尝试选择一个可用的server
    BestAvailableRule 最低并发策略 逐个考察server,如果server断路器打开,则忽略,再选择其中并发链接最低的server
    AvailabilityFilteringRule 可用过滤策略 过滤掉一直失败并被标记为circuit tripped的server,过滤掉那些高并发链接的server(active connections超过配置的阈值)
    ResponseTimeWeightedRule 响应时间加权重策略 根据server的响应时间分配权重,响应时间越长,权重越低,被选择到的概率也就越低。响应时间越短,权重越高,被选中的概率越高,这个策略很贴切,综合了各种因素,比如:网络,磁盘,io等,都直接影响响应时间
    ZoneAvoidanceRule 区域权重策略 综合判断server所在区域的性能,和server的可用性,轮询选择server并且判断一个AWS Zone的运行性能是否可用,剔除不可用的Zone中的所有server

    如何使用Feign

    我们使用第一章中的nacos-discovery-server作为服务提供者,提供了一个“/hello”的接口。新建一个alibaba-client-feign的服务作为消费者。

    1. pom文件中假如openfeign的依赖
     <dependency>
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-starter-openfeign</artifactId>
     </dependency>
    
    1. 在启动类上加上支持feign的注解
    @EnableFeignClients // 开启feign
    
    1. 创建一个feign客户端并使用feign调用微服务
        @RestController
        class TestController{
            @Autowired
            Client client;
            @GetMapping("/test")
            String test(){
    
                return client.hello("hahaha");
            }
        }
    
        @FeignClient(name="nacos-discovery-server")
        interface Client{
            @GetMapping("/hello")
            String hello(@RequestParam String name);
        }
    

    注意:在实际开发中,feign客户端都是写在公共模块当中,哪个服务需要调用引入公共模块即可。

    Feign的两种实现方式

    1. 第一种就是本文中介绍的,Feign和生产者的RequestMapping保持一致
    2. 第二种是在feignClient中提供所有请求的接口,然后controller实现这个feignClient,这样就不必要写重复代码了。

    注意点

    1. 请求参数为对象是,使用@requestbody
    2. 请求参数用@requestParam接收时,必须加上value属性,如@requestParam("name")
    3. 请求参数用@pathVariable接收时,必须加上value属性,如@pathVariable("name")
  • 相关阅读:
    ASP.NET中POST提交数据并跳转页面
    kindeditor编辑器图片水印
    jquery live hover绑定方法
    ASP.NET MVC实现多个按钮提交事件
    Asp.Net时间戳与时间互转
    Django-管理站点重写admin模板
    Pycharm快捷键整理(Mac)
    Python 调用datetime或者time获取时间的时候以及时间转换,最好设置一下时区 否则会出现相差8个小时的情况
    django中使用原生sql
    [django]用日期来查询datetime类型字段
  • 原文地址:https://www.cnblogs.com/zhixie/p/12880245.html
Copyright © 2020-2023  润新知