http客户端Feign

Feign注册使用

Feign作用:用来代替RestTemplate,来调用远程服务的;
http客户端Feign_第1张图片
http客户端Feign_第2张图片

Fegin内部集成了负载均衡ribbon

http客户端Feign_第3张图片

Feign的使用步骤

http客户端Feign_第4张图片

1.先在主启动类中加@EnableFeignClients,声明开启Feign,可以调用其他服务

@EnableFeignClients(clients = UserClient.class,defaultConfiguration = DefaultFeignConfiguration.class)
//声明feign自动装配开关:开

2.pom.xml+openFeign依赖,因为自己使用Feign调用远程服务


  
        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-starter-openfeignartifactId>
        dependency>

3.创建声明一个Feign客户端,里面是调用远程服务的方法(需要声明被调用的服务是哪一个)

 
@FeignClient(name="userservice")//声明式Feign客户端,需要声明服务名
public interface UserClient {
 
    /**
     * 这里猜测是调用了用户服务的底层接口
     * 因为订单服务可以请求到用户服务
     * @param id
     * @return
     */
    @GetMapping("/user/{id}")
    User findById(@PathVariable("id") Long id);
}

Feign日志配置

个人认为目前阶段了解就好,因为默认就是NONE 不记录任何日志信息 对系统的性能优化是最大的

第一种:在yaml中进行日志配置

feign: # 配置日志
  client:
    config:
      default:
        loggerLevel: FULL # 日志级别,basic:就是基本的请求以及想要信息

第二种:使用java代码进行日志配置:
创建一个类,@Bean定义,并给@EnableFeignClients注解声明或者是给@FeignClient注解声明,前者是声明全局,后者是某个服务

package cn.itcast.order.config;
 
import feign.Logger;
import org.springframework.context.annotation.Bean;
 
/**
 * @author diao 2022/5/8
 */
public class DefaultFeignConfiguration {
    /**
     * 设置Feign日志级别
     * @return Logger.Level.BASIC日志级别
     */
    @Bean
    public Logger.Level logLevel(){
        return Logger.Level.BASIC;
    }
}

在主启动类中的@EnableFeignClients()声明默认的Configuration

 
@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
@EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration.class)//声明feign自动装配开关:开
public class OrderApplication {
 
    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }
 
    /**
     * 创建RestTemplate并且注入Spring容器
     * @return
     */
    @Bean
    @LoadBalanced//负载均衡
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
 
    /**
     * 负载均衡策略配置
     * @return
     */
//    @Bean
//    public IRule randomRule(){
//        return new RandomRule();
//    }
//
 
}

http客户端Feign_第5张图片

可以发现在yaml中配置日志配置,优先级大于java代码配置
http客户端Feign_第6张图片

Feign的性能优化

http客户端Feign_第7张图片

需要修改成支持连接池的模式,不然每次调用都要进行挥手连接,太占性能了

Feign客户端实现默认是URLConnection,是不支持连接池的,我们可以在yaml配置文件中修改Feign客户端实现——>HttpClient:

 
feign: # 配置日志
  httpclient:
    enabled: true #支持HttpClient开关
    max-connections: 200 #最大连接数
    max-connections-per-route: 50 #单个路径的对哒连接数

如果要配置Feign日志(针对某个服务,还是全局看你自己咯),这边建议自定义一个bean返回日志,然后再在@EnableFeignClient还是@EnableClient中配置默认配置类即可;

http客户端Feign_第8张图片

Feign最佳实践

方法一:

http客户端Feign_第9张图片

第一种不好的地方就是紧耦合,因为都是继承一个父接口,他一改动,剩下子类都要改动

方法二:

将FeignClient抽取出来,并把这个接口有关的pojo和Feign配置都放在一个单独的模块中,提供给消费者使用:(之前我们是一个消费者调用一个FeignClient,如果是多个消费者调用同一个提供者服务,那么FeignClient就要被重复启动多次)

作用:放在单独一个模块有利于减少代码冗余,任务减轻;
http客户端Feign_第10张图片
总结区别:

一个是服务者的controller和被调用的FeignClient用同一个接口,另外一个是Feign有关的全部放在一个模块中给服务者调用->方便其他的服务调用

个人认为第二种更好 第二种要注意的是要将fegin的软件包地址添加到消费者的启动类中 让其扫描到 @EnableFeignClients(clients = {UserClient.class})

http客户端Feign_第11张图片
http客户端Feign_第12张图片

你可能感兴趣的:(微服务,网络,feign,java)