【二】SpringCloud详细搭建--断路器Hystrix,路由网关Zuul【Finchley版本】

本文主要是介绍【二】SpringCloud详细搭建--断路器Hystrix,路由网关Zuul【Finchley版本】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

SpringCloud详细搭建(下篇)【Finchley版本】

github源码下载:https://github.com/LuckyShawn/simple-spring-cloud

1.断路器Hystrix

Hystrix简述:

  • Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等,Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性。Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等,Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性。

  • “断路器”本身是一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个符合预期的、可处理的备选响应(FallBack),而不是长时间的等待或者抛出调用方无法处理的异常,这样就保证了服务调用方的线程不会被长时间、不必要地占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩。
    作用:服务降级,服务熔断,服务限流,接近实时的监控 等
    官网:https://github.com/Netflix/Hystrix/wiki/How-To-Use

1.1 ribbon-hystrix版断路器

  1. 创建ribbon-hystrix服务
    在这里插入图片描述
    pom.xml增加:
 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId></dependency>

2.创建HelloService

package com.shawn.serverhystrix.service;
@Service
public class HelloService {@Autowiredprivate RestTemplate restTemplate;//一旦调用服务方法失败并抛出了错误信息后,//会自动调用@HystrixCommand标注好的fallbackMethod调用类中的指定方法@HystrixCommand(fallbackMethod = "helloError")public String hello(String name){return restTemplate.getForObject("http://eureka-client/hello?name="+name,String.class);}public String helloError(String name){return "hello!"+name+",An Error Has Occurred";}
}

3.创建HelloController,ConfigBeans

package com.shawn.serverhystrix.controller;
@RestController
public class HelloController {@Autowiredprivate HelloService helloService;@GetMapping("/hello")public String hello(String name){return helloService.hello(name);}
}
package com.shawn.serverhystrix.config;
@Configuration
public class ConfigBeans {@Bean@LoadBalancedpublic RestTemplate restTemplate(){return new RestTemplate();}
}
  1. 修改主启动类
@SpringBootApplication
@EnableHystrix //开启断路器功能
@EnableEurekaClient
public class ServerHystrixApplication {public static void main(String[] args) {SpringApplication.run(ServerHystrixApplication.class, args);}}
  1. 测试
    重复访问:http://localhost:8766/hello?name=shawn
//交替出现
Hello!!shawn,I am from:8763
Hello!!shawn,I am from:8762

停止一个eureka-client8763
重复访问:http://localhost:8766/hello?name=shawn

//在一定访问次数交替出现
Hello!!shawn,I am from:8762
hello!shawn,An Error Has Occurred

在多访问几次,不再出现‘hello!shawn,An Error Has Occurred’,说明不在访问8763端口。避免了整体服务失败和雪崩效应。

2.feign版断路器

  1. 创建feign-hystrix服务
    在这里插入图片描述
  2. 新建并编写application.yml
server:port: 8767
spring:application:name: feign-hystrix
eureka:client:service-url:defaultZone: http://localhost:8761/eureka/
  1. 创建FeignService接口
package com.shawn.feignhystrix.service;
//fallback的指定类,发生熔断执行的类
@FeignClient(value = "eureka-client",fallback = FeignServiceHystrix.class)
public interface FeignService {@RequestMapping(value = "/hello",method = RequestMethod.GET)String sayHello(@RequestParam(value = "name")String name);
}
  1. 创建熔断类FeignServiceHystrix 实现FeignService接口
package com.shawn.feignhystrix.hystrix;
@Component
public class FeignServiceHystrix implements FeignService {@Overridepublic String sayHello(String name) {return "Sorry!"+name+",An Error Has Occurred!";}
}
  1. 创建FeignController
package com.shawn.feignhystrix.controller;
@RestController
public class FeignController {@Autowiredprivate FeignService feignService;@GetMapping("/hello")public String sayHello(String name){return feignService.sayHello(name);}
}
  1. 修改主启动类
@SpringBootApplication
@EnableFeignClients
@EnableEurekaClient
public class FeignHystrixApplication {public static void main(String[] args) {SpringApplication.run(FeignHystrixApplication.class, args);}
}

7.测试方法和结果与ribbon-hystrix相同
补充:其实feign是自带断路器的,可以试着把hystrix的依赖注释掉,也一样可以测试成功。

