最新资源下载

超清版模拟电子技术基础(第五版) 童诗白-PDF

主要内容包括:导言、常用半导体器件、基本放大电路、集成运算放大电路、放大电路的频率响应、放大电路中的反馈、信号的运算和处理、波形的发生和信号的变换、功率放大电路、直流电源和模拟电子电路读图等十一章。

模拟电子技术基础(第四版) 童诗白-PDF

模拟电子技术基础 第四版童诗白、华成英 编高等教育出版社第1章 常用半导体器件第2章 基本放大电路第3章 多级放大电路第4章 集成运算放大电路第5章 放大电路的频率响应第6章 放大电路中的反馈第7章 信号的运算和处理第8章 波形的发生器和信号的转换第9章 功率放大电路第10章 直流电源

最新文章

如何制定OKR,打造高绩效团队

避免OKR制定的误区 根据目标达成一致的结果,制定明确、有效的OKR可以推动团队实现伟大目标,并使组织关注最重要的优先事项。写得不好的OKR可能导致策略混乱,破坏内部指标,并导致团队专注于维持现状而非突破现状。 image.png 制定OKR时,尽量避免这些误区: 沟通不畅的OKR延伸目标 设定延伸目标需要在提供目标的团队内部以及其他与延伸目标相关的团队进行认真的沟通。如果你的项目依赖于另一个团队的目标,确保你了解他们的目标设定理念。如果他们正在使用延伸目标,你应该期望他们提供OKR的70%左右。 在这里可以分享一个笔者亲身经历的例子:我司在实施OKR的过程中,笔者所在的部门负责一个官网内容页的上线的关键结果。但是由于在OKR的制定过程中缺乏顺畅的沟通,导致研发资源没有排期(研发也忙着自己的OKR呢),最终导致这个关键结果无法推进,进而失控的结果。 image.png 一切照常的OKR OKR通常是基于团队认为它可以实现的目标而不改变他们目前正在做的任何事情,而不是团队或其客户真正想要的。为了测试这一点,大家可以采用【堆栈】的方法,根据所需的价值和努力对团队的当前工作以及新请求的项目进行排名。如果OKR包含除最高努力以外的任何其他内容,那么它们就像一切照常的OKR。放弃低优先级的工作并将资源重新分配给顶级的OKR。 有一些目标每季度将保持不变,如“确保客户满意度超过XX%”,如果目标始终处于高优先级,则这是确定的。但关键的结果应该发展,以推动团队继续创新并提高效率。 所以,目标的设置容易缺乏野心。另一方面,OKR被视作是管理的【变革】,那自然是不破不立,想让员工否认自己正在做的工作,恐怕比“为了失败而工作”更难接受。OKR的原则和实施过程并不复杂,但其中蕴含的管理思想一点都不少。倘若管理者没有变革的勇气,无论是OKR、阿米巴还是其他什么方法都拯救不了一家公司的管理问题。实施OKR,就要有壮士断腕的决心。 沙袋 image.png 能够不需要争取资源,就能满足OKR所需资源的团队,可能要么之前囤积资源,要么没有给团队足够的压力,要么两者兼而有之。 低价值目标 目标应该保证清晰的商业价值,否则没有必要投入资源来实现目标。“低价值目标”是指即使实现了,也不能给企业带来明显进步的目标。只需要一个问题“是否存在这个目标在某种情况下取得100%实现,却不提供任何组织价值的情况”,如果答案是肯定的,请把这个目标修改成有价值的目标。 目标的关键结果不足 如果某个特定目标的关键结果并不代表完全实现该目标所需的全部结果,则可能会发生OKR的意外失败。这可能会导致资源需求得不到满足以及目标不能按计划完成。 制定团队OKR 尽管制定OKR的方法会有不同,但是首先制定公司的目标是最利的,这将会帮助团队和个人以实现公司的大目标为基础,设定目标。同时,保证个人和团队目标和公司目标的对齐。下一个议题,便是在哪些层级实现OKR,是事业部、部门还是小组。 image.png 对于团队一级的目标,我们要明白组织的目标不需要在团队目标中一一体现出来。也许一个团队的目标只需要关注某一个组织目标即可。但是,每个团队目标至少要和一个组织目标有所关联。 制定团队目标的一种方法,是召集所有的团队负责人在一起开会,制定目标。在谷歌,团队负责人会在公司目标的背景下,列出下一季度的一系列优先事项。在确定优先级时,需要明确组织的目标并不断检查以下注意事项: 团队的优先事项是否和某个组织目标相关联? 团队的优先事项是否能够帮助组织目标取得有效的进展? 是否有其他很重要的事情被遗忘了? 优先事项是否超过三个? 要注意,OKR不是检查项。绝对不能把他当成部门这个季度主要工作的列举。如果一个团队把OKR当成是公开的ToDoList,将会导致目标的描述过于具体和规范,而失去了作为指明团队目标的方式。我们应当使用OKR来定义团队希望达到的情况,并让团队想出实现这种情况的方法。 结语 企业进行项目化管理过程中,清晰明确的目标,有利于团队形成高度共识,进而实现协作效应的最大化,同时也是保证一个项目高效可控推进的最重要条件。OKR执行的过程也是企业中一个个项目的执行过程,OKR为企业指明最关键的业务指标,但是如何完成或实现这些关键的业务指标还要看OKR的执行情况。CORNERSTONE提供了包括任务/需求/测试管理、迭代规划、缺陷追踪、报表统计、团队协作、WIKI、共享文件和日历等功能模块,20人以下团队可免费使用,点击即可免费注册CORNERSTONE。 image.png

