SpringCloud远程服务调用实战笔记

本文给大家介绍SpringCloud远程服务调用实战笔记,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

笔记

在微服务中,若想要使用远程调用,需要引入spring-cloud-starter-openfeign(在使用注册中心的环境下)

  org.springframework.cloudspring-cloud-starter-openfeignxxx

由于open-feign是声明式的远程调用,所以需要编写一个接口,并且告诉SpringCloud这个接口需要调用远程服务。这个接口我放在公共模块下的feign中。

 package top.ctong.gulimall.common.feign; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import top.ctong.gulimall.common.utils.R; import java.util.Map; @FeignClient("gulimall-coupon") @RequestMapping("/coupon/coupon") public interface CouponFeignService { /** * 通过自定义参数查询列表 * @param params 自定义参数 * @return R * @author Clover You * @date 2021/11/17 09:11 */ @RequestMapping("/list") R list(@RequestParam Map params); } 

@FeignClient("xxx") 该注解用于告诉SpringCloud这是一个远程调用接口,其中的value是你在注册中心中注册的服务名。

接口方法签名需要与被调用的远程服务签名一致,例如上面哪个代码要调用的远程服务:

 package top.ctong.gulimall.coupon.controller; @RestController @RequestMapping("coupon/coupon") public class CouponController { @Autowired private CouponService couponService; /** * 列表 */ @RequestMapping("/list") //@RequiresPermissions("coupon:coupon:list") public R list(@RequestParam Map params){ PageUtils page = couponService.queryPage(params); return R.ok().put("page", page); } } 

接着还要使用@EnableFeignClients开启当前需要使用远程调用的这个服务的远程调用,并且指定你的远程调用接口在哪个包下。

 @EnableFeignClients(basePackages = "top.ctong.gulimall.common.feign") @EnableDiscoveryClient @MapperScan("top.ctong.gulimall.member.dao") @SpringBootApplication public class GulimallMemberApplication { public static void main(String[] args) { SpringApplication.run(GulimallMemberApplication.class, args); } } 

@EnableFeignClients 该注解用于开启当前服务的远程调用功能

basePackages 用于指定远程调用接口所在的包,方便服务启动的时候可以快速扫描到。他可以接收多个包名,因为它是一个String[]

最后在需要远程调用时注入对应的远程调用接口就好

 package top.ctong.gulimall.member.controller; @RestController @RequestMapping("member/member") public class MemberController { private final CouponFeignService couponFeignService; @Autowired public MemberController(CouponFeignService couponFeignService, MemberService memberService) { this.couponFeignService = couponFeignService; this.memberService = memberService; } @RequestMapping("/testFeignInvoke") public R testFeignInvoke() { Map parem = new HashMap<>(10); return couponFeignService.list(parem); } } 

错误(nacos)

如果在启动时出现 No Feign Client for loadBalancing defined. Did you forget to include spring-cloud-starter-loadbalancer? 错误,那么就是你的SpringCloud版本比较高,在高版本的SpringCloud中已经不再使用 spring-cloud-starter-netflix-ribbon 了,而是使用 spring-cloud-starter-loadbalancer 。而nacos还是使用的 spring-cloud-starter-netflix-ribbon

pom.xml文件中引入 spring-cloud-starter-loadbalancer 再启动就没毛病了。

  org.springframework.cloudspring-cloud-starter-loadbalancer3.0.4

在测试远程调用中发生 AbstractMethodError 异常。需要在 pom.xml 中排除 nacos 中引入的 ribbon 。否则 spring-cloud-starter-loadbalancer 无法工作。

  com.alibaba.cloudspring-cloud-starter-alibaba-nacos-discovery  com.netflix.ribbonribbon

到此这篇关于SpringCloud远程服务调用 的文章就介绍到这了,更多相关SpringCloud服务调用 内容请搜索0133技术站以前的文章或继续浏览下面的相关文章希望大家以后多多支持0133技术站!

以上就是SpringCloud远程服务调用实战笔记的详细内容,更多请关注0133技术站其它相关文章!

赞(0) 打赏
未经允许不得转载:0133技术站首页 » Java