- 熟悉spring的都清楚,spring中bean只能是java对象才可以注入的。但是openfeign是接口。那么为什么他可以破坏spring的约定呢。文中告诉你。
申明式接口调用Feign,极大的简化了我们接口之间的调用。只需要通过注解就可以实现我们系统之间接口的调用。
关于分布式我们之前主要集中讨论了服务治理。eureka、consul、zookeeper我们分别从三个角度不同程度的学习了这三个框架的原理及区别。这些作为前期springcloud的重要组成部分是我们学习分布式不容忽视的章节。至于现在springcloud alibaba我们这里重头菜要留到最后。对springcloud alibaba感兴趣还请关注我后续会更新相关内容
简介
- Feign是一个申明式web接口调用的客户端,他基于注解式开发极大简化我们开发成本。
使用
- 他的到来是真的简化我们,在springcloud中与他整合也是非常的方便
pom引入
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--openfeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
复制代码
- 我们只需要引入openfeign,但是它依赖于服务注册中间件。我们这里选择springcloud初期推出服务治理也是我们第一课讨论的中间件-eureka。所以这里除了openfeign意外我们还引入了eureka。关于eureka的说明不了解可以到我的首页中查找。
启动类注入
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class,args);
}
}
复制代码
- 这是个标准的springboot启动程序,
- ①、
@SpringBootApplication
: springboot程序标识启动注解 - ②、
@EnableEurekaClient
: 前面我们也介绍了,开启eureka的相关配置 @EnableFeignClients
: 开启OpenFeign的相关配置
新建interface
- 在我们之前的案例中,我们有payment、order两个模块。OpenFeign使用在客户端上。所以这里我们在eureka章节的项目继续使用。
- 先启动eureka服务和payment服务,为了后面测试负载均衡我们这里也启动两个payment服务。
@FeignClient(value = "CLOUD-PAYMENT-SERVICE")
public interface OrderPaymentService {
@RequestMapping(value = "/payment/create" , method = RequestMethod.POST)
public ResultInfo createByOrder(Payment payment);
}
复制代码
- FeignClient中的内容是payment注册到eureka的服务名。这里需要注意下。
- 接口里我们只需要写对应方法。方法名不需要保持一致。只需要在@RequestMapping注解中请求接口和请求方式需要和payment中保持一致。
- 接口中的方法名不需要处理但是入参类型和payment需要保持一致。
调用
-
剩下就是我们在使用的地方,通过@Autowired等注解注入
OrderPaymentService
。然后就是普通的java方法调用。为了演示出负载均衡的效果。我们在payment方法中携带出端口信息。 -
效果读者可以自行测试,可以发现order服务的保存订单会负载均衡调用两个payment服务。和之前我们ribbon结合restTemplate调用效果是一样的。
-
OpenFeign依赖eureka服务发现。借助ribbon实现负载均衡,借助resttemplate进行接口调用。说到底还是我们常规的操作。
超时控制
- 为了保证调用方系统可用性,我们肯定不能让OpenFeign一直在等待提供方返回数据,向我们基于eureka实现的服务治理如果eureka给我们提供的地址因为网络问题卡顿,那么我么一直等待的话会造成使用效果降低。所以我们需要有一个超时控制。在常规的前后端开发调用接口也是有超时控制的。
- 我们在payment中新增一个timeout接口并在接口内部进行休眠5s.
- 然后在order端进行feign接口开发
-
然后我们调用order端的接口就会发现出现报错。并且报错信息就是超时错误。在feign中默认超时时间是1S 。
-
我们只需要在配置文件中配置ribbon的超时时间就可以了。
-
只加
ribbon.ReadTimeout
属性发现超时就可以生效。但是需要注意这里的超时时间尽量设置比接口真实超时时间大一点。因为中间还有网络延迟时间。如下图所示ribbon.ReadTimeout=6000,那么在接口中我们休眠时间建议在4S以下。
-
因为openfeign在构建的时候是基于Hystrix构建的。内部是有降级思想的。如果我们想开启hystrix我们可以通过
feign.hystrix.enabled=true 复制代码
来开启hystrix。
-
在ribbon中内置了hystrix的。hystrix是用来做服务熔断降级操作的。hystrix默认超时时间1S。ribbon的默认连接超时1S、默认操作请求1S。在第一次请求到服务端的时候Ribbon是需要进行连接验证的。所以在设置中
-
© 版权声明文章版权归作者所有,未经允许请勿转载。THE END