首页 文章 精选 留言 我的

精选列表

搜索[SpringCloud],共1289篇文章
优秀的个人博客,低调大师

SpringCloud微服务(03):Hystrix组件,实现服务熔断

本文源码:GitHub·点这里 || GitEE·点这里 一、熔断器简介 微服务架构特点就是多服务,多数据源,支撑系统应用。这样导致微服务之间存在依赖关系。如果其中一个服务故障,可能导致系统宕机,这就是所谓的雪崩效应。 1、服务熔断 微服务架构中某个微服务发生故障时,要快速切断服务,提示用户,后续请求,不调用该服务,直接返回,释放资源,这就是服务熔断。 熔断生效后,会在指定的时间后调用请求来测试依赖是否恢复,依赖的应用恢复后关闭熔断。 2、服务降级 服务器高并发下,压力剧增的时候,根据当业务情况以及流量,对一些服务和页面有策略的降级(可以理解为关闭不必要的服务),以此缓解服务器资源的压力以保障核心任务的正常运行。 双十一期间,支付宝很多功能都会提示,[双十一期间,保障核心交易,某某服务数据延迟]。 3、核心依赖 <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-hystrix</artifactId> </dependency> 4、核心注解 @EnableHystrix 启动类注解控制熔断功能。 @HystrixCommand 方法注解,熔断控制配置。 5、案例模块描述 演示基于Ribbon服务的熔断 node03-consume-8001 演示基于Feign服务的熔断 node03-consume-8002 Eureka注册中心 node03-eureka-7001 两个服务提供方 node03-provider-6001 node03-provider-6002 二、基于Ribbon服务熔断 1、熔断执行方法 /** * 服务熔断调用方法 */ public String getDefaultInfo (){ return "服务被熔断" ; } 2、简单案例 /** * 简单配置 */ @RequestMapping("/showInfo1") @HystrixCommand(fallbackMethod = "getDefaultInfo") public String showInfo1 (){ return restTemplate.getForObject(server_name+"/getInfo",String.class) ; } Hystrix默认的超时时间是1秒,超时时间内部响应,就会执行熔断,进入fallback程序。由于Spring的懒加载机制,首次请求往往比较慢,可以通过配置Hystrix超时时间解决。 3、复杂案例 配置超时、并发、线程池、指定异常熔断忽略 /** * 复杂配置 */ @RequestMapping("/showInfo2") @HystrixCommand( fallbackMethod = "getDefaultInfo", commandProperties={ // 降级处理超时时间设置 @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "3000"), // 任意时间点允许的最高并发数。超过该设置值后,拒绝执行请求。 @HystrixProperty(name = "fallback.isolation.semaphore.maxConcurrentRequests", value = "1000"), }, // 配置执行的线城池 threadPoolProperties = { @HystrixProperty(name = "coreSize", value = "20"), @HystrixProperty(name = "maxQueueSize", value = "-1"), }, // 该异常不执行熔断,去执行该异常抛出的自己逻辑 ignoreExceptions = {ServiceException.class} ) public String showInfo2 (){ String value = "" ; // 测试配置异常不熔断 // 响应:{"code":500,"msg":"运行异常"} if (value.equals("")){ throw new ServiceException("运行异常") ; } // 该异常被熔断 // if (value.equals("")){ // throw new RuntimeException("抛出错误") ; // } return restTemplate.getForObject(server_name+"/getInfo",String.class) ; } 4、启动类注解 @EnableHystrix 三、基于Feign服务熔断 1、Jar包说明 通过观察Fegin依赖的JAR可知,Fegin的Jar下包含Hystrix需要的Jar包,这里不用再次导入依赖。 2、熔断配置 Feign用接口实现的声明式Rest请求,所以配置也就在接口上面了。 1)、接口代码 @FeignClient(value = "NODE02-PROVIDER",fallback = FallbackService.class) public interface GetAuthorService { @RequestMapping(value = "/getAuthorInfo/{authorId}",method = RequestMethod.GET) String getAuthorInfo (@PathVariable("authorId") String authorId) ; } 2)、熔断执行代码 @Component public class FallbackService implements GetAuthorService { @Override public String getAuthorInfo(String authorId) { return "服务被熔断"+authorId; } } 3)、配置文件 开启熔断功能 feign: hystrix: enabled: true 3、服务类注解 由于上面的接口和熔断代码是在不同的Jar模块中,所以要在启动类@SpringBootApplication注解中扫描,如下。 @SpringBootApplication(scanBasePackages = {"cloud.node02.consume","cloud.block.code.service"}) @EnableEurekaClient // 本服务启动后会自动注册进eureka服务中 @EnableDiscoveryClient // 因为包名路径不同,需要加basePackages属性 @EnableFeignClients(basePackages={"cloud.block.code.service"}) public class Application_8002 { public static void main(String[] args) { SpringApplication.run(Application_8002.class,args) ; } } 四、源代码说明 GitHub地址:知了一笑 https://github.com/cicadasmile/spring-cloud-base 码云地址:知了一笑 https://gitee.com/cicadasmile/spring-cloud-base

优秀的个人博客,低调大师

Spring和SpringBoot以及SpringCloud框架的深入理解

spring 结构图 spring是一个生态体系(也可以说是技术体系),是集大成者,它包含了Spring Framework ,Spring Boot, Spring Cloud等(还包括Spring Cloud data flow,Spring data, Spring Batch, Spring security 等等). Spring是一个分层的JavaSE/EEfull-stack(一站式)轻量级开源框架。 Spring为不同的层都提供的企业级解决方案: web层:spring mvc service层:spring dao层:JDBCTemplate、Springdatajpa(Java Persistence API) Spring的核心思想是IoC(控制反转)和AOP(面向切面编程) Spring Framework Spring Framework是整个spring生态的基石,它可是硬生生的消灭了Java官方主推的企业级开发标准EJB,从而实现一统天下。Spring官方对Spring Framework简短描述:为依赖注入、事务管理、WEB应用、数据访问等提供了核心的支持。Spring Framework专注于企业级应用程序的“管道”,以便开发团队可以专注于应用程序的业务逻辑。 笔者要提醒的是,千万不要把Spring和Spring Framework搞混淆了,很多文章都错误的定义了spring:spring是一个一站式的轻量级的java开发框架,核心是控制反转(IoC)和面向切面(AOP),针对于开发的WEB层(springMVC)、业务层(IoC)、持久层(jdbcTemplate)等都提供了多种配置解决方案。这是Spring Framework的定义,至于Spring,是整个生态。 但是,无论Spring Framework接口如何简化,设计如何优美,始终无法摆脱被动的境况:由于它自身并非容器,所以基本上不得不随JavaEE容器启动而装载,例如Tomcat、Jetty、JBoss等。然而Spring Boot的出现,改变了Spring Framework甚至整个Spring技术体系的现状(摘自小马哥的《SpringBoot编程思想》)。 Spring Boot SpringBoot是一个快速整合的第三方框架,简化了XML配置完全采用注解化、内置http服务器(Tomcat),最终以java应用程序进行执行 Spring Boot这家伙简直就是对Java企业级应用开发进行了一场浩浩荡荡的革命。如果稍微有几年工作经验的老油条,应该都记得以前的Java Web开发模式:Tomcat + WAR包。WEB项目基于spring framework,项目目录一定要是标准的WEB-INF + classes + lib,而且大量的xml配置。如果说,以前搭建一个SSH架构的Web项目需要1个小时,那么现在应该10分钟就可以了。 Spring Boot能够让你非常容易的创建一个单机版本、生产级别的基于spring framework的应用。然后,"just run"即可。Spring Boot默认集成了很多第三方包,以便你能以最小的代价开始一个项目。 我们看看官方对Spring Boot的定义: Spring Boot is designed to get you up and running as quickly as possible, with minimal upfront configuration of Spring. Spring Boot takes an opinionated view of building production-ready applications. 即Spring Boot为快速启动且最小化配置的spring应用而设计,并且它具有用于构建生产级别应用的一套固化的视图(摘自小马哥的《SpringBoot编程思想》)。这里的固化的视图,笔者认为可以理解成Spring Boot的约定,因为Spring Boot的设计是约定大于实现的。 Spring Cloud springnCloud;  Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。 最后就是大名鼎鼎的Spring Cloud了,Spring Cloud事实上是一整套基于Spring Boot的微服务解决方案。它为开发者提供了很多工具,用于快速构建分布式系统的一些通用模式,例如:配置管理、注册中心、服务发现、限流、网关、链路追踪等。 如下图所示,很好的说明了Spring Boot和Spring Cloud的关系,Spring Boot是build anything,而Spring Cloud是coordinate anything,Spring Cloud的每一个微服务解决方案都是基于Spring Boot构建的: 最后就是Spring Cloud生态组件的稳定性和性能。用Spring Cloud微服务生态组件或多或少会碰到这样那样的问题。你甚至会怀疑,这个东西居然是和Spring Framework以及Spring Boot一起属于spring生态的。毕竟,后两者使用过程中你是几乎碰不到问题的。Spring Cloud的一些方案给我的感觉更像一个半成品,如果你的公司使用Spring Cloud来搭建微服务,那么肯定需要一个团队来维护用到的Spring Cloud组件。至于性能嘛,各服务之间默认通过HTTP调用,所以性能你懂的。另外,Spring Cloud netflix这一套组件虽然由netflix贡献,但是我敢肯定绝对是阉割版,以它的hystrix来说,相当多的缺陷,我可不认为hystrix在高并发下能工作的很好。 Spring Cloud还有一个尴尬的处境就是,大公司基本上不会引入这一套架构,比如阿里,有自己一套完整的微服务解决方案,美团也全部都是自研,还有很多公司的网关也是自研。综上,笔者得出的结论是:Spring Boot是大势所趋,而且它就像当年Spring Framework干掉EJB一样,干掉WEB容器+WAR的开发模式,统一现在的Java企业级应用开发标准。至于Spring Cloud?请谨慎选择每一个引入项目的组件,毕竟它的每一个微服务组件都面对很多优秀的开源可替代方案。

优秀的个人博客,低调大师

Jboot v3.2.2 发布,另个 SpringCloud 的选择

Jboot 是一个基于 JFinal、JFinal-Undertow、Dubbo、Seata、Sentinel、ShardingSphere、Nacos等开发的微服务框架,帮助开发者降低微服务开发门槛。同时完美支持在 idea、eclipse 下多 maven 模块,对 java 代码、html、css、js 等资源文件进行热加载。爽爽开发,快乐生活。 Jboot 目前已经开源超过了 3 年的时间,迭代了 100+ 个版本,已经被超过 1000+ 公司在使用。 Jboot 主要有以下特征: 1、基于 JFinal 的 MVC + ORM 快速开发。 2、基于ShardingSphere +Seata 分布式事务 和 分库分表。 3、基于 Dubbo 或 Motan 的 RPC 实现 4、基于 Sentinel 的分布式限流和降级 5、基于 Apollo 和 Nacos 的分布式配置中心 6、基于 EhCache 和 Redis 的分布式二级缓存 Jboot v3.2.2 更新内容如下: 优化:当项目启动的时候,优先初始化中央配置,以防止 undertow 端口等无法在中央仓库配置的问题 优化:新增 Columns.in(list) 和 Columns.notIn(list) 方法 优化:新增 Columns.append() 方法用于追加一个新的 columns 优化:Json输出默认使用驼峰的字段风格 优化:升级 Nacos、Fastjson 等到最新版本 修复:通过 Columns 查询 count,当有 left join 时会出现数量不正确的问题 修复:当 RPC 注解有 ${} 时,无法读取配置内容的问题 文档:修改配置文件里的示例带有双引号的错误配置 文档:优化 PRC 的相关文档 maven 依赖: <dependency> <groupId>io.jboot</groupId> <artifactId>jboot</artifactId> <version>3.2.2</version> </dependency> Hello World: @RequestMapping("/") public class HelloworldController extends JbootController { public void index(){ renderText("hello world"); } public static void main(String[] args){ JbootApplication.run(args); } }

优秀的个人博客,低调大师

SpringCloud微服务(05):Zuul组件,实现路由网关控制

本文源码:GitHub·点这里 || GitEE·点这里 一、Zuul组件简介 1、基础概念 Zuul 网关主要提供动态路由,监控,弹性,安全管控等功能。在分布式的微服务系统中,系统被拆为了多个微服务模块,通过zuul网关对用户的请求进行路由,转发到具体的后微服务模块中。 2、Zuul的作用 1)按照不同策略,将请求转发到不同的服务上去; 2)聚合API接口,统一对外暴露,提高系统的安全性; 3)实现请求统一的过滤,以及服务的熔断降级; 3、案例结构 启动顺序如下: # 注册中心 node05-eureka-7001 # 两个服务提供者 node05-provider-6001 node05-provider-6002 # 网关控制 node05-zuul-7002 启动成功后,注册中心展示如下: 二、Zuul使用详解 1、核心依赖 <!-- 路由网关 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zuul</artifactId> </dependency> 2、核心配置文件 server: port: 7002 spring: application: name: cloud-node05-parent eureka: instance: prefer-ip-address: true client: service-url: defaultZone: http://registry01.com:7001/eureka/ zuul: # 前缀,可以用来做版本控制 prefix: /v1 # 禁用默认路由,执行配置的路由 ignored-services: "*" routes: # 配置6001接口微服务 pro6001: serviceId: node05-provider-6001 path: /api-6001/** # 配置6002接口微服务 pro6002: serviceId: node05-provider-6002 path: /api-6002/** 启动类注解:@EnableZuulProxy 3、统一服务降级 实现FallbackProvider接口,自定义响应提示。 @Component public class FallBackConfig implements FallbackProvider { private static final Logger LOGGER = LoggerFactory.getLogger(FallBackConfig.class) ; @Override public ClientHttpResponse fallbackResponse(Throwable cause) { // 捕获超时异常,返回自定义信息 if (cause instanceof HystrixTimeoutException) { return response(HttpStatus.GATEWAY_TIMEOUT); } else { return fallbackResponse(); } } private ClientHttpResponse response(final HttpStatus status) { return new ClientHttpResponse() { @Override public HttpStatus getStatusCode() { return status; } @Override public int getRawStatusCode() { return status.value(); } @Override public String getStatusText() { return status.getReasonPhrase(); } @Override public void close() { LOGGER.info("close"); } @Override public InputStream getBody() { String message = "{\n" + "\"code\": 200,\n" + "\"message\": \"微服务飞出了地球\"\n" + "}"; return new ByteArrayInputStream(message.getBytes()); } @Override public HttpHeaders getHeaders() { HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); return headers; } }; } @Override public String getRoute() { return "*"; } @Override public ClientHttpResponse fallbackResponse() { return response(HttpStatus.INTERNAL_SERVER_ERROR); } } 4、统一过滤器 继承ZuulFilter类,自定义过滤动作。 @Component public class FilterConfig extends ZuulFilter { private static final Logger LOGGER = LoggerFactory.getLogger(FilterConfig.class) ; @Override public String filterType() { return "pre"; } @Override public int filterOrder() { return 0; } @Override public boolean shouldFilter() { return true; } @Override public Object run() { RequestContext requestContext = RequestContext.getCurrentContext() ; try { doBizProcess(requestContext); } catch (Exception e){ LOGGER.info("异常:{}",e.getMessage()); } return null; } public void doBizProcess (RequestContext requestContext) throws Exception { HttpServletRequest request = requestContext.getRequest() ; String reqUri = request.getRequestURI() ; if (!reqUri.contains("getAuthorInfo")){ requestContext.setSendZuulResponse(false); requestContext.setResponseStatusCode(401); requestContext.getResponse().getWriter().print("Path Is Error..."); } } } 5、测试流程 1)测试网关配置 访问如下接口,响应正常,说明网关配置生效: http://localhost:7002/v1/api-6001/getAuthorInfo/1 http://localhost:7002/v1/api-6002/getAuthorInfo/2 2)测试服务降级 关闭6001服务,再次访问接口,提示信息如下,说明服务降级策略生效: { "code": 200, "message": "微服务飞出了地球" } 3)测试过滤器 因为请求URI不匹配getAuthorInfo,所以被拦截,说明过滤器略生效: http://localhost:7002/v1/api-6001/ 响应提示: Path Is Error... 三、源代码地址 GitHub·地址 https://github.com/cicadasmile/spring-cloud-base GitEE·地址 https://gitee.com/cicadasmile/spring-cloud-base

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

用户登录
用户注册