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!!!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM