本项目主要通过nacos作为注册中心,openfeign完成远程调用服务功能
要调用远程服务,首先在要调用远程服务的模块中添加openfeign依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
远程调用服务的步骤总体分为一下三步:
1、在服务提供者的代码中编写一个功能(controller中的请求),以便服务消费者进行调用,视频中是以member调用coupon中的功能,所以在coupon的Controller中添加方法
@RequestMapping("/memberCoupon/list")
public R memberCoupon(){
CouponEntity couponEntity = new CouponEntity();
couponEntity.setCouponName("满十减一");
return R.ok().put("memberCoupon",Arrays.asList(couponEntity));
}
2.1. 在服务消费者的模块中新建feign包,并添加一个请求接口,在接口首部添加@FeignClient(服务名)(这里的服务名为注册进nacos注册中心的服务名),接着,将服务提供者的完整请求路径及方法签名完整地复制到服务该接口中
package indi.zhihuali.gulimall.member.feign;
import indi.zhihuali.common.utils.R;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* @author zhihua.li
* @date 2020/11/28 - 22:04
**/
@FeignClient("gulimall-coupon") //表明自己是一个会调用coupon服务的Feign客户端
public interface CouponFeignService {
// 声明要调用哪个服务的哪个功能,并完整复制该方法的路径名及方法名(签名)
@RequestMapping("/coupon/coupon/member/list") //声明要调用远程服务的哪个方法
public R memberCoupons();
}
3.在服务消费者的主配置类中添加
@EnableFeignClients(basePackages = "indi.zhihuali.gulimall.member.feign")
开启Feign的远程调用功能
4. 在服务消费者的Controller中添加方法,并将之前创建的接口,即 CouponFeignService 通过@Autowired注解注入Controller中进行调用
@Autowired
private CouponFeignService couponFeignService;
@RequestMapping("coupon/list")
public R couponlist(){
MemberEntity memberEntity = new MemberEntity();
memberEntity.setNickname("张三");
R memberCoupon = couponFeignService.memberCoupon();
return R.ok().put("member",memberEntity).
put("memberCoupon",memberCoupon.get("memberCoupon"));
}
5.分别启动两个服务的主配置类,进行测试
这里member模块开启失败,报错信息为:
No Feign Client for loadBalancing defined. Did you forget to include spring-cloud-starter-loadbalancer?
找了很久的原因,也试过很多很多办法,最后总结出两种解决方案
方案一 (这个属于我自己思维扩展,通过缺少负载均衡的提示研究出来的一种解决办法,但建议直接使用第二种方法!)
Did you forget to include spring-cloud-starter-loadbalancer?
提示要引入 spring-cloud-starter-loadbalancer 依赖,试着导入这个依赖后,项目是成功运行了,但是在地址栏输入相应的url后,发现页面显示500,且idea控制台也报错了
我将spring-cloud-starter-alibaba-nacos-discovery
内置的ribbon换成了spring-cloud-starter-loadbalancer
,发现解决了…
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
<version>2.2.5.RELEASE</version>
</dependency>
方案二:降低spring cloud版本(更好的解决办法)
https://blog.csdn.net/qq_42267491/article/details/110083758https://blog.csdn.net/qq_42267491/article/details/110083758
大佬说
spring cloud版本过高之后,没有包含负载均衡的包(和我开始的猜测一样,因为报错的时候明显就是因为没有正确引入负载均衡功能)
这里我的解决办法是:
选择spring cloud的版本为Hoxton.SR9,原因是要选用Hoxton版本的spring Cloud
通过mvn仓库:https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-dependencies
发现最新版本的Hoxton版本为SR9,引入这个版本的依赖
修改member的pom文件中sc的版本
至此,问题解决
附版本总览:
以coupon模块为例,其他模块也一样
SpringBoot及SpringCloud
common模块中的SpringCloudAlibaba