SpringCloud远程服务调用实战笔记

网友投稿 254 2022-09-13


SpringCloud远程服务调用实战笔记

笔记

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

org.springframework.cloud

spring-cloud-starter-openfeign

xxx

由于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(Gulimalhttp://lMemberApplication.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 lbXYIR 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.cloud

spring-cloud-starter-loadbalancer

3.0.4

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

com.alibaba.cloud

spring-cloud-starter-alibaba-nacos-discovery

com.netflix.ribbon

ribbon


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:# 中小型网络构建-vrrp协议详解
下一篇:IP地址和子网划分学习笔记之《超网合并详解》(将网络分隔成多个IP子网)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~