SpringCloud(二)--SpringCloud服务注册与发现

一. 引言

​ 前文简单介绍了SpringCloud的基本简介与特征,接下来介绍每个组成部分的功能以及经常使用的中间件。本文仅为学习所用,联系侵删。

二. SpringCloud概述

2.1 定义

​ Spring Cloud是一系列框架的有序集合,它巧妙地利用了Spring Boot的开发便利性来简化分布式系统基础设施的开发。在微服务架构中,许多复杂且繁琐的分布式系统问题,如服务发现注册、配置中心、消息总线、负载均衡、熔断机制以及数据监控等,通过Spring Cloud都可以以Spring Boot的开发风格进行快速实现,并做到一键启动和部署。这使得开发者能够更专注于业务逻辑的实现,而无需在底层技术上花费过多精力。

image

image.gif

三. SpringCloud核心组件与原理

3.1 服务注册与发现

3.1.1概念

​ 在微服务架构中,服务注册与发现是确保服务间正常通信的关键环节。服务提供者启动时,会将自己的网络地址、端口号等信息注册到注册中心,如Eureka、Consul或Zookeeper等。这些注册中心负责存储和维护服务的注册信息,并提供服务发现的功能。服务消费者通过注册中心查询所需服务的信息,包括服务的地址和端口等,从而实现服务的动态发现。

​ 服务注册与发现机制的实现,使得微服务架构中的服务能够动态地加入和退出系统,无需手动配置服务间的依赖关系。这大大提高了系统的可扩展性和可维护性。

3.1.2 常用中间件

​ 服务注册与发现通常通过Eureka,Zookeeper,Consul,Nacos等来实现。服务提供者将自己的信息注册到对应的服务端上,服务消费者从对应的服务端获取服务提供者的信息。

3.1.2.1 Eureka

​ Eureka是由Netflix开发并开源的服务发现框架,它主要用于定位运行在AWS域中的中间层服务,实现负载均衡和中间层服务故障转移。Spring Cloud将其集成在其子项目spring-cloud-netflix中,以实现Spring Cloud的服务发现功能。Eureka包含两个组件:Eureka Server和Eureka Client。

Eureka的主要功能和特点包括:
  1. 服务注册与发现:服务提供者在启动时向Eureka Server注册自己的信息,Eureka Server保存这些信息。服务消费者可以通过Eureka Server查询服务提供者的信息,实现动态服务发现。
  2. 客户端负载均衡:Eureka集成了Ribbon实现客户端负载均衡,减少服务间的耦合。
  3. 故障转移:Eureka可以发现服务的可用性,并在服务不可用时进行故障转移,保证系统的高可用性。
  4. 可扩展性:支持多种服务注册和发现策略,支持集群部署。
  5. 健康检查:Eureka有一个检测心跳的功能,服务提供者每30秒向Eureka Server发送心跳请求,报告健康状态。如果超时则会剔除掉这个服务的信息。
  6. 自我保护模式:Eureka Server提供了自我保护机制,当Eureka Server在短时间内丢失过多心跳时,会进入自我保护模式,不再剔除任何服务实例,以避免因网络问题导致的服务不可用。
  7. 心跳机制:服务提供方与Eureka之间通过“心跳”机制进行监控,当某个服务提供方出现问题,Eureka自然会把它从服务列表中剔除,这就实现了服务的自动注册、发现、状态监控。
  8. 集群部署:Eureka Server可以构建集群,不同Eureka Server之间会进行服务信息同步,用来保证服务信息的一致性。

​ Eureka是微服务架构中服务注册与发现的重要组件,它通过简化服务间的通信,提高了系统的可扩展性和可维护性。尽管Eureka 2.0已经停止维护,但它仍然被许多公司的微服务系统所使用。

服务提供者注册代码示例

@SpringBootApplication  
@EnableEurekaClient  
public class ServiceProviderApplication {  
  
    public static void main(String[] args) {  
        SpringApplication.run(ServiceProviderApplication.class, args);  
    }  
}  
  
// application.yml配置Eureka Server地址  
eureka:  
  client:  
    serviceUrl:  
      defaultZone: http://localhost:8761/eureka/

服务消费者发现代码示例

@RestController  
public class ServiceConsumerController {  
  
    @Autowired  
    private DiscoveryClient discoveryClient;  
  
