远程调用
最基本的远程调用,可以向 IOC 容器中添加RestTemplate
并配合@LoadBalanced
注解,使其可以用服务名发起请求,底层通过LoadBalancerInterceptor
请求拦截器,取出服务名后获取到服务地址列表
# OpenFeign
OpenFeign 优化了 RestTemplate 在代码中拼接 URL 的使用体验,可以使用 MVC 注解实现远程调用
Maven依赖
<!-- OpenFeign,如果请求报错可能需要单独引入loadBalancer组件 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- 其他依赖 可选项 -->
<!-- okhttp的feign连接池 -->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-okhttp</artifactId>
</dependency>
<!-- httpclient的feign连接池 -->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
配置文件
feign:
client:
config:
default: # default代表全局配置
loggerLevel: NONE # NONE不打印日志(默认值)
connectTimeout: 5000 # 连接超时时间
readTimeout: 5000 # 读取超时时间
practice-sys: # 仅对系统服务生效
loggerLevel: BASIC # 打印基础日志
httpclient: # 让OpenFeign使用ApacheHttpClient连接池,需自己引入maven依赖
enable: true # 启用httpClient开关
max-connections: 2000 # 最大连接数
max-connections-per-route: 50 # 单个路径最大连接数
okhttp: # 让OpenFeign使用okhttp连接池,需自己引入maven依赖,与httpclient选一即可
enable: true # 启用okhttp开关
compression: # 数据压缩配置
request:
enabled: true # 启用请求压缩
response:
enabled: true # 启用响应解压缩
sentinel:
enabled: true # OpenFiegn启用Sentinel服务保护组件
hystrix:
enabled: false # OpenFiegn关闭Sentinel服务保护组件
启动类代码
@EnableDiscoveryClient
@MapperScan("site.hanzhe.practice.sys.mapper")
@EnableFeignClients(basePackages = "site.hanzhe.practice.api") // 启用OpenFeign并扫描包
@SpringBootApplication(scanBasePackages = "site.hanzhe.practice")
public class PracticeSysApp {
public static void main(String[] args) {
SpringApplication.run(PracticeSysApp.class, args);
}
}
Feign代码
@FeignClient(value = "practice-shop", path = "/order")
public interface ShopOrderFeign {
@GetMapping("/listByUser/{userId}")
R<List<ShopOrder>> listByUser(@PathVariable Integer userId);
}
# 配置类
@Configuration
public class FeignConfig {
@Bean
public RequestInterceptor requestInterceptor() {
// OpenFeign 请求发起之前执行的操作
return requestTemplate -> {
System.out.println("发起请求:" + requestTemplate.url());
requestTemplate.header("token", "xxxx.xxxx.xxxx");
};
}
}
# 服务降级
服务降级是指当系统资源不足时临时取消一些不重要的功能,返回最简单的结果,优先将资源分配给主要功能,可以通过fallback
或者fallbackFactory
属性来实现降级功能
需要注意的是,使用降级必须要整合 Sentinel 或者 hystrix 并在配置文件中设置enable: true
才能生效
fallback
使用@FeignClient
注解的fallback
属性指向降级类并编写降级方法即可实现降级功能
@FeignClient(name = "practice-shop", path = "/order", fallback = ShopOrderFeignFallback.class)
public interface ShopOrderFeign {
@GetMapping("/listByUser/{userId}")
R<List<ShopOrder>> listByUser(@PathVariable Integer userId);
}
@Component
public class ShopOrderFeignFallback implements ShopOrderFeign {
@Override
public R<List<ShopOrder>> listByUser(Integer userId) {
return new R.Ok(ListUtil.empty());
}
}
fallbackFactory
或者使用fallbackFactory
属性实现FallbackFactory
降级工厂类,可以获取到 OpenFeign 的异常信息让我们知道为什么会走到降级
@FeignCLient(value = "practice-shop", path = "/order", fallbackFactory = ShopOrderFeignFallbackFactory.class)
public interface ShopOrderFeign {
@GetMapping("/listByUser/{userId}")
R<List<ShopOrder>> listByUser(@PathVariable Integer userId);
}
@Component
public class ShopOrderFeignFallbackFactory implements FallbackFactory<ShopOrderFeign> {
@Override
public ShopOrderFeign create(Throwable cause) {
return new ShopOrderFeign() {
@Override
public R<List<ShopOrder>> listByUser(Integer userId) {
return new R.Ok(ListUtil.empty());
}
};
}
}
# 日志级别
级别 | 效果 |
---|---|
NONE | 默认值,表示不打印任何日志 |
BASIC | 记录请求时间,响应时间,请求耗时 |
HEADERS | 在 BASIC 基础上,记录请求头,响应头信息 |
FULL | 在 HEADERS 基础上,记录请求体信息,响应体信息 |
- 配置文件:通过
feign.client.config.xxx.loggerLevel
配置,xxx 写为 default 时为全局生效,写服务名时对该服务生效 - 注解:创建一个配置类,不需要加入 IOC 容器,类中使用 @Bean 返回
Logger.level
对象@EnableFeignClients(defaultConfiguration = xxx.class)
为全局生效@FeignClient(configuration = xxx.class)
为指定服务生效