java微服务设计学习(三)服务治理之服务注册与发现Ric.Studio进击的程序员笔记

在微服务大行其道的今天,服务的粒度被拆分得非常细,随之而来的是服务数量的迅速增长。在云原生的浪潮中,服务治理更多情况下与容器调度平台结合,共同形成一站式的自动化调度治理平台。

当然无论是否使用基于容器的调度系统,服务治理的原理和范畴都不会发生改变,只是实现方式不同而已。

服务治理主要包括服务发现、负载均衡、限流、熔断、超时、重试、服务追踪等。我们今天要讲的,就是服务发现的内容。

本章主要介绍以下内容:

现在,让我们开始本次的旅程吧。

服务发现指的是寻找一个serviceprovider的网络位置信息。

具体指的是,使用一个注册中心来记录分布式系统中全部服务的信息,以便让其他服务能够快速找到这些已经注册的服务。

服务发现是支撑大规模SOA和微服务架构的核心模块,需要具有服务注册、服务查找、服务健康检查和服务变更通知等关键功能。

因为没有服务发现模块的话,服务网络位置信息的配置会耦合在具体服务消费者的配置当中,从而导致系统难以维护。

想想这么一个基本的问题:服务消费者们是如何知道服务提供者的IP和端口的呢?

在简单的体系架构中,静态配置(比如DNS、Nignx负载均衡配置等)的方法可以很好的解决问题。每个服务都部署在同一个位置,并且很少更改。没有弹性伸缩的需求。传统的单体式应用的网络地址发生变化的概率较小,在发生变化的时候,运维人员手动更新、加载配置文件即可。

但是在微服务架构中并非如此,微服务更新、发布频繁,并且经常会根据负载情况进行弹性伸缩,因为微服务应用实例的网络地址变化是一个很常态的事情,而我们前面提到的静态配置的解决方案,显然不适合这么一个高度动态的场景。所以,我们需要提供一种机制(模块),让服务消费者在服务提供者的IP地址发生变化的时候能够快速及时地获取到最新的服务信息。

前面说过,使用一个注册中心来记录分布式系统中全部服务的信息,以便让其他服务能够快速找到这些已经注册的服务。

让我们用两个例子来说明服务发现运作的机制(简单版本):

当bizservice采用集群架构,有更多的节点上线时,整个工作流是怎么样的呢?

虽然“服务发现”的整个运行机制理解起来很简单,但是在实际的分布式场景下,作为微服务架构体系的一个核心,我们肯定需要采用搭建集群的方式,保证其高可用性。这时候,就需要考虑一个分布式系统可能会遇到的一些问题。

在一个分布式的计算机系统中,只能同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partitiontolerance)这三个基本特性中的两个,这就是著名的CAP定理。

对于分布式系统来说,分区容错性是必须满足的。因此,必须要在一致性和可用性之间进行取舍,这就是所谓的“选择AP还是选择CP”。

对于服务发现和注册中心集群来说,如果选择一致性而牺牲可用性(选择CP)的话,那么为了保证多点服务中心上的数据一致,一旦某个点的服务中心宕机,服务中心集群都需要暂停对外提供数据写入服务。在保证服务中心集群的数据一致的同时,牺牲了写入服务的可用性。如果选择可用性而牺牲一致性(选择AP)的话,那么为了保证服务不中断,当某个点的服务中心宕机时,仍然存活的服务中心节点可以选择先将数据写入本地存储然后直接返回客户端,但这样又将导致多个节点之间的数据不一致。

业界提供的用于服务发现注册的系统,本质上都是满足AP或CP的系统。

在分布式服务体系中,所有的服务提供者和消费者都依赖于【服务中心】,如果服务中心出现问题,将会出现服务状态感知不敏感等现象,且波及整个系统。因此,保证用于服务发现的注册中心的可用性至关重要。为保证注册中心的可用性,要保证多节点部署,如果是大型网站后台通常还要跨多机房进行部署,以确保注册中心在单一机房不可用的情况下仍然可以提供服务。具有高可用特性的服务中心需要具备以下几个能力:

在下面的章节中,我们将介绍几个常见的可直接作为注册中心的产品。

Zookeeper致力于提供一个高可用且具有严格顺序访问控制能力的分布式协调系统,它是一个分布式数据一致性的解决方案。

ZooKeeper提供了分布式通知和协调、配置管理、命名服务、主节点选举、分布式锁、分布式队列等完善的解决方案。其中分布式通知和协调被广泛用于服务发现。至今为止,它是服务发现领域历史最为悠久、使用最为广泛的产品。

Zookeeper的读写机制和一致性协议决定了它是一个CP系统。

ZooKeeper作为使用最为广泛的分布式协调组件,优点非常多。使用广泛就是它最大的优点,这也使得ZooKeeper很容易在架构师进行技术选型时占据优势。但是,需要明确说明的是,Zookeeper并不是服务发现领域的最佳选择了,它的优势主要体现在选举和分布式锁等分布式强一致性的场景中。当ZooKeeper的主节点因为网络故障与其他节点失去联系而触发整个系统选举时,集群是不可用的,这将导致注册服务体系在选举期间瘫痪。