打破部门壁垒,提升跨部门协作效率,让沟通更加有效

一、跨部门协作是企业管理痛点 据调查结果显示,企业中普通员工与中层管理者之间,花费在内部沟通上的时间,大约占其工作时间的40%-50%,对于更高层的主管来说这一比例则会更高。 有些工作在部门内沟通完全没问题,但是跨部门沟通就问题不断; 一项工作分配好由一个部门主导另一个部门协作,但因配合不当,迟迟无法交付; 跨部门工作经常出现多个部门重复做了同一份工作; 工作出现问题,各部门相互推卸责任,无人担责; 这些都是我们工作中经常遇到的协作问题,随着企业的发展壮大,部门越来越多,成员也逐渐增加,工作慢慢细化,跨部门之间的工作越来越难做,沟通协作效果低下,影响公司整个工作效率。 二、跨部门协作的难点 1、各部门的职责不同,不能相互理解 不同部门之间的工作内容和职责都不相同,有时候大家都只看到自己想要什么,看不到别人的难处。 比如我们的销售团队会经常和研发团队反馈一些客户对产品的意见,但研发团队有自己的任务安排,所以不能及时解决他们反应的问题,时间一久,销售团队和研发团队就会处于一种互相抱怨的状态,影响团队和谐,不利于团队协作。 2、部门的任务目标不同,每个人的视角也会不同 每个部门的工作都有自己的目标,即使是同一个任务,不同部门想要达成的效果也不一样,这就会导致关注点不同,如果对对方的工作再不了解,很容易陷入情绪的对立当中。 比如很多产品经理可能觉得这个产品前端需要加某个功能,稍微改动一下就完事了,并不复杂,但是前端增加的这个功能,可能涉及到后端的很多改动,如果产品经理和研发团队沟通不好,很容易引起争吵。 3、个人KPI > 公司总体目标 说白了,每个人工作都是为了自己的利益(个人成长或是物质奖励),任务完成的好,就能获得相应的奖赏,所以,如果没有利益可得,就会很少有人会愿意帮助别人做自己本职工作之外的事。 比如运营部门现在需要一个产品视频教程,想要设计部门帮忙设计片头片尾,但是这本不是设计部门的任务,就算他们帮忙做好了,最后也是运营部门受到表彰和奖励。 这种情况其实很正常,每个人工作精力就那么多,帮你做了事情还落不到好处,就没人愿意去做了。而出现这种情况的本质还是目标不一致,每个人都在为自己的个人目标努力,而忽视了公司的总体目标。 三、如何做好跨部门协作 一个企业无论规模大小,内部必然需要成立相互独立的部门,通过合理分工,才能实现每个部门单元有效运作,实现企业目标和组织绩效。所以,跨部门沟通可以遵循以下几点原则: 1、全员上下达成一致的目标 产品、销售、市场、人力等每个部门都有自己的任务和职责,如果目标不一致很容易造成大家各忙各的,各部门只从本部门工作和利益出发,而忽视了组织的整体目标,这样只会强化部门间的竞争而削弱了合作,容易造成跨部门的沟通障碍,不能顺畅实现组织目标。 所以跨部门协作首先需要的是目标。目标是要事先已经设定并且达成共识的,而且目标制定完毕还需要公开,向全公司公开OKR,目标透明化,让每个部门、每个人都能时刻看到公司的目标,清楚自己所做的工作是否偏离了公司目标。 ![image.png](https://img-blog.csdnimg.cn/20191122171312670.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxMTM3NDkz,size_16,color_FFFFFF,t_70) (图为[CORNERSTONE](https://www.cornerstone365.cn)的目标关系图) 2 、任务责任到人,明确跨部门人员岗位职责,衔接工作流程 企业内部是由职责分明的部门组成的,企业目标的完成不止需要部门内部积极开展工作,同时也需要超越部门界限的协作共同完成企业工作。 每个部门岗位员工都有自己明确的岗位职责,面对跨部门间员工各个职责存在的模糊地带需要明确,做到权责分明和合理分工;需要共同协作完成的,也需要明确共同的协作内容,并且明确跨部门协作岗位和人员,梳理出一条完整的跨部门协作工作流程,确认每项工作都有人员负责;在实际跨部门协作中不断优化完善跨部门的工作流程,并固化形成工作标准。 ![4cbcc779b5a84377ac19bcaf99fce04d.png](https://img-blog.csdnimg.cn/20191122171318113.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxMTM3NDkz,size_16,color_FFFFFF,t_70) (图为[CORNERSTONE](https://www.cornerstone365.cn)的任务页面) 3、沟通前明确诉求,保障沟通顺畅 其实跨部门协作的本质还是沟通的问题,沟通不到位就容易造成工作上的纰漏。建议在和同事沟通前先明确自己的诉求,然后再进行合理沟通,保证双方的沟通是顺畅的,尽可能地达到预期的效果。重要信息最好是面对面沟通,能更有效地解决问题,避免传达出错,导致任务失败。 4、统一的沟通平台,方便信息留存 现在很多企业都是用企业微信或邮件沟通,来回切换既不方便也容易造成沟通不到的问题。统一的沟通平台不仅可以免去切换的麻烦提高沟通效率,还可以避免聊天中的重要信息及文件的丢失;CORNERSTONE讨论功能可供团队成员互相交流,共享信息,解决自己在工作中遇到的各种问题,重要文档也可随时转存至WIKI或文件中。 ![image.png](https://img-blog.csdnimg.cn/20191122171328500.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxMTM3NDkz,size_16,color_FFFFFF,t_70) (图为[CORNERSTONE](https://www.cornerstone365.cn)的讨论页面) 5、 高效运作的团队创造价值 一个高效运作的团队,一定是目标清晰,角色具体,沟通顺畅,流程明确,团队成员彼此高度信任的,这需要一定的时间来经营和训练。为了维持企业竞争优势,保持企业高效率,提高企业创新绩效能力,企业往往需要采取措施,通过问题导向和需求导向,加强跨部门信息交流和人与人之间的合作,促进跨部门协作能力,减少部门冲突,合理有效利用组织资源,提升组织活力、效率和绩效。 结语: 目前企业内部各级组织间的部门壁垒仍然是很多企业的痛点,工作中难免会遇到跨部门协作的问题,协作不好就会引发一系列问题,严重影响工作效率。总体来说,跨部门协作最重要的一点是目标一致,通过制定统一的目标,让双方能够达成共识。除此之外,还需要多站在对方的立场考虑问题,以便于保证双方合作的顺畅性,形成高效地跨部门协作模式。[CORNERSTONE](https://www.cornerstone365.cn)全行业覆盖的一站式项目协作平台,官网链接,拿走不谢!(http://www.cornerstone365.cn) ![image.png](https://img-blog.csdnimg.cn/20191122171335213.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxMTM3NDkz,size_16,color_FFFFFF,t_70)

资源上传标题内容规范说明

### 标题 一个好的标题能给将会给你带来大量的下载次数,对您上传的资源的准确且简明扼要的描述。 错误标题“#### python教程” 正确写法“#### 教您Python爬虫教程视频_scrpy爬虫教程” ### 内容 内容请大致说明一下里面是什么并上传截图说明,如果是工具类 代码类的资源请尽量完善图文教程,每个资源请上传至少一张图片截图,图文方式的资源将会大大增加您上传资源的下载次数 ### 积分说明 您上传的资源将由您自己定义资源的分值,一个合适的积分值也将会提升您所上传资源的下载次数,例如一个只值1点积分的资源你硬要定义为100积分,这样的文件你将永远不会有人去下载,另外的是一个资源外面一堆的网站可以下载您也上传来我们平台提供人下载且长时间无人下载的资源我们将会进行下架处理,暂定积分分成为3:7每一次下载您将获得70%的积分收益(包括你自己下载自己上传的资源) 平台抽成30% 请勿随意填写文章标题或者内容次数多了将永久停封账号上传权限,请尊重每位下载者,您一篇好的介绍会让你带来大量下载量

码姐姐资源共享用户协议规范

上传及下载规则 1、码姐姐(包括码姐姐网站与相应客户端、自媒体平台、主运营网站等)是为广大用户提供资源(包括但不限于文章、文档、音频、视频、图片、课程、软件、源代码等相关资源)共享的网络存储平台,为确保平台依法合规运营,保证广大用户能够正常便捷地分享、使用频道资源,用户上传的所有资源都不得违反国家法律法规。具体如下: (1)不得上传中华人民共和国法律、法规、规章、条例以及国家政策所禁止或限制的资源或内容,包括但不限于以下情形: 1)反对宪法所确定的基本原则; 2)危害国家安全,泄露国家秘密,颠覆国家政权,破坏国家统一的; 3)损害国家荣誉和利益的; 4)煽动民族仇恨、民族歧视、破坏民族团结的; 5)破坏国家宗教政策,宣扬邪教和封建迷信的; 6)散布谣言,扰乱社会秩序,破坏社会稳定的; 7)散布淫秽、色情、赌博、暴力、凶杀、恐怖或者教唆犯罪的; 8)侮辱或者诽谤他人,侵犯他人合法权利的; 9)煽动非法集会、结社、游行、示威、聚众扰乱社会秩序的; 10)以非法民间组织名义活动的; 11)含有虚假、有害、胁迫、侵犯他人隐私、骚扰、侵权、中伤、粗俗、猥亵、或其它道德上令人反感的内容的; 12)含有中国法律、法规、规章、条例以及国家政策禁止或限制内容的。 (2)不得上传与码姐姐提供的服务内容无关的广告、垃圾信息等资源或内容。 (3)不得上传无法正常显示,或带有病毒或存在其他问题的资源或内容。 (4)不得上传侵犯第三人知识产权或其他合法权益的资源或内容。 (5)不得上传违反码姐姐用户协议、版权规则或任何其他业务规则的资源或内容。 2、用户仅可上传其享有知识产权或已取得相关权利人合法授权的资源或内容,用户不得在未经授权的情况下,上传任何可能涉及侵权的资源或内容,用户必须保证上传资源或内容不侵犯任何第三方的合法权益。用户不得未经著作权人同意擅自对他人的作品进行全部或部分复制、修改、改编、翻译、汇编、反向工程、反向编译、反向汇编或改写并进行上传。用户可以为介绍、评论、研究等目的,在合理范围内依法引用他人已经发表的作品,但应当注明作者姓名、作品名称,且不得侵犯著作权人及其他权利人的合法权益。 3、除由码姐姐上传及发布的资源或内容外,码姐姐分享的其他资源或内容来自用户上传,码姐姐经营者(即北京创新乐知信息技术有限公司及其他相关联的公司)不对该等用户上传的资源或内容的权属等进行实质审核,上传用户须独立就该等上传资源或内容的合法性承担责任。 4、用户保证上传的所有资源或内容符合中华人民共和国法律、法规、规章和规范性文件的相关规定,不侵犯任何第三方的合法权益。若用户上传及发布的内容发生权利纠纷或涉嫌侵犯第三方合法权益,因此发生的纠纷由用户自行解决,并由用户承担全部法律责任。码姐姐经营者并有权删除相关资源或内容,并可以暂停或终止向该用户提供相关服务。 5、码姐姐经营者并不保证用户上传的资源或内容能够通过码姐姐传播途径使得其他用户成功获取、使用。 6、码姐姐经营者保留对用户上传的资源或资源进行不定期的合法、合规性检查的权利,并有权依据检查结果对不符合法律规定或码姐姐规则的资源或内容进行移除,或终止上传用户使用码姐姐服务的资格,且无需向用户或其他任何第三方承担责任。 7、如用户上传的资源或内容涉嫌侵犯第三方的合法权利,第三方向码姐姐经营者提出举报,码姐姐经营者有权直接删除相关资源或内容。 8、当权利人发现码姐姐分享的内容侵犯其合法权益时,权利人可向码姐姐经营者举报,权利人需要将包括但不限于权属证明、权利主体证明、网址链接、联系方式、投诉内容及要求的信息发到码姐姐经营者指定联系方式中。码姐姐经营者有权依据权利人提供的信息及中国法律法规和规范性文件的规定做出独立判断,并采取相应措施。 9、对于用户上传到码姐姐的任何资源或内容,用户同意码姐姐经营者在全世界范围内享有免费的、永久的、不可撤销的、非排他性的使用及商业合作权利,包括但不限于对作品进行复制、下载、展示及网络传播等。 10、用户上传到码姐姐的资源及其内容仅为其作者或用户个人的观点,不代表码姐姐观点,码姐姐不对此承担任何责任,码姐姐亦不对该等资源或内容的真实性、完整性、准确性及合法性进行任何保证或承担任何责任。 11、用户不得重复上传资源或内容。 12、为提高用户上传资源的共享程度,用户对上传到码姐姐的资源默认5积分,并同意初始分值设置后满一周后,码姐姐经营者有权根据上传资源的用户下载数量、用户评价等因素对下载所需积分值进行动态调整。 13、用户使用积分下载资源的,自初次下载之日30日内可免费下载该同一资源,超过限定期限再次下载,用户需重新支付积分。 14、用户应通过正当途径自码姐姐下载资源,不得通过购买、借用其他用户账户、积分交易、用技术手段规避码姐姐下载限制或其他不当方式下载资源,否则码姐姐有权停止用户对下载资源的使用,并采取封禁账户、终止服务等措施。 15、下载资源的用户应当严格遵守法律法规、用户协议、本规则及码姐姐其他业务规则关于知识产权保护的规定,自觉维护资源上传用户及码姐姐经营者的合法权益。 16、不论何种情形,码姐姐经营者都不对任何由于使用或无法使用码姐姐提供的信息所造成的直接的、间接的、附带的、特殊的或其他损失、损害、债务或商务中断负任何责任(不论是可预见的或是不可预见的)。 杜绝商用规则 17、用户不得以任何方式向第三方转让其账户、密码、积分或其他重要信息,否则码姐姐经营者有权注销该用户账号、终止向其提供服务,并保留追究用户赔偿全部损失的权利。 18、用户下载的资源仅供用户个人学习、研究、技术交流等非营业性使用,不得以任何方式(包括但不限于通过转让、借用用户账户、积分交易或其他不当方式,用户并同意码姐姐有权依照相关法律规定以及用户的行为轨迹对用户行为是否构成不当作出认定)用于任何商业或营利性用途。 19、用户不得出于任何非法或未经码姐姐授权的目的使用码姐姐账户或码姐姐提供的功能、服务,包括但不限于以营利为目的恶意注册帐号,不得利用码姐姐账户或码姐姐提供的功能、服务从事营利活动,不得以营利或非营利目的以任何方式(包括但不限于转让、借用、出租、共享等)向任何第三方提供码姐姐账户或码姐姐提供的功能、服务或其任何部分。 其他 20、码姐姐经营者有权根据自身及互联网的发展和中华人民共和国法律、法规及规范性文件的变化,不断修改和完善本规则的相关条款。码姐姐经营者保留随时修改本规则的权利。用户继续使用码姐姐及其提供的服务,即视为同意并自愿遵守本规则条款及其最新版本,否则,用户应终止使用码姐姐及其提供的相关服务。 21、用户在码姐姐注册,并在码姐姐上传或下载相源的,即视为用户已详细阅读本规则,并同意完全遵守本规则的全部内容。 22、本规则的最终解释权归东莞市龙轩云网络科技有公司所有。

