SpringCloud远程服务调用实战笔记

 更新时间:2021年11月24日 14:32:11   作者:CloverYou  
本文给大家介绍SpringCloud远程服务调用实战笔记,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

笔记

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

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-openfeign</artifactId>
  <version>xxx</version>
</dependency>

由于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<String, Object> 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<String, Object> 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<String, Object> 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 再启动就没毛病了。

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-loadbalancer</artifactId>
  <version>3.0.4</version>
</dependency>

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

<dependency>
  <groupId>com.alibaba.cloud</groupId>
  <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  <exclusions>
    <exclusion>
      <groupId>com.netflix.ribbon</groupId>
      <artifactId>ribbon</artifactId>
    </exclusion>
  </exclusions>
</dependency>

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

相关文章

  • Spring MVC Interceptor 实现性能监控的功能代码

    Spring MVC Interceptor 实现性能监控的功能代码

    本篇文章主要介绍了Spring MVC Interceptor 实现性能监控的功能代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-09-09
  • mybatis3中@SelectProvider传递参数方式

    mybatis3中@SelectProvider传递参数方式

    这篇文章主要介绍了mybatis3中@SelectProvider传递参数方式。具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • 浅谈springboot 属性定义

    浅谈springboot 属性定义

    本篇文章主要介绍了浅谈springboot 属性定义,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • Java使用Redisson分布式锁实现原理

    Java使用Redisson分布式锁实现原理

    Redisson分布式锁 之前的基于注解的锁有一种锁是基本redis的分布式锁,这篇文章主要介绍了Java使用Redisson分布式锁实现原理,非常具有实用价值,需要的朋友可以参考下
    2018-10-10
  • netty中的IO、NIO、AIO使用详解

    netty中的IO、NIO、AIO使用详解

    这篇文章主要介绍了netty中的IO、NIO、AIO使用详解,本文会说明各种IO的特点、分别解决了什么样的问题做一个分析阐述,并结合Java代码例子来辅助理解,像这些的历史演进和详细的底层原理网上很多,所以我们只站在应用层,使用者的角度去分析,需要的朋友可以参考下
    2023-12-12
  • Spring中@Primary注解的作用详解

    Spring中@Primary注解的作用详解

    这篇文章主要介绍了Spring中@Primary注解的作用详解,@Primary 注解是Spring框架中的一个注解,用于标识一个Bean作为默认的实现类,当存在多个实现类时,通过使用@Primary注解,可以指定其中一个作为默认的实现类,以便在注入时自动选择该实现类,需要的朋友可以参考下
    2023-10-10
  • SpringBoot+Mybatis Plus导致PageHelper失效的解决方法

    SpringBoot+Mybatis Plus导致PageHelper失效的解决方法

    在Springboot项目中使用分页插件的时候,发现PageHelper插件失效了 ,本文主要介绍了SpringBoot+Mybatis Plus导致PageHelper失效的解决方法,感兴趣的可以了解一下
    2024-07-07
  • 在Spring Boot中如何使用Cookies详析

    在Spring Boot中如何使用Cookies详析

    这篇文章主要给大家介绍了关于在Spring Boot中如何使用Cookies的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者使用Spring Boot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-11-11
  • 三道java新手入门面试题,通往自由的道路--锁+Volatile

    三道java新手入门面试题,通往自由的道路--锁+Volatile

    这篇文章主要为大家分享了最有价值的3道多线程面试题,涵盖内容全面,包括数据结构和算法相关的题目、经典面试编程题等,对hashCode方法的设计、垃圾收集的堆和代进行剖析,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • SpringBoot 之启动流程详解

    SpringBoot 之启动流程详解

    SpringBoot 是一个基于 Spring 框架的快速开发框架,旨在简化 Spring 应用程序的开发和部署。在本文中,我们将深入分析 SpringBoot 启动过程的源代码,并提供必要的解释和说明
    2023-04-04

最新评论