SpringCloud远程服务调用实战笔记

作者:CloverYou 时间:2022-07-13 06:40:19 

笔记

在微服务中,若想要使用远程调用,需要引入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>

来源:https://www.cnblogs.com/CloverYou/p/15566063.html

标签:SpringCloud,远程,服务,调用
0
投稿

猜你喜欢

  • java实现MD5加密的方法小结

    2022-02-26 20:01:47
  • C#设置软件开机自动运行的方法(修改注册表)

    2022-08-27 21:05:46
  • Android自定义Notification添加点击事件

    2022-04-06 19:06:30
  • Android应用借助LinearLayout实现垂直水平居中布局

    2023-02-05 01:46:45
  • 轻松实现Android语音识别功能

    2022-09-11 17:42:46
  • C#中遍历Hashtable的4种方法

    2023-01-18 12:17:51
  • 简单了解Java多态向上转型相关原理

    2023-10-11 16:11:01
  • 简单记事本java源码实例

    2023-11-26 02:03:17
  • Java实现简单的酒店管理系统

    2022-05-10 01:32:12
  • C#使用for循环移除HTML标记

    2022-02-02 08:35:23
  • java 中clone()的使用方法

    2023-03-31 12:11:37
  • ActiveMQ在C#中的应用示例分析

    2021-09-18 19:12:41
  • JAVA面试题 简谈你对synchronized关键字的理解

    2022-09-17 17:06:05
  • Android 调用系统应用的方法总结

    2023-05-05 09:53:52
  • Android数据共享 sharedPreferences 的使用方法

    2023-06-19 01:43:07
  • WinForm判断关闭事件来源于用户点击右上角“关闭”按钮的方法

    2021-05-28 13:00:43
  • 新手小白用C# winform 读取Excel表的实现

    2022-12-27 15:45:12
  • C++高并发内存池的整体设计和实现思路

    2023-07-03 16:29:31
  • Android使用GPS获取用户地理位置并监听位置变化的方法

    2022-03-29 14:24:17
  • Java reservedcodecachesize虚拟机参数案例详解

    2022-03-15 12:18:48
  • asp之家 软件编程 m.aspxhome.com