您好!欢迎来到爱源码

爱源码

热门搜索: 抖音快手短视频下载   

这是我读过的关于微服务架构的最好的文章,没有之一 [免费源码]

  • 时间:2022-09-09 11:04 编辑: 来源: 阅读:303
  • 扫一扫,手机访问
摘要:这是我读过的关于微服务架构的最好的文章,没有之一 [免费源码]
参考资深互联网架构师、微服务布道者Mark的原文章,什么是微服务?微服务是一种细粒度的SOA,或者说在座的很多位高权重的朋友已经理解了它的概念。 个人认为,微服务与其说是一种技术,不如说是一种架构,架构是“技术”的实现,是“技术”相辅相成的策略。 “技术”的策略需要分析使用场景,适当划分业务边界,实现“产业集群化”。但在通过具体技术实现业务逻辑时,更多考虑的是实现过程中的效率、测试的便捷性、维护的可持续性,以达到“以组为单位对技术进行分组”的目的。 从这个角度来说,我个人更倾向于将其定义为“微服务是细粒度的SOA” 这个定义的好处是,不需要反复“抹黑”“单片应用”(也有人翻译成“巨石应用”),因为在SOA技术的演进中已经提到了。 那么,细粒度更多的表现为“取其精华,去其糟粕”。 什么是SOA?* * SOA =面向服务的架构* * SOA的中文定义是面向服务的架构,这不是今天的重点。请原谅我不能详细阐述它。 我使用“点到点”的方法来描述SOA和相关技术的特点。 什么是SOA?面向服务、松耦合、模块化、分布式计算、平台无关、集中管理(中央政府)Web服务Web服务技术演进的目的是处理分布式计算中异构系统的服务调用的通信协议。 早期的Web服务包括XML-PRC、WSDL、SOAP等技术,不仅处理了Windows平台上的COM+和Java平台上的RMI不能跨平台的问题,而且使用了本文中可读的协议,而不是复杂的二进制协议,如CORBA技术。 现代WebServices技术的主要代表是REST等。 消息队列消息队列技术有两个主要目的。在架构方面,消息队列服务有助于分离系统之间的依赖关系;从技术上看,消息队列为系统提供了异步解决的能力,解决了并发同步调用带来的资源过度集中和过度消耗的问题,为上下游系统的数据结构提供了统一的传输介质。 Esb是SOA的综合实现。 SOA不是什么?SOA ≠ MonolithicSOA不仅是单片的,而且是处理单片的。Monolith的个人偏好被翻译成“Monolithic application”和“boulder application” 什么是Monolith?[!【这就是我】(http://upload-images.jianshu.io/upload _ images/9005929-f856b 463 b 08051 ed?imagemogr 2/auto-orient/strip % 7 cimageview 2/2/w/1240)](http://mm biz . qpic . cn/mm biz _ png/rvkydsmjum 0 ia 58 ydda 9 dt 2 KWD sm 06 crx 7 wbicy 9 RM jav 7 ow 4 dbtviaj 4 iaramnlcmuibmz 52 zrms9 lram 5 ricy 8 w/640?wx _ fmt = png & amptp = webp & ampwxfrom = 5 & ampWx_lazy=1)故宫的朋友可能会觉得奇怪。故宫和「单申请」有什么关系?它是皇宫的住所和办公室,象征着“至高无上的权力”和“中央集权” 中华民族,从秦朝的“三公九吏制”,到隋朝的“三省六部制”,再到明清的“内阁制”,无一例外地致力于巩固“中央集权”。 近2000年来,尽管朝代不断更迭,但这一制度一直沿用,并无大的非议。 但1793年,英国马戛尔尼勋爵(Lord Macartney)派使团来华,代表英皇为乾隆皇帝祝寿,也有促进中英贸易的使命。 虽然当时的中国笼罩在“盛世”的光环之下,但在马戛尔尼看来,无论是技术还是社会制度,中国都处于相对落后的阶段。 《左传》中有一句话:“民之幸,国之不幸。”当时大多数人都把英国视为“野蛮人”,不与他们进行贸易。 五十年后,中英爆发鸦片战争。1840年,中华帝国的第一个不平等条约《南京条约》被迫签署。它不仅打击了中华民族,也“唤醒”了大和民族。 明治维新后,日本多次挑战中国在东亚的地位,直到甲午战争战败。 1895年签订《马关条约》,割台湾省,并支付巨额赔款。 但仍有康有为等人不死心,上千人在公交车上联名上书,认为“中央集权”不是问题。 “集权”导致职责臃肿,管理不力。中央不可能面面俱到,也不可能“因地制宜”。 我想说的是,单一应用不就像一个“中央集权”的政府吗?微服务应用更像是“三权分立”的“自治”政府,自治政府之间在“联邦”框架下的“分工”和“合作”。 为什么?“学而不思则罔”。为什么需要微服务?效率的应用需要微服务后,规模和体积变轻,节省了编译、打包、分发、部署的时间,提高了开发效率。 质量需求微服务应用面向持续集成和友好、自动编译、单元和集成测试用例执行和回归,提高应用的整体质量。 当固体需求应用量大且全职时,往往会影响全身。其中一项服务出现问题,整体受到影响。 完整性无法保证。所以微服务后,应用从原来的服务内部组装成服务的自由组合。一旦关联服务出现问题,整个应用可以选择性降级或融合,问题服务恢复后一切照常进行。 运维要求微服务应用具备自动编译、打包、分发、部署和运维的能力。 传统应用不仅需要开发人员,还需要测试人员和操作人员。微服务应用实现后,全栈工程师理想化将成为可能。 增长需要微服务更好更快地适应新技术,比如流行的Apache Kafka。 工程师需要接触新技术,为将来可能的技术选择做准备。 我的建议是,你可以在几个不太重要的微服务应用中尝试几项新技术,在它提供的功能和实际需求之间找到少量自己的理解,也是自我成长的需要。 为什么不是微服务?《论语》中有一句话:“子爵思:‘我不要,我不要,我不要,我不要,我不要。’ “,总之不要假设,不要固执,不要自我感觉良好,有什么是肯定的。 那么,在微服务实践过程中,有哪些因素可以让微服务变得没有必要呢?请注意你的言辞。这里写的是“不必”,不是“不” 单一场景当应用场景单一时,不需要微服务,因为它本身就是微服务,比如少量的静态公告页面。 应用逻辑简单的时候逻辑简单,也违背了微服务的初衷。因为微服务是为了解决复杂的业务逻辑而衍生出来的,所以这种情况下不需要实现微服务。 首先我来解释一下“渐行渐远”的意思,就是逐渐消失。 当应用所关注的业务趋于消失时,虽然有实施的空间,但没有实施的必要。 由于这类应用随时可能不复存在,这就好比没有必要大张旗鼓地重建BB机或服务器的短信服务一样。 “自律”的本义是形容人在做事时的世故和沉着。 我在这里引用这个成语是为了更容易记忆,所以需要拆开来单独解释。 “老”是指年老时的应用。多久才算老?个人经验,申请工龄三年以上 “成”是指应用的规模已经成型,业务几乎没有变化,比如通知应用。 “Hold”是指应用场景会持续很长时间。 “重”是指应用的位置非常重要,任何时候都无法重构,比如交易类应用。 当应用程序满足多个特征时,应用程序不必实现微服务。 对技术的盲从是我最在意的,最担心朋友会得罪我。 我们都是工程师,对技术的追求毋庸置疑。但是,一定不能因为技术而采用技术。新技术的引入,要么是处理现有问题,要么是提供便利,但也是夸大其词。 理性的评估和认真的执行对我们来说更为重要。 技术难点挑战智力,理性治疗考验情绪控制。 看高级网http://Micro services . io/http://Martin fowler . com/articles/Micro services . html书微服务架构,Irakli Nadareishvili的手稿《2016年11月19日微服务实践之路演讲(厦门)》以上马克推荐的网络资源和书籍(在本微信微信官方账号)可能大家都看过,但我主要推荐我上个月去厦门的演讲。之所以放在最后,是因为我很想突出一点,“走在我后面的是我”(老子)。 :DHow前面提到的部分是“是什么”和“为什么”。接下来“如何”的部分,顾名思义就是怎么做。 以上两句“慎独他事”,参考孔子的学生张关于如何做好工作的建议。孔子的回答是:“多闻其错,慎于他事,则寡矣。 如果你看到了许多缺点,并对他人保持谨慎,你就很少有遗憾。 话少,行少,鲁在其中。" 儒家经典总是告诫我们,言行要谨慎,如在深渊中如履薄冰,战战兢兢。 个人认为这些思路是放之四海而皆准的,在微服务实践过程中,也需要谨慎。 如何实现微服务,我想从心态、技术、思想、心态这三个方面来解释一下,“鲁兹是一个人的名字,还有“鲁兹能听见,但不能做,怕被听见”这句话的前两个字 孔子有三千弟子,七十二贤人,其中最著名的是“孔孟十哲”,包括鲁兹。 鲁,即钟繇,字。 整句话的意思是,鲁兹听到了新的知识或真理,但没有付诸实践,他担心新的知识或真理的出现。 这句话很能体现当今浮躁的互联网时代。科技似乎突飞猛进,新技术层出不穷。但是无效的练习导致了第一只老鼠两头的心态。 每当别人掌握了新技术,而自己没有,就觉得不如别人,反之亦然。 我想告诉你的是,微服务不是一种新技术,而是一种新思想。只是先进的咨询和基础的沉淀,让旧的技术或理论在新时代“飞入寻常百姓家”。 “如果你没有位置,你就要为它挺身而出。”当微服务被业界广泛认可和接受的时候,也许你会一直担心去哪里实践。所以,在心态上,你需要冷静,思考它为什么存在。 当你或者你的团队在推广微服务的时候,你首先要做好被挑战甚至被攻击的准备。据不完全统计,世界上有5%的人是因为反对而反对的人。 但是反对负面情绪可能会打动剩下的50% 在这个前提之后,就需要具备攻击“异端”的能力,从而达到“自残”(这种伤害也是可以消除的)。 “不要害怕改变”最后一个心态就是不要害怕犯错,不要害怕改正错误。 作为工程师,在实现的过程中不可能不出错,除非你不去做。 不要害怕犯错误。犯错也是缩小内心期望与现实差距的更好方式。不犯错,就没有成长的空间。所以,你不怕错误,不避改正。 前面部分用了很多诗,然后就不会那么“诗意”了。做一些“干”的事情也是当今科技的亮点。 马上进入技术部分。 * *技术* *从技术上来说,阿里微服务的做法是不能免俗的,基本上是以下三种套路:dockerddmidleware(Java)Docker在阿里巴巴集团的技术体系中,独立开发了兼容Docker的AliDocker,并提供了少量的其他能力和辅助工具。 这一块我不是特别熟悉,会和同事讨论交流。这里只能做几个简单的细节。 怎么一起学习?有免费资料吗?欢迎对Java技术和架构技术感兴趣的同学加入QQ群619881427互相学习和探讨。 群里已经有小伙伴整理好了知识体系(源码、笔记、PPT、学习视频)。欢迎免费入群。 供喜欢Java,喜欢编程,有成为架构师梦想的程序员参考,希望能帮到你。 不是Java程序员也没关系。帮忙转发给更多的朋友!谢谢你 测试环境:AliDocker+ECS(阿里云)生成环境:Ali docker+物理机DDDDDD是Domain Driven Design的缩写,来源于Eric Evans的名著《域驱动设计》(Domain Driven Design)。 从年代上看,是相当古老的设计方法论。 作为微服务的重要理论基础,它以“凤凰涅槃”的姿态重新进入了软件的视野。 在具体的微服务实践中,DDD的三个实施策略取其二。 当然,整个DDD理论并不局限于此。就我个人而言,DDD就像一个传奇。大家都听说过,但没人见过。 但要实现这个理想,就像乌托邦式的“共产主义”,还不到时候。 有界上下文(Bounded Context)有界上下文的思想,个人认为是基于设计模式中“单一责任准则”的进一步发展。 其实也说明了东西方的文化差异。东方是古代中国代表的“中央集权”思想,古希腊城邦的“三权分立”思想。 微服务属于“三权分立”范畴 在微服务实践过程中,确定应用边界是必要的,也是困难的。 必要性体现在系统责任的划分上,应该简单、明确、不耦合。 困难在于重建过程不是一夜之间完成的,而是渐进的。同时,应用的开发是和业务开发同步进行的,困难是可以预见的。 过程虽然痛苦,但不得不做。 持续集成持续集成继承了TDD(测试驱动开发)的思想。对于已经形成较大规模的公司,基本都部署了持续的整合环境,在阿里,是一个系统来协调。 少数流行的开源软件,如GitLab、Jenkins(Hudson)等。 上述两种语境映射策略在实践中已经被采用,但语境映射已经被放弃。放弃的原因不是不正当,而是难以控制。 例如,客户服务提供了客户的模型,包括他们的姓名、生日、电话号码等。 而下游系统只需要客户的姓名信息,但现实中客服无法提供如此细粒度的服务,中间还要做一层上下文映射,两者不再直接相关。 这种情况似乎毫无头绪。但服务后服务数量多,其映射环节基本不可控。下游系统配合变更的成本也很高。因此,在实际操作中,仍然保持原有的调用关系。 尽量减少转换过程中的出错率。 中间件中间件是微服务实现中不可或缺的环节,实现中间件的编程语言可以任意,但目前市场上最流行的还是Java。 根据刚才的粗略统计,这里的朋友大部分都是从事Java的,而我恰好对这个领域比较熟悉。 接下来,我们来讨论一下Java中间件在微服务实践中的措施。 因为时间关系,不可能一一列举,所以下面每个小节都有例子。 Spring Boot春云春云流Spring Boot DevopsPringAnnotation Drive在微服务实践过程中,中间件部门开发推广各业务线,用注解驱动代替过去的XML配置:640?wx _ fmt = png & amptp = webp & ampwxfrom = 5 & ampWx_lazy=1Annotation驱动模式在Spring 3.1及更好的版本中,提供了大量的注释作为XML配置的替代(字段统计,基本没人知道这种方式):640?wx _ fmt = png & amptp = webp & ampwxfrom = 5 & ampWx_lazy=1XML配置方法工程师对XML比较熟悉,上面的XML是用Spring WebMVC的几个组件Bean配置的。 其实除了@EnableWebMvc,还有很多@EnableXXX的替代品,比如@EnableAsync、@EnableAspectJAutoProxy等。 在实施过程中,很多开发商误以为这些就是Spring Boot带来的便利,其实不然。 在Spring Boot的推广和实现过程中,除了上面的标注重构方法,我还想谈谈自己在前台渲染引擎的选择和评测方面的经验和体会。我建议大家要时刻保持怀疑的态度,一方的观点仅供参考。 渲染引擎thyme leaf(Spring推荐)具有HTML结构化、UI友好、表达强大的优点。百里叶(Spring的初衷是为了UI友好,让开发者在编辑模板页面时可以遵循标准的HTML结构。 强大的表达式与标准的OGNL表达式兼容,也支持弹簧表达式。 Spring表达式为Spring 3之后引入的重要功能提供了动态执行程序的能力。 缺点:编码略繁琐,性能一般,扩展编码略繁琐,无对比,无优劣。百里香在编辑过程中相对来说比较繁琐,相比于Velocity和JSP。 一般性能最明显的缺点就是性能确实一般,不建议在经常访问的页面上使用,比如宝贝介绍页面。 扩展复杂百里香元素的标记比比较复杂。 以下是百里香模板页面的内容,其中“th”是百里香标签的命名空间:640?wx _ fmt = png & amptp = webp & ampwxfrom = 5 & ampWx_lazy=1Thymeleaf模板page Velocity(应用广泛)优点:性能好,易扩展,事件解决,配置灵活,性能好。与百里香叶相比,Velocity具有良好的性能。 易于扩展。在可扩展性方面,Velocity提供了宏扩展,实现代码重用。 事件解决方案开发人员可能相对不熟悉事件解决方案。下面我简单描述一下细节。Velocity指的是“org . Apache . velocity . app . event . eventhandler”接口,典型代表是“org . Apache . velocity . app . event . referenceinsertioneventhandler”接口,主要用于在引用插入之前阻塞事件。 灵活的配置也是Velocity的一个明显特征。它提供了大量灵活的配置项,方便开发者设置,如配置模板位置、字符编码等。 缺点:HTML结构不友好,开发停滞。因为Velocity template的语法对HTML结构不友好,直接在页面的未标记区域植入了Directive和宏(macro),比如#set。 发展停滞Velocity 1.7版本自2010年以来一直没有升级,因此Spring 4.3版本(或Spring Boot 1.4)开始将Velocity支持标记为不推荐使用。 640?wx _ fmt = png & amptp = webp & ampwxfrom = 5 & ampWx_lazy=1通用Velocity模板Velocity宏(Macro)Velocity指令(Directive)** JSP(Java EE标准)**优点:编码灵活,兼容性好,性能优异,灵活编码各种页面结构。与以上两种模板引擎相比,JSP编码方式更加灵活。包括:Scriptlets早期类似PHP的脚本语法,即直接在JSP页面中添加Java代码。这种编程模式被称为Scriptlets,其对应的J2EE(当时也称为J2EE,现在的Java EE)设计模型是Model 1。 EL(Express Language)由于Scriptlets的编程方式,在页面上嵌入了过多的Java代码,导致代码难以重用,维护成本相当巨大。 EL(Express Language)1.0规范被引入JSP 2.0规范,然后这种能力被用于J2EE设计模式,并逐渐发展为Model 2和MVC。JSP页面不再负责数据组装等逻辑,只承担页面渲染的功能(当然还是有Scriptlets的能力,但不推荐这种方式) 兼容性好JSP属于Java EE规范,所以Java EE提供实现,比如Tomcat,Jetty,WebLogic等等。 所以JSP是天然兼容的,不需要引入其他资源。 优秀的JSP是一种解释性的编译模板语言。无论是Scriptlets还是EL都可以翻译成Java源文件,然后将Java源文件编译成Java类文件,由容器加载并执行相关方法调用(参考org . Apache . jasper . servlet . JSP servlet)。 多页结构是很多国内Java工程师不太重视的一个特性。通常,JSP页面结构在HTML中是固定的。事实上,它的页面结构格式可以设置为更严格的XHTML甚至XML。 顺便说一句,百里香叶也有这个能力,但是速度没有。 所以,在我看来,JSP不是太过时,而是太先进。 缺点:限制表达式(EL),扩展复杂,约定多,Servlet对限制表达式(EL)的依赖性强EL是OGNL表达式的子集,只实现简单的数据读取和逻辑运算。 类似Bean方法调用的高层语法需要配合JSF(JSF不流行的Web框架)等Web技术。 繁琐的JSP扩展主要是JSP标签扩展,被很多人视为反模式。我觉得没有,但是它的配置比较复杂。比如每个标签的属性都需要绑定一个对应的实现类属性,而且类型复杂,功能也不一样。例如,IterationTag和BodyTag之间有明确的区别。 JSP有很多协议,包括jsp-property-group等。除了标签库协议之外。我将以web.xml中的一段配置为例: 再者,目前流行的HTTP 2 Web server-Undertow与Servlet API不兼容,所以在Spring Boot的官方文档中有专门的解释:640?wx _ fmt = png & amptp = webp & ampwxfrom = 5 & ampwx _ lazy = 1 Spring Boot官方文档表示Spring Boot部分结束,会后可以进一步交流。接下来进入春云一节。 Spring CloudSpring Cloud官方提供基本的功能描述,包括分布式/版本化配置、注册和发现、路由、服务对服务调用、负载均衡、断路和分布式消息传递。 有很多技术。这里,我选择分布式配置作为例子。 详细描述,我在《2016.11.19微服务实践之路(厦门)演讲》(在本微信微信官方账号)中有提及,会后请参考。 开始配置分布式Spring Framework 3.1,提供了一个新的接口:org . Spring Framework . core . env . environment,在这个接口的标准实现中,org。spring framework . core . env . property sources对象合并(几个org。spring framework . core . env . Property sources对象组合),这个对象可以用来轻松解析属性。 同时,PropertySources可以追加一个新的组织。spring framework . core . env . property source对象。 所以,Spring Cloud提供了一个定位器,org。spring framework . cloud . bootstrap . config . property sources定位器,可以方便地追加org。spring framework . core . env . property source对象添加到org。spring framework . core . env . property sources对象。 结合阿里巴巴内部的分布式配置管理中间件Diamond(类似于ZooKeeper),部分实现逻辑如下:640?wx _ fmt = png & amptp = webp & ampwxfrom = 5 & ampWx_lazy=1部分实现逻辑具体用于通过@Value的方式获取配置内容中的属性,并将其与对象字段相关联,如下图所示:640?wx _ fmt = png & amptp = webp & ampwxfrom = 5 & ampWx_lazy=1字段和CI映射代码在ArchimedesProperties之上,有一个@RefreshScope的注释。这个注释的目的是通知Spring Cloud,如果配置项发生更改,更改后的属性值将与对象的字段值同步。 如下图所示,配置内容监听器的实现符合现代注释驱动的方式,将配置项的内容转换成需要的类型:640?wx _ fmt = png & amptp = webp & ampwxfrom = 5 & ampWx_lazy=1监控配置内容类型,安装更换Spring Cloud部分完成,下一步进入Spring Cloud流。 春云流在马丁·福勒的名著《企业集成模式》中提到了(渠道)的概念。Spring Cloud Stream投入实践,提供了一个通用的实现。 这种通用实现的优点是,它对应用程序是透明的,应用程序不再局限于特定的技术。对于它来说,春云流为它建立了一个通道,其中涉及到两个概念:源(发送方)和汇(接收方)。 类似于Kafka消息中间件,阿里巴巴自主开发了一套消息队列,命名为MetaQ,作为与Kalfa的同行项目提交给开源社区Apache,可圈可点。 Kafka和MetaQ都有自己的API。为了增加应用依赖的透明性,为MetaQ做了Spring Cloud Stream的适配,如下图:640?wx _ fmt = png & amptp = webp & ampwxfrom = 5 & ampWx_lazy=1Source (sender)发送消息实例代码Source (sender)发送消息实例代码:640?wx _ fmt = png & amptp = webp & ampwxfrom = 5 & ampWx_lazy=1Sink(接收方)消耗消息实例代码。上面的代码相当简单,类似于JMS中的消息订阅模式。 前三部分是实施部分,最后是技术部分,让我们继续讨论Spring Boot的DevOps。 Spring Boot DevOps 640的整体架构?wx _ fmt = png & amptp = webp & ampwxfrom = 5 & ampWx_lazy=1Archimedes整体架构图每个微服务应用都有一个应用名,通过访问Eureka客户端向注册中心Eureka服务器注册。 Eureka Server保存Archimedes通过Eureka Client提供的REST接口获取的所有注册应用的信息,并同时从获取的应用列表中获取其端点和指标信息。 同时,阿基米德还提供REST API接口,暴露应用元信息,为阿基米德仪表盘提供页面展现。 将所需的度量信息存储在时间序列数据库中,例如OpenTSDB。 然后通过OpenTSDB的HTTP API进行查询,最后在监控页面显示查询结果。 线程管理Archimedes Dashboard提供图形化的线程管理,如下图单实例线程总数序列图所示:640?wx _ fmt = png & amptp = webp & ampwxfrom = 5 & ampWx_lazy=1单实例线程总数序列图如下图所示。其功能类似于JStack,详细列出了具体线程的运行状态和堆栈:640?wx _ fmt = png & amptp = webp & ampwxfrom = 5 & ampWx_lazy=1活动线程栈信息内存管理JVM的内存管理比较复杂,不仅包括内存部分、内存池,还有相关的垃圾收集算法。 JVM内存包括Jjava内存使用、堆使用和非堆使用。 在阿基米德仪表盘中,将它们组合在一起,集中显示。 640?wx _ fmt = png & amptp = webp & ampwxfrom = 5 & ampWx_lazy=1整体内存使用和垃圾收集640?wx _ fmt = png & amptp = webp & ampwxfrom = 5 & amp垃圾收集前后Wx_lazy=1与640比较?wx _ fmt = png & amptp = webp & ampwxfrom = 5 & ampWx_lazy=1内存池使用介绍日志管理个人认为日志管理是原创。虽然Spring Admin也提供了切换日志的能力,但是它不具备将多个日志一起切换的能力,并且它适应了四种流行的日志框架:Java Logging、Log4j、Log4j2和Logback。 640?wx _ fmt = png & amptp = webp & ampwxfrom = 5 & ampWx_lazy=1log4j日志控件640?wx _ fmt = png & amptp = webp & ampwxfrom = 5 & ampWx_lazy=1Logback日志控件Archimedes会自动识别应用使用的日志框架。虽然不建议在一个应用中使用多套日志框架,但现实情况不得不综合考虑,比如一些双方jar包中的独立日志解决方案。 思考完技术,再来说说思维的实现。我总结为三点:少谈“敏捷”。国外很多学校都在吹牛,敏捷已死。 我觉得不算夸张,但也没必要过分。从中吸取教训就好。 欣赏“简单”并牢记“简单就是美丽”是很重要的 微系统设计越简单越好。这里的简洁不是简单。 学习“迪徐人杰”对很多朋友来说可能会很尴尬。与迪·徐人杰是什么关系? 这里的这段描述主要是CEO迪哥问李元芳,“方圆,你怎么看?” 这种不耻下问的精神,直到我们来学习。 迪·徐人杰并非事事都善于观察,也需要像李元芳这样的武夫的分析和建议来破案。为什么不呢?640?wx _ fmt = png & amptp = webp & ampwxfrom = 5 & ampWx_lazy=1朋友们,你们怎么看?怎么一起学习?有免费资料吗?欢迎对Java技术和架构技术感兴趣的同学加入QQ群619881427互相学习和探讨。 群里已经有小伙伴整理好了知识体系(源码、笔记、PPT、学习视频)。欢迎免费入群。 供喜欢Java,喜欢编程,有成为架构师梦想的程序员参考,希望能帮到你。 不是Java程序员也没关系。帮忙转发给更多的朋友!谢谢你


  • 全部评论(0)
资讯详情页最新发布上方横幅
最新发布的资讯信息
【技术支持|常见问题】1556原创ng8文章搜索页面不齐(2024-05-01 14:43)
【技术支持|常见问题】1502企业站群-多域名跳转-多模板切换(2024-04-09 12:19)
【技术支持|常见问题】1126完美滑屏版视频只能显示10个(2024-03-29 13:37)
【技术支持|常见问题】响应式自适应代码(2024-03-24 14:23)
【技术支持|常见问题】1126完美滑屏版百度未授权使用地图api怎么办(2024-03-15 07:21)
【技术支持|常见问题】如何集成阿里通信短信接口(2024-02-19 21:48)
【技术支持|常见问题】算命网微信支付宝产品名称年份在哪修改?风水姻缘合婚配对_公司起名占卜八字算命算财运查吉凶源码(2024-01-07 12:27)
【域名/主机/服务器|】帝国CMS安装(2023-08-20 11:31)
【技术支持|常见问题】通过HTTPs测试Mozilla DNS {免费源码}(2022-11-04 10:37)
【技术支持|常见问题】别告诉我你没看过邰方这两则有思想的创意广告! (2022-11-04 10:37)

联系我们
Q Q:375457086
Q Q:526665408
电话:0755-84666665
微信:15999668636
联系客服
企业客服1 企业客服2 联系客服
86-755-84666665
手机版
手机版
扫一扫进手机版
返回顶部