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

相关文章
|
14天前
|
算法 Java 微服务
【SpringCloud(1)】初识微服务架构:创建一个简单的微服务;java与Spring与微服务;初入RestTemplate
微服务架构是What?? 微服务架构是一种架构模式,它提出将单一应用程序划分为一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。 每个服务允许在其独立的进程中,服务于服务间采用轻量级的通信机制互相协作(通常是Http协议的RESTful API或RPC协议)。 每个服务都围绕着具体业务进行构建,并且能够被独立的部署到生产环境、类生产环境等。另外应当尽量避免统一的、集中式的服务管理机制,对具体的一个服务而言,应根据上下文,选择合适的语言、工具对其进行构建
310 127
|
14天前
|
负载均衡 算法 Java
【SpringCloud(2)】微服务注册中心:Eureka、Zookeeper;CAP分析;服务注册与服务发现;单机/集群部署Eureka;连接注册中心
1. 什么是服务治理? SpringCloud封装了Netfix开发的Eureka模块来实现服务治理 在传统pc的远程调用框架中,管理每个服务与服务之间依赖关系比较复杂,管理比较复杂,所以需要使用服务治理,管理服务于服务之间依赖关系,可以实现服务调用、负载均衡、容错等,实现服务发现与注册
94 1
|
1月前
|
数据可视化 Java BI
将 Spring 微服务与 BI 工具集成:最佳实践
本文探讨了 Spring 微服务与商业智能(BI)工具集成的潜力与实践。随着微服务架构和数据分析需求的增长,Spring Boot 和 Spring Cloud 提供了构建可扩展、弹性服务的框架,而 BI 工具则增强了数据可视化与实时分析能力。文章介绍了 Spring 微服务的核心概念、BI 工具在企业中的作用,并深入分析了两者集成带来的优势,如实时数据处理、个性化报告、数据聚合与安全保障。同时,文中还总结了集成过程中的最佳实践,包括事件驱动架构、集中配置管理、数据安全控制、模块化设计与持续优化策略,旨在帮助企业构建高效、智能的数据驱动系统。
120 1
将 Spring 微服务与 BI 工具集成:最佳实践
|
23天前
|
监控 Cloud Native Java
Spring Boot 3.x 微服务架构实战指南
🌟蒋星熠Jaxonic,技术宇宙中的星际旅人。深耕Spring Boot 3.x与微服务架构,探索云原生、性能优化与高可用系统设计。以代码为笔,在二进制星河中谱写极客诗篇。关注我,共赴技术星辰大海!(238字)
Spring Boot 3.x 微服务架构实战指南
|
7天前
|
负载均衡 Java API
《深入理解Spring》Spring Cloud 构建分布式系统的微服务全家桶
Spring Cloud为微服务架构提供一站式解决方案,涵盖服务注册、配置管理、负载均衡、熔断限流等核心功能,助力开发者构建高可用、易扩展的分布式系统,并持续向云原生演进。
|
1月前
|
监控 安全 Java
Spring Cloud 微服务治理技术详解与实践指南
本文档全面介绍 Spring Cloud 微服务治理框架的核心组件、架构设计和实践应用。作为 Spring 生态系统中构建分布式系统的标准工具箱,Spring Cloud 提供了一套完整的微服务解决方案,涵盖服务发现、配置管理、负载均衡、熔断器等关键功能。本文将深入探讨其核心组件的工作原理、集成方式以及在实际项目中的最佳实践,帮助开发者构建高可用、可扩展的分布式系统。
138 1
|
3月前
|
Java Spring 容器
SpringBoot自动配置的原理是什么?
Spring Boot自动配置核心在于@EnableAutoConfiguration注解,它通过@Import导入配置选择器,加载META-INF/spring.factories中定义的自动配置类。这些类根据@Conditional系列注解判断是否生效。但Spring Boot 3.0后已弃用spring.factories,改用新格式的.imports文件进行配置。
787 0
|
15天前
|
JavaScript Java Maven
【SpringBoot(二)】带你认识Yaml配置文件类型、SpringMVC的资源访问路径 和 静态资源配置的原理!
SpringBoot专栏第二章,从本章开始正式进入SpringBoot的WEB阶段开发,本章先带你认识yaml配置文件和资源的路径配置原理,以方便在后面的文章中打下基础
141 4
|
15天前
|
Java 测试技术 数据库连接
【SpringBoot(四)】还不懂文件上传?JUnit使用?本文带你了解SpringBoot的文件上传、异常处理、组件注入等知识!并且带你领悟JUnit单元测试的使用!
Spring专栏第四章,本文带你上手 SpringBoot 的文件上传、异常处理、组件注入等功能 并且为你演示Junit5的基础上手体验
454 2
|
4月前
|
人工智能 Java 测试技术
Spring Boot 集成 JUnit 单元测试
本文介绍了在Spring Boot中使用JUnit 5进行单元测试的常用方法与技巧,包括添加依赖、编写测试类、使用@SpringBootTest参数、自动装配测试模块(如JSON、MVC、WebFlux、JDBC等),以及@MockBean和@SpyBean的应用。内容实用,适合Java开发者参考学习。
491 0

热门文章

最新文章