zoukankan      html  css  js  c++  java
  • 第八章 SpringCloud之Feign、Hystrix结合使用

    #这个章节主要是针对Hystrix的使用,因为Feign的章节在上一节已经实现了,整个代码也是在上一个章节的基础上修改的

    ##################Hystrix一个简单Demo实现#######################

    1、pom.xml

    <?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">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.1.3.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.test</groupId>
        <artifactId>eureka-client-feign-hystrix</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>eureka-client-feign-hystrix</name>
        <description>Demo project for Spring Boot</description>
    
        <properties>
            <java.version>1.8</java.version>
            <spring-cloud.version>Greenwich.SR1</spring-cloud.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-openfeign</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
    
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-dependencies</artifactId>
                    <version>${spring-cloud.version}</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
    </project>
    View Code

    2、application.yml文件配置

    spring:
      application:
        name: eureka-client-feign-hystrix  #应用名
    logging:  #logging日志配置
      level:
        root: INFO
        org.hibernate: INFO
    server:
      port: 8667   #服务端口
    
    eureka:
      instance:
        hostname: localhost
        prefer-ip-address: true
        instance-id: ${spring.application.name}:${spring.application.instance_id:${server.port}}
      client:
        serviceUrl:
          defaultZone: http://${eureka.instance.hostname}:8661/eureka

    3、启动类加配置

    package com.test.eurekaclientfeign;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
    import org.springframework.cloud.openfeign.EnableFeignClients;
    
    @SpringBootApplication
    @EnableFeignClients
    @EnableCircuitBreaker
    public class EurekaClientFeignHystrixApplication {
        public static void main(String[] args) {
            SpringApplication.run(EurekaClientFeignHystrixApplication.class, args);
        }
    
    }

    4、User.java类

    package com.test.eurekaclientfeign.entity;
    
    import java.io.Serializable;
    import java.math.BigDecimal;
    
    public class User implements Serializable {
        private  Long id;
    
        private  String name;
    
        private  String username;
    
        private  BigDecimal balance;
    
        private  short age;
    
        public Long getId() {
            return id;
        }
    
        public void setId(Long id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        public BigDecimal getBalance() {
            return balance;
        }
    
        public void setBalance(BigDecimal balance) {
            this.balance = balance;
        }
    
        public short getAge() {
            return age;
        }
    
        public void setAge(short age) {
            this.age = age;
        }
    }
    View Code

    5、自定义UserFeignClientConfig.java类,该类的使用,表示不使用Feign的默认配置

    package com.test.eurekaclientfeign.feign;
    
    import feign.Logger;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    public class UserFeignClientConfig {
      /*  @Bean
        public Contract feignContract() {
            return new feign.Contract.Default();
        }*/
    
        @Bean
        Logger.Level feignLoggerLevel() {
            return Logger.Level.FULL;
        }
    }

    6、UserFeignClient1.java

    package com.test.eurekaclientfeign.feign;
    
    import com.test.eurekaclientfeign.entity.User;
    import org.springframework.cloud.openfeign.FeignClient;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    
    @FeignClient(name = "eureka-client-user", configuration = UserFeignClientConfig.class)
    public interface UserFeignClient1 {
        @RequestMapping(method = RequestMethod.GET, value = "/user/{id}")
        User findById(@PathVariable("id") Long id);
    }

    7、MovieController.java类,实现远程调用的类

    package com.test.eurekaclientfeign.controller;
    
    import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
    import com.test.eurekaclientfeign.entity.User;
    import com.test.eurekaclientfeign.feign.UserFeignClient1;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class MovieController {
    
        @Autowired(required = true)
        private UserFeignClient1 userFeignClient1;
    
        @GetMapping(value = "/hystrix/{id}")
        @HystrixCommand(fallbackMethod = "defaultMethod")
        //一但无法调用远程的findById(),则会调用Hystrix的默认接口defaultMethod(),其参数要一致,否则无法使用
        public User findById(@PathVariable("id") Long id) {
            return this.userFeignClient1.findById(id);
        }
    
        public User defaultMethod(@PathVariable("id") Long id){
            User user = new User();
            user.setId(id);
            user.setName("hystrix");
            return user;
        }
    
    }

    8、URL访问

    http://localhost:8661/  # 服务发现
    http://192.168.137.1:8667/hystrix/9  #实现断路,因为数据库没有id=9的数据
    http://192.168.137.1:8667/hystrix/1  #可以正常访问

    Hystrix访问实现如下:

    ########Hystrix将调用访问和断路执行方法绑定在一个线程#########

    只需在MovieController.java中的HystrixCommand添加一个commandProperties属性即可,如下

    package com.test.eurekaclientfeign.controller;
    
    import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
    import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
    import com.test.eurekaclientfeign.entity.User;
    import com.test.eurekaclientfeign.feign.UserFeignClient1;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class MovieController {
    
        @Autowired(required = true)
        private UserFeignClient1 userFeignClient1;
    
        @GetMapping(value = "/hystrix/{id}")
        @HystrixCommand(fallbackMethod = "defaultMethod",
                commandProperties = {
                        @HystrixProperty(name="execution.isolation.strategy", value="SEMAPHORE")
                }
        )
        //一但无法调用远程的findById(),则会调用Hystrix的默认接口defaultMethod(),其参数要一致,否则无法使用
        //添加commandProperties属性,可以使得findById()和defaultMethod()绑定到一个线程中
        public User findById(@PathVariable("id") Long id) {
            return this.userFeignClient1.findById(id);
        }
    
        public User defaultMethod(@PathVariable("id") Long id){
            User user = new User();
            user.setId(id);
            user.setName("hystrix");
            return user;
        }
    
    }

    ###########Hystrix健康检查与监控################

    1、在pom.xml再添加下面依赖

      <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
      </dependency>

    2、在启动类添加一个Bean

    package com.test.eurekaclientfeign;
    
    import com.netflix.hystrix.contrib.metrics.eventstream.HystrixMetricsStreamServlet;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.web.servlet.ServletRegistrationBean;
    import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
    import org.springframework.cloud.openfeign.EnableFeignClients;
    import org.springframework.context.annotation.Bean;
    
    @SpringBootApplication
    @EnableFeignClients
    @EnableCircuitBreaker
    public class EurekaClientFeignHystrixApplication {
        public static void main(String[] args) {
            SpringApplication.run(EurekaClientFeignHystrixApplication.class, args);
        }
    
        @Bean
        public ServletRegistrationBean getServlet(){
            HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();
            ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet);
            registrationBean.setLoadOnStartup(1);
            registrationBean.addUrlMappings("/actuator/hystrix.stream");
            registrationBean.setName("HystrixMetricsStreamServlet");
            return registrationBean;
        }
    }

    3、启动Eureka和服务程序,访问远程调用的服务程序,执行下面的URL

    #使用了actuator,所以都必须以这个组件开始
    http://localhost:8667/actuator/hystrix.stream
    
    http://localhost:8667/actuator/health
  • 相关阅读:
    设置DELL R720 的CPU 风扇转速
    mysqldump 备份导出数据排除某张表或多张表
    MySQL 之 LOAD DATA INFILE 快速导入数据 (单表数据很大)
    ACL规则 反掩码的 写法
    配置Nginx 支持中文URL
    如何删除IE中的证书
    微软Surface 上网本 键盘失灵
    华为 S2700忘记console口密码
    Dell PowerEdge R710, R720 用U盘装系统
    用php做省份的三级联动 附带数据库
  • 原文地址:https://www.cnblogs.com/ywjfx/p/10556521.html
Copyright © 2011-2022 走看看