一、 OpenFeign简介
1. Feign是一个声明式的Web Service客户端
。它的出现使开发Web Service客户端变得很简单。使用Feign只需要创建一个接口加上对应的注解,比如:FeignClient注解。Feign有可插拔的注解,包括Feign注解和JAX-RS注解。
Feign也支持编码器和解码器,Spring Cloud Open Feign对Feign进行增强支持Spring MVC注解,可以像Spring Web一样使用HttpMessageConverters等。
Feign是一种声明式、模板化的HTTP客户端。在Spring Cloud中使用Feign,可以做到使用HTTP请求访问远程服务,就像调用本地方法一样的,开发者完全感知不到这是在调用远程方法,更感知不到在访问HTTP请求。
1.引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2.开启远程调用功能
@EnableFeignClients //激活启用
@EnableDiscoveryClient
@SpringBootApplication
public class GulimallUserApplication {
public static void main(String[] args) {
SpringApplication.run(GulimallUserApplication.class, args);
}
}
3.配置文件:设置超时时间
server:
port: 80
spring:
application:
name: cloud-order-service
eureka:
client:
register-with-eureka: false # 表示不向注册中心注册自己
fetch-registry: true #是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,但是集群必须设置为true才能配合ribbon使用负载
service-url:
# 设置eureka地址
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
# 设置feign客户端超时时间(openFeign默认支持ribbon)
ribbon:
# 建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间
ReadTimeout: 5000
# 建立连接后从服务器读取到可用资源所用的时间
ConnectTimeout: 5000
4.声明远程调用接口
调用端的Service接口:
@FeignClient(value = "gulimall-order") //参数为调用的远程微服务的注册中心显示的名字
public interface OrderFeignService {
//完整的访问路径
@RequestMapping("order/order/list")
public R list(@RequestParam Map<String, Object> params);
}
5.直接注入使用
@RestController
@RequestMapping("user/member")
public class MemberController {
@Autowired
private MemberService memberService;
@Autowired
private OrderFeignService orderFeignService;
/**
* 信息
*/
@RequestMapping("/info/{id}")
// @RequiresPermissions("user:member:info")
public R info(@PathVariable("id") Long id){
MemberEntity member = memberService.getById(id);
//查询用户订单
Map<String,Object> params = new HashMap<>();
params.put("memberId",id);
R order = orderFeignService.list(params);
Map<String,Object> map = (Map<String, Object>) order.get("page");
List<Object> list = (List<Object>) map.get("list");
return R.ok().put("member", member).put("orders",list);
}
}