zoukankan      html  css  js  c++  java
  • Feign + Hystrix 服务熔断和服务降级

    本机IP为  192.168.1.102

    1.    新建 Maven 项目   feign

    2.   pom.xml

    复制代码
    <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>
        <groupId>com.java</groupId>
        <artifactId>feign</artifactId>
        <version>1.0.0-SNAPSHOT</version>
        <name>${project.artifactId}</name>
    
        <!-- 配置版本常量 -->
        <properties>
            <jdk.version>1.8</jdk.version>
            <spring.cloud.version>2.0.0.RELEASE</spring.cloud.version>
        </properties>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.0.5.RELEASE</version>
        </parent>
    
        <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-client</artifactId>
                <version>${spring.cloud.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-openfeign</artifactId>
                <version>${spring.cloud.version}</version>
            </dependency>
    
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>1.2.49</version>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <scope>provided</scope>
            </dependency>
    
    
            <!-- 热部署 -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>springloaded</artifactId>
                <version>1.2.8.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-devtools</artifactId>
            </dependency>
    
        </dependencies>
    
        <build>
            <finalName>${project.artifactId}</finalName>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <configuration>
                        <source>${jdk.version}</source>
                        <target>${jdk.version}</target>
                        <encoding>UTF-8</encoding>
                    </configuration>
                </plugin>
    
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <executions>
                        <execution>
                            <goals>
                                <goal>repackage</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </project>
    复制代码

    3.   application.yml

    复制代码
    server:
      port: 80
      
    
    feign: 
      hystrix: 
        enabled: true
    
    
    
    eureka:
      client:
        register-with-eureka: false
        service-url: 
          defaultZone: http://192.168.1.102:8080/eureka/  
          #defaultZone: http://s0.com:8080/eureka/,http://s1.com:8080/eureka/,http://s2.com:8080/eureka/
    复制代码

    4.   HostService.java

    复制代码
    package com.java.feign.service;
    
    import org.springframework.cloud.openfeign.FeignClient;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    
    import com.alibaba.fastjson.JSONObject;
    
    @FeignClient(value = "MICROSERVICE", fallbackFactory = HostServiceFallbackFactory.class)
    public interface HostService {
    
        @GetMapping("/getHostMessage/{id}")
        public JSONObject getHostMessage(@PathVariable(value = "id") String id);
    
    }
    复制代码

    5.   HostServiceFallbackFactory.java

    复制代码
    package com.java.feign.service;
    
    import org.springframework.stereotype.Component;
    
    import com.alibaba.fastjson.JSONObject;
    
    import feign.hystrix.FallbackFactory;
    
    @Component
    public class HostServiceFallbackFactory implements FallbackFactory<HostService> {
    
        @Override
        public HostService create(Throwable cause) {
            return new HostService() {
    
                @Override
                public JSONObject getHostMessage(String id) {
                    JSONObject json = new JSONObject();
                    json.put("id", id);
                    json.put("description", "服务异常演习专用!");
                    json.put("msg", cause.getMessage());
                    return json;
                }
            };
        }
    
    }
    复制代码

    6.   HostController.java

    复制代码
    package com.java.feign.controller;
    
    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;
    
    import com.alibaba.fastjson.JSONObject;
    import com.java.feign.service.HostService;
    
    @RestController
    public class HostController {
    
        @Autowired
        private HostService hostService;
    
        @GetMapping("/getHostMessage/{id}")
        public JSONObject getHostMessage(@PathVariable String id) {
            return hostService.getHostMessage(id);
        }
    
    }
    复制代码

    7.   FeignStarter.java

    复制代码
    package com.java.feign;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.builder.SpringApplicationBuilder;
    import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
    import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
    import org.springframework.cloud.openfeign.EnableFeignClients;
    import org.springframework.context.annotation.ComponentScan;
    
    @EnableEurekaClient
    @SpringBootApplication
    @EnableFeignClients(basePackages = { "com.java.feign.service" })
    @ComponentScan(basePackages = { "com.java.feign" })
    public class FeignStarter extends SpringBootServletInitializer {
    
        public static void main(String[] args) {
            SpringApplication.run(FeignStarter.class, args);
        }
    
        @Override
        protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
            return builder.sources(FeignStarter.class);
        }
    
    }
    复制代码

    8.   运行测试

    启动  Eureka   服务注册中心,参考  https://www.cnblogs.com/jonban/p/eureka.html

    启动  MicroService  微服务, 参考   https://www.cnblogs.com/jonban/p/microservice.html

    启动  Feign服务,运行 FeignStarter.java

    浏览器输入URL

    http://192.168.1.102/getHostMessage/hello

    http://127.0.0.1/getHostMessage/hello

    返回数据如下:

    {"hostname":"F6RK2EXYAFARPPS","hostAddress":"192.168.1.102","id":"hello"}

    截图如下:

    搭建成功,程序正常运行。

    下面开始测试异常

    关掉微服务提供者 microservice 服务器

    浏览器输入URL

    http://192.168.1.102/getHostMessage/hello

    http://127.0.0.1/getHostMessage/hello

    返回数据如下:

    {"msg":"com.netflix.client.ClientException: Load balancer does not have available server for client: MICROSERVICE","description":"服务异常演习专用!","id":"hello"}

    截图如下:

    服务异常生效,符合预期结果。

  • 相关阅读:
    Openstack 通过 SQLAlchemy-ORM 访问数据库
    ulimit -c unlimited
    ajax 调用后台接口示例
    读书有什么用——北漂18年(番外篇三)
    zTree点击文字勾选复选框
    深度剖析 | 基于大数据架构的BI应用
    深度剖析 | 基于大数据架构的BI应用
    AngularJS之对话框
    AngularJS之依赖注入(实例一)
    AngularJS之$watch方法(监控动作)
  • 原文地址:https://www.cnblogs.com/telwanggs/p/12620108.html
Copyright © 2011-2022 走看看