OpenFeign
OpenFeifn也是服务调用与Ribbon相比简化了使用Spring cloud Ribbon时,自动封装服务调用客户端的开发量。Feign集成了Ribbon利用Ribbon维护了Payment的服务列表信息,并且通过轮询实现了客户端的负载均衡。而与Ribbon不同的是,通过feign只需要定义服务绑定接口且以声明式的方法,优雅而简单的实现了服务调用
使用方法
-
接口+注解: 微服务调用接口+@FeignClient
-
新建一个cloud-consumer-openFeign-order80消费端
-
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> <dependency><!-- 引入自己定义的api通用包,可以使用Payment支付Entity --> <groupId>com.cloud</groupId> <artifactId>cloud-api-commons</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <!--web--> <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> 复制代码
-
主启动类要加@EnableFeignClients
-
新建业务层接口PaymentFeignService接口并新增注解@FeignClient
这里抽象方法就对应服务接口@GetMapping("/payment/get/{id}")
@Component @FeignClient(value = "CLOUD-PAYMENT-SERVICE") public interface OpenFeignService { @GetMapping("/payment/get/{id}") public Result<Payment> getPaymentById(@PathVariable("id") Long id); } 复制代码
-
写控制层Controller 这就正常写
@RestController @Slf4j public class FeignController { @Resource private OpenFeignService openFeignService; @GetMapping(value = "/consumer/payment/get/{id}") public Result<Payment> getPaymentById(@PathVariable("id") Long id) { return openFeignService.getPaymentById(id); } } 复制代码
-
测试
启动7001->8001/8002->80
进行测试会发现OpenFeign自带负载均衡配置项,这是因为它也集成了ribbon包。
OpenFeign超时设置
-
故意让8001端口睡一会
@GetMapping(value = "/payment/feign/timeout") public String paymentFeignTimeOut() { System.out.println("*****paymentFeignTimeOut from port: "+port); //暂停几秒钟线程 try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); } return port; } 复制代码
-
测试一下
-
发现并没有找到接口报404,这是因为feign默认请求为1秒,而我们让程序睡了3秒用户等不了只能给他说没有这个请求,如果真遇到复杂程序就要我们手动调整一下最大时间上限.
这里我们调的ribbon的时间其实也都一样,因为feign已经集成了ribbon
ribbon: ReadTimeout: 5000 # 毫秒时间, 同feign的 ConnectTimeout: 5000 #, 同feign的 复制代码
-
再进行测试 会等待三秒才会得到数据
-
feign的配置
feign: client: config: default: // 这个代表 服务,default为任意服务,可以指定服务名来指定调用该服务时的超时时间 connectTimeout: 毫秒时间,建立连接的超时时间,一般只在发现服务时用到 readTimeout: 毫秒时间 ,接口请求的超时时间 复制代码
OpenFeign日志打印
-
Feign 提供了日志打印功能,我们可以通过配置来调整日志级别,从而了解 Feign 中 Http 请求的细节。说白了就是对Feign接口的调用情况进行监控和输出,现在接口少等以后接口多可以更好的维护。
-
配置类
@Configuration public class FeignConfig { @Bean Logger.Level feignLoggerLevel(){ return Logger.Level.FULL; } } 复制代码
-
yml配置
logging: level: # feign日志以什么级别监控 哪个接口 com.wzj.springcloud.service.OpenFeignService: debug 复制代码
-
启动测试
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层是不是更好理解点。