当前位置:   article > 正文

OpenFeign微服务调用组件_微服务组件openfeigin

微服务组件openfeigin

1.Feign是什么

GitHub - OpenFeign/feign: Feign makes writing java http clients easiericon-default.png?t=N7T8https://github.com/OpenFeign/feign

Feign是Netflix开发的声明式、模板化的HTTP客户端, Feign可以帮助我们更快捷、优雅地调用HTTP API,目的是让编写HTTP接口的客户端变得更简洁和直接。

在Spring Cloud中,使用Feign非常简单——创建一个接口,并在接口上添加一些注解,代码就完成了。Feign支持多种注解,例如Feign自带的注解或者JAX-RS注解等。

Feign是一个声明式的Web服务客户端,让编写Web服务客户端变的更加容易。只需要创建一个接口并添加注解即可

优势:

Feign可以做到使用 HTTP 请求远程服务时就像调用本地方法一样的体验,开发者完全感知不到这是远程方法,更感知不到这是个 HTTP 请求,开发者无需关注与远程的交互细节,更无需关注分布式环境开发。

2.OpenFeign

Feign 和 OpenFeign 的区别(精简记忆版)?

1.支持spring mvc 注解

2.整合了更多的扩展 (请求重试策略、超时控制、请求拦截器

 3.Spring Cloud Alibaba快速整合OpenFeign

1)创建order-service模块提供服务

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-web</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>com.alibaba.cloud</groupId>
  7. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  8. </dependency>

application.properties配置

 controller文件

  1. package com.by.controller;
  2. import cn.by.heimidto.OrderQueryDTO;
  3. import cn.by.heimidto.OrderingDTO;
  4. import cn.by.heimidto.OrderingOkDTO;
  5. import cn.hutool.core.thread.ThreadUtil;
  6. import cn.hutool.core.util.StrUtil;
  7. import org.springframework.web.bind.annotation.*;
  8. import java.math.BigDecimal;
  9. import java.util.List;
  10. import java.util.stream.Collectors;
  11. @RestController
  12. @RequestMapping("/api/order")
  13. public class OrderController {
  14. @GetMapping("/ordering")
  15. public String ordering() {
  16. return "下单成功";
  17. }
  18. @GetMapping("/ordering2")
  19. public OrderingOkDTO ordering2() {
  20. OrderingOkDTO dto = OrderingOkDTO.builder().id(1L).needPay(new BigDecimal(1000)).build();
  21. return dto;
  22. }
  23. @PostMapping ("/ordering3")
  24. public OrderingOkDTO ordering3(@RequestBody OrderingDTO dto) {
  25. List<String> names = dto.getProducts().stream().map(product -> product.getName()).collect(Collectors.toList());
  26. String msg = StrUtil.join( ",", names);
  27. OrderingOkDTO orderingOkDTO = OrderingOkDTO.builder().id(1L).needPay(new BigDecimal(1000)).msg(msg).build();
  28. return orderingOkDTO;
  29. }
  30. @GetMapping ("/select")
  31. public String select(OrderQueryDTO dto) {
  32. String msg = StrUtil.EMPTY;
  33. if (dto.getId() != null) {
  34. msg = "根据Id查询成功:Id= " + dto.getId();
  35. }
  36. if (dto.getUserId() != null){
  37. msg = "根据userId查询成功:userId= " + dto.getUserId();
  38. }
  39. return msg;
  40. }
  41. @GetMapping ("/sleep")
  42. public String sleep(@RequestParam Integer time) {
  43. ThreadUtil.safeSleep(time*1000);
  44. String msg = "睡眠了 " + time + " 秒";
  45. return msg;
  46. }
  47. }

2)、创建user-service服务调用模块

1、引入依赖:
  1. <!-- openfeign 远程调用 -->
  2. <dependency>
  3. <groupId>org.springframework.cloud</groupId>
  4. <artifactId>spring-cloud-starter-openfeign</artifactId>
  5. </dependency>
