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;
    }
}