2.路由网关Zuul

  1. 概述:
  • Zuul包含了对请求的路由和过滤两个最主要的功能:
    其中路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础而过滤器功能则负责对请求的处理过程进行干预,是实现请求校验、服务聚合等功能的基础.

  • Zuul和Eureka进行整合,将Zuul自身注册为Eureka服务治理下的应用,同时从Eureka中获得其他微服务的消息,也即以后的访问微服务都是通过Zuul跳转后获得。

    注意:Zuul服务最终还是会注册进Eureka

  • 代理+路由+过滤三大功能

  • 官网资料:https://github.com/Netflix/zuul/wiki/Getting-Started

  1. 创建工程zuul-gateway
    在这里插入图片描述
    pom.xml新增:
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
  1. 新增并编写application.yml
server:port: 8768
spring:application:name: server-zuul
eureka:client:service-url:defaultZone: http://localhost:8761/eureka/
# serviceId必须与相应的服务名字对应!
zuul:prefix: /shawn  #设置统一域名前缀routes:zuul-a:path: /zuul-a/**serviceId: consumer-ribbonzuul-b:path: /zuul-b/**serviceId: consumer-feignzuul-c:path: /zuul-c/**serviceId: ribbon-hystrixzuul-d:path: /zuul-d/**serviceId: feign-hystrix
  1. 修改主启动类
@SpringBootApplication
@EnableZuulProxy	//开启zuul路由功能
@EnableEurekaClient
public class ServerZuulApplication {public static void main(String[] args) {SpringApplication.run(ServerZuulApplication.class, args);}
}
  1. 启动测试
    现在的结构是:
    在这里插入图片描述

重复访问http://localhost:8768/shawn/zuul-a/hello?name=shawn

//交替出现
Hello!!shawn,I am from:8762
Hello!!shawn,I am from:8763

依次访问zuul-b,zuul-c,zuul-d,都是交替出现,说明路由成功且负载均衡功能正常。

  1. 测试断路器功能
    需要修改zuul项目的application.yml
server:port: 8768
spring:application:name: server-zuuleureka:client:service-url:defaultZone: http://localhost:8761/eureka/
# serviceId必须与相应的服务名字对应!
zuul:prefix: /shawn  #设置统一域名前缀routes:zuul-a:path: /zuul-a/**serviceId: consumer-ribbonzuul-b:path: /zuul-b/**serviceId: consumer-feignzuul-c:path: /zuul-c/**serviceId: ribbon-hystrixzuul-d:path: /zuul-d/**serviceId: feign-hystrixhost:socket-timeout-millis: 60000connect-timeout-millis: 60000ribbon:ReadTimeout: 6000000ConnectTimeout: 6000000hystrix:command:c4i-store:execution:timeout:enabled: trueisolation:thread:timeoutInMilliseconds: 6000000ribbon:ReadTimeout: 600000ConnectTimeout: 600000
#如果未配置以上的超时时间 就会com.netflix.zuul.exception.ZuulException: Forwarding error报错

重复访问http://localhost:8768/shawn/zuul-d/hello?name=shawn
在这里插入图片描述

8763,8762交替
关闭Eureka-client 8762端口
重复访问http://localhost:8768/shawn/zuul-d/hello?name=shawn
在这里插入图片描述
说明断路器功能正常,负载均衡功能也正常,重复访问多次后,不再访问8762端口。

3.Zuul拦截功能

添加一个Myfilter类集成ZuulFilter

