zoukankan      html  css  js  c++  java
  • Spring Cloud之统一fallback接口

    每个方法都配备一个fallback方法

    不利于开发的

    用类的方式

    并且整个方法都是在同一个线程池里面的

    主要对于client的修改:

     pom:

    <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>com.toov5</groupId>
    		<artifactId>parent</artifactId>
    		<version>0.0.1-SNAPSHOT</version>
    	</parent>
    	<artifactId>toov5-api-order-service-impl</artifactId>
    
    	<dependencies>
    		<dependency>
               <groupId>com.toov5</groupId>
    			<artifactId>toov5-api-order-service</artifactId>
    			<version>0.0.1-SNAPSHOT</version>
    		</dependency>
    		
         <dependency>
               <groupId>com.toov5</groupId>
    			<artifactId>toov5-api-member-service</artifactId>
    			<version>0.0.1-SNAPSHOT</version>
    		</dependency>
    		
    		
    	</dependencies>
    
    
    </project>
    

     实现类

    package com.toov5.api.service.impl;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
    import com.toov5.api.entity.UserEntity;
    import com.toov5.api.feign.MemberServiceFeign;
    import com.toov5.api.service.IOrderService;
    import com.toov5.base.BaseApiService;
    import com.toov5.base.ResponseBase;
    
    @RestController
    public class OrderServiceImpl extends BaseApiService implements IOrderService {
        @Autowired
        private MemberServiceFeign memberServiceFeign;
    
        @RequestMapping("/orderToMmeber")
        public String orderToMember(String name) {
            UserEntity user = memberServiceFeign.getMember(name);
            return user == null ? "没有" : user.toString();
        }
    
        @RequestMapping("/orderToMemberUserInfo")
        public ResponseBase orderToMemberUserInfo() {
            return memberServiceFeign.getUserInfo();
        }
    
        @HystrixCommand(fallbackMethod = "orderToMemberUserInfoHystrixFallback")
        @RequestMapping("/orderToMemberUserInfoHystrix")
        public ResponseBase orderToMemberUserInfoHystrix() {
            System.out.println("orderToMemberUserInfoHystrix" + "线程池名称" + Thread.currentThread().getName());
            return memberServiceFeign.getUserInfo();
        }
    
        public ResponseBase orderToMemberUserInfoHystrixFallback() {
            return setResultSuccess("请稍后再试~");
        }
    
        @RequestMapping("/orderToMemberUserInfoHystrixdSecond")
        public ResponseBase orderToMemberUserInfoHystrix_demo02() {
            System.out.println("orderToMemberUserInfoHystrix" + "线程池名称" + Thread.currentThread().getName());
            return memberServiceFeign.getUserInfo();
        }
    
        @RequestMapping("/orderInfo")
        public ResponseBase orderInfo() {
            System.out.println("orderInfo" + "线程池名称" + Thread.currentThread().getName());
            return setResultSuccess();
        }
    
    }

    feign

    package com.toov5.api.feign;
    
    import org.springframework.cloud.openfeign.FeignClient;
    
    import com.toov5.api.fallback.MemberServiceFallback;
    import com.toov5.api.service.IMemberService;
    @FeignClient(value="app-toov5-member",fallback = MemberServiceFallback.class)
    public interface MemberServiceFeign extends IMemberService {
      
    }
     

    fallback类

    package com.toov5.api.fallback;
    
    import org.springframework.stereotype.Component;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    import com.toov5.api.entity.UserEntity;
    import com.toov5.api.feign.MemberServiceFeign;
    import com.toov5.base.BaseApiService;
    import com.toov5.base.ResponseBase;
    
    @Component
    @RequestMapping("fallback/")   //这个可以防止 容器中有与父类重复的 requestMapping!!!
    public class MemberServiceFallback extends BaseApiService implements  MemberServiceFeign {
        
         @Override
        public ResponseBase getUserInfo() {
             return setResultError("来自类的提示:系统错误,请稍后重试!");
        }
         
        @Override
        public UserEntity getMember(String name) {
            // TODO Auto-generated method stub
            return null;
        }
    
    }

    启动类:

    package com.toov5.api;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
    import org.springframework.cloud.netflix.hystrix.EnableHystrix;
    import org.springframework.cloud.openfeign.EnableFeignClients;
    
    @SpringBootApplication(scanBasePackages={"com.toov5.*"})
    @EnableEurekaClient
    @EnableFeignClients
    @EnableHystrix
    public class AppOrder {
       public static void main(String[] args) {
        SpringApplication.run(AppOrder.class, args);
    }
    }

     yml

    ###服务启动端口号
    server:
      port: 8020
    ###服务名称(服务注册到eureka名称)  
    spring:
        application:
            name: app-toov5-order
    ###服务注册到eureka地址
    eureka:
      client:
        service-url:
               defaultZone: http://localhost:8100/eureka
    
               
    ###因为该应用为注册中心,不会注册自己
        register-with-eureka: true
    ###是否需要从eureka上获取注册信息
        fetch-registry: true
    
        ###设置feign客户端超时时间
    ribbon:
    ###指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间。
     ReadTimeout: 5000
    ###指的是建立连接后从服务器读取到可用资源所用的时间。 
     ConnectTimeout: 5000
      
      #spring cloud 默认开启ribbon 
      
    ##开启Hystrix断路器  
    feign:
      hystrix:
        enabled: true
    
    #### hystrix禁止服务超时时间
    #hystrix:  
    # command: 
    #   default: 
    #      execution:   
    #       timeout: 
    #        enabled: false
        
    
    
        
    

      启动后:

    感谢:https://www.jb51.net/article/138758.htm 这篇文章的参考!

     对于报错:

    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'requestMappingHandlerMapping' defined in class path resource [org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]: Invocation of init method failed; nested exception is java.lang.IllegalStateException: Ambiguous mapping. Cannot map 'com.toov5.api.feign.MemberServiceFeign' method
    public abstract com.toov5.base.ResponseBase com.toov5.api.service.IMemberService.getUserInfo()
    to {[/getUserInfo]}: There is already 'memberServiceFallback' bean metho

    的解决办法在 fallback的类上面加上 

    @RequestMapping("fallback/")   //这个可以防止 容器中有与父类重复的 requestMapping!!!
  • 相关阅读:
    Gym
    Gym
    Gym 101147B
    巴什博弈入门
    Hihocode 1304
    hihocoder 1441
    web前端
    ajax json html 结合
    关于获取各种浏览器可见窗口大小:
    原生JS 购物车及购物页面的cookie使用
  • 原文地址:https://www.cnblogs.com/toov5/p/9966908.html
Copyright © 2011-2022 走看看