一、 使用Feign实现远程HTTP调用
1、常见HTTP客户端
- HttpClient
HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 Http 协 议的客户端编程工具包,并且它支持 HTTP 协议最新版本和建议。HttpClient 相比传统 JDK 自带的 URLConnection,提升了易用性和灵活性,使客户端发送 HTTP 请求变得容易,提高了开发的效率。
- Okhttp
一个处理网络请求的开源项目,是安卓端最火的轻量级框架,由 Square 公司贡献,用于替代 HttpUrlConnection 和 Apache HttpClient。OkHttp 拥有简洁的 API、高效的性能,并支持多种协议 (HTTP/2 和 SPDY)。
- HttpURLConnection
HttpURLConnection 是 Java 的标准类,它继承自 URLConnection,可用于向指定网站发送 GET 请求、 POST 请求。HttpURLConnection 使用比较复杂,不像 HttpClient 那样容易使用。
- RestTemplate
RestTemplate 是 Spring 提供的用于访问 Rest 服务的客户端,RestTemplate 提供了多种便捷访问远程 HTTP 服务的方法,能够大大提高客户端的编写效率。
2、什么是Fegin
Feign是Netflix开源的声明式HTTP客户端
3、优点
Feign可以做到使用 HTTP 请求远程服务时就像调用本地方法一样的体验,开发者完全感知不到这是远程方 ,更感知不到这是个 HTTP 请求。
【Fegin和OpenFeign的区别:Spring Cloud openfeign对Feign进行了 增强,使其支持Spring MVC注解,另外还整合了Ribbon和Eureka,从而使得Feign的使用更加方便 】
4、架构图
5、重构以前的代码:
三板斧:
- 引入依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> 复制代码
- 写启动注解
- 增加配置
暂时没有配置 复制代码
- 进行改造
增加一个feign,他也是基于ribbon进行操作的,所以以前我们学的ribbon在这里也适用
package com.msb.order.feignclient; @FeignClient(name = "msb-stock") public interface StockFeignClient { @GetMapping("/stock/reduce/{productId}") String reduce(@PathVariable Integer productId); } 复制代码
package com.msb.order.controller; @Slf4j @RestController public class OrderController { @Autowired private StockFeignClient stockFeignClient; @GetMapping("/order/create") public String createOrder(Integer productId,Integer userId){ String reduce = stockFeignClient.reduce(productId); log.info("减库存成功:{}",reduce); return "下单成功"; } } 复制代码
我们在这里看一下我们启动了两个微服务,他们都发起了调用,也就feign后台实现了负载均衡。我们可以看一下他的继承关系,我们发现fegin里面有依赖了ribbon,所以他除了增强了我们springmvc注解,同时也整合我们的ribbon