10.0 Feign與注冊中心
聲明式遠(yuǎn)程調(diào)用
feign是一個聲明式的HTTP客戶端,他的目的就是讓遠(yuǎn)程調(diào)用更加簡單。
給遠(yuǎn)程服務(wù)發(fā)的是HTTP請求。
會員服務(wù)(member)調(diào)優(yōu)惠券(coupon)服務(wù)
會員服務(wù)通過openFeign先去注冊中心找優(yōu)惠券服務(wù)
10.1 引入 openfeign 依賴
會員服務(wù)想要遠(yuǎn)程調(diào)用優(yōu)惠券服務(wù),只需要給會員服務(wù)里引入openfeign依賴,他就有了遠(yuǎn)程調(diào)用其他服務(wù)的能力。
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

10.2 在coupon服務(wù)(被調(diào)用服務(wù))中修改如下的內(nèi)容
@RequestMapping("coupon/coupon")
public class CouponController {
    @Autowired
    private CouponService couponService;
    @RequestMapping("/member/list")
    public R membercoupons(){    //全系統(tǒng)的所有返回都返回R
        
// 應(yīng)該去數(shù)據(jù)庫查用戶對于的優(yōu)惠券,但這個我們簡化了,不去數(shù)據(jù)庫查了,構(gòu)造了一個優(yōu)惠券給他返回
        CouponEntity couponEntity = new CouponEntity();
        couponEntity.setCouponName("滿100減10");//優(yōu)惠券的名字
        return R.ok().put("coupons",Arrays.asList(couponEntity));
    }
10.3 這樣我們準(zhǔn)備好了優(yōu)惠券的調(diào)用內(nèi)容
在member的配置類上加注解@EnableFeignClients(basePackages="com.yxj.gulimall.member.feign"),
告訴spring這里面是一個遠(yuǎn)程調(diào)用客戶端,member要調(diào)用的接口
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
 那么要調(diào)用什么東西呢?就是我
們剛才寫的優(yōu)惠券的功能,
復(fù)制函數(shù)部分,在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這個接口是一個遠(yuǎn)程客戶端,要調(diào)用coupon服務(wù),再去調(diào)用coupon服務(wù)/coupon/coupon/member/list對應(yīng)的方法
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(); //假設(shè)張三去數(shù)據(jù)庫查了后返回了張三的優(yōu)惠券信息
        
// 打印會員和優(yōu)惠券信息
        return R.ok().put("member",memberEntity).put("coupons",membercoupons.get("coupons"));
    }
 
10.6 重新啟動服務(wù)
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 上面內(nèi)容很重要,我們停留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;
    }
}