【二】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

相关文章

SpringBoot中六种批量更新Mysql的方式效率对比分析

《SpringBoot中六种批量更新Mysql的方式效率对比分析》文章比较了MySQL大数据量批量更新的多种方法,指出REPLACEINTO和ONDUPLICATEKEY效率最高但存在数据风险,MyB... 目录效率比较测试结构数据库初始化测试数据批量修改方案第一种 for第二种 case when第三种

Java docx4j高效处理Word文档的实战指南

《Javadocx4j高效处理Word文档的实战指南》对于需要在Java应用程序中生成、修改或处理Word文档的开发者来说,docx4j是一个强大而专业的选择,下面我们就来看看docx4j的具体使用... 目录引言一、环境准备与基础配置1.1 Maven依赖配置1.2 初始化测试类二、增强版文档操作示例2.

一文详解如何使用Java获取PDF页面信息

《一文详解如何使用Java获取PDF页面信息》了解PDF页面属性是我们在处理文档、内容提取、打印设置或页面重组等任务时不可或缺的一环,下面我们就来看看如何使用Java语言获取这些信息吧... 目录引言一、安装和引入PDF处理库引入依赖二、获取 PDF 页数三、获取页面尺寸(宽高)四、获取页面旋转角度五、判断

Windows环境下解决Matplotlib中文字体显示问题的详细教程

《Windows环境下解决Matplotlib中文字体显示问题的详细教程》本文详细介绍了在Windows下解决Matplotlib中文显示问题的方法,包括安装字体、更新缓存、配置文件设置及编码調整,并... 目录引言问题分析解决方案详解1. 检查系统已安装字体2. 手动添加中文字体(以SimHei为例)步骤

Spring Boot中的路径变量示例详解

《SpringBoot中的路径变量示例详解》SpringBoot中PathVariable通过@PathVariable注解实现URL参数与方法参数绑定,支持多参数接收、类型转换、可选参数、默认值及... 目录一. 基本用法与参数映射1.路径定义2.参数绑定&nhttp://www.chinasem.cnbs

JAVA中安装多个JDK的方法

《JAVA中安装多个JDK的方法》文章介绍了在Windows系统上安装多个JDK版本的方法,包括下载、安装路径修改、环境变量配置(JAVA_HOME和Path),并说明如何通过调整JAVA_HOME在... 首先去oracle官网下载好两个版本不同的jdk(需要登录Oracle账号,没有可以免费注册)下载完

Spring StateMachine实现状态机使用示例详解

《SpringStateMachine实现状态机使用示例详解》本文介绍SpringStateMachine实现状态机的步骤,包括依赖导入、枚举定义、状态转移规则配置、上下文管理及服务调用示例,重点解... 目录什么是状态机使用示例什么是状态机状态机是计算机科学中的​​核心建模工具​​,用于描述对象在其生命

Spring Boot 结合 WxJava 实现文章上传微信公众号草稿箱与群发

《SpringBoot结合WxJava实现文章上传微信公众号草稿箱与群发》本文将详细介绍如何使用SpringBoot框架结合WxJava开发工具包,实现文章上传到微信公众号草稿箱以及群发功能,... 目录一、项目环境准备1.1 开发环境1.2 微信公众号准备二、Spring Boot 项目搭建2.1 创建

Java中Integer128陷阱

《Java中Integer128陷阱》本文主要介绍了Java中Integer与int的区别及装箱拆箱机制,重点指出-128至127范围内的Integer值会复用缓存对象,导致==比较结果为true,下... 目录一、Integer和int的联系1.1 Integer和int的区别1.2 Integer和in

SpringSecurity整合redission序列化问题小结(最新整理)

《SpringSecurity整合redission序列化问题小结(最新整理)》文章详解SpringSecurity整合Redisson时的序列化问题,指出需排除官方Jackson依赖,通过自定义反序... 目录1. 前言2. Redission配置2.1 RedissonProperties2.2 Red