SpringCloud--07、服务调用Feign

版权声明:转载 请注明 原始链接 https://blog.csdn.net/sswqzx/article/details/84782104

1、概述

Feign:意为伪装、声明式调用、理解为、Feign创建一个接口、接口上添加@FeignClient(value="user-server") value=服务器名称、接口内方法上添加 @GetMapping("/user/{id}")、这样以后、Feign会通过动态代理、自动实现类、通过http://user-service/user/5 帮我们调用user-server 端Controller里的方法、然后将数据返回给Feign接口内的抽象方法

(源码没看懂、只能这么理解)

2、入门案例

结构图:

consumer-service导入依赖

        <!--Feign依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

Feign客户端UserFeignClient.java

package com.baidus.consumer.dao;

import com.baidus.consumer.config.FeignConfig;
import com.baidus.consumer.pojo.User;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

/**
 * @ Author     :ShaoWei Sun.
 * @ Date       :Created in 9:42 2018/12/2
 */
@FeignClient(value = "user-service", fallback =UserFeignClientFallback.class, configuration = FeignConfig.class)
public interface UserFeignClient {
    //通过动态代理、动态生成实现类、调用user-server中controller方法、得到数据给queryBUserById
    @GetMapping("/user/{id}")
    User queryUserById(@PathVariable("id") Long id);
}

回调函数类UserFeignClientFallback.java

package com.baidus.consumer.dao;

import com.baidus.consumer.pojo.User;
import org.springframework.stereotype.Component;

/**
 * @ Author     :ShaoWei Sun.
 * @ Date       :Created in 10:08 2018/12/2
 */
@Component
public class UserFeignClientFallback implements UserFeignClient {
    @Override
    public User queryUserById(Long id) {
        User user = new User();
        user.setId(id);
        user.setName("用户查询出现异常");
        return user;
    }
}

改造原来的调用逻辑、UserService.java不用调用UserDao

@Service
public class UserService {

    @Autowired
    private UserFeignClient userFeignClient;

    public List<User> queryUserByIds(List<Long> ids) {
        List<User> users = new ArrayList<>();
        ids.forEach(id -> {
            // 我们测试多次查询,
            users.add(this.userFeignClient.queryUserById(id));
        });
        return users;
    }
}

consumer启动类上开启Feign功能

@SpringBootApplication
@EnableDiscoveryClient
@EnableHystrix
@EnableFeignClients // 开启Feign功能
public class UserConsumerDemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserConsumerDemoApplication.class, args);
    }
}

3、Feign默认集成了Ribbon负载

 

不需要引入依赖、也不用注册RestTemplate对象

application.yml加入负载均衡配置(consumer-server)

ribbon:
  ConnectTimeout: 250 # Ribbon的连接超时时间
  ReadTimeout: 1000 # Ribbon的数据读取超时时间

4、Feign默认集成了Hystrix熔断器

Feign默认也有对Hystix的集成:

 只不过,默认情况下是关闭的。我们需要通过下面的参数来开启:

feign:
  hystrix:
    enabled: true # 开启Feign的熔断功能

5、请求压缩

Spring Cloud Feign 支持对请求和响应进行GZIP压缩,以减少通信过程中的性能损耗。通过下面的参数即可开启请求与响应的压缩功能: (consumer-server)

feign:
  compression:
    request:
      enabled: true # 开启请求压缩
      mime-types: text/html,application/xml,application/json # 设置压缩的数据类型
      min-request-size: 2048 # 设置触发压缩的大小下限

6、日志级别

前面讲过,通过logging.level.xx=debug来设置日志级别。然而这个对Fegin客户端而言不会产生效果。因为@FeignClient注解修饰的客户端在被代理时,都会创建一个新的Fegin.Logger实例。我们需要额外指定这个日志的级别才可以。

设置com.baidus.consumer 日志级别为debug

logging:
  level:
    com.baidus.consumer: debug

编写配置类。定义日志级别

FeignConfig.java

package com.baidus.consumer.config;

import feign.Logger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @ Author     :ShaoWei Sun.
 * @ Date       :Created in 10:25 2018/12/2
 */
@Configuration
public class FeignConfig {
    @Bean
    Logger.Level feignLoggerLevel(){
        return Logger.Level.FULL;
    }
}

Feign支持4种级别:

- NONE:不记录任何日志信息,这是默认值。
- BASIC:仅记录请求的方法,URL以及响应状态码和执行时间
- HEADERS:在BASIC的基础上,额外记录了请求和响应的头信息
- FULL:记录所有请求和响应的明细,包括头信息、请求体、元数据。

在FeignClient中指定配置类: UserFeignClinet.java

package com.baidus.consumer.dao;

import com.baidus.consumer.config.FeignConfig;
import com.baidus.consumer.pojo.User;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

/**
 * @ Author     :ShaoWei Sun.
 * @ Date       :Created in 9:42 2018/12/2
 */
@FeignClient(value = "user-service", fallback =UserFeignClientFallback.class, configuration = FeignConfig.class)
public interface UserFeignClient {
    @GetMapping("/user/{id}")
    User queryUserById(@PathVariable("id") Long id);
}

重启consumer-server 每次访问都会有日志:

猜你喜欢

转载自blog.csdn.net/sswqzx/article/details/84782104