Hystrix服务熔断和降级

it2023-08-04  77

目录

1.服务熔断2.服务降级3.使用Hystrix服务的熔断,加在被调用的服务中(book)3.1 导入依赖3.2 修改启动类,加@EnableCircuitBreaker注解,标注当前工程开启熔断器3.3 修改controller3.4 测试 4.使用Hystrix服务的降级,加在调用的服务中(user)4.1 导入依赖Hystrix4.2 修改配置文件,开启降级4.3 修改启动类,加入@EnableHystrix,标注当前工程开启服务的降级处理4.4 修改BookClient,加入降级跳转的类fallback = BookFallBackMethod.class4.5 新建BookFallBackMethod 实现BookClient接口,写出降级后续执行的操作4.6 修改UserContoller,注入BookClient ,用它调用4.7 测试

1.服务熔断

服务熔断的作用类似于我们家用的保险丝,当某服务出现不可用或响应超时的情况时,为了防止整个系统出现雪崩,暂时停止对该服务的调用。

2.服务降级

服务降级是从整个系统的负荷情况出发和考虑的,对某些负荷会比较高的情况,为了预防某些功能(业务场景)出现负荷过载或者响应慢的情况,在其内部暂时舍弃对一些非核心的接口和数据的请求,而直接返回一个提前准备好的fallback(退路)错误处理信息。这样,虽然提供的是一个有损的服务,但却保证了整个系统的稳定性和可用性。

3.使用Hystrix服务的熔断,加在被调用的服务中(book)

修改book

3.1 导入依赖

<!-- Hystrix 依赖 熔断降级--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency>

3.2 修改启动类,加@EnableCircuitBreaker注解,标注当前工程开启熔断器

@SpringBootApplication //标注当前工程是eureka的客户端 @EnableDiscoveryClient //标注当前工程开启熔断器 @EnableCircuitBreaker public class BookSpringBootApplication { public static void main(String[] args) { SpringApplication.run(BookSpringBootApplication.class); } }

3.3 修改controller

标注当前接口开启熔断,如果出现问题,走HystrixCommand中的findAllFallBack方法 @HystrixCommand(fallbackMethod = “findAllFallBack”)

@RestController public class BookController { @Autowired BookService bookService; @RequestMapping("/findAll") //标注当前接口开启熔断,如果出现问题,走HystrixCommand中的findAllFallBack方法 @HystrixCommand(fallbackMethod = "findAllFallBack") public List<BookPojo> findAll() { //int i=1/0; return bookService.findAll(); } //如果findAll出现问题,请求该方法,该方法返回值类型必须和findAll相同 public List<BookPojo> findAllFallBack(){ System.out.println("熔断。。。。。"); return null; } @RequestMapping("/findById") public BookPojo findById(@RequestBody Map map){ Integer id = (Integer) map.get("id"); return bookService.findById(id); } @RequestMapping("/delete") public void delete(@RequestBody Map map){ Integer id = (Integer) map.get("id"); bookService.delete(id); } @RequestMapping("/update") public void update(@RequestBody BookPojo bookPojo){ bookService.update(bookPojo); } @RequestMapping("/insert") public void insert(@RequestBody BookPojo bookPojo){ bookService.insert(bookPojo); } }

3.4 测试

当book的controller的findAll方法出现异常时,控制台直接输出 熔断。。。。。 页面会出现findAllFallBack返回的值。

4.使用Hystrix服务的降级,加在调用的服务中(user)

4.1 导入依赖Hystrix

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>springCloud_parent</artifactId> <groupId>com.wo</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>user</artifactId> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- eureka 客户端的依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <!-- Hystrix 依赖 熔断降级--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency> <dependency> <groupId>com.wo</groupId> <artifactId>pojo</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies> </project>

4.2 修改配置文件,开启降级

server: port: 8083 spring: application: name: user eureka: client: service-url: defaultZone: http://localhost:8888/eureka instance: #标注当前工程注册时,使用ip地址的方式 prefer-ip-address: true hostname: ${spring.cloud.client.ip-address} instance-id: http://${spring.cloud.client.ip-address}:${server.port} ribbon: #ribbon的读取超时时间 ReadTimeout: 5000 #ribbon的连接超时时间 ConnectTimeout: 5000 feign: hystrix: enabled: true #开启降级

4.3 修改启动类,加入@EnableHystrix,标注当前工程开启服务的降级处理

@SpringBootApplication //标注当前工程是eureka的客户端 @EnableEurekaClient //标注当前工程使用fegin来进行远程调用 feign 结合了ribbon 和resttemplate =>httpclient @EnableFeignClients //标注当前工程开启服务的降级处理 @EnableHystrix public class UserSpringBootApplication { public static void main(String[] args) { SpringApplication.run(UserSpringBootApplication.class); } }

4.4 修改BookClient,加入降级跳转的类fallback = BookFallBackMethod.class

//标注当前接口远程调用某个服务 @FeignClient(serviceId = "book",fallback = BookFallBackMethod.class) public interface BookClient { @RequestMapping("/findAll") public List<BookPojo> findAll(); @RequestMapping("/findById") public BookPojo findById(@RequestBody Map map); @RequestMapping("/delete") public void delete(@RequestBody Map map); @RequestMapping("/update") public void update(@RequestBody BookPojo bookPojo); @RequestMapping("/insert") public void insert(@RequestBody BookPojo bookPojo); }

4.5 新建BookFallBackMethod 实现BookClient接口,写出降级后续执行的操作

//交给Spring管理 @Component public class BookFallBackMethod implements BookClient{ @Override public List<BookPojo> findAll() { System.out.println("当前方法调用不到,降级处理!"); return null; } @Override public BookPojo findById(Map map) { return null; } @Override public void delete(Map map) { } @Override public void update(BookPojo bookPojo) { } @Override public void insert(BookPojo bookPojo) { } }

4.6 修改UserContoller,注入BookClient ,用它调用

@RestController @RequestMapping("/user") public class UserController { @Autowired BookClient bookClient; @RequestMapping("/findAll") public List<BookPojo> findAll(){ return bookClient.findAll(); } @RequestMapping("/findById") public BookPojo findById(@RequestBody Map map){ return bookClient.findById(map); } @RequestMapping("/delete") public void delete(@RequestBody Map map){ bookClient.delete(map); } @RequestMapping("/update") public void update(@RequestBody BookPojo bookPojo){ bookClient.update(bookPojo); } @RequestMapping("/insert") public void insert(@RequestBody BookPojo bookPojo){ bookClient.insert(bookPojo); } }

4.7 测试

当被调用的服务book关闭之后,控制台打印提示信息当 前方法调用不到,降级处理!

最新回复(0)