Feign是Netflix开发的声明式、模板化的HTTP客户端, Feign可以帮助我们更快捷、优雅地调用HTTP API。
Feign支持多种注解,例如Feign自带的注解或者JAX-RS注解等。
Spring Cloud对Feign进行了增强,使Feign支持了Spring MVC注解,并整合了Ribbon和Eureka,从而让Feign的使用更加方便。
Spring Cloud Feign是基于Netflix feign实现,整合了Spring Cloud Ribbon和Spring Cloud Hystrix,除了提供这两者的强大功能外,还提供了一种声明式的Web服务客户端定义的方式。
Spring Cloud Feign帮助我们定义和实现依赖服务接口的定义。在Spring Cloud feign的实现下,只需要创建一个接口并用注解方式配置它,即可完成服务提供方的接口绑定,简化了在使用Spring Cloud Ribbon时自行封装服务调用客户端的开发量。
在我们搭建好的service_file模块中,编写删除源文件的接口。
CrmFileController.java
//根据文件 url 删除源文件
@PostMapping(value = "removeCrmFileById/{id}")
public ResultBean removeCrmFileById(@PathVariable Integer id){
return crmFileService.removeCrmFileById(id);
}
CrmFileServiceImpl.java接口实现类
@Override
public ResultBean removeCrmFileById(Integer id) {
//查询源文件真实的 url
CrmFile crmFile = baseMapper.selectById(id);
String url = crmFile.getUrl();
//根据url 删除源文件
if(!StringUtils.isEmpty(url)){
File folder =new File(url);
boolean flag = folder.delete();
if(flag){
return ResultBean.ok(); //删除成功
}else {
return ResultBean.error(); //删除失败
}
}else {
return ResultBean.error().message("源文件不存在,无法删除");
}
}
<!--服务调用-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
@EnableFeignClients //服务调用
@FeignClient("service-file") //@FeignClient注解用于指定从哪个服务中调用功能 ,名称与被调用的服务名保持一致。
@Component //交给spring管理
public interface FileClient {
//根据文件 url 删除源文件
@PostMapping(value = "/fileservice/crm-file/removeCrmFileById/{id}") //这个路径映射,是全路径映射
public ResultBean removeCrmFileById(@PathVariable("id") Integer id); //@PathVariable注解一定要指定参数名称,否则出错
}
注意:@PostMapping(value = “/fileservice/crm-file/removeCrmFileById/{id}”)
是service_file模块中的这个方法的全映射路径
我们上一篇写的代码,我们重新改造。 @PostMapping(value = “/fileservice/crm-file/removeCrmFileById/{id}”) 这个接口中我们只需要传入该条记录的id,他就能帮我们实现源文件的删除。
//已经交给spring管理了、我们直接注入使用
@Autowired
private FileClient fileClient;
//根据id、删除删除源文件+删除数据库数据记录
@PostMapping(value = "removeCrmFile/{id}")
public ResultBean removeCrmFile(@PathVariable Integer id){
//1、调用service_file模块服务接口,实现源文件删除
if(id != null){
System.out.println("开始调用...");
ResultBean resultBean = fileClient.removeCrmFileById(id);
if(resultBean.getCode() == 2001){
System.out.println("删除失败...");
}
System.out.println("调用结束...");
}
//2、最后删除数据库记录
boolean remove = crmFileService.removeById(id);
if (remove){
return ResultBean.ok();
}else {
return ResultBean.error();
}
}
首先启动两个模块,service_user和service_file,9901端口和9902端口
发送POST请求:http://localhost:9901/eduservice/crm-file/removeCrmFile/3
控制台打印输出
开始调用...
2020-05-15 01:36:03.618 INFO 9208 --- [nio-9901-exec-1] c.netflix.config.ChainedDynamicProperty : Flipping property: service-file.ribbon.ActiveConnectionsLimit to use NEXT property: niws.loadbalancer.availabilityFilteringRule.activeConnectionsLimit = 2147483647
2020-05-15 01:36:03.733 INFO 9208 --- [nio-9901-exec-1] c.netflix.loadbalancer.BaseLoadBalancer : Client: service-file instantiated a LoadBalancer: DynamicServerListLoadBalancer:{NFLoadBalancer:name=service-file,current list of Servers=[],Load balancer stats=Zone stats: {},Server stats: []}ServerList:null
2020-05-15 01:36:03.754 INFO 9208 --- [nio-9901-exec-1] c.n.l.DynamicServerListLoadBalancer : Using serverListUpdater PollingServerListUpdater
2020-05-15 01:36:03.794 INFO 9208 --- [nio-9901-exec-1] c.netflix.config.ChainedDynamicProperty : Flipping property: service-file.ribbon.ActiveConnectionsLimit to use NEXT property: niws.loadbalancer.availabilityFilteringRule.activeConnectionsLimit = 2147483647
2020-05-15 01:36:03.796 INFO 9208 --- [nio-9901-exec-1] c.n.l.DynamicServerListLoadBalancer : DynamicServerListLoadBalancer for client service-file initialized: DynamicServerListLoadBalancer:{NFLoadBalancer:name=service-file,current list of Servers=[192.168.162.1:9902],Load balancer stats=Zone stats: {unknown=[Zone:unknown; Instance count:1; Active connections count: 0; Circuit breaker tripped count: 0; Active connections per server: 0.0;]
},Server stats: [[Server:192.168.162.1:9902; Zone:UNKNOWN; Total Requests:0; Successive connection failure:0; Total blackout seconds:0; Last connection made:Thu Jan 01 08:00:00 CST 1970; First connection made: Thu Jan 01 08:00:00 CST 1970; Active Connections:0; total failure count in last (1000) msecs:0; average resp time:0.0; 90 percentile resp time:0.0; 95 percentile resp time:0.0; min resp time:0.0; max resp time:0.0; stddev resp time:0.0]
]}ServerList:org.springframework.cloud.alibaba.nacos.ribbon.NacosServerList@7cc3506c
调用结束...
MySQL中查看数据库、本地盘符下查看源文件、是不是就都不存在了,成功删除了源文件,删除了数据记录,实现了服务间的调用。