這是上次建立的服務,要讓這兩個服務開始能互相溝通

會員想要從優惠券中查詢到自己的所有優惠券,那會員服務就要到nacos中尋找優惠券服務在哪,找到後才能進行調用。

此專案使用Feign來達到遠端調用的功能,首先必需要在member project中加入maven依賴(Feign),這部分在一開始建立專案時已經有勾選了,所以就不必額外加入

在建立SpringBoot專案時已經有勾選web和openfeign

接下來

要找所有優惠券,就在coupon project中的controller新增一個方法

public R memberCoupons() {
        CouponEntity couponEntity = new CouponEntity();
        couponEntity.setCouponName("滿千送百");
        return R.ok().put("coupons", Collections.singletonList(couponEntity));
    }

接下來

新增package(feign)在member project,然後新增介面,這樣之後要遠端調用的方法都可以集中在這裡使用,然後新增介面CouponFeignService

在介面上加上Annotation

@FeignClient("yumall-coupon")

表示這個介面是一個遠端Client,member服務要調用coupon服務必須從nacos中的服務名稱來辨別,而coupon project之前設定的名稱就是yumall-coupon,所以Annotation中刮號內就輸入yumall-coupon

然後要調用哪個方法就必須要擁有那個方法的完整簽章,將剛剛新增的方法簽章放到介面中,且在對應的路徑中要必須是完整路徑

@RequestMapping("/coupon/coupon/member/list")

總結上述的介面就會長這樣子

總結上述的方式:

  1. 加入open-feign maven
  2. 寫一個介面告訴SpringCloud這個介面是要需要使用遠端調用服務
  3. 宣告介面中的每個方法都是要調用哪個服務的哪個請求

接下來

在應用服務中開啟遠端調用功能

@EnableFeignClients

在這個Annotation中的原始碼中有個basePackages的方法,用來標示要哪個package做遠端調用

最後完整的寫法如下

這樣服務一啟動就會自動掃描指定的package下的方法。

現在寫一個測試請求在member project,在memberController中寫要取得會員的優惠券

@Autowired
private CouponFeignService couponFeignService;

@RequestMapping("/coupons")
    public R test() {
        MemberEntity memberEntity = new MemberEntity();
        memberEntity.setNickname("MarkCheng");
        R memberCoupons = couponFeignService.memberCoupons();
        
        return R.ok().put("member", memberEntity).put("coupons", memberCoupons.get("coupons"));
    }

第一個put是查詢會員,第二個put則是遠端調用方法的結果,而R本身就是一個Map,是之前ren2 project中撰寫的,而宣告式的遠端調用指的就是@FeignClient這個Annotation。

之後使用API時就可以得到結果

http://127.0.0.1:8000/member/member/coupons