Openfeign配置与使用
- 前言
- 介绍openfeign
- 使用openfeign
- 导入依赖
- 启动类
- 正式使用
- 测试结果
前言
在springcloud中消费者项目需要调用提供者项目的接口,一开始用的是RestTemplate中的方法。但是RestTemplate进行远程调用时,直接调用controller层的接口,不符合分层的习惯,一般习惯在controller从调用service的接口。
介绍openfeign
Openfeign是springcloud提供的一个声明式http客户端,它使得调用远程服务就想调用本地服务一样,只需要创建一个接口并添加一个注解即可。
feign的负责均衡默认集成了ribbon,所以在nacos下使用feign,默认实现了负载均衡。
使用openfeign
测试时,我们在消费者项目中调用提供者项目的端口。依赖和启动类中的注解,在两个子项目中都需要。
导入依赖
我用的springcloud alibaba的版本是2.2.6.RELEASE
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.2.0.RELEASE</version>
</dependency>
启动类
在启动类中增加注解@EnableFeignClients
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class StartNacosProvider {
public static void main(String[] args) throws Exception {
SpringApplication.run(StartNacosProvider.class, args);
}
}
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class StartNacosConsumer {
public static void main(String[] args) throws Exception {
SpringApplication.run(StartNacosConsumer.class, args);
}
}
正式使用
在消费者项目中调用提供者的controller接口,所以我们在消费者项目中写feign相关的接口。新建一个feign文件夹,在里面新增一个interface类。
@FeignClient(value = "nacos-provider")
public interface ConsumerFeign {
@RequestMapping(value = "/nacos/provider/get/{id}",method = RequestMethod.GET)
public String getNacosProvider(@PathVariable Integer id);
}
下面来解释一下
1)
@FeignClient(value = "nacos-provider")
nacos-provider 为提供者项目在nacos注册中心中注册的项目名称
2)
@RequestMapping(value = "/nacos/provider/get/{id}",method = RequestMethod.GET)
public String getNacosProvider(@PathVariable Integer id);
为需要调用的提供者项目中的controller层接口。在提供者项目中该接口在controller层是这么写的
@RequestMapping(value = "/nacos/provider/get/{id}",method = RequestMethod.GET)
public String getNacosProvider(@PathVariable Integer id){
return "使用provider中的方法,端口号:"+port+",传来参数:"+id;
}
在消费者项目的controller就可以实现上面所写的接口。springcloud会为ConsumerFeign接口类生成一个代理实现类,不需要人为创建。
@RestController
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
@Autowired
private ConsumerFeign consumerFeign;
// 使用RestTemplate调用provider项目接口
@RequestMapping(value = "/nacos/consumer/get/{id}",method = RequestMethod.GET)
public String getNacosConsumer(@PathVariable Integer id){
return restTemplate.getForObject("http://nacos-provider/nacos/provider/get/"+id,String.class);
}
// 使用feign调用provider项目接口
@RequestMapping(value = "/nacos/consumer/feign/get/{id}",method = RequestMethod.GET)
public String getNacosConsumerFeign(@PathVariable Integer id){
return consumerFeign.getNacosProvider(id);
}
}
provider项目中被调用的controller层接口
@RequestMapping(value = "/nacos/provider/get/{id}",method = RequestMethod.GET)
public String getNacosProvider(@PathVariable Integer id){
return "使用provider中的方法,端口号:"+port+",传来参数:"+id;
}
测试结果
可以看到,我调用的是consumer项目中的接口,而实际输出结果显示,调用provider项目接口调用成功。