简介:
OpenFeign集成了Ribbon,Ribbon又集成了eureka,通过OpenFeign基于注解可以快速简单的开发服务客户端,并完成服务发现和客户端负载均衡。
总结:
1)OpenFeign是实现服务调用及负载均衡的。
2)OpenFeign底层封装了ribbon – 底层还是靠ribbon完成,但是不再直面ribbon。
3)OpenFeign主要是通过一套注解来玩,简单 快速。
使用:
第一步:pom文件:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
第二步:调用方主启动类上添加注解@EnableFeignClients
//表示由OpenFeign管理当前客户端 --- 由OpenFeign管理当前服务发出的远程(服务)调用的请求 @EnableFeignClients //标记eureka客户端 @EnableEurekaClient @SpringBootApplication public class ServiceCApplication { public static void main(String[] args) { SpringApplication.run(ServiceCApplication.class, args); } }
第三步:定义Feign接口,接口上添加@FeignClient注解
/* 3.定义feign接口: 1)标注@FeignClient注解的接口称为feign接口;value属性的值给出需要调用的服务的主机名 2)目的:是指定调用的服务以及服务的接口 1]@FeignClient注解的value属性指定调用的服务名 2]服务的接口通过feign接口中的方法签名指定; */ @FeignClient(value = "service-d") public interface ServiceCServiceDFeign { /* 定义被调用服务的url接口的方法签名: 跟被调用服务的url接口的方法一模一样(修饰符 返回值类型 参数 注解), 仅仅是没有方法体; ---------------------------------------------------------- 该方法签名就表示service-c服务要调用service-d服务的/hello接口 */ @RequestMapping("/hello") public String hello(); }
第四步:在浏览器访问的服务器的controller中注入该接口
/* 4.注入feign接口: */ @Autowired private ServiceCServiceDFeign serviceCServiceDFeign; //url接口/doHello @RequestMapping("/doHello") public String doHello(){ //5.在消费者服务的url接口中通过调用feign的方法签名,实现对被调用服务的url接口的访问 String result = serviceCServiceDFeign.hello(); return result; }
补充:
#ribbon默认请求超时时长为1s,在配置文件中通过ribbon.ReadTimeout属性和ribbon.ConnectTimeout属性可以修改 #设置请求超时时长为3秒 ribbon.ReadTimeout=3000 #设置连接超时时长也为3秒 ribbon.ConnectTime=3000
OpenFeign的负载均衡默认为轮询方式 修改方式参考Ribbon的修改方式
实现机制:
1)OpenFeign通过反射机制为feign接口创建出一个代理对象
2)拿到feign接口上的@FeignClient注解的value值,解析出url:http://order-service
3)拿到feign接口中的方法签名上的@RequestMapping注解,解析出url:http://order-service/doOrder
4)将解析出的url交给ribbon
5)ribbon截取出url地址中的服务名
6)从服务列表中找到该名称的服务的实例集合(服务发现)
7)根据负载均衡算法选出一个实例(默认是轮询算法)
8)拿到该实例的ip和port,替换原来url中的服务名
9)发送真正的请求:restTemplate.getForObject(“http://ip:port/doOrder”, String.class)
关于传参:
OpenFeign调用传参,需确保提供者服务的请求处理方法和消费者服务的feign接口的方法签名保持一致,包括方法名、参数列表、返回值类型、使用的注解、请求url。
- GET请求,通过URL占位符传参(路径参数),参数列表使用@PathVariable。
- GET请求,每个基本参数必须加@RequestParam。
- POST请求,对象集合等参数,必须加@Requestbody(json)或者@RequestParam(普通方式)。
日志配置:
向容器中添加枚举Logger.Level的枚举值,开启OpenFeign的日志功能。
其有四个值:
NONE:默认的,不显示日志。
BASE:仅记录请求方法、URL、响应状态码及执行时间。
HEADERS:在BASE之上增加了请求和响应头的信息。
FULL:在HEADERS之上增加了请求和响应的正文及无数据,即所有信息。
在配置文件中通过logging.level.feign接口完整类路径设置日志级别。
演示:
//第一步: /* 向容器中添加枚举Logger.Level的枚举值FULL,开启OpenFeign的日志功能, 并打印所有信息; */ @Bean public Logger.Level feignLogger(){ return Logger.Level.FULL; }
#第二步:设置日志级别为debug级别 logging.level.com.mmy.feign.UserOrderFeign=debug