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

相关文章
|
18天前
|
Dubbo Java 应用服务中间件
Spring Cloud Dubbo:微服务通信的高效解决方案
【10月更文挑战第15天】随着信息技术的发展,微服务架构成为企业应用开发的主流。Spring Cloud Dubbo结合了Dubbo的高性能RPC和Spring Cloud的生态系统,提供高效、稳定的微服务通信解决方案。它支持多种通信协议,具备服务注册与发现、负载均衡及容错机制,简化了服务调用的复杂性,使开发者能更专注于业务逻辑的实现。
44 2
|
21天前
|
Dubbo Java 应用服务中间件
Dubbo学习圣经:从入门到精通 Dubbo3.0 + SpringCloud Alibaba 微服务基础框架
尼恩团队的15大技术圣经,旨在帮助开发者系统化、体系化地掌握核心技术,提升技术实力,从而在面试和工作中脱颖而出。本文介绍了如何使用Dubbo3.0与Spring Cloud Gateway进行整合,解决传统Dubbo架构缺乏HTTP入口的问题,实现高性能的微服务网关。
|
18天前
|
JSON Java 数据格式
【微服务】SpringCloud之Feign远程调用
本文介绍了使用Feign作为HTTP客户端替代RestTemplate进行远程调用的优势及具体使用方法。Feign通过声明式接口简化了HTTP请求的发送,提高了代码的可读性和维护性。文章详细描述了Feign的搭建步骤,包括引入依赖、添加注解、编写FeignClient接口和调用代码,并提供了自定义配置的示例,如修改日志级别等。
40 1
|
21天前
|
人工智能 文字识别 Java
SpringCloud+Python 混合微服务,如何打造AI分布式业务应用的技术底层?
尼恩,一位拥有20年架构经验的老架构师,通过其深厚的架构功力,成功指导了一位9年经验的网易工程师转型为大模型架构师,薪资逆涨50%,年薪近80W。尼恩的指导不仅帮助这位工程师在一年内成为大模型架构师,还让他管理起了10人团队,产品成功应用于多家大中型企业。尼恩因此决定编写《LLM大模型学习圣经》系列,帮助更多人掌握大模型架构,实现职业跃迁。该系列包括《从0到1吃透Transformer技术底座》、《从0到1精通RAG架构》等,旨在系统化、体系化地讲解大模型技术,助力读者实现“offer直提”。此外,尼恩还分享了多个技术圣经,如《NIO圣经》、《Docker圣经》等,帮助读者深入理解核心技术。
SpringCloud+Python 混合微服务,如何打造AI分布式业务应用的技术底层?
|
2月前
|
安全 应用服务中间件 API
微服务分布式系统架构之zookeeper与dubbo-2
微服务分布式系统架构之zookeeper与dubbo-2
|
2月前
|
负载均衡 Java 应用服务中间件
微服务分布式系统架构之zookeeper与dubbor-1
微服务分布式系统架构之zookeeper与dubbor-1
|
3月前
|
Kubernetes Cloud Native Docker
云原生之旅:从容器到微服务的架构演变
【8月更文挑战第29天】在数字化时代的浪潮下,云原生技术以其灵活性、可扩展性和弹性管理成为企业数字化转型的关键。本文将通过浅显易懂的语言和生动的比喻,带领读者了解云原生的基本概念,探索容器化技术的奥秘,并深入微服务架构的世界。我们将一起见证代码如何转化为现实中的服务,实现快速迭代和高效部署。无论你是初学者还是有经验的开发者,这篇文章都会为你打开一扇通往云原生世界的大门。
|
3月前
|
负载均衡 应用服务中间件 持续交付
微服务架构下的Web服务器部署
【8月更文第28天】随着互联网应用的不断发展,传统的单体应用架构逐渐显露出其局限性,特别是在可扩展性和维护性方面。为了解决这些问题,微服务架构应运而生。微服务架构通过将应用程序分解成一系列小型、独立的服务来提高系统的灵活性和可维护性。本文将探讨如何在微服务架构中有效部署和管理Web服务器实例,并提供一些实际的代码示例。
105 0
|
30天前
|
Kubernetes 安全 微服务
使用 Istio 缓解电信 5G IoT 微服务 Pod 架构的安全挑战
使用 Istio 缓解电信 5G IoT 微服务 Pod 架构的安全挑战
48 8
|
1月前
|
消息中间件 负载均衡 Cloud Native
云原生之旅:从容器到微服务的架构演变
在数字化转型的风潮中,云原生技术以其灵活性、可扩展性和弹性而备受青睐。本文将通过一个虚拟的故事,讲述一个企业如何逐步拥抱云原生,实现从传统架构向容器化和微服务架构的转变,以及这一过程中遇到的挑战和解决方案。我们将以浅显易懂的方式,探讨云原生的核心概念,并通过实际代码示例,展示如何在云平台上部署和管理微服务。