编程导航架构话题讨论

架构

15 参与
分享

快来分享你的内容吧~

点击登录,快来和大家讨论吧~
表情
图片
话题
打卡
综合
交流
文章
问答

24 年 “年薪百万” 的 Java 程序员,都要学什么?

大家好,我是程序员鱼皮。前几天我看了一篇由国外的 Java 架构师大佬分享的文章,主题是 “Java 架构师必会的 20 个技术”。 光看这个标题,就知道在国外做 Java 开发,也很卷啊!能学习的技术真的太多了。 我觉得作者讲的很全面,所以总结一下分享给大家,并且专门针对国内 Java 程序员也要学的重点技术做了标注,希望给想成为优秀 Java 开发或架构师的同学一些启发,也可以作为一个 Java 架构师学习路线来看。 注意,不是说以下技术必须都学完才能达到找工作的标准。如果你想成为优秀的架构师,以下技术学的越多越好。 ## Java 架构师必知必会 想成为 Java 架构师,不仅需要对 Java 及其生态系统有深入的理解,还需要紧跟最新的趋势、技术和最佳实践,以构建坚固、可扩展且高效的应用程序。下面就分享 Java 架构师在 2024 年应该掌握的 20 个关键领域,涵盖了微服务、云原生应用、响应式编程和区块链技术等多方面内容。 ### 1、微服务架构 采用微服务架构意味着将一个较大的、完整的应用程序重构为一组较小的、独立部署的服务,这些服务之间松散耦合,允许单独开发和扩展服务。掌握这种架构风格对于现代 Java 架构师至关重要,因为它有助于有效地设计和维护健壮、可扩展和有弹性的系统。 相关技术: - Spring Boot:Java 主流的,用于创建独立的、生产级 Spring 应用程序的强大框架。 - Spring Data:数据访问层框架,能够更轻松地和各种数据库、存储技术进行集成。 - Spring Cloud:为开发人员提供工具以快速构建分布式系统中的开发框架,比如配置管理、服务发现、熔断等。 - Quarkus:专为云原生设计,并针对 GraalVM 和 OpenJDK 进行了优化,能够快速启动项目,并占用更低的内存。 - Panache:跟 Spring Data 类似,能够更轻松地操作数据库的框架。 - Qute:Quarkus 的模板引擎,能够动态渲染内容。 - OpenShift:基于 Kubernetes 的平台,帮助管理和部署容器化应用程序,简化微服务的编排。又包括 OpenShift Service Mesh、OpenShift Pipelines 和 OpenShift Serverless。 对于国内 Java 开发者,Spring Boot、Spring Cloud 是学习重点。 ### 2、云原生应用 云原生应用是一种设计和部署方式,即专为云环境而生的应用,能够最大化利用云计算平台的弹性、可扩展性和自动化特性。举个例子,当应用访问量不大的时候,可以自动缩减应用节点的数量,从而降低企业的成本。 相关技术: - AWS:提供全面的云服务套件。 - Google Cloud Platform:提供一系列计算、存储和应用服务。 - Microsoft Azure:另一个领先的云平台,提供广泛的工具来构建和管理应用程序。 对于国内 Java 开发者,要学会使用大厂云服务平台来部署项目。 ### 3、容器化和编排 容器化是将应用程序及其所有依赖项(例如代码、运行时环境、库、配置文件)打包到一个独立的、标准化的单元中,称为容器。 容器编排是一种自动化管理、调度和扩展容器化应用程序的过程。它涉及多个容器实例的协调工作,确保它们能够在集群中有效地运行。 掌握这些技术,可以提升应用的部署效率,并确保应用在不同环境中顺利运行,提升可扩展性和可靠性。 相关技术: - Docker:最经典的容器技术,让开发者能够在容器中打包和运行应用程序。 - Kubernetes:又叫 K8S,开源的容器编排系统,用于自动部署、扩展和管理容器化应用程序。 - OpenShift:在 Kubernetes 基础上扩展,提供 DevOps 工具以简化容器编排和管理。 对于国内 Java 开发者,要学习如何构建 Docker 镜像并部署项目,但 Kubernetes 了解即可,不用深入研究。 ### 4、响应式编程 响应式编程是一种编程范式,适用于处理异步数据流和事件驱动的应用程序。它强调数据流的处理方式,特别适合于处理实时、交互式和高并发的应用场景。 相关技术: - Project Reactor:用于在 JVM 上构建响应式应用程序的基础库。 - Akka:用于构建高并发、分布式和弹性消息驱动的应用程序的框架。 - RxJava:用于使用可观察序列编写异步和事件驱动程序的库。 - Vert.x:基于事件驱动、非阻塞、支持多语言的响应式编程框架,专为构建高性能的异步应用程序而设计。 对于国内 Java 开发者,以上这些技术接触的估计都不多,Spring 5 其实也提供了响应式编程模块 Spring Webflux,大家任意学习一种,掌握这种编程方式即可。 对了,提到响应式,有些同学可能会想到 Netty,但严格来说,Netty 可不是响应式编程框架,而是一个高性能的网络通讯框架,因为它不具备响应式编程中数据流处理的特性。 ### 5、无服务器计算 无服务器计算(Serverless Computing)并不是指真的不需要服务器,而是简化应用程序的部署和管理,使开发者能够专注于编写代码而不必关注底层的服务器管理和运维细节。 相关技术: - AWS Lambda:一个允许您在不配置或管理服务器的情况下运行代码的服务。 - Azure Functions:一个解决方案,用于在云中轻松运行小块代码或 “函数”。 - Google Cloud Functions:轻量级的事件驱动异步计算解决方案。 对于国内 Java 开发者,学会使用大厂的云服务平台来部署项目即可。 ### 6、事件驱动架构 事件驱动架构是一种软件架构模式,其核心思想是系统的各个组件之间通过事件进行通信和协作。组件可以是独立的微服务、函数或模块,它们通过发送和接收事件来实现松耦合、高内聚的系统设计。 相关技术: - Apache Kafka:一个分布式事件流平台,每天可以处理数万亿个事件。 - RabbitMQ:支持多种消息协议的可靠消息系统。 - AWS SNS/SQS:简单通知服务(SNS)和简单队列服务(SQS),用于可扩展的消息队列。 对于国内 Java 开发者,要理解事件驱动架构是什么,并且学会使用任意一种消息队列(比如 RabbitMQ 或 Kafka)来实现这种架构。消息的发送和消费就可以理解为事件的发送和接受。 ### 7、安全校验 实施强大的安全措施以保护应用程序免受威胁和漏洞的侵害是任何架构师的首要任务。 相关技术: - Spring Security:一个强大且可定制的身份验证和访问控制框架。 - OWASP 工具:来自开放 Web 应用程序安全项目的各种工具和资源。 - JWT (JSON Web Tokens):用于在两方之间传输紧凑的、URL 安全的信息。 对于国内 Java 开发者,JWT 和 Spring Security 是必学的,可以用它们实现登录、授权、权限管理功能。 ### 8、DevOps 和 CI/CD DevOps 是一种整合了开发和运维的实践和方法论,是指通过自动化和协作来加速软件交付和增强产品质量。 CI/CD 是 DevOps 实践的关键组成部分。CI 指持续集成,开发人员频繁地将代码集成到共享存储库中,并通过自动化构建和测试来验证代码的可靠性。CD 指持续部署(交付),通过持续集成流程验证的代码能够自动做好部署到生产环境的准备,但是部署过程可能需要人工触发。 相关技术: - Jenkins:一个开源自动化服务器,支持构建、部署和自动化项目。 - GitLab CI/CD:提供与 GitLab 集成的强大 CI/CD 管道支持。 - Travis CI:一个用于构建和测试托管在 GitHub 上的项目的持续集成服务。 对于国内 Java 开发者,通过 GitHub Actions 或 GitLab CI/CD 来了解怎么使用 CI/CD 即可,不必自己搭建一个 CI/CD 系统了,一般公司也会提供现成的平台。 ### 9、API 和集成 设计健壮的 API 以确保不同系统之间的无缝通信,这是微服务和混合云环境的关键。 相关技术: - REST:一种设计网络应用程序的架构风格。 - GraphQL:用于 API 的查询语言,可以根据预定义的数据类型系统来执行查询。 - OpenAPI/Swagger:用于设计、构建、记录和使用 RESTful Web 服务的工具(接口文档)。 对于国内 Java 开发者,要能够熟练地设计出一套 RESTful 的 API,并且要会使用 Swagger 为项目快速生成接口文档。至于 GraphQL,不是必学的,但是也建议了解一下,有助于提升基于数据定义的系统设计思维。 ### 10、数据管理和 NoSQL 数据库 数据库是 Java 开发的基本功,能够有效管理和处理大量数据、并且理解 NoSQL 数据库,对于开发高性能、可扩展的程序至关重要。 相关技术: - MySQL:主流的关系型数据库,不多说了。 - MongoDB:一个具有按需查询和索引功能的、灵活的、可扩展的文档数据库。 - Cassandra:一个设计用于处理大量数据的分布式 NoSQL 数据库管理系统。 - Redis:分布式的内存键值对存储数据库,可用作缓存和消息代理。 对于国内 Java 开发者,MySQL 和 Redis 是必学的,同时最好了解下 MongoDB 和 MySQL 的区别,Cassandra 不是必学项。 ### 11、分布式系统 设计和管理具有高可用性和容错能力的分布式系统,这对于企业大规模应用程序的开发至关重要。 相关技术: - Apache Zookeeper:分布式协调服务,可用于维护配置信息、实现名字服务、提供分布式同步、提供组服务等。 - Consul:提供服务发现、配置和分段功能的中间件。 - Netflix Eureka:一个基于 REST 的服务,主要用于 AWS 云中,可用于实现服务注册和发现,以进行负载均衡和故障切换。 对于国内 Java 开发者,推荐学习 Dubbo RPC 框架、Zookeeper 中间件和 Spring Cloud 框架,基本上就能够开发分布式系统了。Zookeeper 一定要认真学,这玩意的应用场景太多了,很多大数据组件(比如 Hadoop)都用到了 Zookeeper 来实现高可用。 ### 12、并发和并行 其实就是并发编程嘛,如何编排设计出合理的并发程序、如何利用并发和并行提高执行效率,是架构师要掌握的关键技能。 相关技术: - Java 并发框架:比如经典的 JUC,提供了很多并发类库。 - Fork/Join 框架:简化了并行应用程序的开发过程。 - Reactive Streams:提供一个具有非阻塞背压特性的异步流处理标准。 对于国内 Java 开发者,JUC 是必备技能,刚开始学习时,先会用 JUC 中的类来实现并发即可;等有时间了,需要阅读一些并发编程相关的书籍,理解并发编程底层的原理、并通过实际项目开发来提升并发程序的设计能力。 ### 13、性能调优和优化 调优技术也是区分开发者和架构师能力的关键,架构师需要定期调优 Java 应用程序,确保其在不同条件和规模下高效运行。 相关技术: - Java Mission Control:用于监控、管理和故障排除 Java 应用程序的一套工具。 - VisualVM:一个集成了多个命令行 JDK 工具和轻量级性能分析功能的可视化工具。 - JProfiler:一个强大的 Java 分析器,有助于排除性能瓶颈。 对于国内 Java 开发者,可以先通过做项目和阅读文章掌握一些基本的程序优化思路,等有一定开发能力后,可以专门去学习下 JVM 原理、以及如何使用工具来分析和调优 JVM。 ### 14、理解 Java 生态系统和更新 虽然大多数开发者使用的都是老版本的 Java(比如 Java 8),但架构师可不能只会 Java 8,要持续理解 Java 的更新和生态系统,确保使用最有效和安全的版本特性。 相关技术: - JDK 17+:最新的长期支持 (LTS) 版本的 Java。 - OpenJDK:Java 平台标准版的免费开源实现。 对于国内 Java 开发者,大多数项目用 Java 8 就足够了,但是也建议学习下 Java 11 和 Java 17 的新特性,现在用这些版本的公司也越来越多了。 ### 15、架构模式和最佳实践 架构师架构师,要能够根据具体的场景设计选择合适的架构模式,使应用程序更加健壮和可维护。 相关技术: - MVC (模型-视图-控制器):开发用户界面常用的架构模式,比如 Spring MVC 框架。 - CQRS (命令查询责任分离):一种将读取和更新操作分离到数据存储中的模式。 - Event Sourcing(事件溯源):将业务实体的状态存储为状态变化事件的序列。 对于国内 Java 开发者,MVC 应该是最熟悉的,不多说了。在能够熟练开发出基本的 CRUD 程序后,建议学习下 23 种经典的策略模式,尤其是单例模式、工厂模式、策略模式、代理模式等等,有助于我们设计出可扩展的程序,并且更好地学习大佬的源码。 ### 16、测试和测试驱动开发 (TDD) TDD(Test-Driven Development)是一种软件开发方法论,其实很好理解,就是在编写实际代码之前,先编写测试代码,然后持续编写代码直到所有测试都通过。这样做可以帮助开发者更全面地覆盖代码的各个分支和边界条件,而且每次修改后立即运行测试,能够快速获得程序正确与否的反馈。 相关技术: - JUnit:一个简单的单元测试框架,用于编写可重复的测试。 - Mockito:一个用于 Java 单元测试的模拟框架。 - Selenium:用于测试网页应用的框架,是一个经典的爬虫工具。 对于国内 Java 开发者,必须要会使用 JUnit 编写单元测试,Mockito 的学习成本不高,最好也去了解下如何使用。TDD 了解一下就好,一般自己做项目也很少用到,企业中也有专门的测试同学出用例。 ### 17、图数据库 图数据库能够高效地处理高度连接的数据,这在现代应用开发中越来越重要。 相关技术: - Neo4j:高度可扩展的本地图数据库,专门设计用于管理和利用数据之间的关系。 - Amazon Neptune:一个完全托管的图数据库服务。 - ArangoDB:一种本地多模型数据库系统。 对于国内 Java 开发者,图数据库的应用并不多(相比于 MySQL、MongoDB 来说),不是必学的技术,作为扩展知识了解即可。 ### 18、大数据与分析 利用大数据技术和分析工具对大型数据集进行处理,是从中提取宝贵见解所必不可少的。 相关技术: - Apache Hadoop:知名的大数据开源框架,允许在集群上进行大数据集的分布式处理。 - Apache Spark:统一的大规模数据处理分析引擎。 - Elasticsearch:一个分布式的、RESTful 的搜索和分析引擎。 对于国内 Java 开发者,大数据也不是必学的技术,但 Elasticsearch 是需要学习的,因为它的核心应用场景是搜索,而搜索几乎是每个应用都要有的功能。大数据开发和 Java 开发有一定的相关性(比如都要写 SQL),在学完后端技术栈后,建议大家优先去学大数据,能够学到很多数据处理的方法和分布式的思想,便于后续开发中处理海量的数据。 ### 19、人工智能与机器学习 现在 AI 有多火不言而喻,学习人工智能和机器学习也能够为我们成为优秀的架构师增加可能性和竞争力。 相关技术: - TensorFlow:一个开源机器学习库。 - Deeplearning4j:面向 JVM 的深度学习库。 - Weka:一组用于数据挖掘任务的机器学习算法。 人工智能的学习成本还是很高的,对于国内 Java 开发者,先会调用别人提供的大模型接口,能利用 AI 开发出应用程序就行。 ### 20、区块链技术 理解区块链的基本原理及其潜在应用,可以帮助我们设计出更安全的、去中心化的应用程序。 相关技术: - Hyperledger Fabric:一个具有权限控制能力的区块链基础设施。 - Ethereum:一个运行智能合约的去中心化平台。 - Corda:专为企业设计的开源区块链平台。 虽然 Java 不是区块链开发的主语言,但是我也建议 Java 开发者接触下区块链、学习如何开发去中心化的程序,毕竟技术是好的。 ## 最后 以上就是本期分享,搞了好几千字,可以看到,想成为一名优秀的 Java 架构师还是很不容易的。学无止境,希望朋友们能持续关注最新技术、学习最佳实践,蹭蹭涨薪。

