SpringCloudHystrix断路器容错保护快速入门

破局之路课程 2024-03-25 00:25:40
前言

项目地址:https://github.com/SunSmileAZY/anzy-master-v1

用的模块:service-eruka、demo-cloud-01、demo-hystrix

一、新建一个Eureka Server服务

核心依赖包:

<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> </dependencies>

启动类:

package com.anzy.cloud.eruka;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration;import org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchAutoConfiguration;import org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration;import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration;import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;/** * ServerEurekaApplication * * @author anzy * @date 2018-05-01 */@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class, ElasticsearchAutoConfiguration.class, RabbitAutoConfiguration.class, RedisAutoConfiguration.class, MongoAutoConfiguration.class, MongoDataAutoConfiguration.class})@EnableEurekaServerpublic ServerEurekaApplication { public static void main(String[] args) { SpringApplication.run(ServerEurekaApplication.class, args); }}

启动项目:

浏览器输入127.0.0.1:20000

二、创建服务提供端demo-cloud-01

提供服务接口:

package com.anzy.cloud.cloud01.product;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.cloud.client.ServiceInstance;import org.springframework.cloud.client.discovery.DiscoveryClient;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import org.springframework.web.client.RestTemplate;import java.util.List;import java.util.Random;/** * @author anzy * @version 1.0 * @date 2020/3/11 20:50 **/@RestController@RequestMapping(value = "/product")public ProductController { @Autowired RestTemplate restTemplate; @Autowired private DiscoveryClient discoveryClient; @GetMapping("/list") public String list(){ List<ServiceInstance> serviceInstance = discoveryClient.getInstances("DEMO-CLOUD-01"); System.out.println(serviceInstance); // 随机睡眠模拟超时,断路器默认2000ms int sleepTime = new Random().nextInt(3000); System.out.println("======== sleepTime: " + sleepTime); try { Thread.sleep(sleepTime); } catch (InterruptedException e) { e.printStackTrace(); } return "成功调用demo-cloud-01 服务,我是商品列表"; }}三、创建服务调用者demo-hystrix

断路器需要引入spring-cloud-starter-netflix-hystrix包

<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency>

开启断路器,在main类中开启@EnableCircuitBreaker

import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration;import org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchAutoConfiguration;import org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration;import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration;import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;import org.springframework.cloud.client.discovery.EnableDiscoveryClient;import org.springframework.cloud.client.loadbalancer.LoadBalanced;import org.springframework.cloud.openfeign.EnableFeignClients;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.ComponentScan;import org.springframework.transaction.annotation.EnableTransactionManagement;import org.springframework.web.client.RestTemplate;/** * ServerEurekaApplication * * @author anzy * @date 2018-05-01 */@SpringBootApplication(exclude = { ElasticsearchAutoConfiguration.class, RabbitAutoConfiguration.class, RedisAutoConfiguration.class, MongoAutoConfiguration.class, MongoDataAutoConfiguration.class})@EnableTransactionManagement // 事务//@EnableEurekaClient // @EnableEurekaClient只适用于Eureka作为注册中心,@EnableDiscoveryClient 可以是其他注册中心。@EnableDiscoveryClient@EnableCircuitBreaker@EnableFeignClients(basePackages = {"com.anzy.cloud"})@ComponentScan(basePackages = {"com.anzy.cloud"})public DemoHystrixApplication { public static void main(String[] args) { SpringApplication.run(DemoHystrixApplication.class, args); } @Bean @LoadBalanced RestTemplate restTemplate(){ return new RestTemplate(); }}package com.anzy.cloud.hystrix.user;import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import org.springframework.web.client.RestTemplate;/** * 断路器使用 * @author anzy * @version 1.0 * @date 2020/1/18 20:51 **/@RestController@RequestMapping(value = "/user")public UserController { @Autowired RestTemplate restTemplate; @HystrixCommand(fallbackMethod = "productListFallback") @GetMapping("/product/list") public String productList(){ return restTemplate.getForEntity("http://DEMO-CLOUD-01/product/list",String.class).getBody().toString(); } // 服务不可能或者超时调用此方法 public String productListFallback(){ return "DEMO-CLOUD-01 服务崩掉了"; }}四、进行测试

打开postman调用 /user/product/list 接口

调用成功未超时

调用失败

具体代码可以看一下项目地址,直接运行service-eruka、demo-cloud-01、demo-hystrix三个项目即可,自己可以修改一下对应的配置。

本文主要是做一个断路器的入门认识一下hystrix,后面将会讲解具体的原理。

0 阅读:0

破局之路课程

简介:感谢大家的关注