Spring Cloud【Finchley】-17 使用Zuul为单个或全部微服务提供容错与回退功能

简介: Spring Cloud【Finchley】-17 使用Zuul为单个或全部微服务提供容错与回退功能

20190806093230928.jpg


概述


Spring Cloud【Finchley】-14 微服务网关Zuul的搭建与使用 # Step8. 网关功能-Hystrix监控测试中我们测试了Zuul默认集成了Hystrix的监控,但是没有提及容错。


这里我们来学习下zuul的容错与回退功能如何实现。


官方指导:https://cloud.spring.io/spring-cloud-static/Finchley.SR2/single/spring-cloud.html#hystrix-fallbacks-for-routes


20190115232310418.png


没有添加fallback功能的示例


https://blog.csdn.net/yangshangwei/article/details/85850470#Step8_Hystrix_192 的操作步骤,如果我们将micorservice-provider-user 停掉,继续多次调用,查看Dashboard


20190115233627682.png

上图可知:zuul的hystrix的监控粒度是微服务,而不是某个API,同样的,经过zuul的所有请求,都会被Hystrix保护起来。

zuul的配置规则如下:

zuul: 
  routes:
    microservice-provider-user: /userprovider/**


所以可以这么访问: http://localhost:4534/userprovider/user/4

20190115233700159.png


这样返回是不是很难看,下面我们来为zuul添加容错。


使用zuul为单个微服务添加容错和回退功能

Step1. 新建微服务microservice-gateway-zuul-fallback


为了不影响别的微服务,我们新建个支持容错与回退功能的微服务 ,在maven父工程上右键 新增mave module


20190116000521469.png


代码同 microservice-gateway-zuul的,为了区别,修改下application.yml中的端口,将port修改为4535


Step2. FallbackProvider实现类


主要是两个方法

  • getRoutes 方法,返回为哪个微服务提供回退功能
  • getBody 方法,微服务不可用时返回的信息
package com.artisan.microservice.fallback;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import org.springframework.cloud.netflix.zuul.filters.route.FallbackProvider;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.client.ClientHttpResponse;
import org.springframework.stereotype.Component;
import com.netflix.hystrix.exception.HystrixTimeoutException;
// 添加注解#Component使其成为Spring管理的bean
@Component
public class MyFallbackProvider  implements FallbackProvider {
    @Override
    public String getRoute() {
      // 为哪个微服务提供提供回退服务,返回微服务的名字,必须和注册在Eureka Server上的名字一致
        return "microservice-provider-user";
    }
    @Override
    public ClientHttpResponse fallbackResponse(String route, final Throwable cause) {
        // fallback时的状态码
      if (cause instanceof HystrixTimeoutException) {
            return response(HttpStatus.GATEWAY_TIMEOUT);
        } else {
            return response(HttpStatus.INTERNAL_SERVER_ERROR);
        }
    }
    private ClientHttpResponse response(final HttpStatus status) {
        return new ClientHttpResponse() {
            @Override
            public HttpStatus getStatusCode() throws IOException {
                return status;
            }
            @Override
            public int getRawStatusCode() throws IOException {
                return status.value();
            }
            @Override
            public String getStatusText() throws IOException {
                return status.getReasonPhrase();
            }
            @Override
            public void close() {
            }
            @Override
            public InputStream getBody() throws IOException {
              // 响应体
                return new ByteArrayInputStream(("【 " +getRoute() + " 】fallback").getBytes());
            }
            @Override
            public HttpHeaders getHeaders() {
              // headers设置
                HttpHeaders headers = new HttpHeaders();
                headers.setContentType(MediaType.APPLICATION_JSON);
                return headers;
            }
        };
    }
}


Step3. 测试

  1. 启动Eureka Server
  2. 启动microservice-gateway-zuul-fallback
  3. 启动micorservice-provider-user


此时,通过zuul去访问微服务micorservice-provider-user

http://localhost:4535/userprovider/user/4

20190116001245285.png

停掉micorservice-provider-user,再次访问

http://localhost:4535/userprovider/user/4

20190115235959956.png

可见回退功能生效了。


为全部微服务提供回退



20190116001822408.png


代码改造

将 getRoute方法 返回 * or null

@Override
    public String getRoute() {
        return "*";
    }



简单起见,仅修改这一个地方,至于返回什么信息,我们这里也不做太复杂,保持和上面的示例一致即可。

20190116090504811.png


zuul-fallback工程application.yml修改

zuul-fallback工程的zuul部分的配置信息:


20190116093303746.png


测试验证

接下来测试下,为了验证我们起两个微服务:

  1. 启动microservice-discovery-eureka
  2. 启动microservice-provider-user
  1. 启动micorservice-consumer-movie-ribbon
  2. 启动microservice-gateway-zuul-fallback

查看服务注册情况 http://localhost:8761/



20190116090833754.png


查看zuul的路由信息 http://localhost:4535/actuator/routes


20190116093339956.png

先通过zuul微服务去访问其他两个微服务


电影微服务: http://localhost:4535/userprovider/user/3


{"id":3,"username":"artisan3","name":"小工匠三","age":30,"balance":300.00}


用户微服务: http://localhost:4535/usermovie/movie/4

{"id":4,"username":"artisan4","name":"小工匠4","age":40,"balance":400.00}


停掉micorservice-consumer-movie-ribbon,再次通过zuul访问consumer-movie

http://localhost:4535/usermovie/movie/4

20190116093434912.png

必须使用zuul代理的路径访问才能生效,使用http://localhost:4535/micorservice-consumer-movie-ribbon/movie/4 不行,因为停掉服务后zuul的路由信息中 http://localhost:4535/actuator/routes 已经没有该代理信息了。


同样的停掉 microservice-provider-user, 再次访问 http://localhost:4535/userprovider/user/3


20190116093823996.png


最后顺便看下zuul的路由信息


20190116093847160.png


代码


https://github.com/yangshangwei/SpringCloudMaster/tree/master/microservice-gateway-zuul-fallback

相关文章
|
24天前
|
消息中间件 缓存 Java
手写模拟Spring Boot启动过程功能
【11月更文挑战第19天】Spring Boot自推出以来,因其简化了Spring应用的初始搭建和开发过程,迅速成为Java企业级应用开发的首选框架之一。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,帮助读者深入理解其工作机制。
38 3
|
2月前
|
Dubbo Java 应用服务中间件
Spring Cloud Dubbo:微服务通信的高效解决方案
【10月更文挑战第15天】随着信息技术的发展,微服务架构成为企业应用开发的主流。Spring Cloud Dubbo结合了Dubbo的高性能RPC和Spring Cloud的生态系统,提供高效、稳定的微服务通信解决方案。它支持多种通信协议,具备服务注册与发现、负载均衡及容错机制,简化了服务调用的复杂性,使开发者能更专注于业务逻辑的实现。
68 2
|
24天前
|
Java 开发者 微服务
手写模拟Spring Boot自动配置功能
【11月更文挑战第19天】随着微服务架构的兴起,Spring Boot作为一种快速开发框架,因其简化了Spring应用的初始搭建和开发过程,受到了广大开发者的青睐。自动配置作为Spring Boot的核心特性之一,大大减少了手动配置的工作量,提高了开发效率。
46 0
|
2月前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
52 4
|
2月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,包括版本兼容性、安全性、性能调优等方面。
166 1
|
2月前
|
Java API 数据库
Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐
本文通过在线图书管理系统案例,详细介绍如何使用Spring Boot构建RESTful API。从项目基础环境搭建、实体类与数据访问层定义,到业务逻辑实现和控制器编写,逐步展示了Spring Boot的简洁配置和强大功能。最后,通过Postman测试API,并介绍了如何添加安全性和异常处理,确保API的稳定性和安全性。
41 0
|
3天前
|
Java Nacos Sentinel
Spring Cloud Alibaba:一站式微服务解决方案
Spring Cloud Alibaba(简称SCA) 是一个基于 Spring Cloud 构建的开源微服务框架,专为解决分布式系统中的服务治理、配置管理、服务发现、消息总线等问题而设计。
70 12
Spring Cloud Alibaba:一站式微服务解决方案
|
1月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。首先,创建并配置 Spring Boot 项目,实现后端 API;然后,使用 Ant Design Pro Vue 创建前端项目,配置动态路由和菜单。通过具体案例,展示了如何快速搭建高效、易维护的项目框架。
108 62
|
10天前
|
Prometheus 监控 Java
如何全面监控所有的 Spring Boot 微服务
如何全面监控所有的 Spring Boot 微服务
25 3
|
1月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,帮助开发者提高开发效率和应用的可维护性。
62 2