openfeign
- 项目架构
﹂openfeign
﹂consumer---------------------------普通消费者(feign自己实现)
﹂producer---------------------------生产者
﹂producer-api-----------------------生产者的api接口(feign实现)
﹂api-consumer-----------------------使用生产者的api模块的消费者
- 生产者
@RestController
public class HelloController {
@RequestMapping("sayHello")
public String sayHello(){
return "hello";
}
}
- 消费者
a) 依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
b) 启动类追加@EnableFeignClients 在bootstrap.yml加上feign.hystrix.enabled=true
c) 服务调用接口和熔断
@FeignClient(name = "prod",fallback = SayHelloServiceImpl.class)
public interface SayHelloService {
@RequestMapping("sayHello")
public String sayHello();
}
@Component
public class SayHelloServiceImpl implements SayHelloService {
@Override
public String sayHello() {
return "服务丢失";
}
}
d) 服务调用
@RestController
public class SayHelloController {
@Autowired
private SayHelloService sayHelloService;
@RequestMapping("feignSayHello")
public String sayHello(){
return sayHelloService.sayHello();
}
}
e) 思考
如果生成者被多个消费者使用,那么每个消费者都需要编写服务调用接口和熔断,耦合度高,不是很好,下文介绍抽离服务调用接口和熔断成为API模块
- 生产者api
a) 依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
b) 服务调用接口和熔断
@FeignClient(name = "prod",fallbackFactory=SayHelloServiceFeignFallbackFactory.class)
@Component
public interface SayHelloService {
@RequestMapping("sayHello")
public String sayHello();
}
@Component
public class SayHelloServiceFeignFallbackFactory implements FallbackFactory<SayHelloService> {
@Override
public SayHelloService create(Throwable throwable) {
SayHelloServiceImpl sayHelloService = new SayHelloServiceImpl();
sayHelloService.setCause(throwable);
return sayHelloService;
}
}
@Slf4j
public class SayHelloServiceImpl implements SayHelloService {
@Setter
private Throwable cause;
@Override
public String sayHello() {
log.error("错误信息为:{}",cause);
return "服务丢失";
}
}
c) 创建spring.factories文件与resources\META-INF下
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.it.base.openfeign.prod.api.service.impl.SayHelloServiceImpl,\
com.it.base.openfeign.prod.api.service.SayHelloServiceFeignFallbackFactory
文件作用为:将我们的SayHelloServiceImpl和SayHelloServiceFeignFallbackFactory注入到被引入该工程里
- 使用生产者的api模块的消费者
a) 依赖
<dependency>
<groupId>org.example</groupId>
<artifactId>producer-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
b) 启动类追加@EnableFeignClients(basePackages = {“com.it.base”}),在bootstrap.yml加上feign.hystrix.enabled=true
扫描feign接口的位置,不加接口只会走熔断。
c) 服务调用
@RestController
public class SayHelloController {
@Autowired
private SayHelloService sayHelloService;
@RequestMapping("apiFeignSayHello")
public String apiFeignSayHello(){
return sayHelloService.sayHello();
}
}
源码下载地址:https://download.csdn.net/download/qq_33422712/16656781