微服务springCloud 的服务调用 feign 和服务熔断 hystrix的使用

说一下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 的实现类,返回状态码

// 开启调用接口,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,"删除视频失败,熔断器...");
            }

猜你喜欢

转载自blog.csdn.net/qq_39564710/article/details/113622792