服务中心对数据一致性的要求并不是非常苛刻的,也难于做到实时感知宕机(会有时延),它更看重的是自愈能力。通过Zookeeper的客户端Curator的缓存能力能够让ZooKeeper在服务发现领域的适配度更高,但这并非ZooKeeper的原生能力和设计初衷。

随着CoreOS和Kubernetes等项目在开源社区日益火热,它们项目中都用到的etcd组件作为一个高可用、强一致性的服务发现存储仓库,渐渐走进开发人员的视野。

相比Zookeeper,etcd还具有以下优点:

Eureka比ZooKeeper这类的CP系统更加适合作为服务发现体系中的注册中心。Eureka优先保证了可用性,它采用了去中心化的设计理念,整个服务集群由对等节点组成,无须像ZooKeeper那样选举主节点。集群中失效的节点不会影响正常节点对外提供服务注册和服务查询能力。Eureka客户端有失效转移的能力,如果在向某个Eureka服务器注册服务时发现连接失败,则会自动切换至其他节点。因此,只要有一台Eureka服务器节点还能够正常工作,就无须担心注册中心的可用性。但是,保证可用性必然造成数据一致性的缺失,客户端查询到的信息不一定是最新的。

Consul使用Go语言编写,因此具有天然可移植性(支持Linux、windows和MacOSX);安装包仅包含一个可执行文件,方便部署,与Docker等轻量级容器可无缝配合。

和etcd一样,Consul基于raft协议,要求必须过半数的节点都写入成功才认为注册成功Leader挂掉时,重新选举期间整个Consul不可用。保证了强一致性但牺牲了可用性。

Nacos是我们国内阿里巴巴的新开源项目,其核心定位是“一个更易于帮助构建云原生应用的动态服务发现、配置和服务管理平台”。(通俗的理解就是,注册中心+配置中心)

服务(Service)是Nacos世界的一等公民。Nacos支持几乎所有主流类型的“服务”的发现、配置和管理:

