首页 文章 精选 留言 我的

精选列表

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

Java程序员微服务架构你必须要掌握的十个要点

近来,几乎人人都在谈论微服务。微服务之所以火热也是因为相对之前的应用开发方式有很多优点,如更灵活、更能适应现在需求快速变更的大环境等。本文将介绍微服务架构设计中的一些要点。 微服务架构设计时有哪些要点呢?先看下图是 Spring Cloud 的整个生态。 下图是完美实现微服务的十二原则: 接下来,细说微服务架构设计中不得不知的十大要点。 负载均衡 + API 网关 在实施微服务的过程中,不免要面临服务的聚合与拆分。 当后端服务的拆分相对比较频繁的时候,作为手机 App 来讲,往往需要一个统一的入口,将不同的请求路由到不同的服务,无论后面如何拆分与聚合,对于手机端来讲都是透明的。 有了 API 网关以后,简单的数据聚合可以在网关层完成,这样就不用在手机 App 端完成,从而手机 App 耗电量较小,用户体验较好。 有了统一的 API 网关,还可以进行统一的认证和鉴权,尽管服务之间的相互调用比较复杂,接口也会比较多。 API 网关往往只暴露必须的对外接口,并且对接口进行统一的认证和鉴权,使得内部的服务相互访问的时候,不用再进行认证和鉴权,效率会比较高。 有了统一的 API 网关,可以在这一层设定一定的策略,进行 A/B 测试,蓝绿发布,预发环境导流等等。 API 网关往往是无状态的,可以横向扩展,从而不会成为性能瓶颈。 程序员学习交流集合:点击这里加入,欢迎一到五年的工程师加入,合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代! 无状态化与独立有状态集群 x` 影响应用迁移和横向扩展的重要因素就是应用的状态。无状态服务,是要把这个状态往外移,将 Session 数据,文件数据,结构化数据保存在后端统一的存储中,从而应用仅仅包含商务逻辑。 状态是不可避免的,例如 ZooKeeper,DB,Cache 等,把这些所有有状态的东西收敛在一个非常集中的集群里面。 整个业务就分两部分,一个是无状态的部分,一个是有状态的部分。 无状态的部分能实现两点: 跨机房随意地部署,也即迁移性。 弹性伸缩,很容易地进行扩容。 有状态的部分,如 ZooKeeper,DB,Cache 有自己的高可用机制,要利用到它们自己高可用的机制来实现这个状态的集群。 虽说无状态化,但是当前处理的数据,还是会在内存里面的,当前的进程挂掉数据,肯定也是有一部分丢失的。 为了实现这一点,服务要有重试的机制,接口要有幂等的机制,通过服务发现机制,重新调用一次后端服务的另一个实例就可以了。 数据库的横向扩展 数据库是保存状态,是最重要的也是最容易出现瓶颈的。有了分布式数据库可以使数据库的性能随着节点增加线性地增加。 分布式数据库最最下面是 RDS,是主备的,通过 MySQL 的内核开发能力,我们能够实现主备切换数据零丢失。 所以数据落在这个 RDS 里面,是非常放心的,哪怕是挂了一个节点,切换完了以后,你的数据也是不会丢的。 再往上就是横向怎么承载大的吞吐量的问题,上面有一个负载均衡 NLB,用 LVS,HAProxy,Keepalived,下面接了一层 Query Server。 Query Server 是可以根据监控数据进行横向扩展的,如果出现了故障,可以随时进行替换的修复,对于业务层是没有任何感知的。 另外一个就是双机房的部署,DDB 开发了一个数据运河 NDC 的组件,可以使得不同的 DDB 之间在不同的机房里面进行同步。 这时候不但在一个数据中心里面是分布式的,在多个数据中心里面也会有一个类似双活的一个备份,高可用性有非常好的保证。 缓存 在高并发场景下缓存是非常重要的。要有层次的缓存,使得数据尽量靠近用户。数据越靠近用户能承载的并发量也越大,响应时间越短。 在手机客户端 App 上就应该有一层缓存,不是所有的数据都每时每刻从后端拿,而是只拿重要的,关键的,时常变化的数据。 尤其对于静态数据,可以过一段时间去取一次,而且也没必要到数据中心去取,可以通过 CDN,将数据缓存在距离客户端最近的节点上,进行就近下载。 有时候 CDN 里面没有,还是要回到数据中心去下载,称为回源,在数据中心的最外层,我们称为接入层,可以设置一层缓存,将大部分的请求拦截,从而不会对后台的数据库造成压力。 如果是动态数据,还是需要访问应用,通过应用中的商务逻辑生成,或者去数据库读取,为了减轻数据库的压力,应用可以使用本地的缓存,也可以使用分布式缓存。 如 Memcached 或者 Redis,使得大部分请求读取缓存即可,不必访问数据库。 当然动态数据还可以做一定的静态化,也即降级成静态数据,从而减少后端的压力。 服务拆分与服务发现 当系统扛不住,应用变化快的时候,往往要考虑将比较大的服务拆分为一系列小的服务。 这样第一个好处就是开发比较独立,当非常多的人在维护同一个代码仓库的时候,往往对代码的修改就会相互影响。 常常会出现我没改什么测试就不通过了,而且代码提交的时候,经常会出现冲突,需要进行代码合并,大大降低了开发的效率。 另一个好处就是上线独立,物流模块对接了一家新的快递公司,需要连同下单一起上线,这是非常不合理的行为。 我没改还要我重启,我没改还让我发布,我没改还要我开会,都是应该拆分的时机。 再就是高并发时段的扩容,往往只有最关键的下单和支付流程是核心,只要将关键的交易链路进行扩容即可,如果这时候附带很多其他的服务,扩容既是不经济的,也是很有风险的。 另外的容灾和降级,在大促的时候,可能需要牺牲一部分的边角功能,但是如果所有的代码耦合在一起,很难将边角的部分功能进行降级。 当然拆分完毕以后,应用之间的关系就更加复杂了,因而需要服务发现的机制,来管理应用相互的关系,实现自动的修复,自动的关联,自动的负载均衡,自动的容错切换。 服务编排与弹性伸缩 当服务拆分了,进程就会非常的多,因而需要服务编排来管理服务之间的依赖关系,以及将服务的部署代码化,也就是我们常说的基础设施即代码。 这样对于服务的发布,更新,回滚,扩容,缩容,都可以通过修改编排文件来实现,从而增加了可追溯性,易管理性,和自动化的能力。 既然编排文件也可以用代码仓库进行管理,就可以实现一百个服务中,更新其中五个服务,只要修改编排文件中的五个服务的配置就可以。 当编排文件提交的时候,代码仓库自动触发自动部署升级脚本,从而更新线上的环境。 当发现新的环境有问题时,当然希望将这五个服务原子性地回滚,如果没有编排文件,需要人工记录这次升级了哪五个服务。 有了编排文件,只要在代码仓库里面 Revert,就回滚到上一个版本了。所有的操作在代码仓库里都是可以看到的。 统一配置中心 服务拆分以后,服务的数量非常多,如果所有的配置都以配置文件的方式放在应用本地的话,非常难以管理。 可以想象当有几百上千个进程中有一个配置出现了问题,是很难将它找出来的,因而需要有统一的配置中心,来管理所有的配置,进行统一的配置下发。 在微服务中,配置往往分为以下几类: 一类是几乎不变的配置,这种配置可以直接打在容器镜像里面。 第二类是启动时就会确定的配置,这种配置往往通过环境变量,在容器启动的时候传进去。 第三类就是统一的配置,需要通过配置中心进行下发。例如在大促的情况下,有些功能需要降级,哪些功能可以降级,哪些功能不能降级,都可以在配置文件中统一配置。 统一日志中心 同样是进程数目非常多的时候,很难对成千上百个容器,一个一个登录进去查看日志,所以需要统一的日志中心来收集日志。 为了使收集到的日志容易分析,对于日志的规范,需要有一定的要求,当所有的服务都遵守统一的日志规范的时候,在日志中心就可以对一个交易流程进行统一的追溯。 程序员学习交流集合:点击这里加入(878249276),欢迎一到五年的工程师加入,合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代! 例如在最后的日志搜索引擎中,搜索交易号,就能够看到在哪个过程出现了错误或者异常。 熔断,限流,降级 服务要有熔断,限流,降级的能力,当一个服务调用另一个服务,出现超时的时候,应及时返回,而非阻塞在那个地方,从而影响其他用户的交易,可以返回默认的托底数据。 当一个服务发现被调用的服务,因为过于繁忙,线程池满,连接池满,或者总是出错,则应该及时熔断,防止因为下一个服务的错误或繁忙,导致本服务的不正常,从而逐渐往前传导,导致整个应用的雪崩。 当发现整个系统的确负载过高的时候,可以选择降级某些功能或某些调用,保证最重要的交易流程的通过,以及最重要的资源全部用于保证最核心的流程。 还有一种手段就是限流,当既设置了熔断策略,又设置了降级策略,通过全链路的压力测试,应该能够知道整个系统的支撑能力。 因而就需要制定限流策略,保证系统在测试过的支撑能力范围内进行服务,超出支撑能力范围的,可拒绝服务。 当你下单的时候,系统弹出对话框说 “系统忙,请重试”,并不代表系统挂了,而是说明系统是正常工作的,只不过限流策略起到了作用。 全方位的监控 当系统非常复杂的时候,要有统一的监控,主要有两个方面,一个是是否健康,一个是性能瓶颈在哪里。 当系统出现异常的时候,监控系统可以配合告警系统,及时地发现,通知,干预,从而保障系统的顺利运行。 当压力测试的时候,往往会遭遇瓶颈,也需要有全方位的监控来找出瓶颈点,同时能够保留现场,从而可以追溯和分析,进行全方位的优化。

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

自学Java编程,比培训机构学成的几率大吗?需要注意什么?

作为一个已经写了十几年代码的老程序员,其实无论是自学还是参加培训本质上都是让自己开窍学习,编程相对别的职业入门还是相对难一些,很多人学了一年了,都不没找到学习编程的感觉,更别说是开窍了,编程是一个自我认知不断加强的过程,最厉害的法宝是坚持到底。同样是一个知识点在不同的阶段认知水平差距非常大,这就是自我认知的过程。做一个程序员特别是工作了好多年的,拿出刚入行一年的代码看,几乎已经没法认出是自己写的代码了,思维经过很多层的冲刷已经很难记得最初的烙印了。 说到自学编程,不是什么人都能自学编程并且找到合适的工作,至于是自学什么编程语言本质上都一样,只不过每种编程语言在语法特性上有所差异。 什么人适合自学编程? 1.自制力强,意志坚强 很多人都有一个编程梦,而且都有尝试着自学的冲动,一般开始学的时候都非常有劲头,真正到了展示意志力的时候选择了放弃,不是每个人都适合去自学,意志力是一个长期培养的素质,如果对于意志力没有足够的信心不建议选择自学,编程到了一定程度都需要坚持,毕竟不是每个人上来就具备深刻的计算机思维模式,计算机语感的培养是需要时间的,所以坚持是必要条件。 2.目标性强,让自己保持激情 自学编程完全靠的是自己的一种克制力,要让自己时刻保持一种积极学习的心态,就需要讲究方法策略,就需要有一定的规划,制定每个月每周甚至到每天的计划,不达成目标就要对自己有所惩罚,对自己要狠一些,整天让自己得过且过,保持有这种心态的人很难自学好。 3.懂得获取资源,吸收进自己的知识体系 现在网络上的学习资料多如牛毛,但真要变成自己的需要东西,并且有机的吸收到自己的体系中去需要去学习,很多人学习编程网上找到视频资料就开始呼呼的学起来了,完全按照视频的格式去学习,学的挺嗨,听的也很明白,但就是遇到问题不知道怎么去思考,特别是需要自己独立思考的时候完全不知道怎么去下手,这种属于典型的为了学习而学习的人 要知道自己如何去学,为什么去学,学到什么阶段,距离自己的知识体系的要求还差多少,都没有一个评估,放到做人属于自知之明,学技术就是有的放矢。有了视频对于重点知识的理解就方便了许多,但如果配合书本的学习,想办法让自己在单位时间内学的更多更快。 如果满足上面的一条或者更多就可以考虑自学了,有很多基础很不错的,甚至本身自学已经具备了很强的能力,还是想扩展自己的知识面,参加个培训查漏补缺,培训的目的查漏补缺,很多零基础的人把培训当成救世主了,什么都靠不住,能靠得住的只有自己 培训有两种效果: 1.查漏补缺,自学的时候可能遗漏知识点,知识点学的会更加全面一些 2.催化剂作用,本来自学找不到感觉,可能通过一段时间的培训知道了如何去学习,能起到这种效果就相当不错了 原文发布时间为:2018-10-31 本文作者:东辉在线 本文来自云栖社区合作伙伴“程序员互动联盟”,了解相关信息可以关注“程序员互动联盟”。

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

不要让自己的人生输在职业规划上——自Java程序员

周到的程序员编码在傍晚回家 程序员的职业发展的路程 1.算法与导论 2.设计模式 3.如何预防颈椎病 4.如何治疗颈椎病 5.活着 6.如何转行 这看似一段程序员自黑的段子,但作为老程序员不得不说这真的不是一个段子, 程序员是一个高风险职业,很多人对自己的职业生涯没有清晰的概念,以至于最后落得不得不转行的尴尬局面,这个转行一般有两个原因,一个是技术跟不上,一个是身体吃不消。 今天正好有时间,结合自身的职业生涯规划,来分享一下个人心得,希望有人可以从中借鉴,找到自己的方向。 文中有给大家分享一些架构学习资料,有感兴趣的可以去领取。 1.选择比努力更重要 选择有两个方向,第一是选择企业,第二是选择技术方向, 这里针对不同人群,建议参考两点, 1).对于职场新人,不要过多的考虑钱的因素,要选择大企业,知名企业,这些企业的特点是,工资不低,职责分工明确,对于你的工作风格养成比较有利,最重要的是换工作比较容易。 这里有人可能蹦出来说。小公司更适合新人,可以快速培养一个人多项技能,虽然会累一点,但会学到很多东西,对于有这种思想的人,我只想说并不是你比别人会的多,你就会比别人有发展,个人认为深度比广度更重要 2).对于职场老人,如果你有敏锐的眼光,看出来某个公司未来发展前景一定很好,在这个公司以后晋升,升职加薪都大大的有,那么去没问题,这是最佳选择,如果你们有这样的眼光。也对公司不是特别了解,那我给你的建议只有两点,第一就是公司能不能活,第二就是钱,能存活的公司谁给的钱多,谁就是最佳选择,有时可能还在纠结这个公司技术氛围更好,你去可能学到更多东西,我只想说作为一个老人,学习的内容更多在于自己,别人并不会帮助你太多 技术选择,如果是职场新人,那么只要不选择过时技术就好,你要注意你的技术最起码能养活你十年,就像做winphone的手机开发者就尴尬了 作为老人,多接触一些是好的,但要有一个是主方向,再像新人一样每个方向,这个看几天,那个看几天,只会浪费时间与经历 2.管理与技术那个更重要 这个是一个没有对错的问题,目前国内很多大公司都很注重技术,所以靠干技术混一辈子也是有可能的,但是技术是一条累并且容易过时的东西,一旦你掌握的技术过时,那就只能呵呵了(那些说技术都是想通的,只能骗自己了,hr可不吃你这套) 管理相对来说就稳定的多,管理能力可以扩展到很多技术方向,而且管理的收入也是高于技术的,但也有缺点就是管理的换工作成本更高。 其实我个人认为最好的职业是技术leader,这个要求能力很高,既要技术处于团队领先,并且还有精力来管理自己的团队,对每个成员的工作和职业发展方向有一个清晰的认识和指导 3.节奏很重要 无论在任何一个公司,拥有自己的节奏很重要,无论别人怎么忙,或怎么不忙,都不能打乱,这个节奏的概念比较抽象,更通俗的话就是,工作要有计划和时间观念,不能一味地通过延长时间来完成工作,尽量保持固定的上下班时间和睡眠时间,而且要安排一些锻炼在生活中, 只有掌控自己的节奏才能在工作和健康的生活中达到一个平衡的度 4.未雨绸缪很重要 规划或思维的长期或短期的词 天有不测风云,人有旦夕祸福 尤其是程序员这个职业,谁都不知道自己在这个行业还能混多久,像我这种爱好的确实希望是一辈子,我很享受解决难点的成就感,但谁知道明天如何呢,所以购买一些商业保险就很重要了,除了商业保险,理财也是很重要的,如果你很了解自己的话,你甚至可以计划出来一个自己可以实现财富自由的数字,注意这个可不是像网上传的在北京要有两个多亿,你要是有理财和收入概念你可以清晰的算出一个你的财富自由最低数字,可能只有几百万或一千万(要把房子和车子除外),这个数字并不是完全没有希望的 这次只是想到了这些,希望每个人都有一个好的职业生涯

资源下载

更多资源
腾讯云软件源

腾讯云软件源

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

Nacos

Nacos

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

Spring

Spring

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

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册