说一下springcloud的流程:
首先把服务注册到nacos上面,然后通过feign进行服务调用,其中feign配置的 @FeignClient("service-oss") 的 "service-oss"值,是通过这个值去nacos中发现这个注册的服务的,然后找到service-oss这个服务后,然后通过hystrix熔断器配置timeout 超时时间,如果在调用服务期间被调用的service-oss服务发现异常超时或者挂掉,那么hystrix就调用fallback=“" 中配置的接口的实现类。在调用服务时候ribbon还会做负载均衡。
服务调用 feign
1: pom.xml 中引入依赖
<!--服务调用-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2:在调用者的启动类上加上 @EnableFeignClients注解,被调用的服务不用加
// 开启服务调用feign
@EnableFeignClients
public class ServiceEduApplication {
3:创建远程服务的接口,加上@FeignClient(“被调用者服务的名称”),其中有些注意点,我都写在了注释里面
// 开启调用接口,fallback 是hystrix熔断器发现被调用服务发生异常时,会调用fallback里面的实现类方法
@FeignClient(value = "service-vod",fallback = VodApiImpl.class)
// 加载spring管理
@Component
public interface VodApi {
// 这里面方法直接从要调用controller中复制过来即可
// 注意1点 : 如果在 在参数中有 @PathVariable 这个注解 ,那么就一定要加 @PathVariable(value = "id") 括号里面的value
// 注意2点 : @DeleteMapping("/eduvod/video/removeAlyVideo/{id}") 这里面的路径用全路径,就是需要把controller上的路径一拼过来
// 注意3点 : @FeignClient("service-vod") 括号里面的是远程调用服务的在application.properties中配置的 application.name 值,
// 这个必须得配置,因为feign调用接口就是根据service-vod 名称去 nacos中发现注册的服务,然后调用其接口的
//根据视频id删除阿里云视频
@DeleteMapping("/eduvod/video/removeAlyVideo/{id}")
public R removeAlyVideo(@PathVariable(value = "id") String id);
}
4:在controller 层的接口中调用,用@Autowired注入即可,在方法中调用就行
// 注入远程服务接口
@Autowired
private VodApi vodApi;
服务熔断 hystrix
1:在pom.xml中引入依赖
<!--hystrix依赖,主要是用 @HystrixCommand -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<!-- ribbon -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
2:在application.properties的配置中,配置开启hystrix,并设置超时时间
#开启熔断器 hystrix
feign.hystrix.enabled=true
#设置熔断时间
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=2000
3:在远程调用的接口类上加入fallback,并且创建远程调用接口的实现类,当被调用者发生异常时候,hystrix 就会调用fallback 的实现类,返回状态码
扫描二维码关注公众号,回复:
12903309 查看本文章

// 开启调用接口,fallback 是hystrix熔断器发现被调用服务发生异常时,会调用fallback里面的实现类方法
@FeignClient(value = "service-vod",fallback = VodApiImpl.class)
// 加载spring管理
@Component
public interface VodApi {lass)
@Component
public class VodApiImpl implements VodApi {
@Override
public R removeAlyVideo(String id) {
return R.error().message("time out");
}
}
4:在controller层方法中的调用,就可以直接判断返回值的中的code值,来判断是否抛出自定义异常了
R result = vodApi.removeAlyVideo(videoSourceId);
if(result.getCode() == 20001) {
throw new MyRuntimeException(20001,"删除视频失败,熔断器...");
}