微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!
springcloud Eureka
这里是修真院后端小课堂,每篇分享文从【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】八个方面深度解析后端知识/技能,本篇分享的是:【springcloud Eureka    】 大家好,我是IT修真院深圳分院第十三期学员,一枚正直纯洁善良的JAVA程序员。今天给大家分享一下,修真院官网JAVA任务四里面的一个扩展:初识springboot和freemarker。1 背景介绍1.1 springcloud是什么Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。 本质是一个基于springboot的一体系微服务框架。1.2 eureka是什么?Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。SpringCloud将它集成在其子项目spring-cloud-netflix中,以实现SpringCloud的服务发现功能。2 知识剖析2.1 eureka的特点1、Eureka包含两个组件:Eureka Server和Eureka Client。2、Eureka Server提供服务注册服务,各个节点启动后,会在Eureka Server中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。3、Eureka Client是一个java客户端,用于简化与Eureka Server的交互,客户端同时也就别一个内置的、使用轮询(round-robin)负载算法的负载均衡器。4、在应用启动后,将会向Eureka Server发送心跳,默认周期为30秒,如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,Eureka Server将会从服务注册表中把这个服务节点移除(默认90秒)。5、Eureka Server之间通过复制的方式完成数据的同步,Eureka还提供了客户端缓存机制,即使所有的Eureka Server都挂掉,客户端依然可以利用缓存中的信息消费其他服务的API.2.2 eureka和zookeeper对比1、著名的CAP理论指出,一个分布式系统不可能同时满足C(一致性)、A(可用性)、和P(分区容错性)。由于分区容错性P在分布式系统中必须要保证的,因此我们只能在A和C之间进行权衡。Zookeeper保证的是CP, Eureka则是AP。2、Zoopkeeper保证CP:当向注册中心查询服务列表时,我们可以容忍注册中心返回的是几分钟以前的注册信息,但是不能接受服务直接down掉不可用。也就是说,服务注册功能对可用性的要求要高于一致性。但是zk会出现这样的一种情况,当master节点因网路故障与其他节点失去联系时,剩余的节点会重新进行leader选举。问题在于,选举leader的时间太长,30~120s,且选举期间整个zk集群是都是不可用的,这就导致在选举期间注册服务瘫痪,在云部署的环境下,因网络问题使得zk集群失去master节点是较大概率会发生的事,虽然服务能够最终恢复,但是漫长的选举时间导致的注册长期不可用是不能容忍的。3、Eureka保证AP:Eureka看明白了这一点,因此在设计时就优先保证可用性。Eureka各个节点都是平等的,几个节点挂掉不影响正常节点的工作,剩余的节点依然可以提供注册和查询服务。而Eureka的客户端在向某个Eureka注册时如果发现连接失败,则会自动切换至其他的节点,只要有一台Eureka还在,就能保证注册服务可用(保证可用性),只不过查到的信息可能不是最新的(不保证一致性)。除此之外,Eureka还有一种自我保护机制,如果在15分钟内超过85%的节点都没有正常的心跳,那么Eureka就认为客户端与注册中心出现了网络故障,此时会出现以下几种情况:3.1.Eureka不再从注册列表中移除因为长时间没有收到心跳而应该过期的服务3.2.Eureka仍然能够接受新服务的注册和查询请求,但是不会被同步到其它节点上(即保证当前节点依然可用)3.3.当前网络稳定时,当前实例新的注册信息会被同步到其它节点中3.常见问题eureka server避免注册自己4 解决方案在application配置文件加入:eureka:  client:    register-with-eureka: false    fetch-registry: false12345.编码实战6.扩展思考2、除了freemarker还有什么模板引擎比较流行除了freemaker还有theamleaf模板引擎,目前springboot官方的模板引擎就是theamleaf,使用theamleaf的好处是theamleaf使用过的就是html文件,不需要想freemarker一样去修改文件后缀为ftl。7.参考文献CSDN、百度百科8 更多讨论1、springcloud 可以结合zookeeper吗?springcloud可以使用zookeeper作为注册中心,也可以用consul作为注册中心,并非一定要用eureka。只不过使用eureka的话,能共使用Netflix的oss组件,搭建起来更加方便。2、eureka中的角色是怎么划分?eureka中的角色划分分为server和client。其中server提供注册服务,client是需要注册的服务,其中client还分为生产者和消费者。一个生产者既可以是生产者也可以消费者。3、eureka如何做集群?eureka做集群也很容易,只需要把eureka的server注册中心的配置文件添加:server:  port: 8761  profiles: peer1eureka:  instance:    hostname: http://peer2:8762/eureka/    server:  port: 8762  profiles: peer2eureka:  instance:    hostname: http://peer1:8761/eureka/123456789101112今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~技能树.IT修真院“我们相信人人都可以成为一个工程师,现在开始,找个师兄,带你入门,掌控自己学习的节奏,学习的路上不再迷茫”。这里是技能树.IT修真院,成千上万的师兄在这里找到了自己的学习路线,学习透明化,成长可见化,师兄1对1免费指导。快来与我一起学习吧~ http://www.jnshu.com/login/1/45664133腾讯视频:https://v.qq.com/x/page/d0708fskipo.html  PPT链接 视频链接 更多内容,可以加入IT交流群565734203与大家一起讨论交流 这里是技能树·IT修真院:https://www.jnshu.com,初学者转行到互联网的聚集地
ANNOTATION和XML两种配置的差别,为什么更喜欢使用ANNOTAION来配置SPRING MVC?
这里是修真院后端小课堂,每篇分享文从【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】八个方面深度解析后端知识/技能,本篇分享的是:【ANNOTATION和XML两种配置的差别,为什么更喜欢使用ANNOTAION来配置SPRING MVC?】ANNOTATION和XML两种配置的差别,为什么更喜欢使用ANNOTAION来配置SPRING MVC?2018年09月07日 11:13:21 weixin_42955916 阅读数:76编辑 大家好,我是IT修真院深圳分院第十三期学员,一枚正直纯洁善良的JAVA程序员。 今天给大家分享一下,修真院官网JAVA任务二里面的知识点:ANNOTATION和XML两种配置的差别,为什么更喜欢使用ANNOTAION来配置SPRING MVC?1 背景介绍web项目的发展历程:MODEL1,MVC,SPRINGMVCmodel1:使用一个组件处理请求、业务、展现等操作。代码耦合度高、冗余等问题。mvc:m:model,业务层,用来处理业务。v:view,视图层,用来展现数据。c:Controller,控制层,用来进行调度,是业务层和视图的桥梁,其目的是要将代码解耦,便于团队开发。springmvc:是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,它为控制器和处理程序提供了大量与此模式相关的功能。并且当向 MVC 添加反转控制,它使应用程序高度解耦,提供了通过简单的配置更改即可动态更改组件的灵活性。Spring MVC 为您提供了完全控制应用程序的各个方面的力量。2.知识剖析2.1SPRING MVC五大组件DispatcherServlet:Spring的WebMVC模块是围绕DispatcherServlet而设计的。DispatcherServlet 给处理程序分派请求,执行视图解析,并且处理语言环境和主题解析,此外还为上传文件提供支持。hadlerMapping:包含了请求路径与模型的对应关系。Controller(控制器):调用相应的业务层处理业务逻辑ModelAndView:Controller处理数据封装在里面,当然还可能有视图名。ViewResolver(视图解析器):调用真正的视图对象来生成相应的页面。2.2运行原理Dispatcherservle主要负责接受请求,然后依据HandlerMapping调用相应的控制器,Controller(控制器)处理业务返回ModelAndView,Disparcherservlet又依据相应的视图解析器(ViewResolver)调用相应的视图响应。3.常见问题1)怎样配置xml配置和注解配置?2)xml配置和注解配置的优缺点?3)为什么为什么更喜欢使用Annotaion来配置Spring MVC?4.解决方案:依据五大组件之间关系,然后xml或者注解配置相应的组件。1)在web.xml文件下配置DispatcherServlet注:上面里面主要是配置DispatcherServlet,启动tomcat后就会启动DispatcherServlet,启动了DispatcherServlet,相应的启动里面的Spring容器(注:里面放的是spring配置文件的路劲,注意一定要放在resource文件夹里面)。然后里面是主要接受请求的,/(代表接受所有请求吧)。2)如上配置文件写好了就可写自己的Controllerimport org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;@Controllerpublic class HelloController  {    @RequestMapping("/hello")    public String hello(){        System.out.println("hello()");        return "hello";    }}12345678910113)在spring文件下配置如下内容注:<context:component-scan base-package=""/>这个是组件扫描,“ ”里面是相应的包名(告诉spring容器到相应的包中扫面相应的注解,所以在建造相应servce,dao层的时候一定要在外面在套一层相应的包,这要的话扫描注解不会只相应的层)相应xml配置:1)web.xml文件和注解文件是一样的。2)编写Controller:import org.springframework.web.servlet.ModelAndView;import org.springframework.web.servlet.mvc.Controller;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class HelloController implements Controller {    @Override    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {        System.out.println("handleRequest()");        return new ModelAndView("hello");    }}123456789101112132)spring配置文件:5.编码实战6.扩展思考:其实spring mvc是相对于web项目提出来的分层思想,而web项目分为前端和后端,相对于后端自顶向下分为controller层,service层,dao层,数据层或者叫持久层。有时候,为了达到解耦的目的,会在上述基层中间加入响应的接口层,以使得接口与实现分离。在更加大型的网站中,会出现更加复杂的架构,比如dao层与数据层之间要有缓存层,或者访问压力增大后,需要使用集群,负载均衡等高级技术注:本人初学java者,如有不对敬请指出,谢谢!7.参考文献CSDN、百度百科8 更多讨论总结:1)怎样配置xml配置和注解配置?xml:根据五大组件相应的配置xml文件里面的内容。注解:相应注解对应的组件替换调xml文件的内容,然后添加组件扫描,和mvc注解开启。2)xml配置和注解配置的优缺点?xml配置主要是结构清晰,容易理解,但是配置内容过多,所以工程量大的时候不利于解读和维护。注解相对比较灵活,但对于初学者不利于理解,配置内容比较少,便于维护。3)为什么为什么更喜欢使用Annotaion来配置Spring MVC?(1)相对于xml配置配置文件比较少,省事。(2)注解代码比较简单,便于维护。温馨提示:本人初学java者,如有不对敬请指出,谢谢!技能树.IT修真院“我们相信人人都可以成为一个工程师,现在开始,找个师兄,带你入门,掌控自己学习的节奏,学习的路上不再迷茫”。这里是技能树.IT修真院,成千上万的师兄在这里找到了自己的学习路线,学习透明化,成长可见化,师兄1对1免费指导。快来与我一起学习吧~技能树.IT修真院“我们相信人人都可以成为一个工程师,现在开始,找个师兄,带你入门,掌控自己学习的节奏,学习的路上不再迷茫”。这里是技能树.IT修真院,成千上万的师兄在这里找到了自己的学习路线,学习透明化,成长可见化,师兄1对1免费指导。快来与我一起学习吧~ http://www.jnshu.com/login/1/28836439腾讯视频:https://v.qq.com/x/page/g0710rd7fa6.html   PPT链接 视频链接更多内容,可以加入IT交流群565734203与大家一起讨论交流 这里是技能树·IT修真院:https://www.jnshu.com,初学者转行到互联网的聚集地
如何使用springCloud搭建一个简单得分布式demo?
这里是修真院后端小课堂,每篇分享文从【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】八个方面深度解析后端知识/技能,本篇分享的是:【如何使用springCloud搭建一个简单得分布式demo?】 【修真院java小课堂】如何使用springCloud搭建一个简单得分布式demo?大家好,我是IT修真院深圳分院第12期的学员,一枚正直纯洁善良的java程序员今天给大家介绍下springMVC提供的框架校验的简单使用。背景介绍随着互联的高速发展,传统的单体应用越来越满足不了现在的应用的高并发要求,微服务概念的诞生就是为了解决这种高并发应用的,而SpringCloud是一个基于SpringBoot实现的微服务架构开发工具。它为微服务架构中涉及的配置管理、服务治理、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等操作提供了一种简单的开发方式。知识剖析1.SpringCloud的几个基本组件服务注册中心服务中心是统一管理我们的服务的,这里的服务统一称为客户端,包括服务提供者和服务消费者。负载均衡组件ribbon我们在之前的任务里学了nginx实现了负载均衡,springCloud里提供了ribbon组件给我们,配合springCloud封装好的RestTemlate只需要简单的配置即可实现负载均衡负载均衡组件feign跟rebbin一样都是实现负载均衡的组件,不同的是feign里面封装了ribbon,并且不用结合RestTemplate即可熔断器Hystric微服务系统是一个分布式架构,服务之间是彼此调用的,单处于中间的某一个服务出了故障,依赖于该服务的其他服务无法继续运作,这时会形成网络阻塞,大量的阻塞导致网络发生雪崩效应从而造成整个系统的崩溃。熔断器的熔断机制类似电路中的短路,当我们某个服务不可用时,直接快速切断该服务的连接,返回一个错误的页面,这样做好处是仅仅是依赖该服务的业务无法正常运作,而其他的不依赖于这个服务的其他服务可以正常运作。路由网关起到分配路由和拦截特定的url的作用。服务配置中心当一个web工程是由非常多的服务组成时,这时维护配置文件也是一件很麻烦的事情,可以把配置文件单独抽出来,放到github或者其他远程仓库里面,要更改配置文件只需要再远程仓库里面改,然后刷新一下即可让这些配置文件生效。常见问题1.微服务要怎么拆分?解决方案1.微服务的“微”到底定义到什么样的程度,这是一个非常难以界定的概念,可以从以下3个方面来界定:一是根据代码量来界定义,根据代码的多少来判断程序的大小;二是根据开发时间的长短来判断;三是根据业务的大小来划分。编码实战拓展思考参考文献【参考一】https://blog.csdn.net/forezp/article/details/70148833更多讨论2.微服务的不足微服务的复杂度。构建一个微服务系统并不是一件容易的事情,微服务系统是分布式系统,构建的复杂度远远超过单体系统,开发人员需要付出一定的学习成本去掌握更多的框架知识和框架知识。服务与服务之间通过HTTP协议或者消息传递机制通信,开发者需要选出最佳的通信机制,并解决网络服务较差时带来的风险。分布式的事务微服务架构所设计的系统是分布式系统。分布式系统有一个著名的CAP理论,即同时满足“一致性””可用性“和分区容错性是一件不可能的事情。CAP理论是由Eric Brewer在2000年PODC会议上提出的,该理论在两年后被证明成立。CAP理论是由告诉架构师不要妄想设计出同时满足三者的系统,应该有所取舍,设计出适合业务的系统。服务部署一个简单的单体系统可能只需要将程序集群部署并部署负载均衡服务器即可,而部署一个复杂的微服务系统就要复杂得多。  PPT链接 视频链接 更多内容,可以加入IT交流群565734203与大家一起讨论交流 这里是技能树·IT修真院:https://www.jnshu.com,初学者转行到互联网的聚集地
什么是SpringCloudBus?如何使用SpringCloudBus实现自动更新配置?
这里是修真院后端小课堂,每篇分享文从【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】八个方面深度解析后端知识/技能,本篇分享的是:【什么是SpringCloudBus?如何使用SpringCloudBus实现自动更新配置?】 大家好,我是IT修真院深圳分院第十一期学员,一枚正直纯洁善良的JAVA程序员。今天给大家分享一下,修真院官网JAVA任务十的一个知识点:什么是SpringCloudBus?如何使用SpringCloudBus实现自动更新配置?1    背景介绍1.1    SpringCloud简介springCloud是基于SpringBoot的一整套实现微服务的框架。他提供了微服务开发所需的配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等组件。SpringBoot旨在简化创建产品级的 Spring 应用和服务,简化了配置文件,使用嵌入式web服务器,含有诸多开箱即用微服务功能2    知识剖析2.1    什么是消息总线?在微服务架构的系统中,我们通常会使用轻量级的消息代理来构建一个共用的消息主题让系统中所有微服务实例都连接上来,由于该主题中产生的消息会被所有实例监听和消费,所以我们称它为消息总线。2.2    什么是SpringCloudBus?Spring cloud bus即SpringCloud框架的消息总线。其本质是利用了MQ的广播机制在分布式的系统中传播消息,目前常用的有Kafka和RabbitMQ。利用bus的机制可以做很多的事情,其中配置中心客户端刷新就是典型的应用场景之一。2.3    使用SpringCloudBus实现自动更新配置的步骤有哪些?1)    设置配置中心,config-server,从git获取配置信息;2)    在service中调用config-server中的相关配置;3)    在service中导入SpringCloudBus相关依赖,配置RabbitMq;4)    在需要刷新配置的Controller上添加@RefreshScope注解5)    在GitHub上配置WebHook,设置更新properties文件后向config-server发送post请求。3    常见问题如何使用SpringCloudBus实现自动更新配置4    解决方案1、见编码实战5    编码实战config-server的yml配置http://localhost:8090/eureka/config-server    https://github.com/              respo          master        localhost      guest      guestbus-refreshservice的yml配置service-hi    master        dev        http://193.112.20.68:8091/    193.112.201.68      guest      guesthttp://193.112.20.68:8090/eureka/  localhost6    扩展思考7    参考文献CSDN、百度百科8    更多讨论8.1    @RefreshScope的作用是什么? 该注解用来标注需要刷新的类,只有加上了这个注解,才会对这个类所引用的配置进行刷新。8.2    服务注册中心、服务配置中心和具体的服务模块是不是必须要放在同一个服务器上?不需要,只需要在yml文件中指定地、开放相关的端口即可。8.3    GitHub的webHook功能如何配置?1)    找到连接的库,打开Setting页面;2)    选择webHook,新增webhook;3)    填写发送POST请求的地址及何时发送POST请求技能树.IT修真院     “我们相信人人都可以成为一个工程师,现在开始,找个师兄,带你入门,掌控自己学习的节奏,学习的路上不再迷茫”。   这里是技能树.IT修真院,成千上万的师兄在这里找到了自己的学习路线,学习透明化,成长可见化,师兄1对1免费指导。快来与我一起学习吧~http://www.jnshu.com/login/1/24864700腾讯视频:https://v.qq.com/x/page/c0719197opo.html   PPT链接 视频链接  更多内容,可以加入IT交流群565734203与大家一起讨论交流这里是技能树·IT修真院:https://www.jnshu.com,初学者转行到互联网的聚集地
什么是springcloud分布式--feign?
这里是修真院后端小课堂,每篇分享文从【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】八个方面深度解析后端知识/技能,本篇分享的是:【什么是springcloud分布式--feign?】1.背景介绍spring cloud简介Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。2.知识剖析(1)Spring Cloud Netflix 简介首先Netflix是一家成功实践微服务架构的互联网公司,Netflix把它的整个微服务框架栈开源贡献给了社区。后来,Spring Cloud对Netflix开源组件进一步封装,方便Spring开发人员构建微服务基础框架。Spring Cloud Netflix的功能十分强大,包括Eureka,Ribbon,hystrix,Feign,Zuul等组件,结合到一起,让服务的调用、路由也变得异常容易。Spring Cloud Netflix作为Spring的重量级整合框架,使用它也意味着我们能从Spring获取到巨大的便利。Spring Cloud的其他子项目,比如Spring Cloud Stream、Spring Cloud Config等等,都为微服务的各种需求提供了一站式的解决方案。 (2)Spring Cloud Netflix主要组件介绍其核心组件是用于服务注册与发现的Eureka:Eureka由多个instance(服务实例)组成,这些服务实例可以分为两种:Eureka Server和Eureka Client。为了便于理解,我们将Eureka client再分为Service Provider和Service Consumer。如下图所示:1)Eureka Server:服务的注册中心,负责维护注册的服务列表。2)Service Provider:服务提供方,作为一个Eureka Client,向Eureka Server做服务注册、续约和下线等操作,注册的主要数据包括服务名、机器ip、端口号、域名等等。3)Service Consumer:服务消费方,作为一个Eureka Client,向Eureka Server获取Service Provider的注册信息,并通过远程调用与Service Provider进行通信。Service Provider和Service Consumer不是严格的概念,Service Consumer也可以随时向Eureka Server注册,来让自己变成一个Service Provider。Spring Cloud针对服务注册与发现,进行了一层抽象,并提供了三种实现:Eureka、Consul、Zookeeper。目前支持得最好的就是Eureka,其次是Consul,最后是Zookeeper。 (3)服务注册:Service Provider本质上是一个Eureka Client。它启动时,会调用服务注册方法,向Eureka Server注册自己的信息。Eureka Server会维护一个已注册服务的列表,这个列表为一个嵌套的hash map:第一层,application name和对应的服务实例。 第二层,服务实例及其对应的注册信息,包括IP,端口号等。当实例状态发生变化时(如自身检测认为Down的时候),也会向Eureka Server更新自己的服务状态。续约的方式与服务注册基本一致,会周期性地向Eureka Server发送心跳以续约自己的信息,避免自己的注册信息被剔除。 (4)Service Consumer本质上也是一个Eureka Client(它也会向Eureka Server注册,只是这个注册信息无关紧要罢了)。它启动后,会从Eureka Server上获取所有实例的注册信息,包括IP地址、端口等,并缓存到本地。这些信息默认每30秒更新一次。基于Service Consumer获取到的服务实例信息,我们就可以进行服务调用了。而Spring Cloud也为Service Consumer提供了丰富的服务调用工具:1)Ribbon,实现客户端的负载均衡。2)Hystrix,断路器。3)Feign,RESTful Web Service客户端,整合了Ribbon和Hystrix。 (5)服务调用端熔断——HystrixNetflix创建了一个名为Hystrix的库,实现了断路器的模式。“断路器”本身是一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个符合预期的、可处理的备选响应(FallBack),而不是长时间的等待或者抛出调用方无法处理的异常,这样就保证了服务调用方的线程不会被长时间、不必要地占用,从而避免了故障在分布式系统中的蔓延,甚至雪崩。(6)服务调用端代码抽象和封装——FeignFeign是一个声明式的Web Service客户端,它的目的就是让Web Service调用更加简单。它整合了Ribbon和Hystrix,从而让我们不再需要显式地使用这两个组件。Feign还提供了HTTP请求的模板,通过编写简单的接口和插入注解,我们就可以定义好HTTP请求的参数、格式、地址等信息。接下来,Feign会完全代理HTTP的请求,我们只需要像调用方法一样调用它就可以完成服务请求。3.常见问题(1)Spring Cloud Netflix的优势?对于微服务的治理而言,核心就是服务的注册和发现。因此选择哪个组件,很大程度上要看它对于服务注册与发现的解决方案。在这个领域,开源架构很多,最常见的是Zookeeper,但这并不是唯一选择。在分布式系统领域有个著名的CAP定理:C—数据一致性,A—服务可用性,P—服务对网络分区故障的容错性。这三个特性在任何分布式系统中不能同时满足,最多同时满足两个。Zookeeper保证的是CP,即它不能保证每次服务请求的可用性。对于大多数涉及到数据存储的分布式环境,数据一致性应该是首先被保证的。但是对于服务发现而言,可用性比数据一致性更加重要,即AP胜过CP。而Spring Cloud Netflix在设计Eureka时遵守的就是AP原则。 (2)实际开发Eureka的过程中,有时会遇见Service Consumer获取到Server Provider的信息有延迟?Eureka官网提到服务端的更改可能需要2分钟才能传播到所有客户端。这是因为Eureka有三处缓存和一处延迟造成的。1)Eureka Server对注册列表进行缓存,默认时间为30s。2)Eureka Client对获取到的注册信息进行缓存,默认时间为30s。3)Ribbon会从上面提到的Eureka Client获取服务列表,将负载均衡后的结果缓存30s。4)如果不是在Spring Cloud环境下使用这些组件(Eureka, Ribbon),服务启动后并不会马上向Eureka注册,而是需要等到第一次发送心跳请求时才会注册。心跳请求的发送间隔默认是30s。Spring Cloud对此做了修改,服务启动后会马上注册。 (3)Feign具有如下特性:可插拔的注解支持,包括Feign注解和JAX-RS注解支持可插拔的HTTP编码器和解码器支持Hystrix和它的Fallback支持Ribbon的负载均衡支持HTTP请求和响应的压缩 (4)服务器端负载均衡和客户端负载均衡的区别?1)服务器端负载均衡:例如Nginx,通过Nginx进行负载均衡,先发送请求,然后通过负载均衡算法,在多个服务器之间选择一个进行访问;即在服务器端再进行负载均衡算法分配。2)客户端负载均衡:例如spring cloud中的ribbon,客户端会有一个服务器地址列表,在发送请求前通过负载均衡算法选择一个服务器,然后进行访问,这是客户端负载均衡;即在客户端就进行负载均衡算法分配。--------------------- 作者:weixin_40636513 来源:CSDN 原文:https://blog.csdn.net/weixin_40636513/article/details/80877098?utm_source=copy 版权声明:本文为博主原创文章,转载请附上博文链接!  PPT链接 视频链接更多内容,可以加入IT交流群565734203与大家一起讨论交流这里是技能树·IT修真院:https://www.jnshu.com,初学者转行到互联网的聚集地
SpringAOP
这里是修真院后端小课堂,每篇分享文从【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】八个方面深度解析后端知识/技能,本篇分享的是:【SpringAOP】标题:【修真院Java小课堂】SpringAOP开场语:大家好,我是IT修真院西安分院第四期郭靖,纯洁善良的JAVA程序员,今天给大家分享一下,修真院官网JAVA任务五任务扩展知识点——SpringAOP(1)背景介绍:什么是AOP?什么是SpringAOP?AOP(Aspect-OrientedProgramming,面向切面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善。AOP技术利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其名为“Aspect”,即切面。实现AOP的技术,主要分为两大类:一是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;二是采用静态织入的方式,引入特定的语法创建“方面”,从而使得编译器可以在编译期间织入有关“方面”的代码。SpringAOP是一种使用了Aop技术的框架。(2)知识剖析:2.1 AOP的基本概念:1.)Aspect(切面):通常是一个类,里面可以定义切入点和通知2.)JointPoint(连接点):程序执行过程中明确的点,一般是方法的调用3.)Advice(通知):AOP在特定的切入点上执行的增强处理,有before,after,afterReturning,afterThrowing,around4.)Pointcut(切入点):就是带有通知的连接点,在程序中主要体现为书写切入点表达式 5.)AOP代理:AOP框架创建的对象,代理就是目标对象的加强。Spring中的AOP代理可以使JDK动态代理,也可以是CGLIB代理,前者基于接口,后者基于子类2.2 通知类型介绍:(1)Before:在目标方法被调用之前做增强处理,@Before只需要指定切入点表达式即可(2)AfterReturning:在目标方法正常完成后做增强,@AfterReturning除了指定切入点表达式后,还可以指定一个返回值形参名returning,代表目标方法的返回值(3)AfterThrowing:主要用来处理程序中未处理的异常,@AfterThrowing除了指定切入点表达式后,还可以指定一个throwing的返回值形参名,可以通过该形参名来访问目标方法中所抛出的异常对象(4)After:在目标方法完成之后做增强,无论目标方法是否成功完成。@After可以指定一个切入点表达式(5)Around:环绕通知,在目标方法完成前后做增强处理,环绕通知是最重要的通知类型,像事务,日志等都是环绕通知,注意编程 中核心是一个ProceedingJoinPoint2.3 SpringAop的两种使用方式:1、使用XML文件配置的方式2、使用注解的方式:启用@AsjectJ支持,在applicationContext.xml中配置 <aop:aspectj-autoproxy>(3)常见问题:3.1怎样定义切入点表达式3.2切入点表达式有哪几种写法3.3多个包使用AOP时怎样写切入点表达式3.4关于通知的优先级问题(4)解决方案:4.1 切入点的定义和表达式:Spring AOP支持的切入点指示符:A:@Pointcut("execution(* com.aijava.springcode.service..*.*(..))")第一个*表示匹配任意的方法返回值,..(两个点)表示零个或多个,上面的第一个..表示service包及其子包,第二个*表示所有类,第三个*表示所有方法,第二个..表示方法的任意参数个数 B:@Pointcut("within(com.aijava.springcode.service.*)")within限定匹配方法的连接点,上面的就是表示匹配service包下的任意连接点                 C:@Pointcut("this(com.aijava.springcode.service.UserService)")this用来限定AOP代理必须是指定类型的实例,如上,指定了一个特定的实例,就是UserService D:@Pointcut("bean(userService)")bean也是非常常用的,bean可以指定IOC容器中的bean的名称 4.2 组合切入点:在多个表达式之间使用  || 、 or 表示  或 ,使用  && , and 表示  与 , ! 表示非。4.3通知执行的优先级:进入目标方法时,先织入Around,再织入Before,退出目标方法时,先织入Around,再织入AfterReturning,最后才织入After。 注意:Spring AOP的环绕通知会影响到AfterThrowing通知的运行,不要同时使用!同时使用也没啥意义。(5)编码实战:(6)拓展思考:基于注解与基于配置文件的优缺点优点:  注解能减少配置的工作,而且配置信息和JAVA代码放在一起,有助于增强程序的内聚性。相对于XML配置文件进行配置文件和程序文件的切换,用注解方式,能提高开发的连贯性,和提成开发效率。缺点:程序复杂的话,还是使用xml配置文件的方式,这样可读性和可维护性比较强。(7)参考文献:https://www.cnblogs.com/liuruowang/p/5711563.htmlhttps://blog.csdn.net/qq_16605855/article/details/73465865https://www.cnblogs.com/xuyatao/p/8485851.html百度百科(8)更多讨论:8.1不同切面的通知执行顺序当定义在不同切面的相同类型的通知需要在同一个连接点执行,如果没指定切面的执行顺序,这两个通知的执行顺序将是未知的。如果需要他们顺序执行,可以通过指定切面的优先级来控制通知的执行顺序。annotation方式:1)@Order(int)指定优先级,例如@Order(1)---->@Order(2)2)也可以通过在切面实现类上实现org.springframework.core.Ordered接口,由private int order 来指定优先级XMl配置方式:可以由aop:aspect的order属性来指定 8.2 AOP使用场景AOP用来封装横切关注点,具体可以在下面的场景中使用:Authentication 权限Caching 缓存Context passing 内容传递Error handling 错误处理Lazy loading懒加载Debugging调试logging, tracing, profiling and monitoring记录跟踪优化校准Performance optimization性能优化Persistence持久化Resource pooling资源池Synchronization同步Transactions 事务 8.3 几个增强之间的区别 除环绕增强外,所有的连接点使用的都是 JoinPoint 类型的入参,而环绕增强使用的是 ProceedingJoinPoint。返回增强能接受到返回值抛出增强能接收到抛出的异常环绕增强的返回值类型为目标方法返回值类型(9)鸣谢:(10)结束语:今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~     PPT链接 视频链接 更多内容,可以加入IT交流群565734203与大家一起讨论交流这里是技能树·IT修真院:https://www.jnshu.com,初学者转行到互联网的聚集地
spring-data-jpa简单介绍
这里是修真院后端小课堂,每篇分享文从【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】八个方面深度解析后端知识/技能,本篇分享的是:【spring-data-jpa简单介绍】【修真院Java小课堂】spring-data-jpa简单介绍 开场语: 大家好,我是IT修真院北京分院第32期的学员廖友,一枚正直纯洁善良的Java程序员,今天给大家分享一下,修真院官网Java任务十中的知识点——spring-data-jpa简单介绍 一、背景介绍: 1、Spring Data是什么?Spring Data 项目的目的是为了简化构建基于 Spring 框架应用的数据访问技术,包括关系数据库、非关系数据库、Map-Reduce 框架、云数据服务等等。 2、什么是JPA?JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。 二、知识剖析: 1、Hibernate Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 2、Hibernate的优缺点Hibernate优点:面向对象、有更好的移植性、开发的效率高。Hibernate缺点:运行效率慢、结构臃肿、JPQL/HQL存在硬伤。使用建议:建议Hibernate用在用户量不大,或需要敏捷开发的企业级应用;互联网项目慎用、慎用、慎用。 3、基本操作CRUD编写接口继承jpaRepository,则可以直接调用接口中的方法完成crud操作 4、JPA数据查询使用JPQL语言编写查询语句 5、关系映射Mapping将数据库中的表字段映射成Java对象中的属性。 三、编码实战 四、参考文献: [1]https://www.ibm.com/developerworks/cn/opensource/os-cn-spring-jpa/index.html [2]http://blog.51cto.com/12348890/2092279 [3]https://www.cnblogs.com/cmfwm/p/8109433.html 五、更多讨论: Q1:可以基于mybatis使用JPA进行crud吗? A1:不能,mybatis不是jpa规范的实现,只有jpa规范的实现才可以使用JPA进行数据操作。 Q2:Hibernate的移植性体现在什么地方? A2:不同数据库厂商的sql语句是有区别的,Hibernate对不同厂商的sql语句进行了封装,使得它能兼容目前主流的数据库,即我们使用JPQL编写的语句,可以在不同的数据库上进行操作。 Q3:为什么在互联网项目中慎用hibernate? A3:因为hibernate对sql语句进行了封装,使得我们不好对sql进行优化,而使用hibernate自己生成的sql语句,运行效率低,无法应对高并发的场景。 六、结束语: 今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~  PPT链接 视频链接更多内容,可以加入IT交流群565734203与大家一起讨论交流这里是技能树·IT修真院:https://www.jnshu.com,初学者转行到互联网的聚集地
什么是spring cloud?
这里是修真院后端小课堂,每篇分享文从【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】八个方面深度解析后端知识/技能,本篇分享的是:【什么是spring cloud?】1.背景介绍什么是spring cloud?spring cloud是一个基于spring boot实现的微服务架构开发工具。  它为微服务架构中涉及的配置管理、服务治理、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、  分布式会话和集群状态管理等操作提供了一种简单的开发方式。2.知识剖析在微服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于http restful的。   Spring cloud有两种服务调用方式,一种是ribbon+restTemplate,另一种是feign。这里讲解下基于ribbon+restTemplate。3.常见问题配置文件  .properties如何配置4.解决方案网上教程都是.yml配置,它是以:进行文件分割和赋值,并且赋值的时候要多加一个空格。而properties是以.分割,等号赋值5.编码实战注册中心新建spring boot项目 注解注解标明自己是EurekaServer application配置文件,修改端口号(默认端口号8080,内嵌tomcat) 新建client,和上面过程一样数据库数据和端口 ribbon负载均衡,SERVICE-HI等于两个web的ip和端口 ribbon轮询方式 6.扩展思考dubbo和springcloud的区别从项目的背景来看,Dubbo 国内用的公司挺多,国内影响力大,Spring Cloud 自然在国外影响力较大,所以这个来看不分伯仲了,毕竟都有大公司在使用。从社区的活跃度来看,可以看下各自的Github托管项目来区分,Dubbo · GitHub与Spring Cloud · GitHub,从更新频率与更新时间来看 Spring Cloud 优于Dubbo,Dubbo基本不维护了。从框架的完整度来看,Dubbo只是实现了服务治理(注册 发现等),而Spring Cloud下面有很多个子项目覆盖了微服务架构下的方方面面,服务治理只是其中的一个方面,一定程度来说,Dubbo只是Spring Cloud Netflix中的一个子集。如果选择Spring Cloud,基本上每个环节都已经有了对应的组件支持,可能有些也不一定能满足你所有的需求,但是其活跃的社区与快速的迭代更新也会让你没有后顾之忧。   PPT链接 视频链接更多内容,可以加入IT交流群565734203与大家一起讨论交流这里是技能树·IT修真院:https://www.jnshu.com,初学者转行到互联网的聚集地
SpringAOP的简单使用
这里是修真院后端小课堂,每篇分享文从【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】八个方面深度解析后端知识/技能,本篇分享的是:【SpringAOP的简单使用】大家好,我是IT修真院成都分院第13期的学员,一枚正直纯洁善良的JAVA程序员,今天给大家分享一下,修真院官网JAVA任务一,深度思考中的知识点——SpringAOP的简单使用(1)背景介绍:AOP(Aspect Oriented Programming),面向切面编程,是OOP(Object Oriented Programming,面向对象编程)的补充和完善。OOP是开发者定义纵向关系,但是并不允许开发者定义横向关系,所以有部分代码是横向的分布在所有对象层次中,例如日志功能等而与它对应的对象的核心功能毫无关系对于其他类型的代码,这种散布在各处的无关的代码被称为横切(cross cutting),在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。AOP技术恰恰相反,它利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为"Aspect",即切面。所谓"切面",简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。(2)知识剖析:Spring AOP的一些基本概念(1)Aspect(切面):通常是一个类,里面可以定义切入点和通知(2)JointPoint(连接点):程序执行过程中明确的点,一般是方法的调用(3)Advice(通知):AOP在特定的切入点上执行的增强处理(4)Pointcut(切入点):就是带有通知的连接点,在程序中主要体现为书写切入点表达式(5)AOP代理:AOP框架创建的对象,代理就是目标对象的加强。Spring中的AOP代理可以使JDK动态代理,也可以是CGLIB代理,前者基于接口,后者基于子类有五种类型的通知:Before(前置):在方法被调用之前调用通知;After(后置):在方法调用之后调用通知;(不管该方法是否执行成功)After-returning(返回结果通知):在方法返回结果后;After-throwing(异常通知):在方法抛出异常后;Around(环绕):在方法调用之前和之后都会调用通知; (3)常见问题:(1)SpringAOP使用方法(2)使用XML方法和使用注解(4)解决方案:使用xml方法:<context:annotation-config/><!--被代理对象--><bean id="math" class="com.springAOP.MyMath"/><!--通知类--><bean id="advices" class="com.springAOP.Advices"/><!--aop设置--><aop:config>    <!--配置切面 把增强用到方法上面-->    <aop:aspect ref="advices">        <!--配置切点-->        <aop:pointcut id="pointcut1" expression="execution(* com.springAOP.MyMath.*(..))"/>        <aop:before method="before" pointcut-ref="pointcut1"/>        <aop:after-returning method="after" pointcut-ref="pointcut1"/>       <!-- <aop:after method="after" pointcut-ref="pointcut1"/>-->        <aop:around method="around" pointcut-ref="pointcut1"/>    </aop:aspect></aop:config> 使用注解:<context:component-scan base-package="com.springAOP2"/><aop:aspectj-autoproxy/> (5)编码实战:使用xml的advice类/* * 通知类,横切逻辑 * */public class Advices {    /*前置增强*/    public void before(JoinPoint jp1) {        System.out.println("-------前置通知-------");        System.out.println(jp1.getSignature().getName());    }    public void after(JoinPoint jp){        System.out.println("-------最终通知-------");    }    /*环绕增强*/    public Object around(ProceedingJoinPoint pjp) throws Throwable{        Object obj;        System.out.println("方法前环绕");        obj=pjp.proceed();        System.out.println("方法后环绕");        return obj;    }使用注解的xml类:@Component@Aspectpublic class Advices2 {    @Before("execution(* com.springAOP2.MyMath2.*(..))")    public void Before(JoinPoint jp){       System.out.println("-----前置通知-----");        System.out.println(jp.getSignature().getName());   }    @After("execution(* com.springAOP2.MyMath2.*(..))")    public void After(JoinPoint jp){        System.out.println("-----后置通知-----");    }} 这边使用了两种方法做演示,方法一和方法二需要修改classpath的配置文件这个是测试文件:@ContextConfiguration(locations = "classpath:springAOP2.xml")@RunWith(SpringJUnit4ClassRunner.class)public class TimeTest  {/*    @Resource    private MyMath myMath;*/    @Resource    private MyMath2 myMath2;//    @Test//    public void Test1(){//        int n1=100,n2=5;//        myMath.add(n1,n2);//    }    @Test    public void Test2(){        int n1=100,n2=5;        myMath2.del(n1,n2);    }  (6)拓展思考:基于注解与基于配置文件的优缺点:注解:1.更加简洁,不需要配置xml文件2.更加方便,不需要从java代码在转到xml3.更加语义化缺点就是耦合度较大,依赖关系不如xml配置文件表达的清晰(7)参考文献:https://www.zhihu.com/question/278435266  知乎id:wayshallhttps://www.cnblogs.com/liuruowang/p/5711563.htmlhttp://www.cnblogs.com/zs234/p/3267623.html(8)更多讨论:(9)鸣谢:感谢修真院的师兄,此教程是在他们之前技术分享的基础上完善而成。(10)结束语:今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~  PPT链接 视频链接 更多内容,可以加入IT交流群565734203与大家一起讨论交流这里是技能树·IT修真院:https://www.jnshu.com,初学者转行到互联网的聚集地 
如何使用springCloud搭建一个简单的分布式demo
这里是修真院后端小课堂,每篇分享文从【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】八个方面深度解析后端知识/技能,本篇分享的是:【如何使用springCloud搭建一个简单的分布式demo】大家好,我是IT修真院北京分院第34期的学员岳晓鹏,一枚正直纯洁善良的java程序员,今天给大家分享一下,修真院官网java任务10,深度思考中的知识点——如何使用springCloud搭建一个简单的分布式demo。自己只是实现了spring cloud的注册中心和简单的负载均衡,应该算是spring cloud的简单介绍。(1)背景介绍: 微服务微服务架构风格就像是把小的服务开发成单一应用的形式, 运行在其自己的进程中,并采用轻量级的机制进行通信(一般是 HTTP 资源 API)。这些服务都是围绕业务能力来构建,通过全自动部署工具来实现独立部署。这些服务,其可以使用不同的编程语言和不同的数据存储技术,并保持最小化集中管理。  Spring CloudSpring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。 (2)知识剖析: 服务注册中心使用微服务,微服务的本质还是各种API接口的调用。服务中心是统一管理我们的服务的,使用Spring Cloud Eureka,我们可以将自己定义的API接口注册到Spring Cloud Eureka上,Eureka负责服务的注册与发现,构成Eureka体系的包括:服务注册中心、服务提供者、服务消费者。 路由网关zuul      服务网关是微服务架构中一个不可或缺的部分。通过服务网关统一向外系统提供REST API的过程中,除了具备服务路由、均衡负载功能之外,它还具备了权限控制等功能。Spring Cloud Netflix中的Zuul就担任了这样的一个角色,为微服务架构提供了前门保护的作用,同时将权限控制这些较重的非业务逻辑内容迁移到服务路由层面,使得服务集群主体能够具备更高的可复用性和可测试性。 熔断器Hystric微服务系统是一个分布式架构,服务之间是彼此调用的,当有一个服务出现了故障,而服务的调用方不知道服务出现故障,此时调用方的请求不断的增加,最后就会调用方形成任务的积压,最终导致自身服务的瘫痪。熔断器的熔断机制类似电路中的短路,当我们某个服务不可用时,直接快速切断该服务的连接,返回一个错误的页面,这样做好处是仅仅是依赖该服务的业务无法正常运作,而其他的不依赖于这个服务的其他服务可以正常运作。 负载均衡组件ribbon为了提高服务的可用性,我们一般会将相同的服务部署多个实例,负载均衡的作用就是使获取服务的请求被均衡的分配到各个实例中。我们在之前的任务里学了nginx实现了负载均衡,springCloud里提供了ribbon组件给我们,配合springCloud封装好的RestTemlate只需要简单的配置即可实现负载均衡。Feign跟rebbin一样都是实现负载均衡的组件,不同的是feign里面封装了ribbon和hystric,不用像ribbon那样必须结合RestTemplate即可使用。 服务配置中心config对于微服务还不是很多的时候,各种服务的配置管理起来还相对简单,但是当成百上千的微服务节点起来的时候,服务配置的管理变得会复杂起来。分布式系统中,由于服务数量巨多,为了方便服务配置文件统一管理,实时更新,所以需要分布式配置中心组件。在Spring Cloud中,有分布式配置中心组件Spring Cloud Config ,它支持配置服务放在配置服务的内存中(即本地),也支持放在远程Git仓库中。 消息中心busSpring Cloud Config中,我们知道的配置文件可以通过Config Server存储到Git等地方,通过Config Client进行读取,但是我们的配置文件不可能是一直不变的,当我们的配置文件放生变化的时候如何进行更新哪?一种最简单的方式重新一下Config Client进行重新获取,但Spring Cloud绝对不会让你这样做的,Spring Cloud Bus提供一种操作使得我们在不关闭服务的情况下更新我们的配置。 (3)常见问题: pring cloud和dubbo的区别?(4)解决方案: 在微服务相关的这几个方面,服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等来比较下的话,Dubbo 只是实现了服务治理,而 Spring Cloud 子项目分别覆盖了微服务架构下的众多部件,服务治理只是其中的一个方面。(5)编码实战:介绍了下hashmap几个概念的实现及put操作的流程  (6)拓展思考: (7)参考文献: https://www.cnblogs.com/xiaojunbo/p/7090742.html【1】CSDN博客http://www.ityouknow.com/springcloud/2017/05/01/simple-springcloud.html【2】个人博客 (8)更多讨论:Q1:什么是客户端负载均衡?A1:负载均衡一般分为服务端负载均衡和客户端负载均衡,服务端的负载均衡通过硬件(如F5)或者软件(如Nginx)来实现。服务端负载均衡是在硬件设备或者软件模块中维护一份可用服务清单,然后客户端发送服务请求到这些负载均衡的设备上,这些设备根据一些算法均衡的将请求转发出去。而客户端负载均衡则是客户端自己从服务注册中心获取服务清单缓存到本地,然后通过客户单内部算法均衡的去访问这些服务。Q2:如何在服务端宕机的情况下保证服务运行?A2:简单来说,这就是熔断器的功能,在服务提供者不能提供服务后,熔断器就会根据检测机制,将服务从注册中心清除,下次有别的请求的时候,就不会去访问已经宕机的服务,返回一个错误信息或导入到别的备用服务上边。有时候会有注册中心宕机的情况,这种情况下,就需要布置注册中心集群,保证注册中心不会全部宕机能好点。Q3:如何区分spring eureka的生产者和消费者?A3:因为spring eureka中只有server和client,生产者和消费者都属于client,他们之间没有明确的界限,根据具体行使的功能来进行划分,你提供服务,你就是服务生产者,你从别的client得到服务,你就是消费者,两者可以互换,功能也可以相互重叠,我们习惯上将他们的职责分清。比方说整个cloud中的其余组件,都是client,但是提供不同的功能,比如负载均衡,熔断等功能,只让它进行特定的功能。区分的话,从配置文件的服务名称来进行区分。 (9)鸣谢: (10)结束语:今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~  PPT链接 视频链接更多内容,可以加入IT交流群565734203与大家一起讨论交流这里是技能树·IT修真院:https://www.jnshu.com,初学者转行到互联网的聚集地
spring的IOC的注解
这里是修真院后端小课堂,每篇分享文从【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】八个方面深度解析后端知识/技能,本篇分享的是:【spring的IOC的注解】【修真院java小课堂】spring的IOC的注解 开场语:大家好,我是IT修真院上海分院第10期的学员洪阳,今天给大家分享一下,修真院官网java任务1,深度思考中的知识点——spring的IOC的注解. (1)背景介绍:传统的xml配置完成IOC,如果内容比较多则配置需花费很多时间,通过注解可以减轻工作量,但注解后修改要麻烦一些,偶合度会增加,应该根据需要选择合适的方法[1]。 (2)知识剖析:在类上增加了一个注解Component,在类的开头使用了@Component注解,它可以被Spring容器识别,启动Spring后,会自动把它转成容器管理的Bean。 除了@Component外,Spring提供了3个功能基本和@Component等效的注解,分别对应于用于对DAO,Service,和Controller进行注解。 1:@Service用于注解业务层组件(我们通常定义的service层就用这个) 2:@Controller用于注解控制层组件(如struts中的action) 3:@Repository用于注解数据访问组件,即DAO组件 4:@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行注解。 singleton---单例  只创建一个对象。 prototype---原型  想创建多少个就创建多少了。 request---针对Web项目,不同的请求创建单独的Bean对象,同一个请求共享一个Bean。 session---针对Web项目,不同的会话创建单独的Bean对象,同一个会话共享一个Bean。 (3)常见问题:@Component@Service@Controller@Repository@Component是否一样,使用时要不要区分 (4)解决方案:这几个注解不同于上面的注解,上面的注解都是将被依赖的bean注入进入,而这几个注解的作用都是生产bean, 这些注解都是注解在类上,将类注解成spring的bean工厂中一个一个的bean。@Controller, @Service, @Repository基本就是语义更加细化的@Component。 (5)编码实战:@Component("user")public class User {private Integer id;private String name;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}}--------------------- @Component(value="user")public class User {@Value("1")private Integer id; @Value("lzgsea")private String name;public Integer getId() {return id;} //@Value("1")public void setId(Integer id) {this.id = id;}public String getName() {return name;} //@Value("lzgsea")public void setName(String name) {this.name = name;}}--------------------- (6)拓展思考:Spring中的注解大概可以分为两大类:1)spring的bean容器相关的注解,或者说bean工厂相关的注解;2)springmvc相关的注解。spring的bean容器相关的注解,先后有:@Required, @Autowired, @PostConstruct, @PreDestory,还有Spring3.0开始支持的JSR-330标准javax.inject.*中的注解(@Inject, @Named, @Qualifier, @Provider, @Scope, @Singleton).springmvc相关的注解有:@Controller, @RequestMapping, @RequestParam, @ResponseBody等等。要理解Spring中的注解,后续还要先要理解Java中的注解。(7)参考文献:lzgsea  - CSDN - Spring注解详解 - https://blog.csdn.net/lzgsea/article/details/79829544 [1] (8)更多讨论:Q1:提问人:XML和注解各自有什么优缺点 A1:回答人:XML:可以适用任何场景;&emsp;结构清晰,维护方便.注解:有些地方用不了,这个类不是自己提供的,开发方便. Q2:提问人:IOC是什么A2:回答人:Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想。  (9)鸣谢:感谢师兄对我无微不至的日程提醒,此教程是在他们之前技术分享的基础上完善而成。 (10)结束语:今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~  PPT链接 视频链接更多内容,可以加入IT交流群565734203与大家一起讨论交流这里是技能树·IT修真院:https://www.jnshu.com,初学者转行到互联网的聚集地
SpringCloud简单介绍
这里是修真院后端小课堂,每篇分享文从【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】八个方面深度解析后端知识/技能,本篇分享的是:【SpringCloud简单介绍。】大家好,我是IT修真院郑州分院第十期的学员,一枚正直纯洁善良的java程序员今天给大家分享一下,修真院官网java任务十,深度思考中的知识点——SpringCloud简单介绍。背景介绍Spring Cloud是基于Spring Boot的一整套实现微服务的框架。它提供了微服务开发所需的配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等组件。知识剖析Eureka,服务注册和发现,它提供了一个服务注册中心、服务发现的客户端,还有一个方便的查看所有注册的服务的界面。 所有的服务使用Eureka的服务发现客户端来将自己注册到Eureka的服务器上。Eureka Client分为服务提供者和服务消费者。服务可以既是服务提供者又是服务消费者。服务提供者服务注册:启动的时候会通过发送REST请求的方式将自己注册到Eureka Server上,同时带上了自身服务的一些元数据信息。**服务续约:**在注册完服务之后,服务提供者会维护一个心跳用来持续告诉Eureka Server: "我还活着 ” 、服务下线:当服务实例进行正常的关闭操作时,它会触发一个服务下线的REST请求给Eureka Server, 告诉服务注册中心:“我要下线了 ”。服务消费者获取服务:当我们启动服务消费者的时候,它会发送一个REST请求给服务注册中心,来获取上面注册的服务清单服务调用:服务消费者在获取服务清单后,通过服务名可以获得具体提供服务的实例名和该实例的元数据信息。在进行服务调用的时候,优先访问同处一个Zone中的服务提供方。 Eureka Server(服务注册中心):失效剔除:默认每隔一段时间(默认为60秒) 将当前清单中超时(默认为90秒)没有续约的服务剔除出去。自我保护:。EurekaServer 在运行期间,会统计心跳失败的比例在15分钟之内是否低于85%(通常由于网络不稳定导致)。 Eureka Server会将当前的实例注册信息保护起来, 让这些实例不会过期,尽可能保护这些注册信息。 Zuul,网关,所有的客户端请求通过这个网关访问后台的服务。他可以使用一定的路由配置来判断某一个URL由哪个服务来处理。并从Eureka获取注册的服务来转发请求。Ribbon,即负载均衡,Zuul网关将一个请求发送给某一个服务的应用的时候,如果一个服务启动了多个实例,就会通过Ribbon来通过一定的负载均衡策略来发送给某一个服务实例。Feign,服务客户端,服务之间如果需要相互访问,可以使用RestTemplate,也可以使用Feign客户端访问。它默认会使用Ribbon来实现负载均衡。Hystrix,监控和断路器。我们只需要在服务接口上添加Hystrix标签,就可以实现对这个接口的监控和断路器功能。Hystrix Dashboard,监控面板,他提供了一个界面,可以监控各个服务上的服务调用所消耗的时间等。Turbine,监控聚合,使用Hystrix监控,我们需要打开每一个服务实例的监控信息来查看。而Turbine可以帮助我们把所有的服务实例的监控信息聚合到一个地方统一查看。这样就不需要挨个打开一个个的页面一个个查看。Spring Cloud Config,解决分布式系统的配置管理方案。它包含了Client和Server两个部分,server提供配置文件的存储、以接口的形式将配置文件的内容提供出去,client通过接口获取数据、并依据此数据初始化自己的应用。Spring Cloud Bus,事件、消息总线。用于在集群(例如,配置变化事件)中传播状态变化,可与Spring Cloud Config联合实现热部署。常见问题如何使用ribbon实现负载均衡?扩展思考SpringCloud的特性Spring Cloud来源于Spring,质量、稳定性、持续性都可以得到保证。Spirng Cloud基于Spring Boot,使用入门门槛较低,更加便于业务落地。Spring Cloud发展非常的快。Spring Cloud社区活跃度很高,使用过程中遇到的问题更容易找到解决方案。SpringCloud是一个全家桶,众多子项目覆盖了微服务架构的很多方面,方案完整性更高。参考文献https://blog.csdn.net/chen978616649/article/details/78493001/https://www.fangzhipeng.com/archive/?tag=SpringCloud更多讨论Q1: Ribbon和Feign的区别A1: Ribbon和Feign都是用于调用其他服务的,不过方式不同。1.启动类使用的注解不同,Ribbon用的是@RibbonClient,Feign用的是@EnableFeignClients。2.服务的指定位置不同,Ribbon是在@RibbonClient注解上声明,Feign则是在定义抽象方法的接口中使用@FeignClient声明。3.调用方式不同,Ribbon需要自己构建http请求,模拟http请求然后使用RestTemplate发送给其他服务,步骤相当繁琐。Feign则是在Ribbon的基础上进行了一次改进,采用接口的方式,将需要调用的其他服务的方法定义成抽象方法即可,不需要自己构建http请求。不过要注意的是抽象方法的注解、方法签名要和提供服务的方法完全一致。Q2: 什么是服务熔断?什么是服务降级?A2: 服务熔断: 一般是某个服务故障或者是异常引起的,类似现实世界中的‘保险丝’,当某个异常条件被触发,直接熔断整个服务,而不是一直等到此服务超时。服务降级:一般是从整体负荷考虑,就是当某个服务熔断之后,服务器将不再被调用,此时客户端可以自己准备一个本地的fallback回掉,返回一个缺省值,这样做,虽然服务水平下降,但好歹,比直接挂掉要强。Q3: eureka和zookeeper都可以提供服务注册与发现的功能,请说说两个的区别?A3: ZooKeeper基于CP,不保证高可用,如果zookeeper正在选主,或者Zookeeper集群中半数以上机器不可用,那么将无法获得数据。Eureka基于AP,能保证高可用,即使所有机器都挂了,也能拿到本地缓存的数据。 PPT链接 视频链接更多内容,可以加入IT交流群565734203与大家一起讨论交流这里是技能树·IT修真院:https://www.jnshu.com,初学者转行到互联网的聚集地
什么是Spring Zuul?
这里是修真院后端小课堂,每篇分享文从【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】八个方面深度解析后端知识/技能,本篇分享的是:【什么是Spring Zuul?】 1.背景介绍spring cloud简介Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。2.知识剖析(1)Spring Cloud Netflix 简介首先Netflix是一家成功实践微服务架构的互联网公司,Netflix把它的整个微服务框架栈开源贡献给了社区。后来,Spring Cloud对Netflix开源组件进一步封装,方便Spring开发人员构建微服务基础框架。Spring Cloud Netflix的功能十分强大,包括Eureka,Ribbon,hystrix,Feign,Zuul等组件,结合到一起,让服务的调用、路由也变得异常容易。Spring Cloud Netflix作为Spring的重量级整合框架,使用它也意味着我们能从Spring获取到巨大的便利。Spring Cloud的其他子项目,比如Spring Cloud Stream、Spring Cloud Config等等,都为微服务的各种需求提供了一站式的解决方案。 (2)Spring Cloud Netflix主要组件介绍其核心组件是用于服务注册与发现的Eureka:Eureka由多个instance(服务实例)组成,这些服务实例可以分为两种:Eureka Server和Eureka Client。为了便于理解,我们将Eureka client再分为Service Provider和Service Consumer。如下图所示:1)Eureka Server:服务的注册中心,负责维护注册的服务列表。2)Service Provider:服务提供方,作为一个Eureka Client,向Eureka Server做服务注册、续约和下线等操作,注册的主要数据包括服务名、机器ip、端口号、域名等等。3)Service Consumer:服务消费方,作为一个Eureka Client,向Eureka Server获取Service Provider的注册信息,并通过远程调用与Service Provider进行通信。Service Provider和Service Consumer不是严格的概念,Service Consumer也可以随时向Eureka Server注册,来让自己变成一个Service Provider。Spring Cloud针对服务注册与发现,进行了一层抽象,并提供了三种实现:Eureka、Consul、Zookeeper。目前支持得最好的就是Eureka,其次是Consul,最后是Zookeeper。 (3)服务注册:Service Provider本质上是一个Eureka Client。它启动时,会调用服务注册方法,向Eureka Server注册自己的信息。Eureka Server会维护一个已注册服务的列表,这个列表为一个嵌套的hash map:第一层,application name和对应的服务实例。 第二层,服务实例及其对应的注册信息,包括IP,端口号等。当实例状态发生变化时(如自身检测认为Down的时候),也会向Eureka Server更新自己的服务状态。续约的方式与服务注册基本一致,会周期性地向Eureka Server发送心跳以续约自己的信息,避免自己的注册信息被剔除。 (4)Service Consumer本质上也是一个Eureka Client(它也会向Eureka Server注册,只是这个注册信息无关紧要罢了)。它启动后,会从Eureka Server上获取所有实例的注册信息,包括IP地址、端口等,并缓存到本地。这些信息默认每30秒更新一次。基于Service Consumer获取到的服务实例信息,我们就可以进行服务调用了。而Spring Cloud也为Service Consumer提供了丰富的服务调用工具:1)Ribbon,实现客户端的负载均衡。2)Hystrix,断路器。3)Feign,RESTful Web Service客户端,整合了Ribbon和Hystrix。 (5)服务调用端熔断——HystrixNetflix创建了一个名为Hystrix的库,实现了断路器的模式。“断路器”本身是一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个符合预期的、可处理的备选响应(FallBack),而不是长时间的等待或者抛出调用方无法处理的异常,这样就保证了服务调用方的线程不会被长时间、不必要地占用,从而避免了故障在分布式系统中的蔓延,甚至雪崩。(6)服务调用端代码抽象和封装——FeignFeign是一个声明式的Web Service客户端,它的目的就是让Web Service调用更加简单。它整合了Ribbon和Hystrix,从而让我们不再需要显式地使用这两个组件。Feign还提供了HTTP请求的模板,通过编写简单的接口和插入注解,我们就可以定义好HTTP请求的参数、格式、地址等信息。接下来,Feign会完全代理HTTP的请求,我们只需要像调用方法一样调用它就可以完成服务请求。3.常见问题(1)Spring Cloud Netflix的优势?对于微服务的治理而言,核心就是服务的注册和发现。因此选择哪个组件,很大程度上要看它对于服务注册与发现的解决方案。在这个领域,开源架构很多,最常见的是Zookeeper,但这并不是唯一选择。在分布式系统领域有个著名的CAP定理:C—数据一致性,A—服务可用性,P—服务对网络分区故障的容错性。这三个特性在任何分布式系统中不能同时满足,最多同时满足两个。Zookeeper保证的是CP,即它不能保证每次服务请求的可用性。对于大多数涉及到数据存储的分布式环境,数据一致性应该是首先被保证的。但是对于服务发现而言,可用性比数据一致性更加重要,即AP胜过CP。而Spring Cloud Netflix在设计Eureka时遵守的就是AP原则。 (2)实际开发Eureka的过程中,有时会遇见Service Consumer获取到Server Provider的信息有延迟?Eureka官网提到服务端的更改可能需要2分钟才能传播到所有客户端。这是因为Eureka有三处缓存和一处延迟造成的。1)Eureka Server对注册列表进行缓存,默认时间为30s。2)Eureka Client对获取到的注册信息进行缓存,默认时间为30s。3)Ribbon会从上面提到的Eureka Client获取服务列表,将负载均衡后的结果缓存30s。4)如果不是在Spring Cloud环境下使用这些组件(Eureka, Ribbon),服务启动后并不会马上向Eureka注册,而是需要等到第一次发送心跳请求时才会注册。心跳请求的发送间隔默认是30s。Spring Cloud对此做了修改,服务启动后会马上注册。 (3)Feign具有如下特性:可插拔的注解支持,包括Feign注解和JAX-RS注解支持可插拔的HTTP编码器和解码器支持Hystrix和它的Fallback支持Ribbon的负载均衡支持HTTP请求和响应的压缩 (4)服务器端负载均衡和客户端负载均衡的区别?1)服务器端负载均衡:例如Nginx,通过Nginx进行负载均衡,先发送请求,然后通过负载均衡算法,在多个服务器之间选择一个进行访问;即在服务器端再进行负载均衡算法分配。2)客户端负载均衡:例如spring cloud中的ribbon,客户端会有一个服务器地址列表,在发送请求前通过负载均衡算法选择一个服务器,然后进行访问,这是客户端负载均衡;即在客户端就进行负载均衡算法分配。  PPT链接 视频链接更多内容,可以加入IT交流群565734203与大家一起讨论交流这里是技能树·IT修真院:https://www.jnshu.com,初学者转行到互联网的聚集地
什么是SPRING BOOT?
这里是修真院后端小课堂,每篇分享文从【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】八个方面深度解析后端知识/技能,本篇分享的是:【什么是SPRING BOOT?】大家好,我是IT修真院郑州分院第十期学员,一枚正直纯洁善良的JAVA程序员。 今天给大家分享一下,修真院官网JAVA任务十,扩展思考中的知识点——什么是SPRING BOOT?? 一、背景介绍     Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。    spring大家都知道,boot是启动的意思。所以,spring boot其实就是一个启动spring项目的一个工具而已。从最根本上来讲,Spring Boot就是一些库的集合,它能够被任意项目的构建系统所使用。 二、知识剖析     简单的说,spring boot就是整合了很多优秀的框架,不用我们自己手动的去写一堆xml配置然后进行配置。     从本质上来说,Spring Boot就是Spring,它做了那些没有它你也会去做的Spring Bean配置。它使用“习惯优于配置”(项目中存在大量的配置,此外还内置了一个习惯性的配置,让你无需手动进行配置)的理念让你的项目快速运行起来。使 用Spring Boot很容易创建一个独立运行(运行jar,内嵌Servlet容器)、准生产级别的基于Spring框架的项目,使用Spring Boot你可以不用或者只需要很少的Spring配置。 三、常见问题     1.如何创建springboot项目     2.如何使用springboot与ssm结合 四、编码实战       详见视频。 五、扩展思考      1.如何使用springboot发布项目(打jar包)?       在pom.xml中添加如下插件:<build>       <plugins>           <plugin>               <groupId>org.springframework.boot</groupId>               <artifactId>spring-boot-maven-plugin</artifactId>               <!--版本-->               <version>1.4.2.RELEASE</version>               <!-- <executions>                      <execution>                          <goals>                              <goal>repackage</goal>                          </goals>                      </execution>                  </executions>   -->               <configuration>                   <mainClass>com.how2java.Application</mainClass>                   <layout>JAR</layout>               </configuration>           </plugin>       </plugins>       <resources>           <resource>               <directory>src/main/resources</directory>               <includes>                   <include>**/*.xml</include>                   <include>**/*.properties</include>               </includes>           </resource>           <resource>               <directory>src/main/java/com/how2java/mapper</directory>               <includes>                   <include>**/*.xml</include>                   <include>**/*.properties</include>               </includes>               <targetPath>com/how2java/mapper</targetPath>           </resource>           <resource>               <directory>src/main/webapp</directory>               <!--注意此次必须要放在此目录下才能被访问到 -->               <targetPath>META-INF/resources</targetPath>               <includes>                   <include>**/**</include>               </includes>           </resource>       </resources>   </build>      2.SPRINGBOOT运行原理:     入口注解@SpringBootApplication注解是一个组合注解,它包含@configuration、@EnableAutoConfiguration和@componentScan三个注解组成。它的核心是@EnableAutoConfiguration注解。这个注解中有一个@Import注解,它导入配置功能EnableAutoConfigurationImportSelector,这个类有个方法扫描具有/META-INF/spring.factories文件的jar。spring.factories中声明了哪些自动配置。然后我们在application.properties文件中进行相应的配置,比如数据库连接,使springboot中的自动配置中的参数是我们需要的配置。  六、参考文献https://blog.csdn.net/qq_31655965/article/details/71258191https://www.cnblogs.com/xuwujing/p/8260935.html 七、更多讨论     1.在如何在外部tomcat中运行?pom文件中 jar 改成 war,内置tomcat要改成provide:     <dependency>            <groupId>org.apache.tomcat.embed</groupId>            <artifactId>tomcat-embed-jasper</artifactId>            <scope>provided</scope>     </dependency>     启动类改成如下:     @SpringBootApplication     @Configuration     @EnableConfigurationProperties     public class BaseApplication extends SpringBootServletInitializer {       @Override       protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {            return application.sources(BaseApplication.class);       }     public static void main(String[] args) {         SpringApplication.run(BaseApplication.class, args);     }   }     2.springboot常用的starter有哪些?        spring-boot-starter-web 嵌入tomcat和web开发需要servlet与jsp支持        spring-boot-starter-data-jpa 数据库支持        spring-boot-starter-data-redis redis数据库支持        spring-boot-starter-data-solr solr支持        mybatis-spring-boot-starter 第三方的mybatis集成starter     3.sspringboot读取配置文件的方式:     pringboot默认读取配置文件为application.properties或者是application.yml PPT链接 视频链接更多内容,可以加入IT交流群565734203与大家一起讨论交流这里是技能树·IT修真院:https://www.jnshu.com,初学者转行到互联网的聚集地
springIOC注解
这里是修真院后端小课堂,每篇分享文从【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】八个方面深度解析后端知识/技能,本篇分享的是:【springIOC注解】【修真院java小课堂】springIOC注解开场语:大家好,我是IT修真院西安分院第4期的学员鲁伯良,一枚正直纯洁善良的java程序员,今天给大家分享一下,修真院官网java任务一,深度思考中的知识点——springIOC注解(1)背景介绍:注解(Annotation),也叫元数据.一种代码级别的说明.它是jdk1.5及以后版本引入的一个特性与类,接口,枚举是在同一个层次.它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对元素说明注释。注解是以“@注解名”在代码中存在的。(2)知识剖析:元注解四大元注解@Retention、@Inherited、@Documented、@Target@Retention1.@Retention: 定义注解的保留策略@Retention(RetentionPolicy.SOURCE)   //注解仅存在于源码中,在class字节码文件中不包含@Retention(RetentionPolicy.CLASS)     // 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得,@Retention(RetentionPolicy.RUNTIME)  // 注解会在class字节码文件中存在,在运行时可以通过反射获取到2.@Target用来声明注解范围(枚举ElementType),ElementType可选值:源码为:@Documented  @Retention(RetentionPolicy.RUNTIME)  @Target(ElementType.ANNOTATION_TYPE)  public @interface Target {      ElementType[] value();  }  @Target(ElementType.TYPE)   //接口、类、枚举、注解@Target(ElementType.FIELD) //字段、枚举的常量@Target(ElementType.METHOD) //方法@Target(ElementType.PARAMETER) //方法参数@Target(ElementType.CONSTRUCTOR)  //构造函数@Target(ElementType.LOCAL_VARIABLE)//局部变量@Target(ElementType.ANNOTATION_TYPE)//注解@Target(ElementType.PACKAGE) ///包   3.@Inherited声明子类可以继承此注解,如果一个类A使用此注解,则类A的子类也继承此注解4.@声明注解能够被javadoc等识别自定义注解定义自定义注解使用@interface 关键字public @interface 注解名 {定义体}一旦在自定义注解里面定义了成员变量之后,在使用该注解是就应该为该注解的成员变量指定值如果只有一个参数成员,最好把参数名称设为"value",后加小括号。也可以在自定义注解的成员变量的时候为其制定初始值,.(默认值),(3)常见问题:注解的使用场景(4)解决方案:类属性自动赋值。验证对象属性完整性。代替配置文件功能,像spring基于注解的配置。可以生成文档,像java代码注释中的@see,@param等(5)编码实战: (6)拓展思考:spring注解传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop、事物,这么做有两个缺点:1、如果所有的内容都配置在.xml文件中,那么.xml文件将会十分庞大;如果按需求分开.xml文件,那么.xml文件又会非常多2、在开发中在.java文件和.xml文件之间不断切换,是一件麻烦的事,同时这种思维上的不连贯也会降低开发的效率为了解决这两个问题,Spring引入了注解,通过”@XXX”的方式,让注解与Java Bean紧密结合,既大大减少了配置文件的体积,又增加了Java Bean的可读性与内聚性。如何使用再上下文文件中加入如下代码扫描<context:component-scan base-package="包" />多个包逗号隔开。常用注解1、@Component通用一般不推荐使用2、@Controller@Controller对应表现层的Bean3、@ Service@Service对应的是业务层Bean4、@ Repository@Repository对应数据访问层Bean@Controller, @Service, @Component, @Repository刨析其中@Component是一种通用名称,泛指任意可以通过Spring来管理的组件,@Controller, @Service, @Repository则是一种特定的组件,通常用来表示某种特定场合下的组件,比如@Repository用来表示仓库(数据层,DAO),并且Spring 框架会根据这种应用场景做些定制,比如@Repository同时具备了自动化的异常转换。类似的, @Service则用来表示服务层相关的类, @Controller则用来表示展示层(presentation)的类。 (7)参考文献:  互联网(8)更多讨论:Q1::spring注解为什么要分层A1::所有这些分层方式都是为了解决应用从小项目成长为大项目时可能遇到的隐患,代价是在项目还小时,增加了项目的复杂度,往往一句代码就能搞定的事情,却要拆到三个类中去。但是太多的实际例子表Q2:@Compoent注解是可以通用的是吗?A2:是的,不过为了层次分明我们不推荐这样使用?Q3:什么情况下会用到自定义注解?A3:自定义注解可以代替掉实体类的get set方法,验证对象的属性完整性.(9)鸣谢: (10)结束语:今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~  PPT链接 视频链接更多内容,可以加入IT交流群565734203与大家一起讨论交流这里是技能树·IT修真院:https://www.jnshu.com,初学者转行到互联网的聚集地
Spring RMI
这里是修真院后端小课堂,每篇分享文从【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】八个方面深度解析后端知识/技能,本篇分享的是:【Spring RMI 】大家好,我是IT修真院甚至分院第12期的学员,一枚正直纯洁善良的JAVA程序员。今天给大家分享一下,修真院官网JAVA任务8的知识点——Spring RMISpring RMIRMI全称是Remote Method Invocation-远程方法调用,是纯Java的网络分布式应用系统的核心解决方案之一。Java RMI 支持存储于不同地址空间的程序级对象之间彼此进行通信,实现远程对象之间的无缝远程调用。RMI目前使用Java远程消息交换协议JRMP进行通信。由于JRMP是专为Java对象制定的,用Java RMI开发的应用系统可以部署在任何支持JRE的平台上。但由于JRMP是专为Java对象制定的,因此,RMI对于用非Java语言开发的应用系统的支持不足。不能与用非Java语言书写的对象进行通信。 知识剖析 一个正常工作的RMI系统由下面几个部分组成:1·远程服务的接口定义2·远程服务接口的具体实现3·桩(Stub)和框架(Skeleton)文件4·一个运行远程服务的服务器5·一个RMI命名服务,它允许客户端去发现这个远程服务6·类文件的提供者(一个HTTP或者FTP服务器)7·一个需要这个远程服务的客户端程序RMI的主要优点:1. RMI是Java编写的, 具有 “编写一次,到处运行 ” 的特性。任何基于RMI的系统均可100%地移植到 任何Java虚拟机上2. 面向对象:RMI可将完整的对象作为参数和返回值进行传递直接通过网络传输对象数据。3.可移动属性:RMI可将属性从客户机移动到服务器,或者从服务器移到客户机。4.设计方式:对象传递功能使您可以在分布式计算中充分利用面向对象技术的强大功能。5.安 全:RMI使用Java内置的安全机制保证下载执行程序时用户系统的安全。分布式和集群分布式:一个业务分拆多个子业务,部署在不同的服务器上。集群:同一个业务,部署在多个服务器上常见问题1. 如何使用Spring RMI发布服务2. 打包问题 解决方案1. 服务端使用Spring 配置来注入RmiServiceExporter对象来发布服务 2. 使用 maven-shade-plugin 将其打包为jar文件. 编码实战 扩展思考  参考文献RMI 说明: http://www.cnblogs.com/xt0810/p/3640167.htmlRMI 优点: https://blog.csdn.net/tornado886/article/details/4540805更多讨论rmi的使用有什么坑吗:上传服务器的时候一定要设置系统对外的ip是服务器外网的IP,不然会出现链接不上的问题。rmi有什么作用:上面已经讲的很清楚了,符合现代编程的理念,RMI 支持存储于不同地址空间的程序级对象之间彼此进行通信,实现远程对象之间的无缝远程调用。spring rmi是唯一一个封装的框架吗:实际上不止spring一个封装了rmi的框架,用的比较多的可能还是阿里的dubbo。  PPT链接 视频链接 更多内容,可以加入IT交流群565734203与大家一起讨论交流这里是技能树·IT修真院:https://www.jnshu.com,初学者转行到互联网的聚集地
Spring中的IOC是什么意思
这里是修真院后端小课堂,每篇分享文从【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】八个方面深度解析后端知识/技能,本篇分享的是:【Spring中的IOC是什么意思 】【修真院java小课堂】Spring中的IOC是什么意思 大家好,我是IT修真院武汉分院第17期的学员汪天驰,一枚正直纯洁善良的java程序员,今天给大家分享一下,修真院官网java任务1,深度思考中的知识点——Spring中的IOC是什么意思 (1)背景介绍: Spring是一个开源的轻量级Java SE(Java 标准版本)/Java EE(Java 企业版本)开发应用框架,其目的是用于简化企业级应用程序开发。应用程序是由一组相互协作的对象组成。Spring框架除了帮我们管理对象及其依赖关系,还提供像通用日志记录、性能统计、安全控制、异常处理等面向切面的能力,还能帮我管理最头疼的数据库事务,本身提供了一套简单的JDBC访问实现,提供与第三方数据访问框架集成(如Hibernate、JPA),与各种Java EE技术整合(如Java Mail、任务调度等等),提供一套自己的web层框架Spring MVC、而且还能非常简单的与第三方web框架集成。从这里我们可以认为Spring是一个超级粘合平台,除了自己提供功能外,还提供粘合其他技术和框架的能力,从而使我们可以更自由的选择到底使用什么技术进行开发。Spring IOC SpringIOC-Iversion of Control即“控制反转”,不是什么技术,而是一种设计思想。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。如何理解好Ioc呢?理解好Ioc的关键是要明确“谁控制谁,控制什么,为何是反转(有反转就应该有正转了),哪些方面反转了”,那我们来深入分析一下:谁控制谁,控制什么:传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对 象的创建;谁控制谁?当然是IoC 容器控制了对象;控制什么?那就是主要控制了外部资源获取(不只是对象包括比如文件等)。为何是反转,哪些方面反转了:有反转就有正转,传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙创建及注入依赖对象;为何是反转?因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转;哪些方面反转了?依赖对象的获取被反转了。(2)知识剖析: IOC的作用: 1IoC 是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合、更优良的程序。传统应用程序都是由我们在类内部主动创建依赖对象,从而导致类与类之间高耦合,难于测试;有了IoC容器后,把创建和查找依赖对象的控制权交给了容器,由容器进行注入组合对象,所以对象与对象之间是 松散耦合,这样也方便测试,利于功能复用,更重要的是使得程序的整个体系结构变得非常灵活。 IOC容器也是具有依赖注入功能的容器,IOC容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。 应用程序无需直接在代码中new相关的对象,应用程序由IOC容器进行组装。在Spring中BeanFactory是IOC容器的实际代表者。Spring IOC容器如何知道哪些是它管理的对象呢?这就需要配置文件,Spring IOC容器通过读取配置文件中的配置元数据,通过元数据对应用中的各个对象进行实例化及装配。一般使用基于xml配置文件进行配置元数据,而且Spring与配置文件完全解耦的,可以使用其他任何可能的方式进行配置元数据,比如注解、基于java文件的、基于属性文件的配置都可以。DI:依赖注入  依赖注入(DI)是一种实现IOC的技术手段。理解DI的关键:谁依赖谁,为什么需要依赖,谁注入谁,注入了什么?①.谁依赖谁?应用程序依赖于IoC容器。让spring创建sqlsession bean。也就是通过SqlSessionFactory创建SqlSession②.为什么需要依赖?应用程序需要IoC容器来提供对象需要的外部资源(包括对象,文件等)。③.谁注入谁?IoC容器注入应用程序某个对象,应用程序依赖的对象。④.注入了什么?注入某个对象所需要的外部资源(包括对象、资源、变量数据)  (3)常见问题:1 spring中的BeanFactory与ApplicationContext的作用和区别? BeanFactory负责读取bean配置文档,管理bean的加载,实例化,维护bean之间的依赖关系,负责bean的声明周期。2. ApplicationContext除了提供上述BeanFactory所能提供的功能之外,还提供了更完整的框架功能:比如资源访问,事件传递,通过ApplicationContext扩展了ResourceLoader(资源加载器)接口。  3. ApplicationContext的初始化和BeanFactory有一个重大的区别:BeanFactory在初始化容器时,并未实例化Bean,直到第一次访问某个Bean时才实例目标Bean;而ApplicationContext则在初始化应用上下文时就实例化所有的单实例的Bean。 因此ApplicationContext的初始化时间会比BeanFactory稍长一些. .Spring容器能够自动装配相互合作的bean, 这意味着容器不需要construor-arg和property配置,能通过Bean工厂自动处理bean之间的协作 2 什么是自动装配 .Spring容器能够自动装配相互合作的bean,这意味着容器不需要construor-arg和property配置,能通过Bean工厂自动处理bean之间的协作(4)编码实战:(5)拓展思考:IOC的优点 IOC 或 依赖注入把应用的代码量降到最低。它使应用容易测试,单元测试不再需要单例和JNDI查找机制。最小的代价和最小的侵入性使松散耦合得以实现。IOC容器支持加载服务时的饿汉式初始化和懒加载。 (6)参考文献: http://www.cnblogs.com/chenssy/p/9576769.html(7)更多讨论:Q1:IOC有哪些缺点?A1:1,创建对象的步骤变复杂了2,通过反射来创建对象会造成效率上的损耗3,缺少IDE重构支持,如果修改了类名还需要到XML文件中手动修改Q2:By Type和 By Name的区别?A2:byName 通过参数名 自动装配,如果一个bean的name 和另外一个bean的 property 相同,就自动装配。     byType 通过参数的数据类型自动自动装配,如果一个bean的数据类型和另外一个bean的property属性的数据类型兼容,  就自动装配。Q3:getBean(“someBean”)时做了什么? A3:如果bean是单例,而且对象没有实例化,则按照上面写的流程利用反射new一个出来,然后放到Map里面。如果已经实例化,则直接从Map里面取出来直接返回。 如果是多例,每次都new一个返回。今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~  PPT链接 视频链接更多内容,可以加入IT交流群565734203与大家一起讨论交流这里是技能树·IT修真院:https://www.jnshu.com,初学者转行到互联网的聚集地
Spring中的IOC是什么意思,为什么要用IOC而不是New来创建实例?
这里是修真院后端小课堂,每篇分享文从【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】八个方面深度解析后端知识/技能,本篇分享的是:【Spring中的IOC是什么意思,为什么要用IOC而不是New来创建实例? 】Spring中的IOC是什么意思,为什么要用IOC而不是New来创建实例? 一.背景介绍Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。Spring的核心是控制反转(IoC)和面向切面(AOP)。 二.知识剖析什么是反转控制(IOC)? 是一种是面向对象编程中的一种设计原则,用来减低计算机代码之间的耦合度。其基本思想是:借助于“ 第三方”实现具有依赖关系的对象之间的解耦。 通过控制反转客户端不需要再主动创建对象,只需要通过IOC,由IOC去创建就可以了 由应用程序创建对象转变为由IOC容器来创建,用于控制创建对象的主体发生了改变,这是控制反转 应用程序需要的对象信息由IOC容器创建后注入,也就是说依赖于容器来注入,这是依赖注入 表达的是一个东西,只是描述的角度不同。 IOC,从容器的角度出发,容器反向控制应用程序对象的创建。 DI,从应用程序的角度出发,应用程序需要依赖容器注入对象。    三.常见问题理解好IoC的关键是:谁控制谁,控制什么了,为何是反转,在哪些方面反转了。 谁控制谁,控制什么了 传统JavaSE程序设计,我们在对象内部直接通过new进行创建对象,是程序主动去创建依赖对象,而IoC有一个专门的容器来创建这些对象,即由IoC容器来创建这些对象的创建。谁控制谁?当然是由IoC容器控制了对象;控制了什么?那就主要是控制了外部资源获取(包括对象、文件等)。 为何是反转,在哪些方面反转了 有反转就有正转。传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转。而反转则是由容器来帮忙创建及注入依赖对象。为何是反转?因为容器帮我们查找和注入依赖对象,对象只是被动的接受依赖对象,所以是反转。哪些方面反转了?依赖对象的获取反转了。 理解DI的关键:谁依赖谁,为什么需要依赖,谁注入谁,注入了什么 1.谁依赖谁?当然是应用程序依赖于IoC容器。 2.为什么需要依赖?应用程序需要IoC容器来提供对象需要的外部资源(包括对象,文件等)。 3.谁注入谁?很明显是IoC容器注入应用程序某个对象,应用程序依赖的对象。 4.注入了什么?就是注入某个对象所需要的外部资源(包括对象、资源、变量数据)  四.扩展和思考spring中Bean的五个作用域 当通过spring容器创建一个Bean实例时,不仅可以完成Bean实例的实例化,还可以为Bean指定特定的作用域。Spring支持如下5种作用域: singleton:单例模式,在整个Spring IoC容器中,使用singleton定义的Bean将只有一个实例 prototype:原型模式,每次通过容器的getBean方法获取prototype定义的Bean时,都将产生一个新的Bean实例 request:对于每次HTTP请求,使用request定义的Bean都将产生一个新实例,即每次HTTP请求将会产生不同的Bean实例。只有在Web应用中使用Spring时,该作用域才有效 session:对于每次HTTP Session,使用session定义的Bean都将产生一个新实例。同样只有在Web应用中使用Spring时,该作用域才有效 globalsession:每个全局的HTTP Session,使用session定义的Bean都将产生一个新实例。典型情况下,仅在使用portlet context的时候有效。同样只有在Web应用中使用Spring时,该作用域才有效 其中比较常用的是singleton和prototype两种作用域。对于singleton作用域的Bean,每次请求该Bean都将获得相同的实例。容器负责跟踪Bean实例的状态,负责维护Bean实例的生命周期行为;如果一个Bean被设置成prototype作用域,程序每次请求该id的Bean,Spring都会新建一个Bean实例,然后返回给程序。在这种情况下,Spring容器仅仅使用new 关键字创建Bean实例,一旦创建成功,容器不在跟踪实例,也不会维护Bean实例的状态。 如果不指定Bean的作用域,Spring默认使用singleton作用域。Java在创建Java实例时,需要进行内存申请;销毁实例时,需要完成垃圾回收,这些工作都会导致系统开销的增加。因此,prototype作用域Bean的创建、销毁代价比较大。而singleton作用域的Bean实例一旦创建成功,可以重复使用。因此,除非必要,否则尽量避免将Bean被设置成prototype作用域。globalsession:每个全局的HTTP Session,使用session定义的Bean都将产生一个新实例。典型情况下,仅在使用portlet context的时候有效。同样只有在Web应用中使用Spring时,该作用域才有效 五.参考文献https://www.cnblogs.com/goody9807/p/7472127.htmlhttps://blog.csdn.net/weixin_41776493/article/details/80035932 六.更多讨论  PPT链接 视频链接更多内容,可以加入IT交流群565734203与大家一起讨论交流这里是技能树·IT修真院:https://www.jnshu.com,初学者转行到互联网的聚集地
spring的IOC
这里是修真院后端小课堂,每篇分享文从【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】八个方面深度解析后端知识/技能,本篇分享的是:【spring的IOC 】1;知识剖析Spring是一个基于IOC和AOP结构的开源轻量级开发应用框架,大神是为了解决企业级应用开发复杂性创建的,因此spring也说是J2EE系统的框架;然后就是重要的两点。IOC 反转控制是Spring的基础,Inversion Of Control简单说就是创建对象由以前的程序员自己new 构造方法来调用,变成了交由Spring创建对象;DI 依赖注入 Dependency Inject. 简单地说就是拿到的对象的属性,已经被注入好相关值了,直接使用即可。java程序中的每个业务逻辑至少需要两个或以上的对象来协作完成,通常每个对象在使用他的合作对象时,使用像new object () 这样的语法来完成合作对象的申请工作。而IOC的思想是: Spring容器来实现这些相互依赖对象的创建、协调工作,对象只需要关系业务逻辑本身就可以了。从这方面来说,对象如何得到他的协作对象的责任被反转了。反转概念; 对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系; 所有的类的创建、销毁都由spring来控制,也就是说控制对象生存周期的不再是引用它的对象,而是spring。对于某个具体的对象而言,以前是它控制其他对象,现在是所有对象都被spring控制,所以这叫控制反转。DI (Dependency Injection),依赖注入概念; 比如对象A需要操作数据库,以前要在A帕自己编写代码来获得一个Connection对象,有了spring我们就只需要告诉spring,A中需要一个Connection,在系统运行时,spring会在适当的时候制造一个Connection,注射到A中,这样就完成了对各个对象之间关系的控制。A需要依赖Connection才能正常运行,Connection是由spring注入到A中的,依赖注入的名字就这么来的。2;代码实战部分首先是获取对象的同时获取被注入的id和name属性 3;Autowired自动装配4;用component装配bean5,测试类6;参考文献1,https://ptteng.github.io/PPT/PPT-java/java_task1_14_SpringIOC.html#/52,https://ptteng.github.io/PPT/PPT-java/java-IOC-task1.html#/93,http://www.yiibai.com/spring/4,https://baike.baidu.com/item/spring/85061?fr=aladdin7;更多讨论   什么是AOP 今天的分享就到这里啦,刚学没多久,水平不够,欢迎大家指正,拍砖~PPT戳这里视频戳这里  我的邀请码:15686104,或者你可以直接点击此链接http://www.jnshu.com/login/1/15686104  作者:hahahehe123链接:https://www.jianshu.com/p/58b66ae501e3來源:简书简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。更多内容,可以加入IT交流群565734203与大家一起讨论交流这里是技能树·IT修真院:https://www.jnshu.com,初学者转行到互联网的聚集地
SPRING AOP的基本使用及拓展
这里是修真院后端小课堂,每篇分享文从【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】八个方面深度解析后端知识/技能,本篇分享的是:【SPRING AOP的基本使用及拓展 】1.背景介绍Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者自己选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。2.知识剖析而Spring核心功能主要是2个方面①Spring IOCIoC(Inversion of Control)控制反转,对象创建责任的反转,在spring中BeanFacotory是IoC容器的核心接口,负责实例化,定位,配置应用程序中的对象及建立这些对象间的依赖。XmlBeanFacotory实现BeanFactory接口,通过获取xml配置文件数据,组成应用对象及对象间的依赖关系。②Spring AOPAOP是Aspect Oriented Programming的缩写,意思是面向切面编程,提供从另一个角度来考虑程序结构以完善面向对象编程(相对于OOP),即可以通过在编译期间、装载期间或运行期间实现在不修改源代码的情况下给程序动态添加功能的一种技术。通俗点说就是把可重用的功能提取出来,然后将这些通用功能在合适的时候织入到应用程序中;比如安全,日记记录,这些都是通用的功能,我们可以把它们提取出来,然后在程序执行的合适地方织入这些代码并执行它们,从而完成需要的功能并复用了这些功能。3.常见问题4.解决方案5.编码实战 SpringAOP介绍_腾讯视频 顺便这里把各注释的解释贴一下!@Aspect指定一个类为切面类@Pointcut("execution(* test.*.*(..))")指定切入点表达式@Before("@Pointcut定义下的方法名()")前置通知:目标方法之前执行@After("@Pointcut定义下的方法名()")                     后置通知:目标方法之后执行(始终执行)@AfterReturning("@Pointcut定义下的方法名()")返回后通知:执行方法结束前执行(异常不执行)@AfterThrowing("@Pointcut定义下的方法名()")异常通知:出现异常时候执行@Around("@Pointcut定义下的方法名()")环绕通知:环绕目标方法执行6.扩展思考代理模式代理(Proxy)是一种设计模式, 提供了对目标对象另外的访问方式;即通过代理访问目标对象。 这样好处: 可以在目标对象实现的基础上,增强额外的功能操作。(扩展目标对象的功能)。 动态代理/JDK代理代理对象的生成,是利用JDKAPI,动态的在内存中构建代理对象,需要我们指定创建 代理对象/目标对象 实现的接口的类型CGLIB代理Cglib代理,也叫做子类代理。在内存中构建一个子类对象从而实现对目标对象功能的扩展。 在Spring的AOP编程中,如果加入容器的目标对象有实现接口,用JDK代理;如果目标对象没有实现接口,用Cglib代理.问题思考:动态代理注意点:代理对象不需要实现接口,但是目标对象一定要实现接口;否则不能用动态代理!CGLIB代理注意点:代理的类不能为final, 否则报错。目标对象的方法如果为final/static, 那么就不会被拦截,即不会执行目标对象额外的业务方法。如何使用AOP代理静态方法?7.参考文献http://www.cnblogs.com/zhaozihan/p/5953063.html8.更多讨论视频链接:v.qq.com/x/page/j05665mtvo9.htmlPPT链接:ptteng.github.io/PPT/PPT-java/Java_task2_SPRINGAOP.html#/ 今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~技能树.IT修真院“我们相信人人都可以成为一个工程师,现在开始,找个师兄,带你入门,掌控自己学习的节奏,学习的路上不再迷茫”。 这里是技能树.IT修真院,成千上万的师兄在这里找到了自己的学习路线,学习透明化,成长可见化,师兄1对1免费指导。快来与我一起学习吧~我的邀请码:13299900,或者你可以直接点击此链接:http://www.jnshu.com/login/1/13299900作者:Sevn_dbb9链接:https://www.jianshu.com/p/47dab0a50165來源:简书简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。更多内容,可以加入IT交流群565734203与大家一起讨论交流这里是技能树·IT修真院:https://www.jnshu.com,初学者转行到互联网的聚集地
SpringAOP介绍
这里是修真院后端小课堂,每篇分享文从【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】八个方面深度解析后端知识/技能,本篇分享的是:【SpringAOP介绍 】1.背景介绍、我们在任务中会接触到Spring,而Spring最关键的两处就是IOC和AOP;今天我们不看IOC,只讲AOP。2.知识剖析什么是AOP?面向切面编程(Aspect Oriented Programing,AOP)采用横向抽取机制,是面向对象编程(Object Oriented Programing,OOP)的补充和完善。OOP引入封装、继承、多态等概念来建立一种对象层次结构,OOP允许开发者定义纵向的关系,但并不适合定义横向的关系,例如日志功能、权限管理、异常处理等,该类功能往往横向地散布在核心代码当中,这种散布在各处的无关代码被称为横切。AOP恰是一种横切技术,解剖开封装对象的内部,将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为Aspect(切面),所谓切面,简单的说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。 AOP能做什么?AOP最常用的几种使用便是:声明式事务管理、权限校验和日志记录。本次放弃权限校验,仅介绍事务管理以及日志记录。 为什么放弃权限管理?拦截器Interceptor,还有监听器,过滤器,这些都比SpringAOP好用。 至于具体如何使用SpringAOP配置事务以及管理日志,请移步~PPT:https://ptteng.github.io/PPT/PPT-java/java-SpringAOP-task3.html#/视频: SpringAOP的介绍_腾讯视频作者:yubotao链接:https://www.jianshu.com/p/0f670598e5ce來源:简书简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。更多内容,可以加入IT交流群565734203与大家一起讨论交流这里是技能树·IT修真院:https://www.jnshu.com,初学者转行到互联网的聚集地
Quartz以及SpringQuartz初探
这里是修真院后端小课堂,每篇分享文从【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】八个方面深度解析后端知识/技能,本篇分享的是:【Quartz以及SpringQuartz初探 】今天给大家分享一下,修真院官网java任务十,可能会使用的新知识点 Quartz以及Spring Quartz1.背景介绍Quartz是一个完全由java编写的开源作业调度框架,他的作用是定时调度 简单来说就是完成各种定时任务,Quartz的原理不是很复杂,只要搞明白几个概念,然后知道如何去启动和关闭一个调度程序即可。2.知识剖析我们先来看quartz的几个基本概念:Job 表示一个工作,是要执行的具体内容,此接口中只有一个方法  void execute(JobExecutionContext context)JobDetail  表示一个具体的可执行的调度程序Job是这个可执行程调度程序所要执行的内容,另外JobDetail还包含了这个任务调度的方案和策略。Trigger代表一个调度参数的配置,什么时候去调Scheduler代表一个调度容器,一个调度容器中可以注册多个JobDetail和Trigger。当Trigger与JobDetail组合,就可以被Scheduler容器调度了。3.常见问题spring  整合quartz;4.解决方案spring本身有几个类 对他进行了相关的封装5.编码实战、第一步 当然是pom文件 添加依赖 注意版本问题 spring3.1以上和Quartz1不兼容 简书粘贴很不方便 这样吧 我 github上传完整 源代码吧 这里只做参考首先我们看一下 Quartz的代码 先声明一个类 继承job 里面写一个简单的方法 打印当前时间  然后这里写个testpublic class Test {public static void main(String[] args) {//1、创建JobDetial对象JobDetail jobDetail = new JobDetail();//设置工作项jobDetail.setJobClass(MyJob.class);jobDetail.setName("MyJob_1");jobDetail.setGroup("JobGroup_1");//2、创建Trigger对象SimpleTrigger strigger = new SimpleTrigger();strigger.setName("Trigger_1");strigger.setGroup("Trigger_Group_1");strigger.setStartTime(new Date());//设置重复停止时间,并销毁该Trigger对象java.util.Calendar c = java.util.Calendar.getInstance();c.setTimeInMillis(System.currentTimeMillis() + 7000 * 1L);strigger.setEndTime(c.getTime());strigger.setFireInstanceId("Trigger_1_id_001");//设置重复间隔时间3strigger.setRepeatInterval(1000 * 1L);//设置重复执行次数strigger.setRepeatCount(3);//3、创建Scheduler对象,并配置JobDetail和Trigger对象SchedulerFactory sf = new StdSchedulerFactory();Scheduler scheduler = null;try {scheduler = sf.getScheduler();scheduler.scheduleJob(jobDetail, strigger);//4、并执行启动、关闭等操作scheduler.start();Thread.sleep(5000);scheduler.shutdown(true);} catch (SchedulerException e) {e.printStackTrace();}catch (InterruptedException e) {e.printStackTrace();}注释的比较全面了   Quartz与Spring的整合也非常简单,Spring提供一组Bean来支持:MethodInvokingJobDetailFactoryBean、SimpleTriggerBean、SchedulerFactoryBean,看一下代码注入什么属性即可明白了。Spring会在Spring容器启动时候,启动Quartz容器。  6.扩展思考我们实际中是否使用,看了一下金信的代码,我们实际在公司框架中也使用了。7.参考文献 http://kevin19900306.iteye.com/blog/13977448.更多讨论Q1:张鑫:那个repeatCount 等于0时真的是无限循环吗?A1:白笑然:说错了 那个应该是循环次数为0Q2:刘佳义:不是用aop来定时吗A2:白笑然:aop也可以定时 不过quartz比较方便 松耦合Q3:于博韬:那个strigger.setRepeatInterval(1000*1L);神魔意思A3:白笑然:重复间隔时间 就是过了1秒在执行ppt链接:https://ptteng.github.io/PPT/PPT-java/java-task10-what%20is%20quartz.html SpringQuartz定时_腾讯视频今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~------------------------------------------------------------------------------------------------------------------------技能树.IT修真院“我们相信人人都可以成为一个工程师,现在开始,找个师兄,带你入门,掌控自己学习的节奏,学习的路上不再迷茫”。这里是技能树.IT修真院,成千上万的师兄在这里找到了自己的学习路线,学习透明化,成长可见化,师兄1对1免费指导。快来与我一起学习吧~我的邀请码:13397829 ,或者你可以直接点击此链接:http://www.jnshu.com/login/1/13397829作者:沉沉钟声链接:https://www.jianshu.com/p/17dd62ba491b來源:简书简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。更多内容,可以加入IT交流群565734203与大家一起讨论交流这里是技能树·IT修真院:https://www.jnshu.com,初学者转行到互联网的聚集地