微服务架构学习-进阶篇--04,Feign的雪崩处理

一,服务降级处理。

上面讲的都是ribbon的雪崩处理,现在讲一下feign的雪崩处理方式-服务降级处理。
思想和ribbon的服务降级处理类似,都是在服务调用出现问题的时候走fallback流程。
(1)在e-book-consumer-hystrix模块下新建maven项目,命名为e-book-consumer-hystrix-feign-fallback。
(2)拷贝原来的项目e-book-consumer-feign的文件和代码到该项目。
(3)改造service文件。

package com.twf.e.book.consumer.hystrix.feign.fallback.service;

import java.util.List;

import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.twf.e.book.consumer.hystrix.feign.fallback.hystrix.ProductServiceFallback;
import com.twf.e.book.product.api.domain.Product;

// 注解加了fallback,当发生服务降级情况时,将自动调用ProductServiceFallback类中的方法。
@FeignClient(name="e-book-product", fallback=ProductServiceFallback.class)
public interface ProductService{
	
	@RequestMapping(value="/product/list",method=RequestMethod.GET)
	public List<Product> listProduct();
}

(4)添加一个fallback类。

package com.twf.e.book.consumer.hystrix.feign.fallback.hystrix;

import java.util.ArrayList;
import java.util.List;

import org.springframework.stereotype.Component;

import com.twf.e.book.consumer.hystrix.feign.fallback.service.ProductService;
import com.twf.e.book.product.api.domain.Product;

@Component
public class ProductServiceFallback implements ProductService{

	@Override
	public List<Product> listProduct() {
		List<Product> list = new ArrayList<Product>();
		list.add(new Product(-1, "fallback"));
		return list;
	}
}

(5)启动注册中心,启动provider,启动该项目。
(6)浏览器访问http://localhost:8105/list,正常情况返回数据,关掉provider,返回fallback的托底数据。

二,服务降级后的异常记录。

这一节就是在上一节的基础上,记录服务降级的原因。
(1)在e-book-consumer-hystrix模块下新建maven项目,命名为e-book-consumer-hystrix-feign-factory。
(2)拷贝e-book-consumer-hystrix-feign-fallback的文件及代码到该项目。
(3)改造hystrix文件。

package com.twf.e.book.consumer.hystrix.feign.factory.hystrix;

import java.util.ArrayList;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import com.twf.e.book.consumer.hystrix.feign.factory.service.ProductService;
import com.twf.e.book.product.api.domain.Product;

import feign.hystrix.FallbackFactory;

@Component
public class ProductServiceFallbackFactory implements FallbackFactory<ProductService>{

	// 加入日志打印
	private Logger logger = LoggerFactory.getLogger(ProductServiceFallbackFactory.class);
	
	@Override
	public ProductService create(final Throwable arg0) {
		return new ProductService() {
			
			@Override
			public List<Product> listProduct() {
				logger.warn("fallback exception:", arg0); // 记录服务降级后的异常原因
				List<Product> list = new ArrayList<Product>();
				list.add(new Product(-1, "fallback"));
				return list;
			}
		};
	}
}

(4)改造service。

package com.twf.e.book.consumer.hystrix.feign.factory.service;

import java.util.List;

import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.twf.e.book.consumer.hystrix.feign.factory.hystrix.ProductServiceFallbackFactory;
import com.twf.e.book.product.api.domain.Product;

// 注解加了fallbackFactory,当发生服务降级情况时,将调用ProductServiceFallbackFactory类中的create方法。
@FeignClient(name="e-book-product", fallbackFactory=ProductServiceFallbackFactory.class)
public interface ProductService{
	
	@RequestMapping(value="/product/list",method=RequestMethod.GET)
	public List<Product> listProduct();
}

(5)启动注册中心,启动该项目和provider。
(6)浏览器访问http://localhost:8106/list,正常情况下,返回正常数据。关掉provider之后,再访问,后台打印异常信息,如下:
微服务架构学习-进阶篇--04,Feign的雪崩处理
(7)源码点这里