package com.shawn.serverzuul.filter;
@Component
public class Myfilter extends ZuulFilter {private static Logger logger = LoggerFactory.getLogger(Myfilter.class);//   filterType:返回一个字符串代表过滤器的类型,在zuul中定义了四种不同生命周期的过滤器类型,具体如下://    pre:路由之前//    routing:路由之时//    post: 路由之后//    error:发送错误调用@Overridepublic String filterType() {return "pre";}//filterOrder:过滤的顺序@Overridepublic int filterOrder() {return 0;}//shouldFilter:这里可以写逻辑判断,是否要过滤,本文true,永远过滤。@Overridepublic boolean shouldFilter() {return true;}//run:过滤器的具体逻辑。可用很复杂,包括查sql,nosql去判断该请求到底有没有权限访问。@Overridepublic Object run() throws ZuulException {RequestContext ctx = RequestContext.getCurrentContext();HttpServletRequest request = ctx.getRequest();Object password = request.getParameter("password");if(null == password){logger.warn("密码为空!");ctx.setSendZuulResponse(false);ctx.setResponseStatusCode(500);try {ctx.getResponse().getWriter().write("登录失败!");} catch (IOException e) {e.printStackTrace();}return null;}if("123456".equals(password)){logger.info("登录成功!");return null;}else{logger.info("密码错误!");ctx.setSendZuulResponse(true);ctx.setResponseStatusCode(500);try {ctx.getResponse().getWriter().write("登录失败!");} catch (IOException e) {e.printStackTrace();}return null;}}
}

重启server-zuul,访问:http://localhost:8768/shawn/zuul-a/hello?name=shawn&password=123
在这里插入图片描述

访问:http://localhost:8768/shawn/zuul-a/hello?name=shawn&password=123456
在这里插入图片描述

END

参考资料:https://blog.csdn.net/forezp/article/details/81040990

这篇关于【二】SpringCloud详细搭建--断路器Hystrix,路由网关Zuul【Finchley版本】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/405016

相关文章

Java实现字节字符转bcd编码

《Java实现字节字符转bcd编码》BCD是一种将十进制数字编码为二进制的表示方式,常用于数字显示和存储,本文将介绍如何在Java中实现字节字符转BCD码的过程,需要的小伙伴可以了解下... 目录前言BCD码是什么Java实现字节转bcd编码方法补充总结前言BCD码(Binary-Coded Decima

SpringBoot全局域名替换的实现

《SpringBoot全局域名替换的实现》本文主要介绍了SpringBoot全局域名替换的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录 项目结构⚙️ 配置文件application.yml️ 配置类AppProperties.Ja

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC

JavaScript中的高级调试方法全攻略指南

《JavaScript中的高级调试方法全攻略指南》什么是高级JavaScript调试技巧,它比console.log有何优势,如何使用断点调试定位问题,通过本文,我们将深入解答这些问题,带您从理论到实... 目录观点与案例结合观点1观点2观点3观点4观点5高级调试技巧详解实战案例断点调试:定位变量错误性能分

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

Java使用jar命令配置服务器端口的完整指南

《Java使用jar命令配置服务器端口的完整指南》本文将详细介绍如何使用java-jar命令启动应用,并重点讲解如何配置服务器端口,同时提供一个实用的Web工具来简化这一过程,希望对大家有所帮助... 目录1. Java Jar文件简介1.1 什么是Jar文件1.2 创建可执行Jar文件2. 使用java

SpringBoot实现不同接口指定上传文件大小的具体步骤

《SpringBoot实现不同接口指定上传文件大小的具体步骤》:本文主要介绍在SpringBoot中通过自定义注解、AOP拦截和配置文件实现不同接口上传文件大小限制的方法,强调需设置全局阈值远大于... 目录一  springboot实现不同接口指定文件大小1.1 思路说明1.2 工程启动说明二 具体实施2

Java实现在Word文档中添加文本水印和图片水印的操作指南

《Java实现在Word文档中添加文本水印和图片水印的操作指南》在当今数字时代,文档的自动化处理与安全防护变得尤为重要,无论是为了保护版权、推广品牌,还是为了在文档中加入特定的标识,为Word文档添加... 目录引言Spire.Doc for Java:高效Word文档处理的利器代码实战:使用Java为Wo

SpringBoot日志级别与日志分组详解

《SpringBoot日志级别与日志分组详解》文章介绍了日志级别(ALL至OFF)及其作用,说明SpringBoot默认日志级别为INFO,可通过application.properties调整全局或... 目录日志级别1、级别内容2、调整日志级别调整默认日志级别调整指定类的日志级别项目开发过程中,利用日志

Java中的抽象类与abstract 关键字使用详解

《Java中的抽象类与abstract关键字使用详解》:本文主要介绍Java中的抽象类与abstract关键字使用详解,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、抽象类的概念二、使用 abstract2.1 修饰类 => 抽象类2.2 修饰方法 => 抽象方法,没有