皮皮网

【jucheap v2.0 源码】【源码云窗下载】【openwrt源码改lan】spring hystrix 源码

2024-12-29 02:05:42 来源:vc service源码

1.Springboot之分布式事务框架Seata实现原理源码分析
2.springcloud2022?
3.Java学习路线
4.Spring Cloud OpenFeign源码FeignClientFactoryBean原理
5.java学习路线

spring hystrix 源码

Springboot之分布式事务框架Seata实现原理源码分析

       在SpringBoot环境下的分布式事务框架Seata实现原理涉及到了代理数据源、注册代理Bean以及全局事务拦截器等关键环节。下面我们将逐步解析其核心逻辑。

       首先,Seata通过GlobalTransactionScanner来注册项目中所有带有@GlobalTransactional注解的方法类。该扫描器是jucheap v2.0 源码一个实现了BeanPostProcessor接口的类,它能够在Spring容器初始化时进行后置处理,从而实现全局事务的管理。

       GlobalTransactionScanner实际上是一个InstantiationAwareBeanPostProcessor,它在实例化Bean前执行postProcessBeforeInstantiation方法,在实例化后执行postProcessAfterInstantiation方法,并在属性填充时执行postProcessProperties方法。尽管GlobalTransactionScanner类本身并未覆盖这3个方法,但在父类的实现中,这些方法用于处理Bean的实例化和属性设置过程。

       关键在于postProcessAfterInitialization方法中实现的wrapIfNecessary方法,该方法在GlobalTransactionScanner类中被重写。当方法执行到existsAnnotation方法判断类方法是否带有@GlobalTransactional注解时,如果存在则创建一个GlobalTransactionalInterceptor作为拦截器处理全局事务。

       在创建代理数据源时,Seata通过DataSourceProxy对系统默认数据源进行代理处理。通过shouldSkip方法判断当前bean是否需要被代理,如果bean是SeataProxy的子类且不是DataSource的子类且不在excludes集合中,则进行代理,从而代理当前系统的默认数据源对象。

       全局事务拦截器主要负责全局事务的发起、执行和回滚。在执行全局事务的方法被代理时,具体的执行拦截器是GlobalTransactionalInterceptor。该拦截器处理全局事务的逻辑,包括获取全局事务、开始全局事务、执行本地业务、提交本地事务、源码云窗下载记录undo log、提交数据更新等步骤。其中,提交本地事务时会向TC(Transaction Coordinator)注册分支并提交本地事务,整个过程确保了分布式事务的一致性。

       当全局事务中任何一个分支发生异常时,事务将被回滚。参与全局事务的组件在异常发生时执行特定的回滚逻辑,确保事务一致性。在Seata的实现中,异常处理机制确保了事务的回滚能够正确执行。

       Seata还提供了XID(Transaction Identifier)的传递机制,通过RestTemplate和Feign客户端进行服务间的调用,确保分布式系统中各个服务能够共享和处理全局事务。RestTemplate在请求头中放置TX_XID头信息,而Feign客户端通过从调用链中获取Feign.Builder,最终通过SeataHystrixFeignBuilder.builder方法实现XID的传递。

       在被调用端(通过Feign调用服务),Seata自动配置会创建数据源代理,使得事务方法执行时能够获取到连接对象,而这些连接对象已经被代理成DataSourceProxy。SeataHandlerInterceptor拦截器对所有请求进行拦截,从Header中获取TX_XID,参与者的XID绑定到上下文中,通过ConnectionProxy获取代理连接对象。在数据库操作中,XID绑定到ConnectionContext,执行SQL语句时通过StatementProxy或PreparedStatementProxy代理连接,从而完成全局事务的处理。

       综上所述,Seata通过一系列复杂的逻辑和机制,实现了SpringBoot环境下的分布式事务管理,确保了分布式系统中数据的openwrt源码改lan一致性和可靠性。

