OpenFeign的使用
在SpringCloud的子模块中导入OpenFeign依赖
<dependencies>
<!--引入Eureka的客户端依赖,不包含springboot-start-web,所以要单独引入-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--引入springboot-start-web依赖,必须引入-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--引入user-common公共模块-->
<dependency>
<groupId>cn.itsource</groupId>
<artifactId>cloud-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--引入OpenFeign依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
启动类上加上OpenFeign的注解
/**
* @Description 支付服务的启动类
* @Author Raymon
* @Date 2023/4/9 17:29
* @Version 1.0
*/
@SpringBootApplication
@EnableEurekaClient // 表示Eureka客户端
@EnableFeignClients // 开启OpenFeign支持
public class PayServerApp {
public static void main(String[] args) {
SpringApplication.run(PayServerApp.class, args);
}
}
配置yaml文件
server:
port: 10086 # user服务端口号
eureka:
client: # Eureka客户端配置,指向注册中心地址
serviceUrl:
defaultZone: http://localhost:1010/eureka/
instance:
prefer-ip-address: true # 开启使用IP地址进行注册
instance-id: pay-server:10086 # 修改实例Id
spring:
application: # 指定此服务的应用名称
name: pay-server
编写Feign接口,提供服务调用
/**
* @Description 请求user服务的feign组件定义
* @Author Raymon
* @Date 2023/4/9 17:38
* @Version 1.0
*/
@FeignClient("user-server") // 指定需要调用的服务的应用名称
@RequestMapping("/user")
public interface UserFeignClient {
/**
* OpenFeign调用user服务接口,默认底层会帮助我们创建动态代理实现类,会使用RestTemplate进行调用
* @param id
* @return
*/
@GetMapping("/{id}")
User getById(@PathVariable("id") Long id);
}
编写Pay服务接口,使用feign调用user服务
/**
* @Description 支付服务的远程接口调用
* @Author Raymon
* @Date 2023/4/9 17:36
* @Version 1.0
*/
@RestController
public class PayController {
@Autowired
private UserFeignClient feignClient;
/**
* 支付请求接口
* @param id 用户的id
* @return
*/
@GetMapping("/pay/{id}")
public User queryById(@PathVariable("id") Long id){
// 调用OpenFeign接口,通信User服务
return feignClient.getById(id);
}
}
启动Eureka、user服务、pay服务,访问pay服务接口进行测试
OpenFeign使用Hystrix
feign: #openFeign超时时间设置
hystrix:
enabled: true #开启熔断支持
ribbon:
ReadTimeout: 1000
SocketTimeout: 1000
ConnectTimeout: 1000
hystrix: #hystrix的熔断超时时间设置
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 4000
1.OpenFeign接口熔断-fallback方式
第一步:在OpenFeign的接口类上指定托底类
@FeignClient(value = "user-server",fallback = UserFeignClientFallback.class) // 指定需要调用的服务的应用名称
public interface UserFeignClient {
/**
* OpenFeign调用user服务接口,默认底层会帮助我们创建动态代理实现类,会使用RestTemplate进行调用
* @param id
* @return
*/
@GetMapping("/user/{id}")
User queryById(@PathVariable("id") Long id);
}
第二步:定义托底类
@Component // 将托底类交给spring管理,否则Hystrix无法进行调用
public class UserFeignClientFallback implements UserFeignClient {
@Override
public User queryById(Long id) {
log.error("此服务不可用!");
//托底数据
return new User(-1L,"无此用户!用户服务不可用~");
}
}
2.OpenFiegn接口熔断-fallbackFactory方式
第一步:创建托底工厂类
/**
* @Description UserFeign的托底工厂类
* @Author Raymon
* @Date 2023/4/10 23:40
* @Version 1.0
*/
@Component
public class UserFeignClientFallbackFactory implements FallbackFactory<UserFeignClient> {
@Override
public UserFeignClient create(Throwable throwable) {
// 1.打印接口错误,方便查找错误
throwable.printStackTrace();
return id -> new User(-1L,"无此用户!用户服务不可用~");
}
}
第二步:指定托底工厂类,使用fallbackFactory属性,使用工厂方式指定托底
@FeignClient(value = "user-server",fallbackFactory = UserFeignClientFallbackFactory.class) // 指定需要调用的服务的应用名称
public interface UserFeignClient {
/**
* OpenFeign调用user服务接口,默认底层会帮助我们创建动态代理实现类,会使用RestTemplate进行调用
* @param id
* @return
*/
@GetMapping("/user/{id}")
User queryById(@PathVariable("id") Long id);
}