SpringCloud--07、服务调用Feign
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 每次访问都会有日志:
还没有评论,来说两句吧...