springcloud?

       å¾®æœåŠ¡æ¡†æž¶ä¹‹SpringCloud简介

       åœ¨äº†è§£SpringCloud之前先了解一下微服务架构需要考量的核心关键点,如下图:

       å¯¹äºŽä»¥ä¸Šç­‰æ ¸å¿ƒå…³é”®ç‚¹çš„处理,不需要我们重复造车轮,SpringCloud已经帮我们集成了,它使用SpringBoot风格将一些比较成熟的微服务框架组合起来,屏蔽掉了复杂的配置和实现原理,为快速构建微服务架构的应用提供了一套基础设施工具和开发支持。

       SpringCloud所提供的核心功能包含:

       SpringCloud架构图

       SpringCloud子项目

       SpringCloud旗下的子项目大致可以分为两类:

       å¦‚下:

       1.SpringCloud与SpringBoot

       SpringBoot可以说是微服务架构的核心技术之一。通过在SpringBoot应用中添加SpringMVC依赖,就可以快速实现基于REST架构的服务接口,并且可以提供对HTTP标准动作的支持。而且SpringBoot默认提供JackJson序列化支持,可以让服务接口输入、输出支持JSON等。因此,当使用SpringCloud进行微服务架构开发时,使用SpringBoot是一条必经之路。

       2.SpringCloud与服务治理(Eureka)

       æœåŠ¡æ²»ç†æ˜¯SpringCloud的核心,在实现上其提供了两个选择,即Consul和Netflix的Eureka。

       Eureka提供了服务注册中心、服务发现客户端,以及注册服务的UI界面应用。

       åœ¨Eureka的实现中,节点之间相互平等,有部分注册中心“挂掉”也不会对整个应用造成影响,即使集群只剩一个节点存活,也可以正常地治理服务。即使所有服务注册节点都宕机,Eureka客户端中所缓存的服务实例列表信息,也可让服务消费者能够正常工作,从而保障微服务之间互相调用的健壮性和应用的弹性。

       3.SpringCloud与客户端负载均衡(Ribbon)

       Ribbon默认与Eureak进行无缝整合,当客户端启动的时候,从Eureka服务器中获取一份服务注册列表并维护在本地,当服务消费者需要调用服务时,Ribbon就会根据负载均衡策略选择一个合适的服务提供者实例并进行访问。

       SpringCloud通过集成Netflix的Feign项目,为开发者提供了声明式服务调用,从而简化了微服务之间的调用处理方式。并且默认Feign项目集成了Ribbon,使得声明式调用也支持客户端负载均衡功能。

       4.SpringCloud与微服务容错、降级(Hystrix)

       ä¸ºäº†ç»™å¾®æœåŠ¡æž¶æž„提供更大的弹性,在SpringCloud中,通过集成Netflix下子项目Hystrix,通过所提供的@HystrixCommand注解可以轻松为我们所开发的微服务提供容错、回退、降级等功能。此外,Hystrix也默认集成到Feign子项目中。

       Hystrix是根据“断路器”模式而创建。当Hystrix监控到某服务单元发生故障之后,就会进入服务熔断处理,并向调用方返回一个符合预期的服务降级处理(fallback),而不是长时间的等待或者抛出调用异常,从而保障服务调用方的线程不会被长时间、不必要地占用,避免故障在应用中的蔓延造成的雪崩效应。

       è€ŒHystrix的仪表盘项目(Dashboard)可以监控各个服务调用所消耗的时间、请求数、成功率等,通过这种近乎实时的监控和告警,可以及时发现系统中潜在问题并进行处理。

       5.SpringCloud与服务网关(Zuul)

       SpringCloud通过集成Netflix中的Zuul实现API服务网关功能,提供对请求的路由和过滤两个功能

       è·¯ç”±åŠŸèƒ½è´Ÿè´£å°†å¤–部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础。

       è¿‡æ»¤å™¨åŠŸèƒ½åˆ™è´Ÿè´£å¯¹è¯·æ±‚的处理过程进行干预,是实现请求校验、服务聚合等功能的基础。

       é€šè¿‡Zuul,可以将细粒度的服务组合起来提供一个粗粒度的服务,所有请求都导入一个统一的入口,对外整个服务只需要暴露一个API接口,屏蔽了服务端的实现细节。通过Zuul的反向代理功能,可以实现路由寻址,将请求转发到后端的粗粒度服务上,并做一些通用的逻辑处理。此外,Zuul默认会与Eureka服务器进行整合,自动从Eureka服务器中获取所有注册的服务并进行路由映射,实现API服务网关自动配置。

       6.SpringCloud与消息中间件(Stream)

       SpringCloud为简化基于消息的开发,提供了Stream子项目,通过建立消息应用抽象层,构建了消息收发、分组消费和消息分片等功能处理,将业务应用中的消息收发与具体消息中间件进行解耦,使微服务应用开发中可以非常方便地与Kafka和RabbitMQ等消息中间件进行集成。

       SpringCloudBus基于Stream进行扩展,可以作为微服务之间的事件、消息总线,用于服务集群中状态变化的传播。

       æ¯”如SpringCloudConfig借助Bus,可以实现配置的动态刷新处理。

       7.SpringCloud与分布式配置中心(Config)

       é’ˆå¯¹å¾®æœåŠ¡æž¶æž„下的配置文件管理需求,SpringCloud提供了一个Config子项目。SpringCloudConfig具有中心化、版本控制、支持动态更新和语言独立等特性。

       åœ¨Config子项目中将微服务应用分为两种角色:配置服务器(ConfigServer)和配置客户端(ConfigClient)。使用配置服务器集中地管理所有配置属性文件,配置服务中心可以将配置属性文件存储到Git、SVN等具有版本管理仓库中,也可以存放在文件系统中。默认采用Git的方式进行存储,因此可以很容易地对配置文件进行修改,并实现版本控制。

       8.SpringCloud与微服务链路追踪(Sleuth)

       SpringCloud中的Sleuth子项目为开发者提供了微服务之间调用的链路追踪。

       Sleuth核心思想就是通过一个全局的ID将分布在各微服务服务节点上的请求处理串联起来,还原了调用关系,并借助数据埋点,实现对微服务调用链路上的性能数据的采集。

       å› æ­¤ï¼Œé€šè¿‡Sleuth可以很清楚地了解到一个用户请求经过了哪些服务、每个服务处理花费了多长时间,从而可以对用户的请求进行分析。此外,通过将采集的数据发送给Zipkin进行存储、统计和分析,从而可以实现可视化的分析和展示,帮助开发者对微服务实施优化处理。

       9.SpringCloud与微服务安全(Security)

       SpringCloudSecurity为我们提供了一个认证和鉴权的安全框架,实现了资源授权、令牌管理等功能,同时结合Zuul可以将认证信息在微服务调用过程中直接传递,简化了我们进行安全管控的开发。

       SpringCloudSecurity默认支持OAuth2.0认证协议,因此单点登录也可以非常容易实现,并且OAuth2.0所生成的令牌可以使用JWT的方式,进一步简化了微服务中的安全管理。

       .SpringCloud的其他子项目

       è‡ªå®šä¹‰springcloud-gateway熔断处理

       ä¸€ã€åœºæ™¯

       ä½¿ç”¨springcloudgateway后,有了熔断,问题也就随之而来,服务间调用有了hystrix可以及时的排除坏接口、坏服务的问题,对系统很有帮助。但是!不是所有的接口都是极短时间内完成的,不是所有的接口都可以设置一样的超时时间的!

       é‚£ä¹ˆæˆ‘们面临一个问题,那就是百分之的接口都可以在1s内完美完成,但是就是那几个特殊接口,需要十几秒,几十秒的等待时间,而默认熔断的时间又只有一个。

       äºŒã€åˆ†æž

       åœ¨å‰é¢springcloudgateway源码解析之请求篇中我们知道请求会经过一些列的过滤器(GatewayFilter),而springcloudgateway的降级熔断处理就是由一个特殊的过滤器来处理的,通过源码分析我们关注到HystrixGatewayFilterFactory这个类,这个类的作用就是生产GatewayFilter用的,我们看下它的实现

       å¯ä»¥çœ‹åˆ°çº¢æ¡†å¤„最后构建了一个匿名的GatewayFilter对象返回,这个对象在接口请求过程中会被加载到过滤器链条中,仔细看到这里是创建了一个RouteHystrixCommand这个命令对象,最终调用command.toObservable()方法处理请求,如果超时熔断调用resumeWithFallback方法

       é€šè¿‡æºç åˆ†æžgateway在路由时可以指定HystrixCommandKey,并且对HystrixCommandKey设置超时时间

       ä¸‰ã€æ–¹æ¡ˆ

       çŸ¥é“网关熔断的原理就好办了,自定义熔断的过滤器配置到接口请求过程中,由过滤器来读取接口熔断配置并构建HystrixObservableCommand处理请求。

       è‡ªå®šä¹‰ä¸€ä¸ªç±»XXXGatewayFilterFactory继承AbstractGatewayFilterFactory,将api和对应的timeout配置化,来实现细化到具体接口的熔断配置,具体实现如下:

       packageorg.unicorn.framework.gateway.filter;

       importcn.hutool.core.collection.CollectionUtil;

       importcom.netflix.hystrix.HystrixCommandGroupKey;

       importcom.netflix.hystrix.HystrixCommandKey;

       importcom.netflix.hystrix.HystrixCommandProperties;

       importcom.netflix.hystrix.HystrixObservableCommand;

       importcom.netflix.hystrix.exception.HystrixRuntimeException;

       importorg.springframework.beans.factory.ObjectProvider;

       importorg.springframework.cloud.gateway.filter.GatewayFilter;

       importorg.springframework.cloud.gateway.filter.GatewayFilterChain;

       importorg.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;

       importorg.springframework.cloud.gateway.support.ServerWebExchangeUtils;

       importorg.springframework.cloud.gateway.support.TimeoutException;

       importorg.springframework.core.annotation.AnnotatedElementUtils;

       importorg.springframework.mand;

       if(CollectionUtil.isNotEmpty(apiTimeoutList)){

       //request匹配属于那种模式

ApiHystrixTimeoutapiHystrixTimeout=getApiHystrixTimeout(apiTimeoutList,path);

command=newUnicornRouteHystrixCommand(config.getFallbackUri(),exchange,chain,initSetter(apiHystrixTimeout.getApiPattern(),apiHystrixTimeout.getTimeout()));

       }else{

       command=newUnicornRouteHystrixCommand(config.getFallbackUri(),exchange,chain,initSetter(serviceId(exchange),null));

       }

       returncommand;

}

       /

