前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringCloud微服务实战(5)-Feign应用通信

SpringCloud微服务实战(5)-Feign应用通信

作者头像
JavaEdge
发布2022-11-30 16:04:01
3860
发布2022-11-30 16:04:01
举报
文章被收录于专栏:JavaEdgeJavaEdge

1 初识Feign

1.1 Feign是什么?

Feign是声明式的Web服务客户端。它使编写Web服务客户端更加容易。要使用Feign,请创建一个接口并添加注解。它支持可插拔的注解,包括Feign注解和JAX-RS(Java API for RESTful Web Services)注解。

Feign还支持可插拔的编码器和解码器。 Spring Cloud添加了对Spring MVC注解的支持,并支持使用Spring Web中默认使用的相同的HttpMessageConverters。 Spring Cloud集成了Eureka和Spring Cloud LoadBalancer,以在使用Feign时提供负载均衡的http客户端。

分布式系统实现远程调用的方式很多。按照协议划分,有 RPC,Webservice,http。不同协议下也有不同的框架实现,比如 dubbo 就是 RPC 框架,而本教程所讲解的 Feign 便可理解为一种 http 协议的框架实现,用于分布式服务之间通过 Http 进行远程调用。

1.2 项目中如何引用Feign?

在项目的 pom.xml 文件中使用

  • group为org.springframework.cloud
  • artifact id为spring-cloud-starter-openfeign

的起步依赖即可。

代码语言:javascript
复制
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

spring boot 应用的启动类

代码语言:javascript
复制
@SpringBootApplication
@EnableFeignClients
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

StoreClient.java

代码语言:javascript
复制
@FeignClient("stores")
public interface StoreClient {
    @RequestMapping(method = RequestMethod.GET, value = "/stores")
    List<Store> getStores();

    @RequestMapping(method = RequestMethod.POST, value = "/stores/{storeId}", consumes = "application/json")
    Store update(@PathVariable("storeId") Long storeId, Store store);
}

1.3 代码解释

@FeignClient注解中,String值(上面的“stores”)是一个任意的客户端名称,用于创建负载均衡器的客户端。也可以使用url属性(绝对值或仅是主机名)指定URL。应用程序上下文中的Bean名称是接口的全限定名称。如果想要指定别名,那么还可以指定@FeignClient注解的qualifier属性值哦。

上面的负载均衡器客户端将要发现“stores”服务的物理地址。 如果你的应用程序是Eureka客户端,则它将在Eureka服务的注册表中解析该服务。如果你不想使用Eureka,则可以使用SimpleDiscoveryClient在外部配置中简单地配置服务器列表。

openFeign

2 SpringCloud中服务间两种restful调用方式

  • RestTemplate
  • Feign

RestTemplate的三种使用方式

3 负载均衡器:Ribbion

  • RestTemplate
  • Feign
  • Zuul
  • ServerList
  • IRule
  • ServerListFilter

4 追踪源码自定义负载均衡策略

command+option+B进入其实现类
command+option+B进入其实现类
再跟进到 LoadBalancerClient 中
再跟进到 LoadBalancerClient 中
RibbonLoadBalancerClient#choose()
RibbonLoadBalancerClient#choose()
RibbonLoadBalancerClient#getServer(ILoadBalancer loadBalancer)
RibbonLoadBalancerClient#getServer(ILoadBalancer loadBalancer)
ILoadBalancer
ILoadBalancer
RibbonLoadBalancerClient#getServer(ILoadBalancer loadBalancer)
RibbonLoadBalancerClient#getServer(ILoadBalancer loadBalancer)
ILoadBalancer#getAllServers(),并进入
ILoadBalancer#getAllServers(),并进入

启动两个 Product 服务

product#1
product#1
product#2
product#2

再 debug 启动 Order 服务

三个服务成功注册
三个服务成功注册
在此打断点,并 debug 运行
在此打断点,并 debug 运行
获取服务列表
获取服务列表
  • 再看看其负载均衡策略
可见默认即轮询
可见默认即轮询

负载均衡请求

请求到2
请求到2
请求到1
请求到1

的确是轮询请求

通过启动日志也可看出具体使用的策略
通过启动日志也可看出具体使用的策略

为了检验是否为轮询,在此打断点

符合预期,确实为轮询
符合预期,确实为轮询

如果希望使用其他负载均衡规则该咋办呢,看官网文档

如希望用随机规则替代默认的轮询规则
如希望用随机规则替代默认的轮询规则
配置全路径名
配置全路径名
成功替换默认规则
成功替换默认规则

Feign的使用

Feign是一个声明式的Web服务客户端。这使得Web服务客户端的写入更加方便 要使用Feign创建一个界面并对其进行注释。它具有可插入注释支持,包括Feign注释和JAX-RS注释。Feign还支持可插拔编码器和解码器。Spring Cloud增加了对Spring MVC注释的支持,并使用Spring Web中默认使用的HttpMessageConverters。Spring Cloud集成Ribbon和Eureka以在使用Feign时提供负载均衡的http客户端。

如何加入Feign

  1. 要在您的项目中包含Feign,请使用组org.springframework.cloud和工件ID spring-cloud-starter-openfeign的启动器
  1. 在启动类添加注解@EnableFeignClients 可以在@EnableFeignClients属性defaultConfiguration中以与上述相似的方式指定默认配置 不同之处在于,此配置将适用于所有feigh客户端

调用商品服务的目标接口

  1. 声明调用的服务接口方法
  • @FeignClient name属性为某所需调用的某个服务的接口 在@FeignClient注释中,String值(以上“存储”)是一个任意的客户端名称,用于创建Ribbon负载平衡器,还可以使用url属性(绝对值或只是主机名)指定URL。应用程序上下文中的bean的名称是该接口的完全限定名称。要指定自己的别名值,可以使用@FeignClient注释的qualifier值。
添加@FeignClient注解
添加@FeignClient注解
  • 声明式REST客户端(伪RPC )
  • 采用了基于接口的注解

6 获取商品列表(Feign)

dao层测试接口正常
dao层测试接口正常
service 层单测正常
service 层单测正常
准备提供该接口
准备提供该接口
Order 服务中访问接口
Order 服务中访问接口
报错
报错

因为参数使用了 RequestBody 注解,所以需 POST 请求

7 扣库存(Feign)

调用接口
调用接口
发现报错
发现报错
控制台
控制台

由于缺失无参构造器

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-01-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 初识Feign
    • 1.1 Feign是什么?
      • 1.2 项目中如何引用Feign?
        • 1.3 代码解释
          • openFeign
            • RestTemplate的三种使用方式
            • 如何加入Feign
        • 2 SpringCloud中服务间两种restful调用方式
        • 3 负载均衡器:Ribbion
        • 4 追踪源码自定义负载均衡策略
        • Feign的使用
        • 6 获取商品列表(Feign)
        • 7 扣库存(Feign)
        相关产品与服务
        负载均衡
        负载均衡(Cloud Load Balancer,CLB)提供安全快捷的流量分发服务,访问流量经由 CLB 可以自动分配到云中的多台后端服务器上,扩展系统的服务能力并消除单点故障。负载均衡支持亿级连接和千万级并发,可轻松应对大流量访问,满足业务需求。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档