OpenFeign
一、引入依赖
<!--openFeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!--负载均衡器-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
二、添加@EnableFeignClients注解
@SpringBootApplication
@EnableFeignClients
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
三、编写Feign客户端
@FeignClient("user-service")
public interface UserClient {
@GetMapping("/user/{id}")
String getUser(@PathVariable Long id);
}
四、调用服务
@Autowired
private UserClient userClient;
@GetMapping("/{userId}")
public String getOrder(@PathVariable Long userId) {
return "订单服务调用用户服务成功,用户信息:" + userClient.getUser(userId);
}
五、连接池
Feign底层发起http请求,依赖于其它的框架。其底层支持的http客户端实现包括:
- HttpURLConnection:默认实现,不支持连接池
- Apache HttpClient:支持连接池
- OKHttp:支持连接池
1. 引入依赖
<!--OK http 的依赖 -->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-okhttp</artifactId>
</dependency>
2. 开启连接池
feign:
okhttp:
enabled: true # 开启OKHttp功能
再次请求,打个断点,可以看到delegate已经变成OkHttp的客户端

六、开启日志
OpenFeign只会在FeignClient所在包的日志级别为DEBUG时,才会输出日志。而且其日志级别有4级:
NONE:不记录任何日志信息,这是默认值。BASIC:仅记录请求的方法,URL以及响应状态码和执行时间。HEADERS:在BASIC的基础上,额外记录了请求和响应的头信息。FULL:记录所有请求和响应的明细,包括头信息、请求体、元数据。
Feign默认的日志级别就是NONE,所以默认我们看不到请求日志。
logging:
level:
com.paran: DEBUG
public class DefaultFeignConfig {
@Bean
public Logger.Level feignLogLevel(){
return Logger.Level.FULL;
}
}
局部生效:在某个FeignClient中配置,只对当前FeignClient生效
@FeignClient(value = "user-service", configuration = DefaultFeignConfig.class)
全局生效:在@EnableFeignClients中配置,针对所有FeignClient生效。
@EnableFeignClients(defaultConfiguration = DefaultFeignConfig.class)
七、负载均衡
有说在yml中配置的,这种方式会报找不到服务实例的错误,不是因为别的原因,就是加了这个配置的原因,因为把这个loadbalancer的配置去掉就不会报这个错误,一加上就报错
spring:
cloud:
loadbalancer:
configurations: round-robin # 或 random
可以使用下面这种办法实现负载均衡
@Configuration
@LoadBalancerClient(
name = "user-service", // 服务名
configuration = CustomLoadBalancerConfig.class // 指定配置类
)
public class CustomLoadBalancerConfig {
@Bean
public ReactorServiceInstanceLoadBalancer myServiceLoadBalancer(
Environment environment,
LoadBalancerClientFactory clientFactory) {
String serviceId = environment.getProperty(
LoadBalancerClientFactory.PROPERTY_NAME);
// 拿到延迟加载的 ServiceInstanceListSupplier
ObjectProvider<ServiceInstanceListSupplier> supplierProvider =
clientFactory.getLazyProvider(serviceId, ServiceInstanceListSupplier.class);
// 这里使用 RandomLoadBalancer:随机策略
return new RandomLoadBalancer(supplierProvider, serviceId);
}
}

5803

被折叠的 条评论
为什么被折叠?



