Spring CLoud使用方式
基本原理
通过@EnableFeignClients开启使用feignclient
basePackages(扫描基础包)、basePackageClasses(扫描基础类)、value(作用类似于basePackages);如果没有basePackages,则将@EnableFeignClients注解类所在的包作为基础扫描包
defaultConfiguration:默认配置
clients:被@FeignClient修饰的类集合,如果不为空,则不会再扫描包
扫描@EnableFeignClients的包下被@FeignClient修饰的类
将@FeignClient修改的类转换为BeanDefinition,同时根据配置的url,name,serviceId等,填充调用的URL,检查是否为接口
调用bean时,根据url获取调用地址
不使用注册中心
- 引入openfeign依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
- 通过@FeignClient注解定义接口类
- name: 定义名称,如果没有配置url,则使用name作为服务名进行服务发现的依据,多用于有注册中心的时候
- url: 服务地址,可通过EL表达式注入配置文件中的值,例如:${openapi.auth.url}
- path: 可选项,接口前缀,类似于controller类上的requestMapping的值
- fallbackFactory:回调函数,用于配置熔断。需要配合熔断框架使用,例如sentinel、hytrix等
- 定义具体调用的接口方法,和提供者的contrller写法相同,使用@GetMapping、@RequestBody等注解
@FeignClient(name = "auth-user", url = "${openapi.auth.url}", path = "/user", fallbackFactory = UserApiFallbackFactory.class)
public interface UserApi {
@GetMapping("/getCurrentUserName")
String getCurrentUserName();
@PostMapping(value = "/getAthUser")
String getAthUser(@RequestBody AthUser athUser);
}
扩展
- 如果使用@FeignClient实现动态配置URL,即从数据库中读取,而不是通过配置文件???
- 思路一:通过修改Environment中属性的值,从而在获取占位符时,动态调整
使用熔断
- 熔断框架支持sentinel、hytrix等,这里以sentinel为例
- 引入sentinel依赖
<!--引入sentinel依赖--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency>
- 设置配置文件使用sentinel
feign: sentinel: enabled: true
- 声明回调类,需要使用spring bean类
@Component @Slf4j public class UserApiFallbackFactory implements FallbackFactory<UserApi> { @Override public UserApi create(Throwable cause) { return new UserApi() { @Override public String getCurrentUserName() { log.error("获取当前用户名称异常", cause); return ""; } @Override public String getAthUser(AthUser athUser) { log.error("获取当前用户异常", cause); return ""; } }; } }
- 使用@feignClient引用回调
@FeignClient(name = "auth-user", url = "${openapi.auth.url}", path = "/user", fallbackFactory = UserApiFallbackFactory.class)
配置
- 推荐使用配置文件进行配置,简单灵活可读性高
单服务配置
通过@FeignClient配置
- 通过@FeignClient指定配置,可对不同的服务提供不同的配置
- 编写配置类
public class OpenFeignConfig { /** * 声明openFeign的日志级别 * * @return {@link Logger.Level} */ @Bean public Logger.Level getOpenFeignLoggerLevel() { return Logger.Level.FULL; } }
- 声明配置
@FeignClient(name = "auth-user", url = "${openapi.auth.url}", path = "/user", fallbackFactory = UserApiFallbackFactory.class, configuration = OpenFeignConfig.class)
配置文件中配置
feign: sentinel: enabled: true client: config: auth-user: loggerLevel: NONE
- 其中,auth-user为@feignClient中配置的name值,用于标识针对哪个接口进行配置
- 配置文件的优先级高于@FeignClient的配置
全局配置
bean注入配置形式
- 方式一
@Configuration
public class OpenFeignConfig {
/**
* 声明openFeign的日志级别
*
* @return {@link Logger.Level}
*/
@Bean
public Logger.Level getOpenFeignLoggerLevel() {
return Logger.Level.FULL;
}
}
- 方式二
- 增加配置类
public class OpenFeignConfig { /** * 声明openFeign的日志级别 * * @return {@link Logger.Level} */ @Bean public Logger.Level getOpenFeignLoggerLevel() { return Logger.Level.FULL; } }
- 在
@EnableFeignClients中声明默认配置@EnableFeignClients(defaultConfiguration = OpenFeignConfig.class)
配置文件配置
feign:
sentinel:
enabled: true
client:
config:
default:
loggerLevel: NONE