前面我们已经讲了服务注册的Eureka,Zookeeper,Consult,以及调用部分的的Ribbon和LoadBalancer,现在我们将学习服务调用的第二部分组件,Feign和OpenFeign,由于Feign已经停更了,我们直接进入OpenFeign的学习。
1.OpenFeign的简介
1.1 Feign与OpenFeign简介
官网文档:OpenFeign官网文档
Feign是Netflix开发的声明式、模板化的HTTP客户端, Feign可以帮助我们更快捷、优雅地调用HTTP API。
Spring Cloud对Feign进行了增强,使Feign支持了Spring MVC注解,并整合了Ribbon和Eureka,从而让Feign的使用更加方便。
1.2 Feign能干什么
简单来说,Feign定义服务调用的接口,通过注解即可绑定服务提供方的接口,让不同微服务方便的共用一套服务调用的模板。后面我们将通过code来深入理解。
2 OpenFeign的使用
2.1 服务架构
2.2 OpenFeign的使用步骤
2.3 建模块
新建模块cloud-consumer-feign-order80
2.4 写Pom
<dependencies> <!-- openfeign --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <!-- eureka-client --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <!-- 引用自己定义的api通用包,可以使用Payment支付Entity --> <dependency> <groupId>com.wangzhou.springcloud</groupId> <artifactId>cloud-api-commons</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!--热部署--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
在idea右上角可以看到80服务的maven依赖,发现果然eureka,ribbon,hystrix等依赖都被一并导入进来了。
2.5 application.yml
server: port: 80 eureka: client: register-with-eureka: true service-url: #defaultZone: http://eureka7001.com:7001/eureka defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
2.6 主启动
@SpringBootApplication @EnableFeignClients //激活并开启OpenFeign public class OrderMainFeign80 { public static void main(String[] args) { new SpringApplication(OrderMainFeign80.class).run(args); } }
2.7 业务类
(1)service
在springcloud包下新建service.PaymentFeignService接口
(业务逻辑接口+@FeignClient配置调用provider服务。)
新建PaymentFeignService接口并新增注解@FeignClient
@Component @FeignClient(value = "CLOUD-PAYMENT-SERVICE") // 告知Feign要去Eureka上找名字为cloud-payment-service的微服务 public interface PaymentFeignService { // 下面的接口与8001服务端保持一致,我们可以直接去copy @GetMapping(value = "/payment/get/{id}")// value值为调用地址 public CommonResult getPaymentById(@PathVariable("id")Long id); }
发现没有,现在service只需要写接口+使用注解即可,很清爽。
(2)Controller
controller暴露下接口,调用下service就大功告成。
@Slf4j @RestController public class PaymentFeignController { //@Resource和@Autowired注解都是用来实现依赖注入的。 // 只是@AutoWried按by type自动注入,而@Resource默认按byName自动注入。 @Resource private PaymentFeignService paymentFeignService; @GetMapping("/consumer/payment/get/{id}") public CommonResult<Payment> getPayment(@PathVariable("id")Long id){ log.info("********查询的id:" + id); return paymentFeignService.getPaymentById(id); } }
2.8 测试
依次启动7001,7002Eureka集群,8001,8002服务提供者支付微服务集群,最后启动服务调用者订单模块OrderMainFeign80.
访问:http://localhost/consumer/payment/get/1
完活。
2.9 总结
再回过头来领悟下OpenFeign是怎么实现服务调用的:接口+注解。简单不?
3 OpenFeign的超时机制
在8001,8002的cotroller中增加如下接口。
@GetMapping("feign/timeout") public String paymentTimeout() throws InterruptedException { TimeUnit.SECONDS.sleep(3); return serverPort; }
改造下controller启动各个微服务后,再访问http://localhost:8001/payment/feign/timeout自测下。
再访问:http://localhost/consumer/payment/feign/timeout,宝子注意看: Read timed out executing GET http://CLOUD-PAYMENT-SERVICE/payment/feign/timeout!!!
我们可以通过配置来改变其超时等待时间。在80的yml中添加。
#没提示不管它,可以设置 ribbon: #指的是建立连接后从服务器读取到可用资源所用的时间 ReadTimeout: 5000 #指的是建立连接使用的时间,适用于网络状况正常的情况下,两端连接所用的时间 ConnectTimeout: 5000
再测试即可。
4 OpenFeign的日志增强
OpenFeign可用进行日志增强,查看
其日志级别如下。
步骤
配置日志bean
在80的springcloud包下新建config.FeignConfig
import feign.Logger; //不要导错包 @Configuration public class FeignConfig { @Bean Logger.Level feignLoggerLevel(){ //打印最详细的日志 return Logger.Level.FULL; } }
在80的yml文件中添加:
#开启日志的feign客户端 logging: level: #feign日志以什么级别监控哪个接口 com.achang.springcloud.service.PaymentFeignService: debug #写你们自己的包名