2、编写调用接口+@FeignClient注解 并在启动类添加 @EnableFeignClients注解
  1. package com.by.feignservice;
  2. import cn.by.heimidto.OrderQueryDTO;
  3. import cn.by.heimidto.OrderingDTO;
  4. import cn.by.heimidto.OrderingOkDTO;
  5. import com.by.config.FeignConfig;
  6. import feign.RequestLine;
  7. import org.springframework.cloud.openfeign.FeignClient;
  8. import org.springframework.cloud.openfeign.SpringQueryMap;
  9. import org.springframework.web.bind.annotation.*;
  10. //@FeignClient(name = "order-service-app",configuration = FeignConfig.class) //针对一个配置 日志级别
  11. @FeignClient(name = "order-service-app")
  12. @RequestMapping("/api/order")
  13. public interface OrderService {
  14. @GetMapping("/ordering")
  15. String ordering();
  16. @GetMapping("/ordering2")
  17. OrderingOkDTO ordering2();
  18. @PostMapping("/ordering3")
  19. OrderingOkDTO ordering3(@RequestBody OrderingDTO dto);
  20. @GetMapping ("/select")
  21. public String select(@SpringQueryMap OrderQueryDTO dto);
  22. @GetMapping ("/sleep")
  23. String sleep(@RequestParam Integer time) ;
  24. }
3、发起调用,像调用本地方法一样调用远程服务
  1. package com.by.controller;
  2. import cn.by.heimidto.OrderQueryDTO;
  3. import cn.by.heimidto.OrderingDTO;
  4. import cn.by.heimidto.OrderingOkDTO;
  5. import cn.by.heimidto.ProductDTO;
  6. import com.by.feignservice.OrderService;
  7. import org.springframework.beans.factory.annotation.Autowired;
  8. import org.springframework.web.bind.annotation.GetMapping;
  9. import org.springframework.web.bind.annotation.RequestMapping;
  10. import org.springframework.web.bind.annotation.RestController;
  11. import org.springframework.web.client.RestTemplate;
  12. import java.util.ArrayList;
  13. import java.util.List;
  14. @RestController
  15. @RequestMapping("/api/user")
  16. public class UserController {
  17. @Autowired
  18. RestTemplate restTemplate;
  19. @Autowired
  20. OrderService orderService;
  21. @GetMapping("/sleep")
  22. public String sleep() {
  23. String sleep = orderService.sleep( 15);
  24. return sleep;
  25. }
  26. @GetMapping("/shopping")
  27. public String shopping() {
  28. String str = orderService.ordering();
  29. return "下单";
  30. }
  31. @GetMapping("/shopping2")
  32. public String shopping2() {
  33. OrderingOkDTO orderingOkDTO = orderService.ordering2();
  34. return "orderingOkDTO";
  35. }
  36. @GetMapping("/shopping3")
  37. public String shopping3() {
  38. List<ProductDTO> products = new ArrayList<>();
  39. products.add(new ProductDTO(1,"手机"));
  40. products.add(new ProductDTO(2,"su7"));
  41. OrderingDTO orderingDTO = new OrderingDTO();
  42. orderingDTO.setUserId(1);
  43. orderingDTO.setProducts(products);
  44. OrderingOkDTO orderingOkDTO = orderService.ordering3(orderingDTO);
  45. return " ";
  46. }
  47. @GetMapping("/order/select")
  48. public String orderSelect() {
  49. OrderQueryDTO orderQueryDTO = new OrderQueryDTO();
  50. orderQueryDTO.setId(1);
  51. String select = orderService.select(orderQueryDTO);
  52. return " ";
  53. }
  54. }

5)配置类

  1. package com.by.config;
  2. import feign.Logger;
  3. import feign.Request;
  4. import org.springframework.context.annotation.Bean;
  5. import org.springframework.context.annotation.Configuration;
  6. import java.util.concurrent.TimeUnit;
  7. @Configuration
  8. public class FeignConfig {
  9. //全局配置服务日志级别
  10. //@Bean
  11. Logger.Level feignLoggerLevel() {
  12. return Logger.Level.FULL;
  13. }
  14. //配置请求超时时间
  15. @Bean
  16. public Request.Options options() {
  17. return new Request.Options(10, TimeUnit.SECONDS, 20,TimeUnit.SECONDS,true);
  18. }
  19. }
  1. package com.by.config;
  2. import org.springframework.cloud.client.loadbalancer.LoadBalanced;
  3. import org.springframework.context.annotation.Bean;
  4. import org.springframework.context.annotation.Configuration;
  5. import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
  6. import org.springframework.web.client.RestTemplate;
  7. @Configuration
  8. public class RestTemplateConfig {
  9. @Bean
  10. @LoadBalanced
  11. public RestTemplate restTemplate(){
  12. RestTemplate restTemplate = new RestTemplate();
  13. restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory());
  14. return restTemplate;
  15. }
  16. }

