Feign的demo
jar包
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
配置
spring.application.name=feign-client
server.port=40006
eureka.client.serviceUrl.defaultZone=http://localhost:20000/eureka/
启动类
@EnableDiscoveryClient
@SpringBootApplication
@EnableFeignClients
public class FeignConsumerApplication {
public static void main(String[] args) {
new SpringApplicationBuilder(FeignConsumerApplication.class)
.web(WebApplicationType.SERVLET)
.run(args);
}
}
调用其他微服务的接口
@FeignClient("eureka-client")
public interface IService {
@GetMapping("/sayHi")
String sayHi();
}
编写Controller层
@RestController
public class Controller {
@Autowired
private IService service;
@GetMapping("/sayHi")
public String sayHi() {
return service.sayHi();
}
}
Feign的demo升级
@EnableFeignClients:加载到消费者的启动类中 @FeignClient("feign-client"):加载到消费者需要调用的服务sevice接口上面
可以将所有需要调用的feigen单独整理成一个mudel,当其他模块调用时,可以将这个模块作为依赖引入到消费者模块,服务提供者可以implements这个接口(一些需要远程调用的方法),然后服务消费者调用接口实现远程服务调用
配置超时和重试策略(配置到消费者中)
# 每台机器最大重试次数
feign-client.ribbon.MaxAutoRetries=2
# 可以再重试几台机器
feign-client.ribbon.MaxAutoRetriesNextServer=2
# 连接超时
feign-client.ribbon.ConnectTimeout=1000
# 业务处理超时
feign-client.ribbon.ReadTimeout=2000
# 在所有HTTP Method进行重试
feign-client.ribbon.OkToRetryOnAllOperations=true
Feign源码解读
class FeignClientsRegistrar implements ImportBeanDefinitionRegistrar, ResourceLoaderAware, EnvironmentAware
ResourceLoaderAware:可以得到Bean的具体信息:ResourceLoaderAware
EnvironmentAware :凡注册到Spring容器内的bean,实现了EnvironmentAware接口重写setEnvironment方法后,在工程启动时可以获得application.properties的配置文件配置的属性值。EnvironmentAware
注意点:扫描main函数下面的包
ClassUtils.getPackageName(importingClassMetadata.getClassName());
如果调用的不同业务的服务需要在注解上指定basePackages,basePackageClasses,去引导加载想要的类
@FeignClient(value = xxxxxxxxxx)
public interface MyService extends IService{
}
#当Bean名字一样的时候,允许被覆盖
main:
allow-bean-definition-overriding: true