SpringCloud Feign使用

 

SpringCloud Feign使用

一,Feign简介

Feign是Netflix开发的⼀个轻量级RESTful的HTTP服务客户端(⽤它来发起请求,远程调⽤的),是以Java接⼝注解的⽅式调⽤Http请求,⽽不⽤像Java中通过封装HTTP请求报⽂的⽅式直接调⽤,Feign被⼴泛应⽤在Spring Cloud 的解决⽅案中。类似于Dubbo,服务消费者拿到服务提供者的接⼝,然后像调⽤本地接⼝⽅法⼀样去调⽤,实际发出的是远程的请求。

Feign可帮助我们更加便捷,优雅的调⽤HTTP API:不需要我们去拼接url然后调⽤restTemplate的api,在SpringCloud中,使⽤Feign⾮常简单,创建⼀个接⼝(在消费者–服务调⽤⽅这⼀端),并在接⼝上添加⼀些注解,代码就完成了。

SpringCloud对Feign进⾏了增强,使Feign⽀持了SpringMVC注解(OpenFeign),本质:封装了Http调⽤流程,更符合⾯向接⼝化的编程习惯,类似于Dubbo的服务调⽤,Dubbo的调⽤⽅式其实就是很好的⾯向接⼝编程。

二,Feign配置应用

1,服务消费者⼯程中引⼊Feign依赖

<dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

  

2,服务消费者⼯程启动类使⽤注解@EnableFeignClients添加Feign⽀持

@SpringBootApplication
@EnableDiscoveryClient //开启服务发现,注册到注册中心
@EnableFeignClients("com.lagou.edu") //实现远程调用,指定远程包
public class FrontApplication {
    public static void main(String[] args){
        SpringApplication.run(FrontApplication.class,args);
    }
}

 

注意:此时去掉Hystrix熔断的⽀持注解@EnableCircuitBreaker即可包括引⼊的
依赖,因为Feign会⾃动引⼊。Feign = RestTemplate+Ribbon+Hystrix

3,创建Feign接⼝

name:调⽤的服务名称,和服务提供者yml⽂件中spring.application.name保持⼀致
path: 定义当前FeignClient的统一前缀
@FeignClient(name = "edu-ad-boot",path = "/ad")
public interface AdRemoteService {
    调用请求路径
    @GetMapping("/space/getAllSpace")
    List<PromotionSpaceDTO> getAllSpace();
    @GetMapping("/space/getSpaceById/{spaceId}")
    PromotionSpaceDTO getSpaceById(@PathVariable(value = "spaceId") int id);
}

 

服务提供者信息:
在这里插入图片描述


在这里插入图片描述

注意:
1)@FeignClient注解的name属性⽤于指定要调⽤的服务提供者名称,和服务
提供者yml⽂件中spring.application.name保持⼀致
2)接⼝中的接⼝⽅法,就好⽐是远程服务提供者Controller中的Hander⽅法
(只不过如同本地调⽤了),那么在进⾏参数绑定的时,可以使⽤
@PathVariable、@RequestParam、@RequestHeader等,这也是OpenFeign
对SpringMVC注解的⽀持,但是需要注意value必须设置,否则会抛出异常

4,调用接口,测试时候可以调用成功

@RestController
@RequestMapping("/ad")
public class AdController {
    @Autowired
    private AdRemoteService adRemoteService;

    @RequestMapping("/space/getAllSpace")
    public ResponseDTO getAllSpace(){
        List<PromotionSpaceDTO> allSpace = adRemoteService.getAllSpace();
        return ResponseDTO.success(allSpace);
    }
}

 

在这里插入图片描述

5,整个测试项目结构

在这里插入图片描述
impl是实现,api是接口供外部调用。impl的controller中方法定义完后,在api中定义对应接口,然后执行install打一个jar包引入impl中,impl定义一个remote文件夹处理远程调用,实现远程调用接口,新起一个boss项目,加入远程调用feign的依赖,加入api的依赖。直接调用api接口路径配置保持一致,调用测试成功。

 
 
posted @ 2023-02-16 09:47  百合叶  阅读(106)  评论(0编辑  收藏  举报