二、spring cloud alibaba学习(Feign)

末鹿安然 提交于 2020-02-08 01:17:06

Feign

是开源的声明式http客户端,简化restTemplate调用时url难以维护,代码不可读等问题。

只要声明一个接口,feign就会自动构造一个请求的地址并请求

feign也具有负载均衡,通过整合ribbon实现,所以之前ribbon配置在这依然可用。

加依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

加注解

在启动类上加@EnableFeignClients

没有配置

创建远程http调用接口

@FeignClient(name = "user-center")
public interface UserCenterFeignClient{
    //当findById被调用的时候,feign就会构建出http://user-center/users/{id}并请求
    @GetMapping("/users/{id}")
    UserDTO findById(@PathVariable Integer id);
}

如果参数多的话,写成(@RequestParam xx1,xx2,xx3...)即可

调用的时候就可以不用restTemplate,并写相关url,用UserCenterFeignClient.findById(id)即可。

feign的组成

feign细粒度配置自定义

配置和ribbon一样,可通过java代码或配置文件配置

指定feign日志级别

feign的日志级别有

使用java代码的方式:

跟ribbon指定规则类似

在feign接口注解中加configuration

@FeignClient(name = "user-center" , configuration = "UserCenterFeignConfiguration.class")
public interface UserCenterFeignClient{
    //当findById被调用的时候,feign就会构建出http://user-center/users/{id}并请求
    @GetMapping("/users/{id}")
    UserDTO findById(@PathVariable Integer id);
}

再写个UserCenterFeignConfiguration类

public class UserCenterFeignConfiguration{
    @Bean
    public Logger.level level(){
        return Logger.level.FULL;
    }
}

在配置文件中配置UserCenterFeignConfiguration类

logging:
  level:
    (UserCenterFeignConfiguration的全路径): debug

feign日志级别建立在接口是debug的基础上,假如是info,那不会打印

 

使用配置的方式:

feign:
  client:
    config:
      #想要调用的微服务的名称
      user-center:
        loggerLevel: full

feign的全局配置自定义

跟ribbon相似,代码配置:

在启动类上的@EnableFeignClients加括号配置,变为@EnableFeignClients(defaultConfiguration = "UserCenterFeignConfiguration.class")即可

配置属性的方式:

feign:
  client:
    config:
      #全局配置
      default:
        loggerLevel: full

feign支持的配置项

代码方式和属性方式的配置项略有不同

代码方式:

属性方式:

feign配置的优先级

全局代码<全局属性<细粒度代码<细粒度属性

feign构造多参数的请求

如果另写一个FeignClient接口,且注解name一样(例如都是"user-center"),需要加配置

spring:
  main:
    allow-bean-definition-overriding: true

Get方式

接口在传入参数中加@SpringQueryMap注解

@FeignClient(name = "user-center")
public interface TestUserCenterFeignClient{
    @GetMapping("/q")
    UserDTO findById(@SpringQueryMap UserDTO userDTO);
}

或者一个一个传参

@FeignClient(name = "user-center")
public interface TestUserCenterFeignClient{
    @RequestMapping(value = "/q" , method = RequestMethod.GET)
    UserDTO findById(@RequestParam("id") Long id,@RequestParam("name") String name , ...);
}

Post方式

@FeignClient(name = "user-center")
public interface TestUserCenterFeignClient{
    @RequestMapping(value = "/q" , method = RequestMethod.POST)
    UserDTO findById(@RequestBody UserDTO userDTO);
}

feign脱离ribbon使用

之前的例子,feign调用的服务都是注册在nacos中的,如果feign想调用没有注册在nacos上的服务(例如调用百度)

@FeignClient(name = "baidu", url = "http://www.baidu.com")
public interface TestBaiduFeignClient{
    @GetMapping("")
    public String index();
}

调用的时候

private TestBaiduFeignClient testBaiduFeignClient;
@GetMapping("baidu")
public String baiduIndex(){
    return this.testBaiduFeignClient.index();
}

RestTemplate和Feign对比

feign性能优化

1.配置连接池(例如Apache的HttpClient或者okhttp,这里用httpclient)

加依赖

<dependency>
    <groupId>io.github.openfeign></groupId>
    <artifactId>feign-httpclient</artifactId>

写配置

feign:
  httpclient:
    #让feign使用apache httpclient做请求,而不是默认的urlconnection
    enabled: true
    #feign的最大连接数
    max-connections: 200
    #feign单个路径的最大连接数
    max-connections-per-route: 50

2.选择合适的日志级别

不建议设成full,因为打印的日志太多了,可以设成basic

 

 

 

http://www.imooc.com/article/289005

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!