***@paramapiTimeoutList

*@parampath

*@return

*/

privateApiHystrixTimeoutgetApiHystrixTimeout(ListapiTimeoutList,Stringpath){

       for(ApiHystrixTimeoutapiTimeoutPattern:apiTimeoutList){

       if(this.antPathMatcher.match(apiTimeoutPattern.getApiPattern(),path)){

       returnapiTimeoutPattern;

}

       }

       ApiHystrixTimeoutapiHystrixTimeout=newApiHystrixTimeout();

       apiHystrixTimeout.setApiPattern("default");

       apiHystrixTimeout.timeout=null;

       returnapiHystrixTimeout;

}

       @Override

publicGatewayFilterapply(Configconfig){

       return(exchange,chain)-{

       UnicornRouteHystrixCommandcommand=initUnicornRouteHystrixCommand(exchange,chain,config);

returnMono.create(s-{

       Subscriptionsub=command.toObservable().subscribe(s::success,s::error,s::success);

       s.onCancel(sub::unsubscribe);

}).onErrorResume((Function)throwable-{

       if(throwableinstanceofHystrixRuntimeException){

       HystrixRuntimeExceptione=(HystrixRuntimeException)throwable;

HystrixRuntimeException.FailureTypefailureType=e.getFailureType();

switch(failureType){

       caseTIMEOUT:

       returnMono.error(newTimeoutException());

       caseCOMMAND_EXCEPTION:{

       Throwablecause=e.getCause();

if(causeinstanceofResponseStatusException||AnnotatedElementUtils

       .findMergedAnnotation(cause.getClass(),ResponseStatus.class)!=null){

       returnMono.error(cause);

}

       }

       default:

       break;

}

       }

Java学习路线

       根据个人实际的经历,结合多种书籍,特别整理出了下面的java学习路线:

一、Java SE部分

       1、java基础:基础语法;面向对象(重点);集合框架(重点);常见类库API;

       2、java界面编程:AWT;事件机制;Swing;

       3、java高级知识:Annotation;IO和NIO、AIO;多线程、线程池;阻塞、非阻塞、异步网络通信;反射、动态代理;

二、JDBC编程

       4、SQL基础:基础SQL语句;基本查询;多表查询;子查询;结果集的交、并、差运算;

       5、JDBC基础:常见数据库用法;JDBC操作常见数据库;RowSet与离线结果集;数据库连接池;事务管理、批处理;

       6、JDBC进阶:存储过程、函数;触发器;理解JCBC的不足;掌握ORM工具优势和设计;

三、DHTML编程

       7、HTML基础:基本HTML标签;常见表单标签;DIV+CSS布局;

       8、JavaScript知识:javascript基本语法;javascript基本对象特征;Json语法;深刻理解javascript的动态特征;

       9、Dom和事件机制:DOM操作、编程;常见浏览器事件机制;掌握用户交互技巧;

四、XML编程

       、XML基础:XML基础规则;DTD和SCheme;XML和样式单;

       、XML进阶:DOM、SAX和JAXP;dom4j、JDOM等工具;XQuery和XQJ;基于XML的数据交换;

       、Web Service:JAX_WS2、SAAJ规范;WSDL和SOAP协议;CXF框架、拦截器;CXF整合Spring;

五、冒险板块起源码Java Web编程

       、Web编程基础:Tomcat服务器;Jsp语法、EL、内置对象;Servlet API;Servlet 3.0注解;Listener和Filter;

       、Web编程进阶:自定义标签库;MVC和DAO、Servlet、标签的作用;JSTL、DisplayTag等常见标签库用法;

       、Web编程原理:请求/响应、架构;Http协议;深刻理解Jsp运行原理;掌握Web容器底层的线程池、socket通信、调用Servlet的命令模式;

六、Ajax编程:

       、Ajax编程:XML HttpRequest和异步请求;发送请求和处理响应;常见Ajax库(Prototype、Jquery、ExtJs、DWR)用法;结合Http协议、异步请求深入研究ajax库的设计;

七、Android开发

       、Android基础:Android开发调试环境;Android应用结构;界面组件与界面编程;资源管理;四大组件;

       、Android中级:文件IO和SQLite;图形、图像与动画;音频、视频的录制与播放;传感器编程;GPS应用;

       、Android高级:网络编程与Web Service;OpenGL_ES 3D开发;整合Google服务;使用NDK开发;java和c相互调试;

八、轻量级Java EE

       、Struts2:MVC与struts体系;Action和Result;国际化和标签库;文件上传、下载;类型转换和输入检验;拦截器与插件开发;

       、Hibernate:ORM与持久化映射;关系映射、继承映射;延迟加载、性能调优;HQL查询、条件查询、SQL查询;二级缓存和查询缓存;

       、Spring:IoC与Bean配置、卡管理app源码管理;Bean生命周期;SP、EL;AOP与事务权限控制;S2SH整合开发;Spring整合Jpa;

九、经典Java EE

       、JSF<选学>:MVC与JSF设计理念;托管Bean与导航模型;JSF流程与事件机制;JSF标签库;类型转换与输入检验;

       、EJB及相关技术:JNPI与RMI;会话Bean及其生命周期;IoC与EJB拦截器;JMS与MDB;会话Bean与Web Service;

       、JPA:ORM框架与JPA规范;JPA注解与常用API;JTA事务与事务管理;JPQL查询;EJB、JPA整合;

十、Java 拓展、进阶:

       、Java EE实践与架构:Ant+Ivy或Maven;SVN、CVS;深刻理解种以上设计模式;掌握各种Java EE架构及各自优势;

       、Workflow:Workflow规范及功能;JBPM等workflow框架;多次重构、反复思考;大型项目经验;

       、Java EE进阶:掌握各MVC框架运行原理、能开发类似框架;掌握Spring、HiveMind、AspectJ等框架原理、能开发类似工具;掌握Hibernate、iBatis等框架原理,能开发类似工具;深入研究EJB机制、大致了解应用服务器的实现;

       希望对您有所帮助!~

Spring Cloud OpenFeign源码FeignClientFactoryBean原理

       Spring Cloud OpenFeign的FeignClientFactoryBean在实例化过程中,通过FactoryBean接口实现,GetObject方法的关键步骤包括获取FeignContext、配置Feign.Builder、创建HardCodedTarget和调用loadBalance方法。这些步骤涉及自动配置、FeignClientSpecification的使用、Logger和Builder组件的定制以及动态代理的生成。最后,getObject方法返回的是一个接口的代理类,用于执行远程调用。

       详细分析:

       FeignClientFactoryBean在Spring容器中,通过getObject方法转化为实际的FeignClient实例。首先,它从FeignContext获取相关配置,这个配置在引入OpenFeign依赖时自动注入。接下来,通过getTarget方法,FeignClientFactoryBean配置了Builder组件,如Logger(非Slf4j)、RequestInterceptor、Encoder和Decoder等,同时考虑了用户自定义组件的配置。之后,创建了HardCodedTarget,基于FeignClient接口、注解值和完整URL构建,然后通过loadBalance方法,整合了LoadBalancerFeignClient和HystrixTargeter,进行负载均衡和目标URL定位。

       在newInstance方法中,解析了接口方法的注解,生成了MethodHandler,并用FeignInvocationHandler封装,这个InvocationHandler在代理类实例化时被调用,实现了远程调用。最终,通过Proxy.newProxyInstance动态生成了代理类,完成FeignClientFactoryBean的实例化过程。

       总的来说,FeignClientFactoryBean实例化是通过一系列配置和代理生成,实现了Spring Cloud OpenFeign的远程调用功能。如果你对源码的深入理解感兴趣,下期文章将继续解析调用源码细节。

java学习路线

       目前在职Java开发,我给出的Java学习路线是:

       JavaSE--数据库--jdbc----前端基础--Javaweb--Spring--Mybatis--Maven--Springboot---Reids--Springcloud--Linux--Git。

       JavaSE:java基础,既然是基础,那肯定是最重要的,所以学习的时候也是需要重点学习的地方。

       数据库:为什么要学数据库呢,因为我们的web数据需要持久化到磁盘上统一管理,而数据库无疑就是最好工具。目前主流的关系型数据库有mysql 和oracle。我建议先学mysql。为什么呢mysql相比Oracle难度要低,而在国内应用场景又是最多的。

       学会了mysql可以开发出一个完整的产品了,再学oracle都可以的。

       前端基础:既然是做一个网站,那肯定不能是后台的数据,这样用户也是没办法看的,所以需要学习前端知识,把数据展示到页面上,而对于后台人员来说,学习阶段只需要学习前端基础就可以了。Html 、js、css、jquery就可以了。当然到离开后期你也可以学学专门为后端人员定制的前端框架,比如,layui,easyui。如果还觉得不够可以学学前端专用框架。比如vue  element ,但是大前提是把自己的后台学到位了再学其他的。

       Javaweb:jsp、servlet。为什么用了html还要学jsp呢。因为jsp和Java是无缝连接的。学了javaweb以后就可以自己做一个项目出来了,比如你想做一个个人网站。你可以给你们学校做一个教务管理系统都是可以的。

       Spring:后台框架。为什么要用框架呢,可以快速开发,并且降低了耦合。Spring的AOP支持允许将一些通用任务如安全、事务、日志等进行集中式管理,从而提供了更好的复用,Spring的ORM和DAO提供了与第三方持久层框架的良好整合,并简化了底层的数据库访问。

       Mybatis:持久层框架,当然持久层还有一个框架应用也很广的,那就是hibernate,一个是半自动的一个是全自动,而在国内应用最多的是mybatis,在国外用得最多的是hibernate,具体原因,大家可以百度查查。持久层框架有什么好处呢?如果你用原始的jdbc做开发,那你得自己来管理每一个连接,连接的打开和关闭,都是有开发人员来操作的,而且jdbc也没有实体的映射,需要我们写代码把值set进去,而用了框架这些都交给框架去做了。

       Maven:mavne是一个工具,他的核心是pom.xml,这个配置文件,pom的全英文是project  object model,意思是对象管理模型,也就是把项目也看成一个对象来操作了。给我们带来最直观的好处就是依赖问题,以前我们需要自己下载jar包,在构建到项目中,但是有了maven只需要写jar的依赖就可以自动给我们下载了。 

       Springboot:springboot是基于maven的,springboot最明显的特点就是开箱即用,也就是构建了一个springboot项目 直接就可以做开发了,而不需要像我们自己配一个springmvc的框架一样的需要去配置大量的xml文件。让我们开发人员更着重于业务上的开发。

       Redis:前面的mysql,oracle是关系型数据库,什么是关系型呢,就是一对一 一对多  多对多。有表与表之间有这些关系在,所以就叫关系型数据库,而redis就是非关系型数据库,也就是他存储数据之间是没有这些关系,他是以键值对 list  set方式存储的。

       对了,顺便在这里说一下,我目前是在职Java开发,如果你现在也在学习Java,了解Java,渴望成为一名合格的Java开发工程师,在入门学习Java的过程当中缺乏基础入门的视频教程,你都可以申请加入我的Java新手学习交流qun:前面输入是:前面输入是:七九八,中间输入是:八四四,最后输入是:六二零。里面聚集了很多正在学习Java技术的初学者,qun文件里面还有我做Java技术这段时间整理的一些学习手册,面试题,开发工具,PDF文档书籍教程,需要的话都可以来获取下载。

       Springcloud:微服务框架,什么是微服务呢,就是把我们传统的单体服务拆分开了,就是将一个单体架构的应用按业务划分为一个个的独立运行的程序即服务,微服务架构其实就是一个分布式架构,具体的就不详细的讲了,因为这里面牵涉到的解决方案是灵活的。

       Linux:linux的应用通常都是在底层,那我们上层开发人员为什么也要学它呢,其实我们的主要应用是在服务器上,也就是服务器的系统。当然系统也有Windows的,而Windows的和Linux的区别就是Windows服务器有问题是微软来解决,很方便:别人替你做,但也不方便:你遇到问题都得让他官方来解决漏洞,但是Linux就不一样,他是完全开源的,有问题自己马上就可以解决,只要开发人员能力够硬去改内核都是可以的。

       Git:版本管理工具,与之对应的还有svn,最大的区别在于git是分布式系统,而svn不是分布式的,因为你们进企业以后都是协同开发  也就是一个项目小组里面几个小伙伴一起开发一个项目,所以就要有一个代码的管理工具来保证你们做的不同模块可以整合,所以说git也是需要学的。