10.0 Feign與注冊中心
聲明式遠程調用
feign是一個聲明式的HTTP客戶端,他的目的就是讓遠程調用更加簡單。
給遠程服務發的是HTTP請求。
會員服務(member)調優惠券(coupon)服務
會員服務通過openFeign先去注冊中心找優惠券服務
10.1 引入 openfeign 依賴
會員服務想要遠程調用優惠券服務,只需要給會員服務里引入openfeign依賴,他就有了遠程調用其他服務的能力。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
10.2 在coupon服務(被調用服務)中修改如下的內容
@RequestMapping("coupon/coupon")
public class CouponController {
@Autowired
private CouponService couponService;
@RequestMapping("/member/list")
public R membercoupons(){ //全系統的所有返回都返回R
// 應該去數據庫查用戶對于的優惠券,但這個我們簡化了,不去數據庫查了,構造了一個優惠券給他返回
CouponEntity couponEntity = new CouponEntity();
couponEntity.setCouponName("滿100減10");//優惠券的名字
return R.ok().put("coupons",Arrays.asList(couponEntity));
}
10.3 這樣我們準備好了優惠券的調用內容在member的配置類上加注解@EnableFeignClients(basePackages="com.yxj.gulimall.member.feign"),
告訴spring這里面是一個遠程調用客戶端,member要調用的接口
package com.yxj.gulimall.member;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
@MapperScan("com.yxj.gulimall.member.dao")
@EnableDiscoveryClient
@EnableFeignClients(basePackages="com.yxj.gulimall.member.feign")
public class GulimallMemberApplication {
public static void main(String[] args) {
SpringApplication.run(GulimallMemberApplication.class, args);
}
}
10.4 那么要調用什么東西呢?就是我們剛才寫的優惠券的功能,
復制函數部分,在member的com.yxj.gulimall.member.feign包下新建類:
package com.yxj.gulimall.member.feign;
import com.yxj.common.utils.R;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
@FeignClient("gulimall-coupon") //告訴spring cloud這個接口是一個遠程客戶端,要調用coupon服務,再去調用coupon服務/coupon/coupon/member/list對應的方法
public interface CouponFeignService {
@RequestMapping("/coupon/coupon/member/list")
public R membercoupons();//得到一個R對象
}
10.5 然后我們在member的控制層寫一個測試請求
@RestController
@RequestMapping("member/member")
public class MemberController {
@Autowired
private MemberService memberService;
@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"));
}
10.6 重新啟動服務
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}}
10.7 上面內容很重要,我們停留5分鐘體會一下
coupon里的R.ok()是什么 # coupon里的控制層就是new了個couponEntity然后放到hashmap(R)里而已。
public class R extends HashMap<String, Object> {
public static R ok() {
return new R();
}
public R put(String key, Object value) {
super.put(key, value);
return this;
}
}