当我们需要调用其他微服务或者第三方接口时,我们可能会使用Dubbo或者Spring自带的组件RestTemplate,但相对于前面两位来说 我还是比较喜欢使用SpringCloud的组件Feign的,在我看来Feign的使用还是比较灵活的。
懒得自己写一个微服务,这里我在网上搜了一个第三方接口:
https://api.imjad.cn/cloudmusic/?type=song&id=32785674
以这个接口为例
使用OpenFeign需要的依赖
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-dependenciesartifactId>
<version>2.5.0version>
<type>pomtype>
<scope>importscope>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-openfeignartifactId>
dependency>
dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-dependenciesartifactId>
<version>2020.0.3version>
<type>pomtype>
<scope>importscope>
dependency>
dependencies>
dependencyManagement>
这里SpringBoot版本我用的2.5.0 SpringCloud的版本是2020.0.3
编写Feign相关的逻辑
1、首先需要在主方法类上加上 @EnableFeignClients
2、编写feign的接口
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
@FeignClient(url="https://api.imjad.cn", name = "music")
public interface RemoteMusicService {
@GetMapping("/cloudmusic")
public Object getMusic(@RequestParam("type") String type, @RequestParam("id") String id);
}
3、写个controller调用RemoteMusicService
import com.swagger.demo.remoteAPI.RemoteMusicService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestOpenFeign {
@Autowired
private RemoteMusicService remoteMusicService;
@GetMapping("/testFeign")
public Object getMusic(String type, String id) {
return remoteMusicService.getMusic(type, id);
}
}
牵扯到熔断、降级我们第一时间想到的当然是Hystrix,没错这次我们需要用到它
1、需要添加的依赖
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-hystrixartifactId>
<version>2.2.9.RELEASEversion>
dependency>
2、主方法类上增加对Hystrix的支持
3、在application配置文件中增加配置(开启Feign对Hystrix的支持)
#feign.hystrix.enabled=true
feign.circuitbreaker.enabled=true
这里注意,我的SpringCloud版本是2020.0.3,这里的配置是feign.circuitbreaker.enabled=true
; 如果你使用的SpringCloud版本是2020之前的版本则配置信息为feign.hystrix.enabled=true
。(这个版本问题还是比较坑的,我之前就栽在这里过)
4、为RemoteMusicService 接口设置降级
这里降级方式有两种,一种是fallback
,另一种是fallbackFactory
。两种都可以实现在接口调用失败时降级。后者可以比前者输出的信息更加详细。接下来,我们都测试一下。
fallback方式:
首先写个fallback类并实现对应降级的接口
import com.swagger.demo.remoteAPI.RemoteMusicService;
import org.springframework.stereotype.Component;
@Component
public class MusicFallback implements RemoteMusicService {
@Override
public Object getMusic(String type, String id) {
System.out.println("哈哈哈哈 报错了");
return "哈哈哈";
}
}
这里的@Component
别忘了加,降级的时候需要到spring容器中去获取这个bean对象
为RemoteMusicService增加fallback配置:
测试输出:
FallbackFactory方式:
首先写个FallbackFactory类并实现FallbackFactory<对应降级的接口>
import com.swagger.demo.remoteAPI.RemoteMusicService;
import org.springframework.cloud.openfeign.FallbackFactory;
import org.springframework.stereotype.Component;
@Component
public class MusicFallbackFactory implements FallbackFactory<RemoteMusicService> {
@Override
public RemoteMusicService create(Throwable cause) {
// 与fallback的方式类似 需要返回一个对应接口的对象
return new RemoteMusicService() {
@Override
public Object getMusic(String type, String id) {
System.out.println("哈哈哈哈 报错了");
return "哈哈哈123";
}
};
}
}