DDD学习笔记第一节:DDD 是什么?

# DDD 是什么? DDD 是领域驱动设计(Domain-Driven Design)的缩写,这是一种主要软件开发方法,由 Eric Evans 在他的书《领域驱动设计:软件核心复杂性应对之道》(Domain-Driven Design: Tackling Complexity in the Heart of Software)中首次提出。 DDD 主要关注于创建与业务领域紧密相关的软件模型,以确保软件能够准确地解决实际问题。 ## DDD 和核心理念 DDD 的核心理念包括以下几个方面: 1. 领域模型(Domain Model) 领域模型是对特定业务领域知识的精确表述,它包括业务中的实体(Entities)、值对象(Value Objects)、服务(Services)、聚合(Aggregates)、聚合根(Aggregate Roots)等概念。领域模型是DDD的核心,它反映了业务专家的语言和决策。 2. 统一语言(Ubiquitous Language) 统一语言是开发团队与业务专家共同使用的语言,它在整个项目中保持一致。统一语言确保所有人都对业务概念有着相同的理解,减少沟通成本和误解。 1. 限界上下文(Bounded Context): 2. 限界上下文是明确界定的系统边界,在这个边界内部有一套统一的模型和语言。不同的限界上下文之间可能有不同的模型,它们通过上下文映射(Context Mapping)来进行交互和集成。 3. 聚合(Aggregate): 聚合是一组相关对象的集合,它们被视为数据修改的单元。每个聚合都有一个聚合根,它是外部对象与聚合内部对象交互的唯一入口。 4. 领域服务(Domain Services): 当某些行为不自然属于任何实体或值对象时,这些行为可以被定义为领域服务。领域服务通常表示领域中的一些操作或业务逻辑。 5. 应用服务(Application Services): 应用服务是软件的一部分,它们协调领域对象来执行任务。它们负责应用程序的工作流程,但不包含业务规则或知识。 6. 基础设施(Infrastructure): 基础设施包括为领域模型提供持久化机制(如数据库)、消息传递、应用程序的配置等技术组件。 7. 领域事件(Domain Events): 领域事件是领域中发生的有意义的业务事件,它们可以触发其他子系统的反应或流程。 **总结** DDD 的目标是通过将软件的关注点集中在核心领域上,并通过丰富的领域模型来管理复杂性,从而提高软件的质量和维护性。DDD 强调与业务专家的紧密合作,以确保软件解决方案能够准确反映业务需求。通过这种方法,软件开发团队可以创建出更加灵活、可扩展且与业务紧密结合的系统。 DDD所提到的软件设计方法涵盖了:范式、模型、框架、方法论,主要活动包括建模、测试、工程、开发、部署、维护。 ## 范式 (Paradigms) 范式是指软件设计和开发的基本风格或哲学。它通常定义了编程的基本原则和模式。常见的软件设计范式包括: 1. 结构化编程:强调程序结构的重要性,使用顺序、选择和循环控制结构。 2. 面向对象编程 (OOP):基于对象的概念,将数据和处理数据的方法封装在一起。 3. 函数式编程:将计算视为数学函数的评估,避免状态改变和可变数据。 4. 事件驱动编程:以事件为中心,响应用户操作、消息或其他系统事件。 ## 模型 模型是对软件系统的抽象表示,用于帮助理解、设计和测试系统。常用的软件设计模型包括: 1. UML (统一建模语言):一套图形化的建模语言,用于描述、设计和文档化软件项目。 2. ER模型 (实体-关系模型):用于数据库设计,描述数据的实体及其之间的关系。 3. 状态机模型:描述系统可能的状态、事件和在这些事件发生时的转换。 ## 框架 (Frameworks) 框架是一套预先制定的代码库和组件,用于提供软件开发的骨架。框架通常定义了应用程序的结构,提供了一组通用的功能和模式,以便开发者可以专注于实现特定的业务逻辑。例如: 1. Spring Framework:一个用于Java应用程序的全面编程和配置模型。 2. Django:一个高级Python Web框架,鼓励快速开发和干净、实用的设计。 3. Gin:一个 Go 的 Web 应用框架 ## 方法论 (Methodologies) 方法论是指一套指导软件开发过程的规则和实践。它包括项目管理、开发流程、团队协作等方面。常见的软件开发方法论有: 1. 敏捷开发:一种迭代和增量的开发方法,强调灵活性和客户合作。 2. Scrum:一种敏捷开发框架,用于管理复杂的软件和产品开发。 3. 瀑布模型:一种线性顺序的开发方法,将项目分为不同阶段,每个阶段完成后才能进入下一个阶段。 主要活动 软件设计的主要活动包括: 1. 建模 (Modeling) :通过创建模型来表示系统的不同方面,如使用UML图来描述系统架构。 2. 测试 (Testing) :确保软件的质量,包括单元测试、集成测试、系统测试和验收测试。 3. 工程 (Engineering) :应用工程原则和实践来构建软件,包括需求分析、设计、实现和测试。 4. 开发 (Development) :编写代码和实现功能,将设计转化为实际的软件产品。 5. 部署 (Deployment) :将软件发布到生产环境,使其可供用户使用。 6. 维护 (Maintenance) :在软件发布后对其进行更新和改进,修复缺陷,提升性能和适应性。 每个活动都是软件开发生命周期的重要组成部分,它们相互依赖,共同确保软件项目的成功。 ## 维护 (Maintenance) 软件维护是在软件发布后进行的活动,包括以下几个方面: 1. 纠错:修复软件中发现的缺陷或错误。 2. 适应性维护:修改软件以适应环境的变化,如操作系统升级、硬件更换等。 3. 完善性维护:增加新功能或提升性能,以满足用户新的或变化的需求。 4. 预防性维护:改进软件内部结构,以防止潜在的问题发生,提高软件的可维护性和可扩展性。 软件维护是一个持续的过程,它确保软件能够长期有效地服务于用户。 ## 总结 软件设计方法是一个复杂的领域,涉及多种概念和实践。范式提供了设计哲学,模型帮助我们理解和抽象系统,框架为开发提供了基础结构,方法论指导整个开发过程。软件设计的主要活动——建模、测试、工程、开发、部署和维护——是确保软件项目成功的关键步骤。每个活动都需要专业知识和技能,以及对应的工具和技术的支持。通过这些活动的协同工作,软件工程师能够交付高质量、满足用户需求的软件产品。

