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


猜你喜欢
- 我贴c#的代码: namespace IWebs.Webs{ using System; using System.Web.Services
- 提起ProgressBar,想必大家都比较熟悉,使用起来也是比较方便,直接在XML文件中引用,然后添加属性,运行就OK了,虽然使用Progr
- 目录aop配合反射统一签名验证接口统一签名校验第一种aop 方式实现第二种 * aop配合反射统一签名验证直接上代码,作为记录。CheckS
- SpringBoot starter用了springboot 那么久了居然都还没自定义过starter,想想都觉得羞愧,所以今天来玩一下。S
- 问题背景在最近的项目开发中遇到一个需求 需要对mysql做一些慢查询、大结果集等异常指标进行收集监控,从运维角度并没有对mysql进行统一的
- eclipse配置tomcattomcat资源下载如果打开没有servers请查看这篇文章:eclipse创建项目没有dynamic web
- 前言C#方法中参数类型有4种参数类型,有时候很难记住它们的不同特征,下图对它们做一个总结大家可能在编码中或多或少的使用过out的ref,但是
- 最近在学习ssh框架时,照着网上做了一个商城系统,之前在一些需要用户存在的操作中,都是在每一个action中写重复的代码,这样做现在想起来并
- 背景在研究规则引擎时,如果规则以文件的形式存储,那么就需要监听指定的目录或文件来感知规则是否变化,进而进行加载。当然,在其他业务场景下,比如
- 队列的定义:队列(Queue)是只允许在一端进行插入,而在另一端进行删除的运算受限的线性表。 (1)允许删除的一端称为队头(Fro
- 添加jar包这里的Scala不是maven工程所以要找到项目结构(快捷键:同时按住Ctrl+shift+Alt+s)在模块里面添加添加MyS
- 本节作为主要讲解Spring Data的环境搭建JPA Spring Data :致力于减少数据访问层(DAO)的开发量。开发者唯一要做的就
- 本文实例为大家分享了Android实现圆形云标签效果展示的具体代码,供大家参考,具体内容如下下面是实现的效果图:这个适合用于选择 用户的一些
- Springboot对配置文件的敏感信息加密前言最近公司对软件的安全问题比较在意,要求对配置文件中的敏感信息如数据库密码等进行加密。但是Sp
- 这篇文章主要介绍了Spring如何使用注解的方式创建bean,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需
- 一般我们在controller层调用service时,只需要使用@Autowired注解即可,例如如下代码我们经常看到:@RestContr
- 获取当前年的周数 /// <summary> /// 获得今年有几周 /// </summa
- 1.jsch官方API查看地址(附件为需要的jar) http://www.jcraft.com/jsch/2.jsch简介 JSch(Ja
- 前言map的迭代删除,和我们常见的list,set不太一样,不能直接获取Iteraotr对象,提供的删除方法也是单个的,根据key进行删除,
- 获取方法的相关信息的两种形式反射是一种允许用户获得类信息的C#功能,Type对象映射它代表的底层对象;在.Net 中, 一旦获得了Type对