本文已参与[新人创作礼]活动,一起开启掘金创作之路
基于SpringCloud-Alibaba,Nacos,OpenFeign完成远程调用功能
一,简介
在SpringCloud分布式微服务系统中,常会遇到远程调用其他模块的问题,SpringCloud-Alibaba提供了Nacos注册中心,配置中心,OpenFeign组件为我们提供了远程调用功能,极大方便了我们对项目的管理以及调用。 下面为大家演示使用Spring Cloud Alibaba的Nacos和OpenFeign完成的远程调用。
二,环境配置
==注意==:nacos的开启,服务注册,配置中心不是今天的主角,将简单描述。
1,首先引入依赖,根据自己使用的spring cloud版本选择
<!--服务注册/发现-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--配置中心-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>0.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2,修改对应服务的配置文件,将服务注册到nacos注册中心
1,调用方的配置文件配置
server:
port: 10001
spring:
application:
name: naisimall-product #此处的名,设为你的项目模块名即可
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
#以下为数据库和mybatis-plus的相关配置,保留自己的即可
datasource:
username: root
password: root
url: jdbc:mysql://192.168.136.88:3306/naisimall_pms
driver-class-name: com.mysql.jdbc.Driver
mybatis-plus:
mapper-locations: classpath:/mapper/**/*.xml
global-config:
db-config:
id-type: auto
logic-delete-value: 1
logic-not-delete-value: 0
2,被调用方的配置文件配置
spring:
datasource:
username: root
password: root
url: jdbc:mysql://192.168.136.88:3306/naisimall_sms
driver-class-name: com.mysql.jdbc.Driver
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
application:
name: naisimall-coupon #此处的名,设为你的项目模块名即可
mybatis-plus:
mapper-locations: classpath:/mapper/**/*.xml
global-config:
db-config:
id-type: auto
server:
port: 7000
三,代码编写
1,修改对应服务的启动类,完成服务注册
1,调用方的启动类
@MapperScan("com.chen.naisimall.product.dao")
@SpringBootApplication
@EnableDiscoveryClient //开启服务发现功能
//开启远程调用功能,这里的basePackages为远程调用的接口包
@EnableFeignClients(basePackages = "com.chen.naisimall.product.feign")
public class NaisimallProductApplication {
public static void main(String[] args) {
SpringApplication.run(NaisimallProductApplication.class, args);
}
}
2,被调用方的启动类
@EnableDiscoveryClient
@SpringBootApplication
public class NaisimallCouponApplication {
public static void main(String[] args) {
SpringApplication.run(NaisimallCouponApplication.class, args);
}
}
2,编写远程调用方法
1,编写被远程调用的方法,就是写好的普通请求方法。此处是在naisimall-coupon模块里
@RestController
@RequestMapping("coupon/spubounds")
public class SpuBoundsController {
@Autowired
private SpuBoundsService spuBoundsService;
@RequestMapping("/list")
public R list() {
PageUtils page = spuBoundsService.list();
return R.ok().put("page", page);
}
}
2,编写远程调用的接口,此处是在naisimall-product模块里,
==(1),首先编写远程调用的接口==
在feign包下新建接口
@FeignClient("naisimall-coupon") //此处填写远程调用的服务名,和配置文件匹配
public interface CouponFeignService {
//路径填写完全,和被调用接口有点不太一样
@PostMapping("/coupon/spubounds/list")
public R list();
}
3,编写远程调用的方法,此处是在naisimall-product模块里,
@RestController
@RequestMapping("product/attr")
public class AttrController {
//注入编写好的远程调用接口CouponFeignService
@Autowired
CouponFeignService couponFeignService;
@RequestMapping("/list")
public R list() {
//远程调用CouponFeignService
PageUtils page = couponFeignService.list();
return R.ok().put("page", page);
}
}
四,注意事项
1,服务一定要注册在nacos注册中心,且服务名要和项目中的对应上 2,该使用的注解一定不要少,主要在启动类上的注解 3,配置文件一定要填写完整 4,远程调用的接口,路径一定要写全,不可丢失,包括Controller类上注解标识的路径