    @GetMapping("/services")  
    public List<String> getServices() {  
        return discoveryClient.getServices();  
    }  
}  
  
// application.yml配置Eureka Server地址  
eureka:  
  client:  
    serviceUrl:  
      defaultZone: http://localhost:8761/eureka/
3.1.2.2 Nacos
Nacos的功能与特点

​ Nacos是一个开源的动态服务发现、配置管理和服务管理平台,主要用于构建云原生应用。以下是Nacos的一些核心功能和特点:

  1. 服务发现与管理
    • Nacos支持基于DNS或RPC的服务发现,允许跨语言和跨平台的服务注册,并且客户端能够自动发现新注册的服务。
    • 提供对服务实例的健康状况监控,支持多种协议(如HTTP, TCP)的心跳检测,确保只有健康的实例参与服务调用。
    • 允许为每个服务实例附加额外的信息,如权重、版本等。
  2. 动态配置服务
    • 提供集中化的配置管理,支持实时更新并推送到所有订阅的客户端。
    • 支持多环境配置,可以针对不同的环境(开发、测试、生产)设置不同的配置值。
    • 配置热更新,即配置发生变化时,不需要重启服务即可生效,实现无缝的配置更新。
  3. DNS服务
    • 支持将服务名称解析为实际的IP地址,适用于微服务架构下的服务间通信。
    • 提供灵活的路由策略,可以根据需要设置负载均衡策略和其他路由规则。
  4. API和SDK支持
    • 提供Java、Python、Go等多种语言的客户端库,方便不同技术栈的应用集成Nacos。
    • 通过RESTful风格的API,用户可以直接操作Nacos中的数据和服务。
  5. 可视化控制台
    • 提供了一个Web控制台,便于管理员查看集群状态、管理服务实例、修改配置等。
    • 支持基于角色的访问控制(RBAC),可以精细控制用户的访问权限。
  6. 高可用性
    • 支持在多个节点上部署以形成集群,保证系统的高可用性和容错能力。
    • 使用数据库或磁盘文件存储关键数据,即使服务器宕机也能恢复服务状态。
  7. 其他特性
    • 与Spring Cloud生态系统良好集成,同时也支持其他主流的微服务框架。
    • 支持SSL/TLS加密传输,保护敏感信息的安全。

​ Nacos的这些功能使其成为构建微服务架构中不可或缺的一部分,特别是在大规模分布式系统中,它可以极大地简化服务治理和配置管理工作。

一句话概括就是Nacos = SpringCloud注册中心 + SpringCloud配置中心

Nacos配置示例

服务提供者配置(application.yml):

server:
  port: 8070
spring:
  application:
    name: nacos-provider
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848 # Nacos服务地址

服务消费者配置(application.yml):

server:
  port: 8071
spring:
  application:
    name: nacos-consumer
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848 # Nacos服务地址

启动类注解:

@SpringBootApplication
@EnableDiscoveryClient //开启服务注册发现功能
public class NacosProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(NacosProviderApplication.class, args);
    }
}

详情参考:https://blog.csdn.net/wuesr/article/details/119032757

3.1.2.3 Zookeeper
Zookeeper功能与特点

​ Zookeeper是一个开源的分布式协调服务,由Apache基金会维护。它最初是作为Hadoop和Hbase的一个组件开发的,用于管理集群中的配置信息、命名服务、分布式同步和群组服务等。以下是Zookeeper的一些关键特点:

  1. 数据模型:Zookeeper提供了一个树状的层次化命名空间,称为ZNode,类似于文件系统。每个ZNode都可以存储数据,但有1MB的数据大小限制。
  2. 通知机制:客户端可以对特定的ZNode设置Watcher,当ZNode发生变化时,客户端会收到通知,从而可以做出相应的业务调整。
  3. 一致性:Zookeeper保证了全局数据的一致性,即所有服务器保存的数据副本都是相同的。
  4. 顺序性:Zookeeper中的更新请求是顺序进行的,来自同一个客户端的更新请求会按照发送顺序依次执行。
  5. 原子性:数据更新是原子性的,要么成功,要么失败。
  6. 实时性:在一定时间范围内,客户端能够读取到最新的数据。

​ Zookeeper广泛应用于分布式系统中,用于实现数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master选举、分布式锁和分布式队列等功能。

