SpringCloud-Feign,Hystrix,Gateway(请求路由-跨域-限流-过滤器鉴权)


Feign服务调用,Hystrix降级以及熔断机制,Gateway网关请求路由-跨域-限流-过滤器鉴权

SpringCloud

Feign声明式服务调用

Feign底层依赖于Ribbon来实现负载均衡和远程调用

  • 简化远程调用:不再使用RestTemplate来完成RPC,而是使用Feign接口
  1. 消费端客户端引入open-feign依赖
<!--feign-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
  1. 编写Feidn调用接口

模拟的是订单调用产品服务

/**产品的Feign声明式接口,用于发起RPC*/
@FeignClient(value = "eureka-provider")
//value指定的服务提供者应用名称
public interface ProductFeign {
   
    /**此处和peovider服务中的ProductController的方法声明一样
    * String url = "http://EUREKA-PROVIDER/product/findOne/"+id;
    * EUREKA-PROVIDER由@FeignClient(value = "eureka-provider")代替
    * /product/findOne/"+id由该方法声明代替
    * */
    @RequestMapping("/product/findOne/{id}")
    public Product findById(@PathVariable("id") int id);
    
}
  1. 引导类中添加注解,来开启Feign功能
//开启Feign功能
@EnableFeignClients
@SpringBootApplication
public class CustomerApp {
   
    public static void main(String[] args) {
   
        SpringApplication.run(CustomerApp.class);
    }
}
  1. customer端实现RPC
@RestController
@RequestMapping("/orders")
public class IOrdersController {
   
    @Autowired
    private ProductFeign productFeign;
    /*使用Feign来完成RPC*/
    @GetMapping("/find/{id}")
    public Product find(@PathVariable("id") int id) {
   
        Product byId = productFeign.findById(id);
        return byId;
    }
}
  1. 启动服务完成调用
  • 超时设置
# 设置Ribbon的超时时间
ribbon:
  ConnectTimeout: 1000 # 连接超时时间 默认1s
  ReadTimeout: 3000 # 逻辑处理的超时时间 默认1s
  • 日志功能
    记录的时远程调用过程种Http数据信息
  1. 设置当前的日志级别 debug
# 设置当前的日志级别 debug,feign只支持记录debug级别的日志
logging:
  level:
    com.itheima: debug

  1. 编写配置类,注入Logger.Level对象
@Configuration
public class FeignLogConfig {
   
    /*
        NONE,不记录
        BASIC,记录基本的请求行,响应状态码数据
        HEADERS,记录基本的请求行,响应状态码数据,记录响应头信息
        FULL;记录完成的请求 响应数据
     */
    @Bean
    public Logger.Level level(){
   
        return Logger.Level.FULL;
    }
}
  1. Geign接口使用注解启用该Bean

/**产品的Feign声明式接口,用于发起RPC*/
@FeignClient(value = "FEIGN-PROVIDER",configuration = FeignLogConfig.class)
//value指定的服务提供者应用名称
//configuration用于加载日志Bean配置类
public interface ProductFeign {
   
    @RequestMapping("/product/findOne/{id}")
    public Product findById(@PathVariable("id") int id);

}

Hystrix熔断器

开源的延迟和容错库,用于隔离访问远程服务,第三方库,防止出现级联失败(雪崩,多级服务调用)

雪崩:一个服务失败,导致整个线路的调用失败的情况

主要功能:

  • 隔离
  1. 线程池隔离-默认使用
    在这里插入图片描述

  2. 信号量隔离-例如根据访问量隔离设定上限
    在这里插入图片描述

  • 降级:异常,超时
    客户端(如404,等等)和消费端(如网络失败时)都要写
    在这里插入图片描述

  • 熔断
    即当一段时间服务端错误较多,启用熔断机制,干掉服务端所有的功能,等待恢复

  • 限流

Hystrix降级

包括异常降级,以及网络超时降级

  • 服务提供方降级
  1. 引入hystrix依赖
    feign中有对hystrix的依赖
    在这里插入图片描述

  2. Controller中定义降级方法,与原方法返回类型和参数一样需

@RestController
@RestController
@RequestMapping("/product")
public class IProductController {
   
    @Autowired
    private IProductService iProductService;
    /*@RequestMapping("/findOne")
    public Product findById(int id){
        return iProductService.findById(id);
    }*/
    @RequestMapping("/findOne/{id}")
    @HystrixCommand(fallbackMethod = "findById_back",commandProperties = {
   
            //设置hystrix的超时时间
            @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "5000")
    })
    //fallbackMethod指定降级后调用的方法
    public Product findById(@PathVariable("id") int id){
   
        //1.制造异常以降级
        //int i=3/0;
        //2.超时来降级,默认1秒
        try {
   
            Thread.sleep(3000);
        } catch (InterruptedException e) {
   
            e.printStackTrace();
        }

        return iProductService.findById(id);
    }
    /**定义降级方法*/
    public Product findById_back(int id){
   
        System.out.println("降级了");
        return new Product(111,"降级了",20,20);
    }
}

  1. 使用注解在原方法上配置降级方法

需要导入提供该注解的依赖

<dependency>
            <groupId>com.netflix.hystrix</groupId>
            <artifactId>hystrix-javanica</artifactId>
        </dependency>
  1. 在引导类开启hystrix功能,使用注解
/*启动类*/
@SpringBootApplication
@EnableEurekaClient //该注解 在新版本中可以省略
@EnableHystrix//开启Hystrix功能
public class ProviderApp {
   
    public static void main(String[] args) {
   
        SpringApplication.run(ProviderApp.class);
    }
}
  • 服务消费方降级
  1. 定义feign调用接口实现类,复写方法,即降级方法
/**实现feign接口,即方法的降级*/
@Component
public class ProductFeignImpl implements ProductFeign {
   
    @Override
    public Product findById(int id) {
   
        return new Product(200,"消费放被降级了",200,200);
    }
}
  1. 在FeignClient 注解中使用fallbanck属性设置降级处理类
/**产品的Feign声明式接口,用于发起RPC*/
@FeignClient(value = "hystrix-provider",fallback = ProductFeignImpl.class)//value指定的服务提供者应用名称
//fallback指定降级方法的实现类
public interface ProductFeign {
   
    @RequestMapping("/product/findOne/{id}")
    public Product findById(@PathVariable("id") int id);
}
  1. 配置开启feign对hystrix的支持
#开启feign对hystrix的支持
feign:
  hystrix:
    enabled: true
  1. RPC消息提供者,该服务睡了两秒,故降级
    因为默认连接时间是1s
@RestController
@RequestMapping("/product")
public class IProductController {
   
    @Autowired
    private IProductService iProductService;
    /*@RequestMapping("/findOne")
    public Product findById(int id){
        return iProductService.findById(id);
    }*/
    @RequestMapping("/findOne/{id}")
    @HystrixCommand(fallbackMethod = "findById_back",commandProperties = {
   
            //设置hystrix的超时时间
            @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "3000")
    })
    //fallbackMethod指定降级后调用的方法
    public Product findById(@PathVariable("id") int id){
   
        //1.制造异常以降级
        //int i=3/0;
        //2.超时来降级,默认1秒
        try {
   
            Thread.sleep(2000);
        } catch (InterruptedException e) {
   
            e.printStackTrace();
        }

        return iProductService.findById(id)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值