THE END
1.微服务架构的设计模式?(Java微服务架构如何设计模式)在当今的软件开发领域,微服务架构已经成为了一种主流的架构模式。而设计模式作为软件开发中的重要概念,对于构建高效、可维护的 Java 微服务架构起着关键的作用。本文将详细介绍 Java 微服务架构中如何设计模式,帮助读者更好地理解和应用这一技术。 二、设计模式的重要性 https://www.528045.com/article/ag3rokriar.html
2.Java编程基础教程:Java微服务架构java微服务架构的软件开发Java编程基础教程:Java微服务架构 本文介绍了微服务架构的核心概念,包括服务、边界上下文、API Gateway、服务注册中心等,并详细阐述了如何使用Spring Cloud搭建微服务系统,包括Eureka服务注册与发现、Zipkin分布式追踪、Ribbon负载均衡和Hystrix容错管理。通过实例展示了如何启动和测试微服务,以及使用Zipkin进行服务调用追踪。https://blog.csdn.net/universsky2015/article/details/134390649
3.Java微服务入门教程:从零开始搭建你的第一个微服务本文介绍了Java微服务的开发环境搭建,包括Spring Boot和Spring Cloud的使用,以及如何通过REST API进行服务间通信。文章还详细讲解了服务发现、配置管理和监控,帮助开发者快速理解和实践微服务架构。 微服务简介 微服务的概念 微服务是一种架构风格,它将一个大系统拆分为多个小服务,每个小服务独立运行并且互相协作,提供整个系https://www.imooc.com/article/365652
4.Java微服务架构中的关键技术和设计原则解读javaJava被广泛应用于各种领域,包括桌面应用程序、移动应用程序(尤其是Android)、Web应用程序、企业级应用程序、云计算和物联网(IoT)。由于其稳定性、安全性和跨平台特性,Java仍然是最受欢迎的编程语言之一。 二、什么是微服务 微服务(Microservices)是一种软件开发架构风格,它将一个大型应用程序分解为一组小型、独立的服务https://www.jb51.net/program/330022kqh.htm
5.丰富的Java资源学习整理!SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,史上最全面的springcloud微服务技术栈课程|Java微服务 2.分布式开发框架Dubbo 学完这套课程后,可以应对企业级分布式项目中Dubbo的使用,并可以解决服务超时、重试、服务降级、集群容错等问题。 Dubbo快速入门,Java分布式框架必会的dubbo教程 http://54xdj.com/BlogsHome/Detail?id=848
6.Java开发全栈知识体系架构学习(服务器微服务数据库思维导2021年从入门到精通java开发全栈知识体系架构学习总结知识脑图(学习使用于项目实战)前端、后台、服务器、Linux、性能优化、集群搭建、微服务、大数据、项目实战等内容 Java JVM sql优化 springMVC spring cloud 作者其他创作 大纲/内容一、前端技术篇 1、基础知识篇 HTML CSS 去除a标签默认样式 分支主题 https://www.processon.com/view/60504b5ff346fb348a93b4fa
7.微服务全生命周期稳定性实践(二)学习笔记简介:快速学习微服务全生命周期稳定性实践。 开发者学堂课程【微服务全生命周期稳定性实践 :微服务全生命周期稳定性实践(二)】学习笔记,与课程紧密联系,让用户快速学习知识。 课程地址:https://developer.aliyun.com/learning/course/1205/detail/18172 微服务全生命周期稳定性实践 https://developer.aliyun.com/article/1121633
8.史上最强Java学习路线图(6大必学阶段)–mikechenJava学习路线的第一阶段,我认为需要打好坚实的基础。 1.编程基础 常量与变量 数据类型 运算符 流程控制语句 方法 数组 2.面向对象 继承 多态 重写(Override) 重载(Overload) 封装 接口 java包 package 3.泛型(Generic ) 泛型的使用场景 泛型类型 泛型方法 https://youzhixueyuan.com/java-programmers-learn-route.html
9.SpringCloud学习笔记:SpringCloud代码Demo集,内含2w字技术栈导学核心代码位置:在模块 dubbo+zookeeper 下这部分是跟狂神说Java学习的(黑马版直接跳过了这两个技术),Zookeeper与Eureka 、Nacos一样也是一种注册中心。 三、微服务远程调用Demo——RestTemplate基本使用 核心代码位置:在模块 01-cloud-demo 下的order-service 和 user-service https://gitee.com/tuobataotian/spring-cloud-learning-notes
10.GitHub【Java学习+面试指南】 一份涵盖大部分Java程序员所需要掌握的核心知识。. Contribute to weyuhui110/JavaGuide development by creating an account on GitHub.https://github.com/weyuhui110/JavaGuide
11.意外收获!阿里技术官私库中的Spring全家桶小册,源码实战都有一线大厂的带动,让微服务成为了Java程序员面试的必备考点。其中是否具有 Spring Cloud 技术能力的程序员,也是企业招聘中影响薪资的核心要素之一。在这特地分享这套Spring Cloud微服务学习笔记给小伙伴们! 主要内容分四个大模块: 第一部分:微服务架构之服务注册Eureka与服务调用Ribbon篇https://maimai.cn/article/detail?fid=1739412289&efid=anoYQx3atkB1RNmzTxgL3A
12.48套Java架构师/高并发/微服务/分布式/源码分析/设计模式/业务第46套:资深CTO&架构师讲Java亿级项目架构设计与落地应用-需求分析+高层架构设计+系统架构设计+架构落地课程 第47套:MY-Java架构师精英学习实战营-微服务 分布式 高并发 性能优化 企业架构 源码分析 运维部署 项目实战 设计框架 第48套:狂野架构师-Java架构师起步篇+进阶篇+深入篇+云原生篇+架构百宝箱篇+源码分析https://www.soft1188.com/javajg/6787.html
13.Java学习全攻略:从入门到精通的详细路线Spring、Hibernate、MyBatis:学习流行的Java框架,利用这些框架简化开发流程,提高开发效率。 推荐学习资源: 《Spring揭秘》深入理解Spring框架的实现原理。 实战项目,如使用Spring Boot搭建微服务架构,体验现代Java开发模式。 六、项目实战与持续学习 6. 通过项目实战巩固知识 https://www.jianshu.com/p/7d258aa8ee01
14.3个主流Java微服务框架腾讯云开发者社区从学习、开发,到部署运行,都这么便捷,想不火都难。 官网地址: https://spring.io 2. Dropwizard Dropwizard 是一个开源的 RESTful 快速开发框架,对微服务的开发也极其友好,而且性能很强。 Dropwizard 也是打成 Jar 运行,SpringBoot 默认集成的是 Tomcat,Dropwizard 集成的是 Jetty。 https://cloud.tencent.com/developer/article/1823718
15.Java面试中涉及微服务框架的面试题(附答案)上面的10道题是今天为大家整理的Java微服务框架的相关面试题。如果你想学习更多的相关内容,你可以观看Java微服务培训课程,能够更深入地理解今天的话题,更好地提高自己Java专业水平。https://www.tulingxueyuan.cn/tlzx/jsp/1434.html
16.本脚手架,侧重于开发。侧重于基础。侧重于学习。可以基于此Crazy-SpringCloud 微服务脚手架 &视频介绍: Crazy-SpringCloud 微服务脚手架,是为 Java 微服务开发 入门者 准备的 学习和开发脚手架。并配有一系列的使用教程和视频,大致如下: 高并发 环境搭建图文教程和演示视频,陆续上线: Crazy-SpringCloud 微服务脚手架图文教程和演示视频,陆续上线: https://toscode.mulanos.cn/crazymaker/crazy-springcloud
17.SpringCloud学习篇1Rest学习环境搭建:服务消费者 一、微服务架构 首先理解什么是分布式、什么是集群、和微服务有什么区别? 参考:大白话解说,半分钟就懂 — 分布式与集群是什么 ? 区别是什么? 先举一个小栗子:去饭店吃饭就是一个完整的业务,饭店的厨师、配菜师、传菜员、服务员就是分布式;厨师、配菜师、传菜员和服务员都不止一个人https://blog.51cto.com/u_15790456/6569695