使用起因
之前我们利用了Nacos实现了服务的治理,利用RestTemplate实现了服务的远程调用。这样一来购物车虽然通过远程调用实现了调用商品服务的方法,但是远程调用的代码太复杂了:
解决方法
并且这种调用方式比较复杂,一会儿远程调用,一会儿本地调用。
因此,我们改变并优化远程调用的代码,让远程调用像本地方法调用一样简单。而这就要用到OpenFeign组件了。
其实远程调用的关键点就在于四个:
请求方式
请求路径
请求参数
返回值类型
所以我们使用OpenFeign只需要利用SpringMVC的相关注解来声明上述4个参数,然后OpenFeign基于动态代理帮我们生成远程调用的代码,我们就不用在写那繁琐的代码了,直接调用它帮我们生成的代码就行了,非常方便
快速上手
1.导入依赖
<!--openFeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!--负载均衡器-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
2.启用OpenFeign
在cart-service的CartApplication启动类上添加注解,表示开启OpenFeign功能
3.编写OpenFeign客户端
代码如下:
package com.hmall.api.client;
import com.hmall.api.dto.ItemDTO;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.Collection;
import java.util.List;
// 远程调用商品服务
@FeignClient(name = "item-service")
public interface ItemClient {
@GetMapping("/items")
List<ItemDTO> queryItemsByIds(@RequestParam("ids") Collection<Long> ids);
}
这里只需要声明接口,不用实现方法。接口中的注解解释:
@FeignClient("item-service"):声明服务名称
@GetMapping("/items"):声明请求路径
@RequestParam("ids") Collection<Long> ids:声明请求参数
List<ItemDTO>:返回值类型
有了上面接口后,我们只需要调用这个方法,就可以实现远程调用了
4.使用FeignClient
最后我们在cart-service的CartServiceImpl中修改代码,直接调用ItemClient的方法即可:
OpenFeign替我们完成了服务拉取、负载均衡、发送http请求的所有工作
而且,这里我们不再需要RestTemplate了,还省去了RestTemplate的注册