Feign(遠程調用)與注冊中心


聲明式遠程調用

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
public class SpuBoundTo {

private Long spuId;
private BigDecimal buyBounds;
private BigDecimal growBounds;

}
//5、保存spu的積分信息  跨庫gulimal_sms  -> sms_spu_bounds
Bounds bounds = vo.getBounds();
SpuBoundTo spuBoundTo = new SpuBoundTo();
BeanUtils.copyProperties(bounds,spuBoundTo);
spuBoundTo.setSpuId(infoEntity.getId());
couponFeignService.saveSpuBounds(spuBoundTo);
@FeignClient("gulimall-coupon")
public interface CouponFeignService {


/** 1、CouponFeignService.saveSpuBounds(spuBoundTo)
* 1)、@RequestBody將spuBoundTo對象轉為json。
* 2)、找到gulimall-coupon服務,給/coupon/spubounds/save發送請求。
* 將上一步轉的json放在請求體位置,發送請求
* 3)、對方服務收到請求。請求體里有json數據
* (@RequestBody SpuBoundsEntity spuBounds);將請求體的json轉為SpuBoundsEntity;
* 只要json數據模型是兼容的。雙方服務無需使用同一個to
*
* @param spuBoundTo
* @return
*/
@PostMapping("/coupon/spubounds/save")
R saveSpuBounds(@RequestBody SpuBoundTo spuBoundTo);
}

gulimall-coupon服務:

@Data
@TableName("sms_spu_bounds")
public class SpuBoundsEntity implements Serializable {
private static final long serialVersionUID = 1L;

/**
* id
*/
@TableId
private Long id;
/**
*
*/
private Long spuId;
/**
* 成長積分
*/
private BigDecimal growBounds;
/**
* 購物積分
*/
private BigDecimal buyBounds;
/**
* 優惠生效情況[1111(四個狀態位,從右到左);0 - 無優惠,成長積分是否贈送;1 - 無優惠,購物積分是否贈送;2 - 有優惠,成長積分是否贈送;3 - 有優惠,購物積分是否贈送【狀態位0:不贈送,1:贈送】]
*/
private Integer work;

}
  /**
* 保存
*/
@PostMapping("/coupon/spubounds/save")

public R save(@RequestBody SpuBoundsEntity spuBounds){
    spuBoundsService.save(spuBounds);

return R.ok();
}

總結:當兩個服務之間通過Feign進行遠程調用時,只需要保證以下幾點:

  • @FeignClient("gulimall-coupon")中微服務名和該服務在注冊中心中的名稱一致
  • @PostMapping("/coupon/spubounds/save")訪問url地址路徑一致和@PostMapping發送方式一致
  • R 返回值一致
  • SpuBoundTo和SpuBoundsEntity中的屬性一致
  • save(@RequestBody SpuBoundsEntity spuBounds)封裝格式一致

至於方法名(如示例代碼中的saveSpuBounds和save)和對象名(如示例代碼中的SpuBoundTo和SpuBoundsEntity)不一致也可以進行數據之間的傳遞

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM