谷粒商城-全栈-12 分布式组件-SpringCloud OpenFeign 测试远程调用

OpenFeign进行远程调用

feign使用三步:

  • 1、导包 openfeign
  • 2、开启@EnbableFeignClients 功能
  • 3、编写接口,进行远程调用

我们的项目在创建的时候已经添加了 OpenFeign 依赖,如果还没有添加,则需引入依赖:

修改pom.xml文件添加OpenFeign依赖

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

修改 com.atguigu.gulimall.coupon.controller.CouponController 作为调用测试

@RequestMapping("/member/list")
public R membercoupons(){
    CouponEntity couponEntity = new CouponEntity();
    couponEntity.setCouponName("100减50");
    return R.ok().put("coupons",Arrays.asList(couponEntity));
}

新建 com.atguigu.gulimall.member.feign.CouponFeignService 实现调用接口

package com.atguigu.gulimall.member.feign;

import com.atguigu.common.utils.R;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;

@FeignClient("gulimall-coupon")
public interface CouponFeignService {
    @RequestMapping("/coupon/coupon/member/list")
    public R membercoupons();
}

启用Feign调用功能com.atguigu.gulimall.member.GulimallMemberApplication

//在服务启动时会自动扫描Feign包下的路径
@EnableFeignClients(basePackages = "com.atguigu.gulimall.member.feign")

创建接口com.atguigu.gulimall.member.controller.MemberController

@Autowired
CouponFeignService couponFeignService;

@RequestMapping("/coupons")
public R Test(){
    MemberEntity memberEntity = new MemberEntity();
    memberEntity.setNickname("张三");

    R membercoupons = couponFeignService.membercoupons();

    return R.ok().put("member",memberEntity)
        .put("coupons",membercoupons.get("coupons"));
}

启动微服务gulimall-coupon、gulimall-member,并开启nacos服务,访问 localhost:8000/member/member/coupons

报错了,错误信息:

context with path [] threw exception [Request processing failed; nested exception is feign.RetryableException: Read timed out executing GET http://gulimall-coupon/coupon/coupon/member/list] with root cause

原来是因为开了代理,所以,注册中心没有找到gulimall-coupon 的IP地址,关掉VPN,然后重启服务。
http://localhost:8000/member/member/coupons

{
    "msg": "success",
    "code": 0,
    "coupons": [
        {
            "id": null,
            "couponType": null,
            "couponImg": null,
            "couponName": "满100减10",
            "num": null,
            "amount": null,
            "perLimit": null,
            "minPoint": null,
            "startTime": null,
            "endTime": null,
            "useType": null,
            "note": null,
            "publishCount": null,
            "useCount": null,
            "receiveCount": null,
            "enableStartTime": null,
            "enableEndTime": null,
            "code": null,
            "memberLevel": null,
            "publish": null
        }
    ],
    "member": {
        "id": null,
        "levelId": null,
        "username": null,
        "password": null,
        "nickname": "张三",
        "mobile": null,
        "email": null,
        "header": null,
        "gender": null,
        "birth": null,
        "city": null,
        "job": null,
        "sign": null,
        "sourceType": null,
        "integration": null,
        "growth": null,
        "status": null,
        "createTime": null
    }
}

小结

想要远程调用别的服务
1)、引入open-feign
2)、编写一个接口,告诉SpringCloud这个接口需要调用远程服务。
1、声明接口的每一个方法都是调用哪个远程服务的那个强求
3)、开启远程调用功能 (@EnableFeignClients)

为者常成,行者常至