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