Feign
当微服务注册到一个注册中心的时候,我们微服务之间可以通过Feign组件来进行远程调用。
# 现在有两个微服务(两个项目):一个是people,一个是dog
# 我们现在想在people项目调用dog项目中的getDog()方法
// 在项目A中
public class DogController {
("/dog")
public String getDog() {
return "hello,dog";
}
}
// 在项目B中
public class PeopleController {
("/people")
public String people() {
return "hello,people";
}
}
- 就是我们在项目B中需要调用项目A中的getDog()方法
- 此时,我们需要在项目B中开启Feign。
1. 在启动类上加上 @EnableFeignClients 注解
2. 创建一个接口类,并且在接口中上加上 @FeignClient(name = "dog") 注解
注意:name属性就是项目A在注册中心的名字,不区分大小。
3. 在接口类中写上我们需要调取的方法
4. 在需要使用的地方注入接口类,并可以使用接口类中的方法完成任务
name = "dog")(
public interface GetDogFeign {
("/dog")
public String getDog();
}
public class PeopleController {
// 注入接口类
GetDogFeign dogFeign;
("/people")
public String people() {
return "hello,people";
}
("/getDog")
public String getGog() {
// 直接使用接口类中的方法
return dogFeign.getDog();
}
}
Hystrix
当一个微服务出现问题的时候就会引起引用此微服务的其他服务出现问题。
为了避免这种情况,SpringCloud为我们提供了一种熔断机制的解决方案。
# 就像上面B项目需要引用A项目的getDog()方法,当A项目挂掉的时候,B项目的这个功能也就访问不了。
# 我们可以引入 Hystrix 解决这个问题
- 步骤:
- 在启动类上加上@EnableCircuitBreaker启用 Hystrix
- 在B项目的getDog()方法上加上@HystrixCommand注解
- 当A项目挂掉后,就会执行下面的refuse方法
fallbackMethod = "refuse")(
("/getDog")
public String getGog() {
return dogFeign.getDog();
}
public String refuse() {
return "???";
}