OpenFeign
OpenFeifn也是服务调用与Ribbon相比简化了使用Spring cloud Ribbon时,自动封装服务调用客户端的开发量。Feign集成了Ribbon利用Ribbon维护了Payment的服务列表信息,并且通过轮询实现了客户端的负载均衡。而与Ribbon不同的是,通过feign只需要定义服务绑定接口且以声明式的方法,优雅而简单的实现了服务调用
使用方法
- 接口+注解: 微服务调用接口+@FeignClient
- 新建一个cloud-consumer-openFeign-order80消费端
- pom
1 | xml复制代码<dependencies> |
- 主启动类要加@EnableFeignClients
- 新建业务层接口PaymentFeignService接口并新增注解@FeignClient
这里抽象方法就对应服务接口@GetMapping(“/payment/get/{id}”)
1 | java复制代码@Component |
- 写控制层Controller 这就正常写
1 | java复制代码@RestController |
- 测试
启动7001->8001/8002->80
进行测试会发现OpenFeign自带负载均衡配置项,这是因为它也集成了ribbon包。
OpenFeign超时设置
- 故意让8001端口睡一会
1 | java复制代码 @GetMapping(value = "/payment/feign/timeout") |
- 测试一下
- 发现并没有找到接口报404,这是因为feign默认请求为1秒,而我们让程序睡了3秒用户等不了只能给他说没有这个请求,如果真遇到复杂程序就要我们手动调整一下最大时间上限.
这里我们调的ribbon的时间其实也都一样,因为feign已经集成了ribbon
1 | yml复制代码ribbon: |
- 再进行测试 会等待三秒才会得到数据
- feign的配置
1 | yml复制代码feign: |
OpenFeign日志打印
- Feign 提供了日志打印功能,我们可以通过配置来调整日志级别,从而了解 Feign 中 Http 请求的细节。说白了就是对Feign接口的调用情况进行监控和输出,现在接口少等以后接口多可以更好的维护。
- 配置类
1 | java复制代码@Configuration |
- yml配置
1 | java复制代码logging: |
- 启动测试
openfeign 和 feign
Feign 是Spring Cloud组件中的一个轻量级RESTful的HTTP服务客户端Feign内置了Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务。Feign的使用方式是:使用Feign的注解定义接口,调用这个接口,就可以调用服务注册中心的服务。OpenFeign是Spring Cloud 在Feign的基础上支持了SpringMVC的注解,如@RequesMapping等等。OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。 org.springframework.cloud spring-cloud-starter-feign org.springframework.cloud spring-cloud-starter-openfeign
Feign | OpenFeign |
---|---|
是Spring Cloud组件中的一个轻量级RESTful的HTTP服务客户端Feign内置了Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务。 | 是Spring Cloud 在Feign的基础上支持了SpringMVC的注解,如@RequesMapping等等。 |
Feign的使用方式是:使用Feign的注解定义接口,调用这个接口,就可以调用服务注册中心的服务。 | OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。 |
org.springframework.cloud spring-cloud-starter-feign | org.springframework.cloud spring-cloud-starter-openfeign |
为什么有Ribbon又出现OpenFeig呢?
为了方便,让程序写起来更有逻辑。比如我们之前用Ribbon+RestTemplate方式去获得暴露的端口,我们是直接在Controller中进行的,而代码写起来也不是很顺畅的对吧。而我们之前写代码是怎么样的?是不是刚开始学时老师就强调dao-service-controller,但是你用了是不是就没办法调用service是不是违背了本来的意愿其实也没那么严重。这是OpenFeign就出现了,他封装了Ribbon只是在接口成用注解进行完成操作,是不是方便很多写起来更加方便了。这里理解为8001的controller接口为80端的serviceImpl或者dao层是不是更好理解点。
本文转载自: 掘金