【架构师】零基础到精通——注册中心

所有基础的笔记都在这里面啦 ,[百万笔记共创知识库](https://www.yuque.com/icu0),点击左边蓝字即可获取!助力每一位开发者! # 注册中心 注册中心主要是为分布式服务的**发布与发现**提供一层统一标准化的基础组件,便于使用者直接操作简单接口即可实现服务发布与发现功能。 ## 1、服务注册 服务注册有两种形式:**客户端注册**和**代理注册**。 ### 1-1、客户端注册 客户端注册是服务自己要负责注册与注销的工作。当服务启动后注册线程向注册中心注册,当服务下线时注销自己。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/e16083d7fddb41aeb2465b1d0de77df7.png) 这种方式缺点是注册注销逻辑与服务的业务逻辑耦合在一起,如果服务使用不同语言开发,那需要适配多套服务注册逻辑。 ### 1-2、代理注册 代理注册由一个单独的代理服务负责注册与注销。当服务提供者启动后以某种方式通知代理服务,然后代理服务负责向注册中心发起注册工作。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/36bb599c15a94d0dbbc6e29a3dcb0023.png) 这种方式的缺点是多引用了一个代理服务,并且代理服务要保持高可用状态。 ## 2、服务发现 服务发现也分为客户端发现和代理发现。 ### 2-1、客户端发现 客户端发现是指客户端负责向注册中心查询可用服务地址,获取到所有的可用实例地址列表后客户端根据**负载均衡**算法选择一个实例发起请求调用。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/7b7d109f57a24dc8ae8c548011c45ed4.png) 这种方式非常直接,客户端可以控制负载均衡算法。但是缺点也很明显,获取实例地址、负载均衡等逻辑与服务的业务逻辑耦合在一起,如果服务发现或者负载平衡有变化,那么所有的服务都要修改重新上线。 ### 2-2、代理发现 代理发现是指新增一个路由服务负责服务发现获取可用的实例列表,服务消费者如果需要调用服务A的一个实例可以直接将请求发往路由服务,路由服务根据配置好的负载均衡算法从可用的实例列表中选择一个实例将请求转发过去即可,如果发现实例不可用,路由服务还可以自行重试,服务消费者完全不用感知。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/b8163c910f474761953c45e57e047783.png) ## 3、心跳机制 如果服务有多个实例,其中一个实例出现宕机,注册中心是可以实时感知到,并且将该实例信息从列表中移出,也称为摘机。如何实现摘机?业界比较常用的方式是通过心跳检测的方式实现,心跳检测有**主动**和**被动**两种方式。 ### 3-1、被动检测 **被动检测**是指服务主动向注册中心发送心跳消息,时间间隔可自定义,比如配置5秒发送一次,注册中心如果在三个周期内比如说15秒内没有收到实例的心跳消息,就会将该实例从列表中移除。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/f125bca115a04a41a392cb6720e4b8ef.png) 上图中服务A的实例2已经宕机不能主动给注册中心发送心跳消息,15秒之后注册就会将实例2移除掉。 ### 3-2、主动检测 **主动检测**是注册中心主动发起,每隔几秒中会给所有列表中的服务实例发送心跳检测消息,如果多个周期内未发送成功或未收到回复就会主动移除该实例。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/f4a2239310f446e0806c2324dd65e883.png) ## 4、Dubbo注册中心 ### 4-1、核心功能 针对使用者,主要关注注册中心的以下五个核心接口,通过以下五个核心接口,可以实现服务的动态发布、动态发现以及优雅下线等操作: - **注册服务**:将服务提供者的URL暴露至注册中心 - **注销服务**:从注册中心将服务提供者的地址进行摘除 - **订阅服务**:将从注册中心订阅需要消费的URL至本地,当注册中心的服务清单发展变化时,自动通知订阅者 - **退订服务**:取消向注册中心订阅的服务监听者 - **查找服务**:向注册中心查找指定的服务清单列表 ### 4-2、生产特性 Zookeeper会有一些未知的问题出现,所以需要生产特性来应对各种可能出现的问题,从而提升产品的质量。该类功能针对使用者一般情况是没办法直接感受到,但其发挥的作用就是保障产品的高质量服务: - **自动重连**:与Zookeeper或Redis的连接断开后,支持自动重新连接 - **自动切换**:与Zookeeper或Redis的连接失败后,支持自动切换 - **自动清理**:Zookeeper或Redis中的数据过期后,支持自动清理(超时自动摘除) - **自动恢复**:与Zookeeper或Redis自动重连成功后,支持自动恢复(即再次发起注册、订阅或监听动作) - **自动重试**:失败自动重试(注册、注销、订阅、退订、监听和取消监听失败,无限重试至成功为止) - **自动缓存**:Client订阅的服务清单会自动离线缓存至JVM本地的文件(变更通知时更新) ## 5、业界方案 下面结合各个维度对比一下各组件: | **方案** | **优点** | **缺点** | **访问协议** | **一致性算法** | | :------------ | :----------------------------------------------------------- | :----------------------------------------------------------- | :----------- | :------------- | | **Zookeeper** | 1.功能强大,不仅仅只是服务发现;2.提供watcher机制可以实时获取服务提供者的状态;3.广泛使用,dubbo等微服务框架已支持 | 1.没有健康检查;2.需要在服务中引入sdk,集成复杂度高;3.不支持多数据中心 | TCP | Paxos(CP) | | **Consul** | 1.开箱即用,方便集成;2.带健康检查;3.支持多数据中心;4.提供web管理界面 | 不能实时获取服务变换通知 | HTTP/DNS | Raft(CP) | | **Nacos** | 1.开箱即用,适用于dubbo,spring cloud等;2.AP模型,数据最终一致性;3.注册中心,配置中心二合一(二合一也不一定是优点),提供控制台管理;4.纯国产,各种有中文文档,久经双十一考验 | 刚刚开源不久,社区热度不够,依然存在bug | HTTP/DNS | CP+AP | | **Eureka** | | | HTTP | AP | ### 5-1、Zookeeper ![在这里插入图片描述](https://img-blog.csdnimg.cn/eb57f5426ba148f08213c97d75c8c288.jpeg) ### 5-2、Consul Consul是HashiCorp公司推出的开源工,使用Go语言开发,具有开箱即可部署方便的特点。Consul是分布式的、高可用的、 可横向扩展的用于实现分布式系统的服务发现与配置。 **Consul有哪些优势?** - 服务注册发现:Consul提供了通过DNS或者restful接口的方式来注册服务和发现服务。服务可根据实际情况自行选择 - 健康检查:Consul的Client可以提供任意数量的健康检查,既可以与给定的服务相关联,也可以与本地节点相关联 - 多数据中心:Consul支持多数据中心,这意味着用户不需要担心Consul自身的高可用性问题以及多数据中心带来的扩展接入等问题 **Consul的架构图** ![在这里插入图片描述](https://img-blog.csdnimg.cn/38ae807b7ecf4b15b71ee4f5456342e5.png) Consul 实现多数据中心依赖于gossip protocol协议。这样做的目的: - 不需要使用服务器的地址来配置客户端;服务发现是自动完成的 - 健康检查故障的工作不是放在服务器上,而是分布式的 **Consul的使用场景** Consul的应用场景包括**服务注册发现**、**服务隔离**、**服务配置**等。 - **服务注册发现场景**中consul作为注册中心,服务地址被注册到consul中以后,可以使用consul提供的dns、http接口查询,consul支持health check - **服务隔离场景**中consul支持以服务为单位设置访问策略,能同时支持经典的平台和新兴的平台,支持tls证书分发,service-to-service加密 - **服务配置场景**中consul提供key-value数据存储功能,并且能将变动迅速地通知出去,借助Consul可以实现配置共享,需要读取配置的服务可以从Consul中读取到准确的配置信息 ### 5-3、Nacos ![在这里插入图片描述](https://img-blog.csdnimg.cn/b4310068e13b419ba53fcf5105b7d990.png) Nacos 英文全称为 Dynamic Naming and Configuration Service,是一个由阿里巴巴团队使用 Java 语言开发的开源项目。 Nacos 是一个更易于帮助构建云原生应用的动态服务发现、配置和服务管理平台(参考自 Nacos 官网)。 Nacos 的命名是由 3 部分组成: ![在这里插入图片描述](https://img-blog.csdnimg.cn/bc95faa9888744bf98195c73726fd07f.png) Nacos 作为服务注册中心经历了十年“双十一”的洪峰考验,具有简单易用、稳定可靠、性能卓越等优点,可以帮助用户更敏捷、容易地构建和管理微服务应用。

互联网公司经典技术架构

互联网公司技术架构,微信/淘宝/微博/腾讯/阿里/美团点评/百度/Google/Facebook/Amazon/eBay的架构 地址:https://github.com/davideuler/architecture.of.internet-product

Aliyun Java Initializr

Java 开发者福利,springboot脚手架、应用框架还能进行选择MVC、分层架构、COLA(DDD)等. 地址:https://start.aliyun.com/bootstrap.html

JimmyCoding

一个热爱技术的up主。频道包含丰富技术话题,从设计模型,架构框架,云原生技术,到技术人软技能感悟等均有深刻分享。很多技术分享不仅有深刻的原理剖析,更有代码讲解。强烈推荐给大家。 地址:https://space.bilibili.com/1611831474

NGINX中文官网

地址:https://www.nginx-cn.net/

VeryNginx

VeryNginx 基于 lua_nginx_module(openrestry) 开发,实现了高级的防火墙、访问统计和其他的一些功能。 集成在 Nginx 中运行,扩展了 Nginx 本身的功能,并提供了友好的 Web 交互界面。 地址:https://github.com/alexazhou/VeryNginx

Nginx Controller

NGINX Controller是所有NGINX Plus实例的集中管理平台。 使用Controller,您可以在多云环境中轻松管理多个NGINX Plus服务器。 使用直观的向导样式界面,您可以创建NGINX Plus的新实例,并集中配置负载平衡,URL路由和SSL终止等功能。 Controller具有丰富的监控和警报功能,有助于确保应用程序的可用性,性能和可靠性。 Controller基于最佳实践提供对200个关键指标和抢先推荐的深入可见性, 使ITOps和DevOps团队能够首先避免性能问题,并解决可能出现的任何问题。 地址:https://www.nginx.com/products/nginx-controller/

Nginx

地址:http://nginx.org/en/download.html

下载 APP