#### 服务调用Feign
- 场景举例
> 项目拆分成订单服务,库存服务,积分服务等,现在订单服务确实知道库存服务、积分服务、在哪里了,同时也监听着哪些端口号了。**但是新问题又来了:难道订单服务要自己写一大堆代码,跟其他服务建立网络连接,然后构造一个复杂的请求,接着发送请求过去,最后对返回的响应结果再写一大堆代码来处理吗?**
- 以前的远程调用方式
![](https://box.kancloud.cn/02f1f7ec8392a601ab7a8a0fd0d461e1_781x553.png)
> 使用Feign可以简化很多,它底层封装好了轮子
- 首先引入依赖
```
<dependency>
<groupId>com.dg</groupId>
<artifactId>sc-common-lib</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- Eureka客户端服务注册 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- 服务调用 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- Web应用支持-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 国际化模板-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
```
- 定义接口 ProductFeignClient.java
```
@FeignClient(value = "sc-eureka-client")
public interface ProductFeignClient {
@GetMapping("/products")
List<Product> listProducts();
}
```
- 定义Controller进行测试
```
@Controller
public class ProductController {
@Autowired
ProductFeignClient productFeignClient;
@RequestMapping("/products")
public Object products(Model m) {
List<Product> ps = productFeignClient.listProducts();
m.addAttribute("ps", ps);
m.addAttribute("version", 1.0);
return "products";
}
}
```
- 浏览器测试调用结果,结果正确,远程调用成功
![](https://box.kancloud.cn/08f7717d519c6f41772ad3382c985ce2_1024x238.png)