6)用到的DTO

  1. @Data
  2. @AllArgsConstructor
  3. @NoArgsConstructor
  4. @Builder
  5. public class OrderQuery {
  6. private Integer id;
  7. private String name;
  8. }
  1. @Data
  2. @AllArgsConstructor
  3. @NoArgsConstructor
  4. @Builder
  5. public class OrderingDTO {
  6. private Long id;
  7. private BigDecimal needPay;
  8. }

7)Get 传递对象 使用@SpringQueryMap注解

 

 4.高级配置

Feign 提供了很多的扩展机制,让用户可以更加灵活的使用。

4.1 日志配置

有时候我们遇到 Bug,比如接口调用失败、参数没收到等问题,或者想看看调用性能,就需要配置 Feign 的日志了,以此让 Feign 把请求信息输出来。

Feign 提供了日志打印功能,我们可以通过配置来调整日志级别,从而了解 Feign 中 Http 请求的细节。说白了就是对Feign接口的调用情况进行监控和输出

通过源码可以看到日志等级有 4 种,分别是:

  • NONE【性能最佳,适用于生产】:不记录任何日志(默认值)。

  • BASIC【适用于生产环境追踪问题】:仅记录请求方法、URL、响应状态代码以及执行时间。

  • HEADERS:记录BASIC级别的基础上,记录请求和响应的header。

  • FULL【比较适用于开发及测试环境定位问题】:记录请求和响应的header、body和元数据

4.1.1 全局配置

注意一:此处配置@Configuration注解就会全局生效,如果想指定对应某一个服务生效,就不能配置.

注意二 因为feign调试日志是debug级别输出,springboot默认的日志级别是info,所以feign的debug日志级别就不会输出,一定要将调用服务的日志级别调为debug

logging.level.com.by=DEBUG
  1. @Configuration
  2. public class FeignConfig
  3. {
  4. @Bean
  5. Logger.Level feignLoggerLevel()
  6. {
  7. return Logger.Level.FULL;
  8. }
  9. }
 4.1.2 局部配置

局部配置,让调用的微服务生效,在@FeignClient 注解中指定使用的配置类

4.1.3 在配置文件配置 
  1. logging.level.com.beiyou = debug开启日志
  2. ##配置feign 的日志级别
  3. #-- default 全局配置
  4. feign.client.config.default.loggerLevel=NONE
  5. #-- nacos-a 具体服务名
  6. feign.client.config.nacos-a.loggerLevel=FULL

4.2 超时配置 

通过 Options 可以配置连接超时时间和读取超时时间

4.2.1 全局配置
  1. @Configurationpublic class FeignConfig {
  2. @Bean public Request.Options options() {
  3. return new Request.Options(10L, TimeUnit.SECONDS, 60L,TimeUnit.SECONDS,true);
  4. }}
4.2.2 配置文件中配置
  1. #全局配置feign.client.config.default.connectTimeout=5000
  2. feign.client.config.default.readTimeout=10000
  3. 这里default 是一个特殊的客户端名称,用于表示全局配置。设置 connectTimeout 和 readTimeout 属性的值来定义全局的连接超时时间和读取超时时间。
  4. #局部配置 请将 <clientName> 替换为实际的Feign客户端名称。feign.client.config.<clientName>.connectTimeout=5000
  5. feign.client.config.<clientName>.readTimeout=10000
  6. feign.client.config.order-service.connectTimeout=5000 # 连接超时时间,默认10s order-service: #对应微服务feign.client.config.order-service.readTimeout=10000 # 请求处理超时时间,默认60s

 补充说明: Feign的底层用的是Ribbon,但超时时间以Feign配置为准

04-OpenFeign-请求超时机制_openfeign.timeout-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/xcg340123/article/details/136021389

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/1005747
推荐阅读
相关标签
  

闽ICP备14008679号