Zookeeper配置示例

Maven依赖:

<!-- zookeeper支持 -->
<dependency>
    <groupId>org.apache.zookeeper</groupId>
    <artifactId>zookeeper</artifactId>
    <version>3.6.4</version>
</dependency>
<!-- curator-recipes -->
<dependency>
    <groupId>org.apache.curator</groupId>
    <artifactId>curator-recipes</artifactId>
    <version>5.5.0</version>
</dependency>
<!-- curator-framework -->
<dependency>
    <groupId>org.apache.curator</groupId>
    <artifactId>curator-framework</artifactId>
    <version>5.5.0</version>
</dependency>

连接Zookeeper客户端:

RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 5);
CuratorFramework client = CuratorFrameworkFactory.newClient(
    "ip:port",
    1000,
    60*1000,
    retryPolicy);
client.start();

详情参考:(https://blog.csdn.net/weixin_64105389/article/details/134180897)

3.1.2.4 Consul

Consul是由HashiCorp开发的开源工具,用于实现分布式系统的服务发现和配置。Consul的特点包括:

  1. 服务发现:Consul通过DNS或HTTP接口简化了服务的注册和发现过程,允许外部服务同样注册。
  2. 健康检查:Consul集成了健康检查功能,可以快速告警集群中的操作问题,并防止服务转发到故障的服务上。
  3. 键/值存储:Consul提供了一个动态配置存储系统,通过简单的HTTP接口可以在任何地方操作。
  4. 多数据中心支持:Consul无需复杂配置即可支持任意数量的数据中心。
  5. 安全性:Consul提供了ACL(访问控制列表)和TLS加密,以确保服务间通信的安全。

​ Consul的架构由服务器(SERVER)和客户端(CLIENT)节点组成,所有服务都可以注册到这些节点上,实现服务注册信息的共享。Consul的设计目标是对DevOps社区和应用程序开发人员友好,适合现代化、弹性基础架构的需求。

Consul配置示例
Maven依赖

首先,你需要在你的pom.xml文件中添加Consul客户端的依赖。这里使用的是consul-apiconsul-session客户端库。

xml

<dependencies>
    <!-- Consul API -->
    <dependency>
        <groupId>com.orbitz.consul</groupId>
        <artifactId>consul-client</artifactId>
        <version>1.4.2</version>
    </dependency>
    <!-- Consul Session -->
    <dependency>
        <groupId>com.orbitz.consul</groupId>
        <artifactId>consul-session</artifactId>
        <version>1.4.2</version>
    </dependency>
</dependencies>
服务注册
import com.orbitz.consul.Consul;
import com.orbitz.consul.model.agent.ImmutableRegistration;
import com.orbitz.consul.model.agent.Registration;

public class ConsulServiceRegistration {

    public static void main(String[] args) {
        // 创建Consul实例,连接到本地Consul代理
        Consul consul = Consul.builder().build();

        // 构建服务注册信息
        Registration registration = ImmutableRegistration.	builder()
                .id("service-id") // 服务ID
                .name("my-service") // 服务名称
                .address("127.0.0.1") // 服务地址
                .port(8080) // 服务端口
                .check(Registration.RegCheck
                        .http("http://127.0.0.1:8080/health", "10s")) // 健康检查
                .build();

        // 注册服务
        consul.agentClient().register(registration);

        System.out.println("Service registered with Consul");
    }
}
服务注销
import com.orbitz.consul.Consul;
import com.orbitz.consul.model.agent.Deregistration;

public class ConsulServiceDeregistration {

    public static void main(String[] args) {
        // 创建Consul实例,连接到本地Consul代理
        Consul consul = Consul.builder().build();

        // 构建服务注销信息
        Deregistration deregistration = Deregistration
                .builder()
                .id("service-id") // 服务ID
                .build();

        // 注销服务
        consul.agentClient().deregister(deregistration);

        System.out.println("Service deregistered from Consul");
    }
}
服务发现
import com.orbitz.consul.Consul;
import com.orbitz.consul.model.catalog.CatalogService;

import java.util.List;

public class ConsulServiceDiscovery {

    public static void main(String[] args) {
        // 创建Consul实例,连接到本地Consul代理
        Consul consul = Consul.builder().build();

        // 获取所有服务
        List<CatalogService> services = consul.catalogClient().getServices().getResponse();

        // 打印服务名称
        for (CatalogService service : services) {
            System.out.println(service.getServiceName());
        }
    }
}
3.1.2.5 总结

img

参考资料:

eureka、consul、nacos三大产品对比 - ☆野生架构师☆ - 博客园

).getServices().getResponse();

    // 打印服务名称
    for (CatalogService service : services) {
        System.out.println(service.getServiceName());
    }
}

}


