使用OpenFeign作为远程服务调用

1. Feign介绍

  通过RestTemplate调用其它服务的API时,所需要的参数须在请求的URL中进行拼接,如果参数少的话或许我们还可以忍受,一旦有多个参数的话,这时拼接请求字符串就会效率低下

  Feign是一个声明式的Web Service客户端,它的目的就是让Web Service调用更加简单。Feign提供了HTTP请求的模板,通过编写简单的接口和插入注解,就可以定义好HTTP请求的参数、格式、地址等信息。

  而Feign则会完全代理HTTP请求,我们只需要像调用方法一样调用它就可以完成服务请求及相关处理。Feign整合了Ribbon负载均衡Hystrix服务熔断,可以让我们不再需要显式地使用这两个组件。

 Feign具有如下特性:

  支持可插拔的HTTP编码器和解码器;
  支持Hystrix和它的Fallback;
  支持Ribbon的负载均衡;
  支持HTTP请求和响应的压缩。
  有点像我们springmvc模式的Controller层的RequestMapping映射。这Feign是用@FeignClient来映射服务的。

2. Feign的使用

实现案例:在会员服务中通过nacos服务注册中心远程调用优惠券服务

spring cloud实现远程调用的工具有哪些 springcloud alibaba 远程调用_HTTP

 

 

 

2.1、引入open-feign

<dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2.2、编写一个接口,告诉springCloud这个接口需要远程调用  


@RequestMapping("/member/list")
    public R memberCoupons(){
        CouponEntity coupon = new CouponEntity();
        coupon.setCouponName("满1000减200");
        return R.ok().put("coupons",Arrays.asList(coupon));
    }

 

spring cloud实现远程调用的工具有哪些 springcloud alibaba 远程调用_spring_02

2.3、在会员模块中新建feign文件包,创建CouponFeignService接口:优惠券远程调用服务。

     1)、接口服务使用注解@FeignClient,注解中的值为nacos中微服务的名称,用于服务发现

  2)、声明接口的每一个方法都是调用某个服务的请求

      注意:RequestMapping中的请求路径为该服务的全路径

@FeignClient("ttmall-coupon")
public interface CouponFeignService {

    @RequestMapping("/coupon/coupon/member/list")
    public R memberCoupons();
}

 

spring cloud实现远程调用的工具有哪些 springcloud alibaba 远程调用_HTTP_03

 

 

2.4、在会员模块中的启动类开启远程调用功能 @EnableFeignClients

   basePackages中值为feign包的路径

@EnableFeignClients(basePackages="com.agentliu.ttmall.member.feign")

 

spring cloud实现远程调用的工具有哪些 springcloud alibaba 远程调用_远程调用_04

 

 

2.5、在会员模块中编写测试类调用会员服务的远程服务

@Autowired
    CouponFeignService couponFeignService;

    @RequestMapping("/coupons")
    public R getMemberCoupon(){
        MemberEntity  memberEntity = new MemberEntity();
        memberEntity.setUsername("张三");
        R coupon = couponFeignService.memberCoupons();
        return R.ok().put("member",memberEntity).put("coupon",coupon.get("coupons"));
    }

 

spring cloud实现远程调用的工具有哪些 springcloud alibaba 远程调用_HTTP_05

 

 

 2.6、启动会员服务、优惠券服务,在浏览器中请求刚才编写的会员测试方法

http://localhost:8000/member/member/coupons

 

spring cloud实现远程调用的工具有哪些 springcloud alibaba 远程调用_HTTP_06