码姐姐交流社区中发贴的Markdown语法介绍

码姐姐交流社区作为一个开发者的交流探讨的聚集地,对Markdown的支持是必不可少的,在这里简单介绍下Markdown在发贴时的用法。 ## 标题 在发贴中经常用到,Markdown支持6种标题,我们可以使用# 前缀来标记,注意# 后面有个空格 示例代码 ``` # 一级标题 ## 二级标题 ### 三级标题 #### 四级标题 ##### 五级标题 ###### 六级标题 ``` 显示效果 # 一级标题 ## 二级标题 ### 三级标题 #### 四级标题 ##### 五级标题 #### 六级标题 ### 列表 在Markdown中,可以使用- 和1. 来标记无序列表和有序列表,注意- 和1. 后面有个空格 示例代码 ``` - 码姐姐官网 - 码姐姐社区 - 码姐姐文档 ``` ``` 1. 码姐姐官网 2. 码姐姐社区 3. 码姐姐文档 ``` 显示效果 - 码姐姐官网 - 码姐姐社区 - 码姐姐文档 1. 码姐姐官网 2. 码姐姐社区 3. 码姐姐文档 ### 链接 在发贴时插入链接是我们经常需要使用到的一个操作,虽然在码姐姐可以直接粘贴链接,在这里还是做一下简单介绍 链接的语法比较简单,使用[显示文本](链接URL) 示例代码 ``` [码姐姐交流社区](http://www.qcsdn.com) ``` [码姐姐交流社区](http://www.qcsdn.com) 图片 在发贴时图片是我们经常需要用到的,虽然在FastAdmin可以直接粘贴上传并生成Markdown格式,但这里还是做一下简单介绍 图片的语法只是在链接的语法前多了一个!,使用![图片描述](图片地址) 示例代码 ``` ![码姐姐](http://www.qcsdn.com/assets/img/logo.png) ``` ![码姐姐](http://www.qcsdn.com/assets/img/logo.png) ### 引用 在发贴时如果需要引用文字,可以使用> 来标记 示例代码 ``` > 码姐姐是一款基于ThinkPHP5和Bootstrap的极速后台开发框架,可进行快速的二次开发,手机、平板、PC均自动适配,无需要担心兼容性问题 ``` 显示效果 > 码姐姐是一款基于ThinkPHP5和Bootstrap的极速后台开发框架,可进行快速的二次开发,手机、平板、PC均自动适配,无需要担心兼容性问题 粗体和斜体 在Markdown中,粗体和斜体分别使用**和_来标记 示例代码 ``` **粗体** _斜体_ ``` 显示效果 **粗体** _斜体_ 代码 在发贴时我们经常需要贴代码,在Markdown中单行代码可以使用`代码`来标记,多行代码可以使用```来标记,注意在```后面可以使用php/js/css等语言名称 示例代码 ```php $obj = appcommonlibraryEmail::instance(); $result = $obj ->to($params->email) ->subject('验证码') ->message("你的验证码是:1234") ->send(); ``` 显示效果 ``` $obj = \app\common\library\Email::instance(); $result = $obj ->to($params->email) ->subject('验证码') ->message("你的验证码是:1234") ->send(); ``` 表格 示例代码 ``` 标题1 | 标题2 | 标题3 -----|-------|----- 内容1 | 内容2 | 内容3 内容1 | 内容2 | 内容3 内容1 | 内容2 | 内容3 ``` 显示效果 标题1 | 标题2 | 标题3 -----|-------|----- 内容1 | 内容2 | 内容3 内容1 | 内容2 | 内容3 内容1 | 内容2 | 内容3