#### 3.1.2.5 总结

[外链图片转存中...(img-7K64nSwU-1735826422036)]



参考资料:

[eureka、consul、nacos三大产品对比 - ☆野生架构师☆ - 博客园](https://www.cnblogs.com/shumtn/p/13391470.html)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/946971.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

当生成式AI遇见数字孪生

吴付标 总部位于美国宾夕法尼亚州的Bentley软件公司&#xff0c;于金秋十月在枫叶之国加拿大名城温哥华举办一年一度的2024纵览基础设施大会暨光辉大奖赛。此次盛会吸引了来自全球的数百位行业精英&#xff0c;旨在探讨基础设施数智化的最新趋势&#xff0c;分享生态圈的创新成…

散度与旋度的探讨

一、散度的定义与物理意义 1. 散度的定义 散度(Divergence)是向量分析中的一个核心概念,用于描述一个向量场在某一点的源或汇的强度。在数学上,散度通常使用符号“div”表示。对于一个三维向量场F(x, y, z) = (Fx, Fy, Fz),其散度可以定义为: div F = ∂Fx/∂x + ∂Fy/…

英文字体:创意前卫杀手级标题海报封面设计粗体字体 Morne Display

看啊&#xff0c;设计师们&#xff01;Morne 刚刚进入字体游戏&#xff0c;让我们告诉你&#xff0c;它不是来玩的——认识我们的字体&#xff0c;它就像你早上的咖啡一样大胆。无论您是在制作杀手级标题、偷偷摸摸的副标题还是大胆的海报&#xff0c;Morne 都能为您提供前后、…

LLM - 使用 LLaMA-Factory 部署大模型 HTTP 多模态服务 (4)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/144881432 大模型的 HTTP 服务&#xff0c;通过网络接口&#xff0c;提供 AI 模型功能的服务&#xff0c;允许通过发送 HTTP 请求&#xff0c;交互…

【大模型系列】Mobile-Agent(2024.04)

Paper: https://arxiv.org/pdf/2401.16158Github: https://github.com/X-PLUG/MobileAgentAuthor: Junyang Wang et al. 北交、阿里巴巴 Mobile-agent核心工作&#xff1a; 首先使用视觉感知工具(检测和OCR模型)识别前端界面中文本和图像元素的精确位置 检测图标&#xff1a;…

JVM实战—8.如何分析jstat统计来定位GC

大纲 1.使用jstat了解线上系统的JVM运行状况 2.使用jmap和jhat了解线上系统的对象分布 3.如何分析JVM运行状况并合理优化 4.使用jstat分析模拟的BI系统JVM运行情况 5.使用jstat分析模拟的计算系统JVM运行情况 6.问题汇总 1.使用jstat了解线上系统的JVM运行状况 (1)JVM的…

什么是Redis哨兵机制?

大家好&#xff0c;我是锋哥。今天分享关于【什么是Redis哨兵机制&#xff1f;】面试题。希望对大家有帮助&#xff1b; 什么是Redis哨兵机制&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Redis 哨兵&#xff08;Sentinel&#xff09;机制是 Redis 提…

深度学习的魔法世界

技术文章&#xff1a;深度学习的魔法世界 引言 嘿&#xff0c;今天我们要一起探索一个非常酷的魔法世界——深度学习&#xff01;这是一门让计算机变得超级聪明的科学。我们会用最简单的语言来解释深度学习的基本概念&#xff0c;让你们也能轻松理解。 一、深度学习的六大魔…

数据挖掘——决策树分类

数据挖掘——决策树分类 决策树分类Hunt算法信息增益增益比率基尼指数连续数据总结 决策树分类 树状结构&#xff0c;可以很好的对数据进行分类&#xff1b; 决策树的根节点到叶节点的每一条路径构建一条规则&#xff1b;具有互斥且完备的特点&#xff0c;即每一个样本均被且…

RFID手持机与RFID工业平板在仓储物流管理系统中的选型

概述 随着物联网技术在仓储物流管理系统中的普及&#xff0c;RFID手持机与RFID工业平板作为基于RFID技术手持式读写器的两种重要终端设备形态&#xff0c;得到了广泛应用。尽管RFID手持机与RFID工业平板都具备读写 RFID标签的基本功能&#xff0c;使用场景较为类似&#xff0c…

文件本地和OSS上传

这里写目录标题 前端传出文件后端本地存储阿里云OSS存储上传Demo实现上传ConfigurationProperties 前端传出文件 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>上传文件</title> </head&g…

element-plus大版本一样,但是小版本不一样导致页面出bug

npm 的版本 node的版本 npm的源这些都一样&#xff0c;但是效果不一样 发现是element的包版本不一样导致的 2.9.1与2.8.1的源是不一样的&#xff0c;导致页面出bug;

CSS进阶和SASS

目录 一、CSS进阶 1.1、CSS变量 1.2、CSS属性值的计算过程 1.3、做杯咖啡 1.4、下划线动画 1.5、CSS中的混合模式(Blending) 二、SASS 2.1、Sass的颜色函数 2.2、Sass的扩展(extend)和占位符(%)、混合(Mixin) 2.3、Sass的数学函数 2.4、Sass的模块化开发 2.5、Sass…

python-Flask:SQLite数据库路径不正确但是成功访问到了数据库,并对表进行了操作

出现了这个问题&#xff0c;就好像是我要去找在南方的人&#xff0c;然后我刚好不分南北&#xff0c;我认为的方向错了&#xff0c;实则方向对了。 在我针对复盘解决&#xff1a;sqlite3.OperationalError: unrecognized token: “{“-CSDN博客这个内容的时候&#xff0c;又出现…

剪映--关键帧教程:制作视频文字说明,文字动态划线,透明文字,虚拟触控,画面旋转缩小退出

关键帧介绍 剪映当中许多动态的效果都是关键帧的应用&#xff0c;像接下来会讲到的文字动态划线&#xff0c;画面旋转退出&#xff0c;都是关键帧的效果&#xff0c;用户只要设定初始状态和最后状态&#xff0c;软件会将中间的动态补齐。剪辑的难点在于自己需要先想好要怎么去…

【数据结构Ⅰ复习题】

如有错误欢迎指正&#xff0c;题目根据教材----------严蔚敏数据结构&#xff08;c语言版 第2版&#xff09;人民邮电电子版 数据结构Ⅰ复习题 一、填空题1&#xff0e;算法应该具备的5个重要特性有___有穷性___、确定性、可行性、输入和输出。2&#xff0e;非空单链表L中*p是头…

697: Edit Distance

我们定义 dp[i][j] 为将字符串 A[0..i-1] 转换为 B[0..j-1] 的最小操作数 状态转移 通过动态规划的思想&#xff0c;我们可以使用 状态转移方程 来计算 dp[i][j]。具体来说&#xff0c;dp[i][j] 的值可以由以下几种操作得到&#xff1a; 如果 A[i-1] B[j-1]&#xff1a; 如果…

【AI创作】kimi API初体验

一、介绍 接口文档 https://platform.moonshot.cn/docs/guide/migrating-from-openai-to-kimi 收费详情 并发: 同一时间内我们最多处理的来自您的请求数RPM: request per minute 指一分钟内您最多向我们发起的请求数TPM: token per minute 指一分钟内您最多和我们交互的toke…

迈向AGI,3、2、1,2025上链接!

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 往期精彩文章推荐 关于AI TIME AI TIME源起于2019年&#xff0c;旨在发扬科学思辨精神&#xff0c;邀请各界人士对人工智能理论、算法和场景应用的本质问题进行探索&#xff0c;加强思想碰撞&#xff0c;链接全…

C语言中的强弱符号

文章目录 一、基本定义二、链接过程中的行为三、应用场景四、强弱符号示例1五、稍有难度示例2 在C语言中&#xff0c;强弱符号是与链接过程相关的重要概念&#xff0c;C中不存在强弱符号&#xff0c;以下是对它们的详细讲解&#xff1a; 一、基本定义 强符号 强符号通常是指在…