前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用feign进行服务调用

使用feign进行服务调用

原创
作者头像
Java旅途
修改2020-10-23 10:08:23
2.3K0
修改2020-10-23 10:08:23
举报
文章被收录于专栏:Java旅途Java旅途

什么是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的依赖
代码语言:txt
复制
 <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-openfeign</artifactId>
 </dependency>
  1. 在启动类上加上支持feign的注解
代码语言:txt
复制
@EnableFeignClients // 开启feign
  1. 创建一个feign客户端并使用feign调用微服务
代码语言:txt
复制
// feign 客户端
@FeignClient(name="nacos-discovery-server")
interface Client{
    @GetMapping("/hello")
    String hello(@RequestParam String name);
}

// 消费服务
@RestController
class TestController{

    @Autowired
    Client client
        
    @GetMapping("/test")
    String test(){
		// 调用生产者
        return client.hello("hahaha");
    }
}

   

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

Feign的两种实现方式

  1. 第一种就是本文中介绍的,Feign和生产者的RequestMapping保持一致
代码语言:txt
复制
@FeignClient(name="nacos-discovery-server")
interface Client{
    @GetMapping("/hello")
    String hello(@RequestParam String name);
}
// 生产者
@RestController
class TestController{
        
    @GetMapping("/hello")
    String hello(@RequestParam String name){
        return name;
    }
}
  1. 第二种是在feignClient中提供所有请求的接口,然后controller实现这个feignClient,这样就不必要写重复代码了。
代码语言:txt
复制
@FeignClient(name="nacos-discovery-server")
interface Client{
    @GetMapping("/hello")
    String hello(@RequestParam("name") String name);
}

@RestController
class producer implements Client{

    @GetMapping("/hello")
    @Override
    public String hello(@RequestParam("name") String name) {
        return name;
    }
}

注意点

  1. 请求参数为对象是,使用@requestbody
  2. 请求参数用@requestParam接收时,必须加上value属性,如@requestParam("name")
  3. 请求参数用@pathVariable接收时,必须加上value属性,如@pathVariable("name")

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是Feign
  • Ribbon支持的负载均衡策略
  • 如何使用Feign
  • Feign的两种实现方式
  • 注意点
相关产品与服务
负载均衡
负载均衡(Cloud Load Balancer,CLB)提供安全快捷的流量分发服务,访问流量经由 CLB 可以自动分配到云中的多台后端服务器上,扩展系统的服务能力并消除单点故障。负载均衡支持亿级连接和千万级并发,可轻松应对大流量访问,满足业务需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档