微服务小结4---http客户端Feign

什么是Feign
在以往的经验中,我们已经知道使用@RestTemplate可以实现远程调用,但RestTemplate有一定的缺陷如代码可读性差,url参数难以维护等 所以就有了Feign
Feign是一个声明式的可插拔的http客户端让我们更方便的进行http请求
如何定义和使用feign客户端
1 引入feign依赖

        <!--feign客户端依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

2 在相应模块的启动类中加入@EnableFeignClients开启feign

@SpringBootApplication
@EnableFeignClients
public class OrderApplication {

    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }
}

3 定义和使用feign客户端

@FeignClient(value = "userService")  //远程调用的服务为userService
public interface UserClient {
    @GetMapping("/user/{id}")
    User findById(@PathVariable("id") Long id);
}

直接在相应的服务调用UserClient
Feign的日志配置
微服务小结4---http客户端Feign_第1张图片
自定义feign的日志配置
两种方式
1

//全局配置 
feign:
  client:
    config:
      default:  //default代表这是全局配置
        loggerLevel: FULL  //日志级别为full
//局部配置
feign:
  client:
    config:
      userserivce:  //userservice代表日志只在这个服务内生效 为局部配置
        loggerLevel: FULL  //日志级别为full

2

1 声明一个日志配置类
public class defaultFeignConfiguration {
   @Bean
    public Logger.Level logLever(){
       return Logger.Level.BASIC;
   }
}
2 如果是全局配置
@EnableFeignClients(defaultConfiguration = defaultFeignConfiguration.class)
3 如果是局部配置
@FeignClient(configuration = defaultFeignConfiguration)  //远程调用的服务为userService

Feign的性能优化
Feign的低层默认URLconnection不使用连接池,这也导致会消耗大量的资源去创建和销毁,性能优化主要是使用OKHttp和Apache HTTPClient 支持线程池的方式来优化以及日志级别尽量使用BASIC以及NULL
引入依赖

        <!--引入HttpClient依赖-->
        <dependency>
            <groupId>io.github.openfeign</groupId>
            <artifactId>feign-httpclient</artifactId>
        </dependency>
feign:
  httpclient:
    enabled: true # 支持HttpClient的开关
    max-connections: 200 # 最大连接数
    max-connections-per-route: 50 # 单个路径的最大连接数
  client:
    config:
      default:
        loggerLevel: BASIC

在实际项目开发中,我们的FeignClient客户端可能要被多个消费者使用,所以我们考虑将FeignClient进行抽取成一个独立的模块,实现松耦合

注意事项:在调用这个独立的Feign模块时我们可能扫描不到这个模块的包
有以下两种方式进行包的读取

1EnableFeignClients中指定FeignClient的字节码
@EnableFeignClients(clients = UserClient.class,defaultConfiguration = defaultFeignConfiguration.class)
2 直接指定包路径
@EnableFeignClients(basePackeages= "包路径")

你可能感兴趣的:(微服务,java,springcloud)