
會員想要從優惠券中查詢到自己的所有優惠券,那會員服務就要到nacos中尋找優惠券服務在哪,找到後才能進行調用。
此專案使用Feign來達到遠端調用的功能,首先必需要在member project中加入maven依賴(Feign),這部分在一開始建立專案時已經有勾選了,所以就不必額外加入

接下來
要找所有優惠券,就在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")
總結上述的介面就會長這樣子

總結上述的方式:
- 加入open-feign maven
- 寫一個介面告訴SpringCloud這個介面是要需要使用遠端調用服務
- 宣告介面中的每個方法都是要調用哪個服務的哪個請求
接下來
在應用服務中開啟遠端調用功能
@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
