Day04
OpenFeign
快速入门
OpenFeign是一个声明式的http客户端,是Springcloud在Eureka公式开源的Feign基础上改造而来的。其作用就是基于SpringMVC的常见注解,帮我们优雅实现http请求的发送
OpenFeign已经被SpringCloud自动装配,实现起来非常简单:
1、引入依赖,包括OpenFeign和负载均衡组件SpringCloudLoadBalancer
<!--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>
2、通过@EnableFeginClients注解,启用OpenFeign功能
@EnableFeignClients
@MapperScan("com.hmall.cart.mapper")
@SpringBootApplication
public class CartApplication {
public static void main(String[] args) {
SpringApplication.run (CartApplication.class, args);
}
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
3、编写FeignClient
@FeignClient(value = "item-service")
public interface ItemClient {
@GetMapping("/items")
List<ItemDTO> queryItemByIds(@RequestParam("ids") Collection<Long> ids);
}
4、使用FeignCLient
List<ItemDTO> items = itemClient.queryItemByIds(itemIds);
连接池
OpenFeign对Http请求做了优雅的伪装,不过其底层发起的Http请求,依赖于其他框架。这些框架可以自己选择,包括以下三种:
1、HttpURLConnection:默认实现,不支持连接池,不断的链接与断开开销大
2、Apache HttpClient:支持连接池
3、OKHttp:支持连接池
具体步骤:
1、引入依赖
<!--OK http 的依赖 -->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-okhttp</artifactId>
</dependency>
2、开启连接池功能
在application.yml中添加配置:
feign:
okhttp:
enabled: true
最佳实践:
当定义的FeginClient不在SpringBootApplication的扫描包范围时,这些FeginClient无法使用。有两种解决方式:
1、指定FeginClient所在包
@EnableFeignClients(basePackages = "com.hmall.api.client")
2、指定FeignClient字节码
@EnableFeignClients(client={UserClient.class})
日志
OpenFeign只会在FeignClient所在包的日志级别为DEBUG时,才会输出日志。而且其日志级别有4级:
1、NONE:不记录任何日志信息,这是默认值
2、BASIC:仅记录请求的方法,URL以及响应状态码和执行时间
3、HEADERS:在BASIC的基础上,额外记录了请求和响应的头信息
4、FULL:记录所有请求和响应的明细,包括头信息、请求体、元数据
由于Feign默认的日志级别是NONE,所以默认我们看不到请求日志
自定义日志级别需要声明一个类型为Logger.Leve的Bean,在其中定义日志级别:
public class DefaultFeignConfig {
@Bean
public Logger.Level feignLoggerLevel(){
return Logger.Level.FULL ;
}
}
但此时这个Bean并未生效,要想配置某个FeignClient的日志,可以在@FeignCLient注解中声明:
@FeignClients(value="item-service",configuration = DefaultFeignConfig.class)
如果想要全局配置,让所有的FeignClient都按照这个日志配置,则需要在#EnableFeignClients注解中声明:
@EnableFeignClients(basePackages = "com.hmall.api.client",defaultConfiguration = DefaultFeignConfig.class)
网关
网关:就是网络的关口,负责请求的路由、转发、身份校验
网关从注册中心拉取所有的注册服务,前端访问时网关进行校验、路由、转发

在SpringCluod中网关的实现包括两种:
Spring Cloud Gateway:Spring官方出品,基于WebFlux响应式编程,无需调优即可获得优异性能
Netfilx Zuul:Netfile出品,基于Servlet的阻塞式编程,与Spring Cloud Gateway性能类似
配置网关
server:
port: 8080
spring:
application:
name: gateway
cloud:
nacos:
server-addr: 192.168.150.101:8848
gateway:
routes:
- id: item-service
uri: lb://item-service
predicates:
-
Path=/items/**,/search/**
-
id: user-service
uri: lb://user-service
predicates:
-
Path=/users/**,/addresses/**
-
id: cart-service
uri: lb://cart-service
predicates:
-
Path=/cart/**
-
id: pay-service
uri: lb://pay-service
predicates:
- Path=/pay/**
路由属性
网关路由对应的Java类型是RouteDefinition,其中常见的属性有:
id:路由的唯一标识
url:路由目标地址
predicate:路由断言,判断请求是否符合当前路由
filters:路由过滤器,对请求或响应做特殊处理
12种基本的RoutePredicateFactory实现:

路由过滤器:网关中提供了33种路由过滤,每种过滤器都有独特的作用

网关登录校验