聲明式遠程調用
feign是一個聲明式的HTTP客戶端,他的目的就是讓遠程調用更加簡單。給遠程服務發的是HTTP請求。
1、引入依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2、編寫一個接口,接口告訴springcloud這個接口需要調用遠程服務
@FeignClient("gulimall-coupon") //告訴spring cloud這個接口是一個遠程客戶端,要調用coupon服務(nacos中找到,所以"gulimall-coupon"對應的nacos上的注冊名),具體是調用coupon服務的/coupon/coupon/member/list對應的方法
public interface CouponFeignService {
// 遠程服務的url
@RequestMapping("/coupon/coupon/member/list") //注意寫全優惠券類上還有映射//注意我們這個地方不是控制層,所以這個請求映射請求的不是我們服務器上的東西,而是nacos注冊中心的
public R membercoupons();//得到一個R對象
}
3、開啟遠程調用功能 @EnableFeignClients,要指定遠程調用功能放的基礎包
@EnableFeignClients(basePackages="com.atguigu.gulimall.member.feign")//掃描接口方法注解("com.atguigu.gulimall.member.feign"對應的是所有feign類所存在的文件路徑,表示掃描該路徑下所以含有@FeignClient注解的類)
@EnableDiscoveryClient
@SpringBootApplication
public class gulimallMemberApplication {
public static void main(String[] args) {
SpringApplication.run(gulimallMemberApplication.class, args);
}
}
進階操作:
示例代碼:
gulimall-product服務:
@Data |
//5、保存spu的積分信息 跨庫gulimal_sms -> sms_spu_bounds |
@FeignClient("gulimall-coupon") |
gulimall-coupon服務:
@Data |
/** spuBoundsService.save(spuBounds); |
總結:當兩個服務之間通過Feign進行遠程調用時,只需要保證以下幾點:
-
@FeignClient("gulimall-coupon")中微服務名和該服務在注冊中心中的名稱一致
-
@PostMapping("/coupon/spubounds/save")訪問url地址路徑一致和@PostMapping發送方式一致
-
R 返回值一致
-
SpuBoundTo和SpuBoundsEntity中的屬性一致
-
save(@RequestBody SpuBoundsEntity spuBounds)封裝格式一致
至於方法名(如示例代碼中的saveSpuBounds和save)和對象名(如示例代碼中的SpuBoundTo和SpuBoundsEntity)不一致也可以進行數據之間的傳遞