• 微服务day04-基于Feign的远程调用


    一.Feign的认识

    是http客户端,因为使用RestTemplate存在一些问题:代码可读性差,参数配置费事,不够优雅…

    String url="http://userservice/user/"+order.getUserId();
    User user=restTemplate.getForObject(url,User.class);
    
    • 1
    • 2

    Feign是一个声明式的HTTP客户端,可以帮助我们发送更加方便的发送HTTP请求

    1.1 Feign的使用

    1.导入依赖
    在order-service中导入依赖

    	
        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-starter-openfeignartifactId>
        dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2.开启注解
    在oder-service启动类上加上注解@EnableFeignClients

    3.编写Feign客户端
    在cn.itcast.order包下添加接口clients.UserClient,在接口上添加注解@FeignClient(“userservice”),并且括号里边声明你要请求的服务,之后编写接口函数,类似Controller。

    @FeignClient("userservice")
    public interface UserClient {
    
        @GetMapping("/user/{id}")
        User findById(@PathVariable("id") Long id);
        
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    4.注释掉原来的RestTemplate相关代码,改造service中代码

    @Service
    public class OrderService {
    
        @Autowired
        private OrderMapper orderMapper;
    
        @Autowired
        private UserClient userClient;
    
    //    @Autowired
    //    private RestTemplate restTemplate;
    
        public Order queryOrderById(Long orderId) {
            // 1.查询订单
            Order order = orderMapper.findById(orderId);
            // 2.Feign远程调用
            User user=userClient.findById(order.getUserId());
            // 3.配置orderj
            order.setUser(user);
            // 4.返回
            return order;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    配置成功之后结果图:
    在这里插入图片描述

    1.2 自定义Feign配置

    Feign支持许多自定配置,比如:

    类型作用说明
    feign.Logger.Level修改日志级别包含四种不同的级别:NONE、BASIC、HEADERS、FULL
    feign.codec.Decoder响应结果的解析器http远程调用的结果做解析,例如解析json字符串为java对象
    feign.codec.Encoder请求参数编码将请求参数编码,便于通过http请求发送
    feign. Contract支持的注解格式默认是SpringMVC的注解
    feign. Retryer失败重试机制请求失败的重试机制,默认是没有,不过会使用Ribbon的重试

    配置日志方式一
    基于配置文件修改feign的日志级别可以针对单个服务:

    # feign日志级别配置
    feign:  
      client:
        config: 
          userservice: # 针对某个微服务的配置
            loggerLevel: FULL #  日志级别 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    也可以针对所有服务:

    # feign日志级别配置
    feign:
      client:
        config:
          default: # 针对全局的配置
            loggerLevel: FULL # FULL:这是最详细的日志级别,Feign 会输出所有请求和响应的详细信息
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    日志级别生效结果:
    在这里插入图片描述
    配置日志方式二
    也可以基于Java代码来修改日志级别,先声明一个类,然后声明一个Logger.Level的对象:

    public class DefaultFeignConfiguration  {
        @Bean
        public Logger.Level feignLogLevel(){
            return Logger.Level.BASIC; // 日志级别为BASIC
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    如果要全局生效,将其放到启动类的@EnableFeignClients这个注解中:

    @EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration .class) 
    
    • 1

    如果是局部生效,则把它放到对应的@FeignClient这个注解中:

    @FeignClient(value = "userservice", configuration = DefaultFeignConfiguration .class) 
    
    • 1

    比如:

    @FeignClient(value = "userservice", configuration = DefaultFeignConfiguration.class)
    public interface UserClient {
        @GetMapping("/user/{id}")
        User findById(@PathVariable("id") Long id);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    1.3 Feign性能调优

    Feign性能调优主要有2点:

    • 1.改变Feign的底层客户端实现

    • 2.改变Feign的日志级别为Basic/None*

    Feign底层发起http请求,依赖于其它的框架。其底层客户端实现包括:

    • URLConnection:默认实现,不支持连接池
    • Apache HttpClient :支持连接池
    • OKHttp:支持连接池

    因此提高Feign的性能主要手段就是使用连接池代替默认的URLConnection。

    1.1 在order-service的pom文件中引入Apache的HttpClient依赖:

    
    <dependency>
        <groupId>io.github.openfeigngroupId>
        <artifactId>feign-httpclientartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    1.2 配置连接池,在order-service的application.yml中添加配置:

    # feign自定义配置
    feign:
      client:
        config:
          default:
    #        loggerLevel: FULL
            loggerLevel: BASIC # 日志级别,BASIC就是基本的请求和响应信息
      httpclient:
        enabled: true # 开启feign对HttpClient的支持
        max-connections: 200 # 最大的连接数
        max-connections-per-route: 50 # 每个路径的最大连接数
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    1.4 Feign最佳实践分析

    由于Feign的客户端与服务提供者的controller代码非常相似,因此应当可以有某种办法简化这种代码的重复编写。
    在这里插入图片描述
    在这里插入图片描述
    有2种方式:

    • 定义API接口并基于springMVC注解做声明;(紧耦合不推荐)
    • 将Feign抽取成独立的模块,并把与接口有关的POJO,默认的Feign配置都放在这个模块中,提供给所有消费者使用(松耦合,推荐使用)。例如,将UserClient、User、Feign的默认配置都抽取到一个feign-api包中,所有微服务引用该依赖包,即可直接使用。

    Feign抽取成独立的模块实现方式:

    • 创建一个module,命名为feign-api,然后引入feign的starter依赖

    在这里插入图片描述

    <dependency>
        <groupId>org.springframework.cloudgroupId>
        <artifactId>spring-cloud-starter-openfeignartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 将order-service中的UserClient,User,DefaultFeignConfiguration移动到feign-api项目中

    在这里插入图片描述

    • 在order-service中引入feign-api的依赖
    <dependency>
        <groupId>cn.itcast.demogroupId>
        <artifactId>feign-apiartifactId>
        <version>1.0version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 修改order-service中与上述3个组件有关的import部分

    修改之后,发现UserClient对象爆红,提示“无法装配,未找到UserClient类型的Bean”,这是因为OrderApplication默认扫描cn.itcast.order下的包,而UserClient在被移动放到Feign-api模块之下,位于cn.itcast.feign包中,不会被OrderApplication扫描到,因而无法在spring容器中找到对应的Bean;
    在这里插入图片描述
    此时可以通过@EnableFeignClients(client=UserClient.class)(详细指定需要加载的Client接口)或者
    指定需要加载的Client接口@EnableFeignClients(basePackages = “cn.itcast.feign.clients”)(加载了整个包进来)

    • 启动order-servcie与user-service微服务,效果如下:

    在这里插入图片描述

  • 相关阅读:
    专业138+总分400+南航南京航空航天大学878考研经验电子信息与通信工程,真题,大纲,参考书
    传智杯第一届例题5
    MySQL识别不了中文怎么办?(适合新手)
    联邦学习概述与现状
    【kali-权限提升】(4.2.3)社会工程学工具包:二维码组合攻击
    数据库第二天 DML操作 DQL查询
    python知识点的一些归纳
    论坛介绍|COSCon'23 Web应用开发(W)
    无人机镜头稳定的原理和相关算法
    字典组件(前端使用)
  • 原文地址:https://blog.csdn.net/linjianshaonian_/article/details/136419156