• SpringCloud --服务调用Feign


    介绍

    服务间通信简介

    一个系统可以由不同的微服务构成,比如一个电商系统可以由订单服务、商品服务、用户服务等共同组成。 这些服务相互独立,但又相互依赖。由于它们相互依赖,所以需要通过通信的方式来进行相互调用。

    服务间通信方式主要有两种:

    (1) 基于HTTP的REST(SpringCloud)

    (2) RPC(Dubbo)

    SpringCloud服务间调用方式有两种:

    (1) RestTemplate

    (2) FeignClient

    这两种方式都是通过REST接口调用服务的http接口

    SpringCloud搭建各种微服务之后,服务间通常存在相互调用的需求,SpringCloud提供了@FeignClient 注解非常优雅的解决了这个问题Feign的中文名称翻译过来是伪装。

    实战中使用Feign进行服务间通信

    1. 增加依赖(WKD项目中使用)

    1 <dependency>
    2     <groupId>org.springframework.cloud</groupId>
    3     <artifactId>spring-cloud-starter-openfeign</artifactId>
    4 </dependency>

    说明:依赖有分feignopenfeign

    (1) Feign本身不支持Spring MVC的注解,它有一套自己的注解;

    (2) Spring Cloud OpenFeign是在Feign的基础上扩展了对Spring MVC注解的支持,如@RequesMapping等等,同时还整合了Ribbon和Eureka来提供均衡负载的HTTP客户端实现。

    2、增加注解@EnableFeignClients

    (1) Application启动类上增加注解@EnableFeignClients

    (2)写在一个专门的配置文件中

     

    说明:FeignClinentConfig 外部Restful接口引入:

    如果Feignclien是外部包引入的,可能需要指定扫描路径,在注解@EnableFeignClients中指定

    @EnableFeignClients(/*basePackages={"package.contains.fegin.clients"}*/)手写的Feigclient 在 .assemble.fegin 中通过组件@FeignClient 引入,就是说你需要加上你可能要调用中心的API的包路径,好比你的找个配置文件在库存中心inventory,你可能要调用到基础数据中心data,那你得加上扫描路径(类似com.xxx.center.data.api)。

    3、新建一个feign接口

    参数说明:

    name:指定FeignClient的名称(微服务的名称),name属性会作为微服务的名称,用于服务发现(如果使用Nacos实现服务注册发现,name与服务的名称一致,使用eureka也一样);

    url: url一般用于调试,可以手动指定@FeignClient调用的地址;

    path: 定义当前FeignClient所有方法的requestMapping的统一前缀,,类似与controller类上的requestMapping;

    4、调用feign

    假如应用中心stock调用库存中心inventory,实现类中注入inventory中心的Api接口,直接调用。

     1 @Service
     2 public class BandServiceImpl implements IBandService {
     3 
     4 @Resource
     5 private IBandQueryApi bandQueryApi;
     6 
     7 ......
     8 
     9 @Override
    10 public RestResponse<BandRespDto> queryBandById(Long id) {
    11   //调用库存中心
    12    return bandQueryApi.queryBandById(id);
    13 }
    14 }

    FeignClient原理简述

    (1)当程序启动时,会进行包扫描,扫描所有包下有@FeignClient注解的类并将这些类注入到Spring IOC容器中

    (2)当定义的Feign接口中的方法被调用时,Feign通过JDK的动态代理为每个接口方法创建一个RequestTemplate对象。这个RequestTemplate对象中包含请求的所有信息,如请求参数,请求URL等。

    (3)然后RequestTemplate生成Request,将Request交给Client处理,这个Client默认是JDK的HTTPUrlConnection,也可以是OKhttp、Apache的HTTPClient等。

    (4)最后Client被封装成LoadBaLanceClient类,这个类结合Ribbon负载均衡发起服务之间的调用

    参考/好文

    Spring Cloud中的服务间通信(RestTemplateFeign)

    https://blog.csdn.net/zhaohongfei_358/article/details/83148623

    Feign的工作原理

    https://juejin.im/post/5ccbe82851882544da5008ce

    希望本文章对您有帮助,您的转发、点赞是我的创作动力,十分感谢。更多好文推荐,请关注我的微信公众号--JustJavaIt
  • 相关阅读:
    Netty ChannelHandler组件作用
    Netty Channel组件作用
    Netty NioEventLoop自定义任务处理
    NIO与BIO
    JDK ByteBuffer与Netty ByteBuf
    linux-源码软件管理-yum配置
    typora使用快捷键
    远程连接mysql库问题
    MVC 后台处理 json格式的日期
    使用 SqlClient 创建数据库连接并获取数据
  • 原文地址:https://www.cnblogs.com/liaowenhui/p/12443341.html
Copyright © 2020-2023  润新知