六种常见的数据扩增方式(附代码)

本示例主要介绍 Spring Cloud 系列中的 Eureka,如何使用Hystrix熔断器容错保护我们的应用程序。 在微服务架构中,系统被拆分成很多个服务单元,各个服务单元的应用通过 HTTP 相互调用、依赖,在某个服务由于网络或其他原因自身出现故障、延迟时,调用方也会出现延迟。若调用方请求不断增加,可能会形成任务积压,最终导致调用方服务瘫痪,服务不可用现象逐渐放大。 解决方案 Spring Cloud Hystrix 是一个专用于服务熔断处理的开源项目,实现了一系列服务保护措施,当依赖的服务方出现故障不可用时,hystrix实现服务降级、服务熔断等功能,对延迟和故障提供强大的容错能力,从而防止故障进一步扩大。 Hystrix 主要作用介绍 保护和控制底层服务的高延迟和失效对上层服务的影响。 避免复杂分布式中服务失效的雪崩效应。在大型的分布式系统中,存在各种复杂的依赖关系。如果某个服务失效,很可能会对其他服务造成影响,形成连锁反应。 快速失效和迅速恢复。以Spring为例,一般在实现controller的时候,都会以同步的逻辑调用依赖的服务。如果服务失效,而且没有客户端失效机制,就会导致请求长时间的阻塞。如果不能快速的发现失效,而就很难通过高可用机制或者负载均衡实现迅速的恢复。 实现服务降级。这一点是从用户体验来考虑的,一个预定义默认返回会比请求卡死或者500好很多。 实现了服务监控、报警和运维控制。Hystrix Dashboard和Turbine可以配合Hystrix完成这些功能。 Hystrix 主要特性: 服务熔断 Hystrix 会记录各个服务的请求信息,通过 成功、失败、拒绝、超时 等统计信息判断是否打开断路器,将某个服务的请求进行熔断。一段时间后切换到半开路状态,如果后面的请求正常则关闭断路器,否则继续打开断路器。 服务降级 服务降级是请求失败时的后备方法,故障时执行降级逻辑。 线程隔离 Hystrix 通过线程池实现资源的隔离,确保对某一服务的调用在出现故障时不会对其他服务造成影响。 代码实现 创建三个项目来完成示例,分别为:服务注册中心hystrix-eureka-server,服务提供者hystrix-service-provider,服务消费者hystrix-service-consumer 1.创建hystrix-eureka-server服务注册中心 pom.xml配置 ``` 4.0.0 com.easy hystrix-eureka-server 0.0.1-SNAPSHOT jar hystrix-eureka-server Demo project for Spring Boot cloud-hystrix com.easy 1.0.0 org.springframework.cloud spring-cloud-starter-netflix-eureka-server org.springframework.boot spring-boot-starter-test test org.springframework.boot spring-boot-maven-plugin ``` application.yml配置文件 ``` server: port: 8761 spring: application: name: eureka-server eureka: instance: hostname: localhost # eureka 实例名称 client: register-with-eureka: false # 不向注册中心注册自己 fetch-registry: false # 是否检索服务 service-url: defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ # 注册中心访问地址 ``` HystrixEurekaServerApplication.java启动类 ``` package com.easy.eurekaServer; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; @EnableEurekaServer @SpringBootApplication public class HystrixEurekaServerApplication { public static void main(String[] args) { SpringApplication.run(HystrixEurekaServerApplication.class, args); } } ``` 2.创建hystrix-service-provider服务提供者 pom.xml配置 ``` 4.0.0 com.easy hystrix-service-provider 0.0.1-SNAPSHOT jar hystrix-service-provider Demo project for Spring Boot cloud-hystrix com.easy 1.0.0 org.springframework.cloud spring-cloud-starter-netflix-eureka-client org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-maven-plugin ``` application.yml配置文件 ``` spring: application: name: hystrix-service-provider eureka: client: service-url: defaultZone: http://localhost:8761/eureka/ # 实例一 server: port: 8081 HelloController.java提供一个hello接口 package com.easy.serviceProvider.web; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController public class HelloController { @GetMapping("hello") public String hello(@RequestParam String p1, @RequestParam String p2) throws Exception { // 用来测试服务超时的情况 // int sleepTime = new Random().nextInt(2000); // System.out.println("hello sleep " + sleepTime); // Thread.sleep(sleepTime); return "hello, " + p1 + ", " + p2; } } ``` 最后贴上启动类HystrixServiceProviderApplication.java ``` package com.easy.serviceProvider; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @EnableDiscoveryClient @SpringBootApplication public class HystrixServiceProviderApplication { public static void main(String[] args) { SpringApplication.run(HystrixServiceProviderApplication.class, args); } } ``` 3.创建hystrix-service-consumer服务消费者 pom.xml配置 ``` 4.0.0 com.easy hystrix-service-consumer 0.0.1-SNAPSHOT jar hystrix-service-consumer Demo project for Spring Boot cloud-hystrix com.easy 1.0.0 org.springframework.cloud spring-cloud-starter-netflix-eureka-client org.springframework.cloud spring-cloud-starter-netflix-ribbon org.springframework.cloud spring-cloud-starter-netflix-hystrix org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-test test org.springframework.boot spring-boot-maven-plugin ``` application.yml配置文件 ``` spring: application: name: hystrix-eureka-server eureka: client: service-url: defaultZone: http://localhost:8761/eureka/ hystrix: command: default: execution: isolation: thread: timeoutInMilliseconds: 1000 # 默认超时时间 ``` 相关代码 异常处理类NotFallbackException.java ``` package com.easy.serviceConsumer.exception; public class NotFallbackException extends Exception { } 服务层HelloService.java package com.easy.serviceConsumer.service; import com.easy.serviceConsumer.exception.NotFallbackException; import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; @Service public class HelloService { @Autowired RestTemplate restTemplate; private static final String HELLO_SERVICE = "http://hystrix-service-provider/"; @HystrixCommand(fallbackMethod = "helloFallback", ignoreExceptions = {NotFallbackException.class} , groupKey = "hello", commandKey = "str", threadPoolKey = "helloStr") public String hello(String p1, String p2) { return restTemplate.getForObject(HELLO_SERVICE + "hello?p1=" + p1 + "&p2=" + p2, String.class); } private String helloFallback(String p1, String p2, Throwable e) { System.out.println("class: " + e.getClass()); return "error, " + p1 + ", " + p2; } } ``` 控制器ConsumerController.java ``` package com.easy.serviceConsumer.web; import com.easy.serviceConsumer.service.HelloService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController public class ConsumerController { @Autowired HelloService helloService; @GetMapping("hello") public String hello(@RequestParam String p1, @RequestParam String p2) { System.out.println("hello"); return helloService.hello(p1, p2); } } ``` 4.启动类HystrixServiceConsumerApplication.java ``` package com.easy.serviceConsumer; import org.springframework.boot.SpringApplication; import org.springframework.cloud.client.SpringCloudApplication; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; import org.springframework.web.client.RestTemplate; @SpringCloudApplication public class HystrixServiceConsumerApplication { @Bean @LoadBalanced RestTemplate restTemplate() { return new RestTemplate(); } public static void main(String[] args) { SpringApplication.run(HystrixServiceConsumerApplication.class, args); } } ``` 使用示例 分别运行3个服务,HystrixEurekaServerApplication.java(服务注册中心),HystrixServiceProviderApplication.java(服务提供者),HystrixServiceConsumerApplication.java(服务消费者) 1.访问 http://localhost:8080/hello?p1=a&p2=b ,正常情况下响应为 hello, a, b 2.关闭 hystrix-service-provider 或在 sleepTime 超过 1000ms 时,访问 http://localhost:8080/hello?p1=a&p2=b,执行降级逻辑,返回 error, a, b

立即
投稿
返回
顶部