当前位置: 首页 > Linux

SpringCloud学习(三)

时间:2023-04-06 20:13:26 Linux

本文集成了Hystrix,继续搭建demo。雪崩效应:在微服务架构中,通常会有多个服务层调用,基础服务的故障可能会导致级联故障,进而导致整个系统不可用。这种现象称为服务雪崩效应。服务雪崩效应是“服务提供者”不可用导致“服务消费者”不可用,并逐渐放大不可用的过程。如下图所示:A是服务提供者,B是A的服务消费者,C和D是B的服务消费者。A的不可用导致B的不可用,当不可用放大到C时而D就像滚雪球一样,形成雪崩效应。保险丝:保险丝的原理很简单,就像电源过载保护器一样。它可以快速失败,如果在一段时间内检测到许多类似的错误,它会强制多个后续调用快速失败,不再访问远程服务器,从而防止应用程序不断尝试执行可能失败的操作,允许应用程序继续执行而不用等待错误被修复,或者浪费CPU时间等待长时间超时发生。断路器还使应用程序能够诊断错误是否已修复,如果已修复,应用程序将尝试再次调用该操作。断路器模式就像是那些容易出错的操作的代理。这样的代理可以统计最近一次调用发生错误的次数,然后决定是允许操作继续进行,还是立即返回错误。熔断器开关转换逻辑如下:Hystrix熔断器:1.断路器机制断路器很好理解。当HystrixCommand请求后端服务失败次数超过一定百分比(默认50%)时,断路器会切换到打开状态(Open)。这时候所有的请求都会直接失败,不会发送给后端服务。断路器保持分闸状态一段时间后(默认5秒),会自动切换到半开状态(HALF-OPEN)。这个时候,判断下一个请求的返回状态。如果请求成功,断路器切换回关闭状态(CLOSED),否则切换回打开状态(OPEN)。Hystrix的断路器就像我们家庭电路中的保险丝。一旦后端服务不可用,断路器会直接切断请求链,避免发送大量无效请求影响系统吞吐量,并且断路器具有自检测和恢复能力。2.FallbackFallback相当于降级操作。对于查询操作,我们可以实现一个fallback方法,当请求后端服务出现异常时,可以使用fallback方法返回的值。fallback方法的返回值一般是设置的默认值或者来自缓存。3、资源隔离在Hystrix中,资源隔离主要是通过线程池来实现的。通常,我们在使用过程中会根据需要调用的远程服务来划分多个线程池。比如调用产品服务的Command放在A线程池,调用账户服务的Command放在B线程池。这样做的主要好处是,运行环境这样,即使调用服务的代码出现bug或者所在的线程池因为其他原因耗尽,也不会影响系统中的其他服务.但代价是维护多个线程池会给系统带来额外的性能开销。如果你对性能要求比较严格,并且确定调用服务的客户端代码不会出问题,可以使用Hystrix的信号模式(Semaphores)来隔离资源。我们在电影微服务Hystirx中使用,在controller中新建如下目录的文件,可以直接使用Hystrix注解,自定义fallback功能。当请求后端服务出现异常时,可以使用fallback方法返回的值。@GetMapping("/movie/{id}")@HystrixCommand(fallbackMethod="fallbackMovie",commandProperties=@HystrixProperty(名称="execution.isolation.strategy",value="semaphore"))publicUserfindmovie(@PathVariableintid){returnuserFeignClient.find(id);}publicUserfallbackMovie(intid){Useruser=newUser();用户.setId(10);返回用户;其中,commandProperties=@HystrixProperty(name="execution.isolation.strategy",value="semaphore")的值Hystrix默认是thread,默认使用线程池中隔离的线程。如果要切换到和调用者同一个线程使用SpringSecurity的上下文,需要设置隔离策略为信号量关于Spring父子容器上下文:1.首先对于一个web应用,部署在一个web容器,web容器提供了一个全局的Context环境,这个context就是ServletContext,为后续的springIoC容器提供宿主环境;2.其次,web.xml中会提供contextLoaderListener。Web容器启动时,会触发容器初始化事件。这时contextLoaderListener会监听这个事件,调用它的contextInitialized方法。在这个方法中,spring会初始化一个启动上下文。这个上下文称为根上下文,即WebApplicationContext,它是一个接口类,准确的说,它的实际实现类是XmlWebApplicationContext。这是spring的IoC容器,对应Bean定义的配置由web.xml中的context-param标签指定。IoC容器初始化后,spring使用WebApplicationContext.ROOTWEBAPPLICATIONCONTEXTATTRIBUTE作为属性Key,保存在ServletContext中,方便获取;3、同样,contextLoaderListener监听器初始化完成后,开始初始化web.xml中配置的Servlet。这个servlet可以配置多个配置。以最常见的DispatcherServlet为例。这个servlet实际上是一个标准的前端控制器,用于转发、匹配和处理每一个servlet请求。当DispatcherServlet上下文被初始化时,它会创建自己的IoC上下文来保存springmvc相关的beans。在建立DispatcherServlet自己的IoC上下文时,它会使用WebApplicationContext.ROOTWEBAPPLICATIONCONTEXTATTRIBUTE从ServletContext中获取之前的根上下文(即WebApplicationContext)作为自己上下文的父上下文。有了这个父上下文之后,初始化你持有的上下文。这个DispatcherServlet初始化它自己的上下文的工作可以在它的initStrategies方法中看到。大致的工作就是初始化处理器映射,视图解析等。这个servlet本身持有的context的默认实现类也是mlWebApplicationContext。初始化完成后,spring将servlet名称相关的属性(这里不是简单的给servlet命名为Key,而是通过一些改造,可以自行查看源码)作为属性Key,同时保存它在ServletContext中,以便后续使用。这样,每个servlet都拥有自己的context,即拥有自己独立的bean空间,每个servlet共享相同的bean,即rootcontext(第二步初始化的context)定义的那些bean。在feign中使用Hystrix:feignclient@FeignClient(name="userprovider",configuration=FeignClient.class,fallback=HystrixFallbackClient.class)publicinterfaceUserFeignClient{@RequestMapping(value="/user/{id}",method=RequestMethod.GET)publicUserfind(@PathVariable("id")intid);}回退类HystrixFallbackClient实现回退方法@ComponentpublicclassHystrixFallbackClient实现UserFeignClient{@OverridepublicUserfind(intid){用户.setId(1);返回用户;}}如果想禁用某个feignClient的Hystrix,可以更改feignClient的config,返回里面的feign.bulider,默认为Hystrix的FeignConfig:@ConfigurationpublicclassFeignConfig{@BeanpublicContractfeignContract(){return新的feign.Contract.Default();}@Bean@Scope("prototype")publicFeign.BuilderfeignBuilder(){returnFeign.builder();如果需要访问fallback触发的原因,Hystrix也提供fallbackfactory:重写UserFeignClient的属性:@FeignClient(name="userprovider",configuration=FeignClient.class,fallbackFactory=HystrixFallbackFactory.class)publicinterfaceUserFeignClient{@RequestMapping(value="/user/{id}",method=RequestMethod.GET)publicUserfind(@PathVariable("id")intid);}创建HystrixFallbackFactory,和一个继承UserFeignClient的接口HystrixUserFeignClientWithFactory:publicinterfaceHystrixUserFeignClientWithFactoryextendsUserFeignClient{}HystrixFallbackFactory:@ComponentpublicclassHystrixFallbackFactoryimplementsFallbackFactory{privatestaticfinalLoggerlogger=LoggerFactory.getLogger(HystrixFallbackFactory.class);@OverridepublicUserFeignClientcreate(Throwablethrowable){this.logger.info("异常原因为{}",throwable.getMessage());返回新的HystrixUserFeignClientWithFactory(){@OverridepublicUserfind(intid){Useruser=newUser();用户.setId(0);返回用户;}};}}hystrix实时监控可视化可以使用dashboardeureka的pom添加`org.springframework.cloudspring-cloud-starter-hystrix-dashboard`并在应用中添加注解@EnableHystrixDashboard,启动eureka,电影微服务(记得把UserFeignClient的fallback改成fallbackfactory,删除fallback属性和UserFeignClient实现类,否则报错)访问hystrix,首先使用电影微服务,hystrix可以打印日志记录,访问http://localhost:8088/hystrix...然后在http://localhost:8761/hystrix,输入http://localhost:8088/hystrix...地址,成功监控