目录
Feign服务调用,Hystrix降级以及熔断机制,Gateway网关请求路由-跨域-限流-过滤器鉴权
SpringCloud
Feign声明式服务调用
Feign底层依赖于Ribbon来实现负载均衡和远程调用
- 简化远程调用:不再使用RestTemplate来完成RPC,而是使用Feign接口
- 消费端客户端引入open-feign依赖
<!--feign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
- 编写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);
}
- 引导类中添加注解,来开启Feign功能
//开启Feign功能
@EnableFeignClients
@SpringBootApplication
public class CustomerApp {
public static void main(String[] args) {
SpringApplication.run(CustomerApp.class);
}
}
- 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;
}
}
- 启动服务完成调用
- 超时设置
# 设置Ribbon的超时时间
ribbon:
ConnectTimeout: 1000 # 连接超时时间 默认1s
ReadTimeout: 3000 # 逻辑处理的超时时间 默认1s
- 日志功能
记录的时远程调用过程种Http数据信息
- 设置当前的日志级别 debug
# 设置当前的日志级别 debug,feign只支持记录debug级别的日志
logging:
level:
com.itheima: debug
- 编写配置类,注入Logger.Level对象
@Configuration
public class FeignLogConfig {
/*
NONE,不记录
BASIC,记录基本的请求行,响应状态码数据
HEADERS,记录基本的请求行,响应状态码数据,记录响应头信息
FULL;记录完成的请求 响应数据
*/
@Bean
public Logger.Level level(){
return Logger.Level.FULL;
}
}
- 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熔断器
开源的延迟和容错库,用于隔离访问远程服务,第三方库,防止出现级联失败(雪崩,多级服务调用)
雪崩:一个服务失败,导致整个线路的调用失败的情况
主要功能:
- 隔离
-
线程池隔离-默认使用
-
信号量隔离-例如根据访问量隔离设定上限
-
降级:异常,超时
客户端(如404,等等)和消费端(如网络失败时)都要写
-
熔断
即当一段时间服务端错误较多,启用熔断机制,干掉服务端所有的功能,等待恢复 -
限流
Hystrix降级
包括异常降级,以及网络超时降级
- 服务提供方降级
-
引入hystrix依赖
feign中有对hystrix的依赖
-
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);
}
}
- 使用注解在原方法上配置降级方法
需要导入提供该注解的依赖
<dependency>
<groupId>com.netflix.hystrix</groupId>
<artifactId>hystrix-javanica</artifactId>
</dependency>
- 在引导类开启hystrix功能,使用注解
/*启动类*/
@SpringBootApplication
@EnableEurekaClient //该注解 在新版本中可以省略
@EnableHystrix//开启Hystrix功能
public class ProviderApp {
public static void main(String[] args) {
SpringApplication.run(ProviderApp.class);
}
}
- 服务消费方降级
- 定义feign调用接口实现类,复写方法,即降级方法
/**实现feign接口,即方法的降级*/
@Component
public class ProductFeignImpl implements ProductFeign {
@Override
public Product findById(int id) {
return new Product(200,"消费放被降级了",200,200);
}
}
- 在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);
}
- 配置开启feign对hystrix的支持
#开启feign对hystrix的支持
feign:
hystrix:
enabled: true
- 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)