SpringCloud Alibaba 【四】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项目接口调用成功。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值