Spring-cloud学习笔记— Feign的简介及应用配置
1. RestTemplate远程调⽤的不便之处
- 服务消费者调⽤服务提供者的时候使⽤
RestTemplate技术
,这个技术存在不便之处
不便之处有以下几种
- 拼接url
- restTmplate.getForObJect
- 这两处代码都⽐较模板化,能不能不让我我们来写这种模板化的东⻄,另外来说
- 拼接url⾮常的low,拼接字符串,拼接参数,很low还容易出错
2. Feign的简介
Feign
是Netflix开发的⼀个轻量级RESTful的HTTP服务客户端(⽤它来发起请求,远程调⽤的)Feign
是以Java接⼝注解的⽅式调⽤Http请求,⽽不⽤像Java中通过封装HTTP请求报⽂的⽅式直接调⽤Feign
被⼴泛应⽤在Spring Cloud 的解决⽅案中类似于Dubbo
,服务消费者拿到服务提供者的接⼝,然后像调⽤本地接⼝⽅法⼀样去调⽤,实际发出的是远程的请求。Feign可帮助我们更加便捷,优雅的调⽤HTTP API
:不需要我们去拼接url然后调⽤restTemplate的api,在SpringCloud中,使⽤Feign⾮常简单创建⼀个接⼝(在消费者--服务调⽤⽅这⼀端)
,并在接⼝上添加⼀些注解,代码就完成了SpringCloud对Feign进⾏了增强
,使Feign⽀持了SpringMVC注解,就是OpenFeign
2-1. 本质: 封装了Http调⽤流程,更符合⾯向接⼝化的编程习惯,类似于Dubbo的服务调⽤
2-2. Dubbo 的调⽤⽅式其实就是很好的⾯向接⼝编程
3. Feign的配置应用
- 在
服务调⽤者⼯程
(消费者)创建接⼝(添加注解) - (效果)
Feign
= RestTemplate+Ribbon+Hystrix - 引入
jar包
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
服务调⽤者⼯程
(消费者)(⾃动投递微服务)启动类使⽤注解@EnableFeignClients
添加Feign
⽀持,此时去掉Hystrix熔断
的⽀持注解@EnableCircuitBreaker
即可包括引⼊的依赖,因为Feign
会⾃动引⼊@SpringBootApplication @EnableDiscoveryClient // 开启服务发现 @EnableFeignClients // 开启Feign public class AutodeliverFeignApplication8092 { public static void main(String[] args) { SpringApplication.run(AutodeliverFeignApplication8092.class,args); } }
- 由于
Feign
也类似于dubbo
,所以先创建Feign
接口@SpringBootApplication @EnableDiscoveryClient @EnableFeignClients public class AutodeliverApplication { public static void main(String[] args) { SpringApplication.run(AutodeliverApplication.class, args); } }
- 创建
Feign
接⼝/** * 原来:http://lagou-service-resume/resume/openstate/ + userId; * @FeignClient表明当前类是一个Feign客户端 * value指定该客户端要请求的服务名称(登记到注册中心上的服务提供者的服务名称) */ @FeignClient(value = "lagou-service-resume") @RequestMapping("/resume") public interface ResumeServiceFeignClient { /** * Feign要做的事情就是,拼装url发起请求 * 我们调用该方法就是调用本地接口方法,那么实际上做的是远程请求 * @param userId * @return */ @GetMapping("/openstate/{userId}") public Integer findDefaultResumeState(@PathVariable("userId") Long userId);
@FeignClient
注解的name
属性⽤于指定要调⽤的服务提供者名称,和服务提供者yml
⽂件中spring.application.name
保持⼀致接⼝中的接⼝⽅法
,就好⽐是远程服务提供者Controller
中的Hander
⽅法(只不过如同本地调⽤了),那么在进⾏参数绑定的时,可以使⽤@PathVariable
、@RequestParam
、@RequestHeader
等,这也是OpenFeign
对SpringMVC
注解的⽀持,但是需要注意value
必须设置,否则会抛出异常使⽤接⼝中⽅法完成远程调⽤
(注⼊接⼝即可,实际注⼊的是接⼝的实现)@RestController @RequestMapping("/autodeliver") public class AutodeliverController { @Autowired private ResumeServiceFeignClient resumeServiceFeignClient; @GetMapping("/checkState/{userId}") public Integer findResumeOpenState(@PathVariable Long userId) { Integer defaultResumeState = resumeServiceFeignClient.findDefaultResumeState(userId); return defaultResumeState; } }