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

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo