zoukankan      html  css  js  c++  java
  • SpringCloud整合Hystrix的两种方式

    一、准备工作

    1. 新建Eureka注册中心模块(单机)

    ① 引入依赖

    <dependencies>
        <!-- web 启动器 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- eureka server端 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
    </dependencies>

    ② application.properties配置

    # 设置spring应用命名,可以自定义,非必要
    spring.application.name=eureka-server
    # 设置Eureka Server WEB控制台端口,自定义
    server.port=8761
    #是否将自己注册到Eureka-Server中,默认的为true
    eureka.client.register-with-eureka=false
    #是否从Eureka-Server中获取服务注册信息,默认为true
    eureka.client.fetch-registry=false

    ③ 启动eureka

    @EnableEurekaServer
    @SpringBootApplication
    public class EurekaApplication {
        public static void main(String[] args) {
            SpringApplication.run(EurekaApplication.class, args);
        }
    }

    执行main方法,访问 http://localhost:8761 查看。

    2. 新建服务接口模块api-service

    这个很简单,只有接口声明。

    public interface UserService {
    
        Map<String,Object> getUser(Integer id);
    }

    二、Ribbon中使用熔断器

    1. 新建服务提供者模块

    ① 引入依赖

    <dependencies>
        <!-- web 启动器 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- eureka client -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <!--接口依赖-->
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>api-service</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
    </dependencies>

    ② application.properties配置

    spring.application.name=userService
    server.port=8666
    eureka.instance.instance-id=user-service
    #注册中心地址
    eureka.client.serviceUrl.defaultZone=http://127.0.0.1:8761/eureka/
    #访问信息可以使用IP地址
    eureka.instance.prefer-ip-address=true

    ③ 启动类

    @EnableDiscoveryClient
    @SpringBootApplication
    public class AppService {
        public static void main(String[] args) {
            SpringApplication.run(AppService.class, args);
        }
    }

    ④ 服务接口实现

    @Service
    public class UserServiceImpl implements UserService {
        @Override
        public Map<String, Object> getUser(Integer id) {
            Map<String, Object> data = new HashMap<>();
            data.put("id", Math.random() + "-" + id);
            data.put("name", "test name");
            data.put("age", 20);
            return data;
        }
    }

    ⑤ 对外访问controller

    @RestController
    public class UserController {
    
        @Autowired
        UserService userService;
    
        @RequestMapping("/getUser/{id}")
        public Map<String, Object> getUser(@PathVariable(value = "id") Integer id){
            return userService.getUser(id);
        }
    }

    2. 新建消费者模块

    ① 引入依赖

    <dependencies>
        <!-- web 启动器 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- eureka client -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <!-- ribbon -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
        </dependency>
        <!-- 整合hystrix -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>
    </dependencies>

    ② application.properties

    spring.application.name=userServiceConsumer
    server.port=8777
    eureka.instance.instance-id=user-service-consumer
    eureka.client.serviceUrl.defaultZone=http://127.0.0.1:8761/eureka/
    #访问信息可以使用IP地址
    eureka.instance.prefer-ip-address=true

    ③ 启动类

    @EnableHystrix //在启动类上添加@EnableHystrix注解开启Hystrix的熔断器功能。
    @EnableEurekaClient
    @SpringBootApplication
    public class RibbonConsumerApplication {
    
        //当添加@LoadBalanced注解,就代表启动Ribbon,进行负载均衡
        @LoadBalanced
        @Bean
        public RestTemplate restTemplate() {
            return new RestTemplate();
        }
    
        public static void main(String[] args) {
            SpringApplication.run(RibbonConsumerApplication.class, args);
        }
    
    }

    ④ controller

    @RestController
    @RequestMapping("/hystrix/consumer")
    public class HystrixConsumerController {
    
        @Autowired
        private RestTemplate restTemplate;
    
        /**
         * 调用 user微服务
         */
        @HystrixCommand(fallbackMethod = "getDefaultUser")
        @GetMapping("getUser")
        public String getUser(Integer id) {
            String url = String.format("http://%s/getUser/" + id, "userService");
            return restTemplate.getForObject(url, String.class);
        }
    
        public String getDefaultUser(Integer id) {
            System.out.println("熔断,默认回调函数");
            return "{"id":-1,"name":"熔断用户","age":"21"}";
        }
    }

    ⑤ 访问:http://localhost:8777/hystrix/consumer/getUser?id=7,可以正常访问,然后停掉服务,还会发现进入熔断操作。

    三、Feign中使用熔断器

  • 相关阅读:
    vue单文件组件形成父子(子父)组件之间通信(vue父组件传递数据给子组件,子组件传递数据给父组件)
    appium 问题四的解决办法(模拟器打开的页面弹出框与脚本打开页面的弹出框不一致)
    appium 自动化问题三--键盘关键字的使用
    RF+appium自动化问题二解决思路
    appium自动化滑动鼠标滚动条的用法
    appium自动化中元素定位碰到的问题一
    appium自动化时,输入中文不显示的问题解决
    appium自动化模拟器使用
    pycharm 无法识别selenium,appium等工具时的解决办法
    Mysql基础学习(二)之DQL的使用
  • 原文地址:https://www.cnblogs.com/myitnews/p/12730515.html
Copyright © 2011-2022 走看看