贵港网站建设培训,自动建立wordpress,中国建设综合门户网站,好用的快速网站建设平台一. 引言
前文简单介绍了SpringCloud的基本简介与特征#xff0c;接下来介绍每个组成部分的功能以及经常使用的中间件。本文仅为学习所用#xff0c;联系侵删。
二. SpringCloud概述
2.1 定义
Spring Cloud是一系列框架的有序集合#xff0c;它巧妙地利用了Spring…一. 引言
前文简单介绍了SpringCloud的基本简介与特征接下来介绍每个组成部分的功能以及经常使用的中间件。本文仅为学习所用联系侵删。
二. SpringCloud概述
2.1 定义
Spring Cloud是一系列框架的有序集合它巧妙地利用了Spring Boot的开发便利性来简化分布式系统基础设施的开发。在微服务架构中许多复杂且繁琐的分布式系统问题如服务发现注册、配置中心、消息总线、负载均衡、熔断机制以及数据监控等通过Spring Cloud都可以以Spring Boot的开发风格进行快速实现并做到一键启动和部署。这使得开发者能够更专注于业务逻辑的实现而无需在底层技术上花费过多精力。 三. SpringCloud核心组件与原理
3.1 服务注册与发现
3.1.1概念
在微服务架构中服务注册与发现是确保服务间正常通信的关键环节。服务提供者启动时会将自己的网络地址、端口号等信息注册到注册中心如Eureka、Consul或Zookeeper等。这些注册中心负责存储和维护服务的注册信息并提供服务发现的功能。服务消费者通过注册中心查询所需服务的信息包括服务的地址和端口等从而实现服务的动态发现。
服务注册与发现机制的实现使得微服务架构中的服务能够动态地加入和退出系统无需手动配置服务间的依赖关系。这大大提高了系统的可扩展性和可维护性。
3.1.2 常用中间件
服务注册与发现通常通过EurekaZookeeperConsulNacos等来实现。服务提供者将自己的信息注册到对应的服务端上服务消费者从对应的服务端获取服务提供者的信息。
3.1.2.1 Eureka
Eureka是由Netflix开发并开源的服务发现框架它主要用于定位运行在AWS域中的中间层服务实现负载均衡和中间层服务故障转移。Spring Cloud将其集成在其子项目spring-cloud-netflix中以实现Spring Cloud的服务发现功能。Eureka包含两个组件Eureka Server和Eureka Client。
Eureka的主要功能和特点包括
服务注册与发现服务提供者在启动时向Eureka Server注册自己的信息Eureka Server保存这些信息。服务消费者可以通过Eureka Server查询服务提供者的信息实现动态服务发现。客户端负载均衡Eureka集成了Ribbon实现客户端负载均衡减少服务间的耦合。故障转移Eureka可以发现服务的可用性并在服务不可用时进行故障转移保证系统的高可用性。可扩展性支持多种服务注册和发现策略支持集群部署。健康检查Eureka有一个检测心跳的功能服务提供者每30秒向Eureka Server发送心跳请求报告健康状态。如果超时则会剔除掉这个服务的信息。自我保护模式Eureka Server提供了自我保护机制当Eureka Server在短时间内丢失过多心跳时会进入自我保护模式不再剔除任何服务实例以避免因网络问题导致的服务不可用。心跳机制服务提供方与Eureka之间通过“心跳”机制进行监控当某个服务提供方出现问题Eureka自然会把它从服务列表中剔除这就实现了服务的自动注册、发现、状态监控。集群部署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 ListString getServices() { return discoveryClient.getServices(); }
} // application.yml配置Eureka Server地址
eureka: client: serviceUrl: defaultZone: http://localhost:8761/eureka/3.1.2.2 Nacos
Nacos的功能与特点
Nacos是一个开源的动态服务发现、配置管理和服务管理平台主要用于构建云原生应用。以下是Nacos的一些核心功能和特点
服务发现与管理 Nacos支持基于DNS或RPC的服务发现允许跨语言和跨平台的服务注册并且客户端能够自动发现新注册的服务。提供对服务实例的健康状况监控支持多种协议如HTTP, TCP的心跳检测确保只有健康的实例参与服务调用。允许为每个服务实例附加额外的信息如权重、版本等。 动态配置服务 提供集中化的配置管理支持实时更新并推送到所有订阅的客户端。支持多环境配置可以针对不同的环境开发、测试、生产设置不同的配置值。配置热更新即配置发生变化时不需要重启服务即可生效实现无缝的配置更新。 DNS服务 支持将服务名称解析为实际的IP地址适用于微服务架构下的服务间通信。提供灵活的路由策略可以根据需要设置负载均衡策略和其他路由规则。 API和SDK支持 提供Java、Python、Go等多种语言的客户端库方便不同技术栈的应用集成Nacos。通过RESTful风格的API用户可以直接操作Nacos中的数据和服务。 可视化控制台 提供了一个Web控制台便于管理员查看集群状态、管理服务实例、修改配置等。支持基于角色的访问控制RBAC可以精细控制用户的访问权限。 高可用性 支持在多个节点上部署以形成集群保证系统的高可用性和容错能力。使用数据库或磁盘文件存储关键数据即使服务器宕机也能恢复服务状态。 其他特性 与Spring Cloud生态系统良好集成同时也支持其他主流的微服务框架。支持SSL/TLS加密传输保护敏感信息的安全。
Nacos的这些功能使其成为构建微服务架构中不可或缺的一部分特别是在大规模分布式系统中它可以极大地简化服务治理和配置管理工作。
一句话概括就是Nacos SpringCloud注册中心 SpringCloud配置中心
Nacos配置示例
服务提供者配置application.yml:
server:port: 8070
spring:application:name: nacos-providercloud:nacos:discovery:server-addr: 127.0.0.1:8848 # Nacos服务地址服务消费者配置application.yml:
server:port: 8071
spring:application:name: nacos-consumercloud: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的一些关键特点
数据模型Zookeeper提供了一个树状的层次化命名空间称为ZNode类似于文件系统。每个ZNode都可以存储数据但有1MB的数据大小限制。通知机制客户端可以对特定的ZNode设置Watcher当ZNode发生变化时客户端会收到通知从而可以做出相应的业务调整。一致性Zookeeper保证了全局数据的一致性即所有服务器保存的数据副本都是相同的。顺序性Zookeeper中的更新请求是顺序进行的来自同一个客户端的更新请求会按照发送顺序依次执行。原子性数据更新是原子性的要么成功要么失败。实时性在一定时间范围内客户端能够读取到最新的数据。
Zookeeper广泛应用于分布式系统中用于实现数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master选举、分布式锁和分布式队列等功能。
Zookeeper配置示例
Maven依赖:
!-- zookeeper支持 --
dependencygroupIdorg.apache.zookeeper/groupIdartifactIdzookeeper/artifactIdversion3.6.4/version
/dependency
!-- curator-recipes --
dependencygroupIdorg.apache.curator/groupIdartifactIdcurator-recipes/artifactIdversion5.5.0/version
/dependency
!-- curator-framework --
dependencygroupIdorg.apache.curator/groupIdartifactIdcurator-framework/artifactIdversion5.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的特点包括
服务发现Consul通过DNS或HTTP接口简化了服务的注册和发现过程允许外部服务同样注册。健康检查Consul集成了健康检查功能可以快速告警集群中的操作问题并防止服务转发到故障的服务上。键/值存储Consul提供了一个动态配置存储系统通过简单的HTTP接口可以在任何地方操作。多数据中心支持Consul无需复杂配置即可支持任意数量的数据中心。安全性Consul提供了ACL访问控制列表和TLS加密以确保服务间通信的安全。
Consul的架构由服务器SERVER和客户端CLIENT节点组成所有服务都可以注册到这些节点上实现服务注册信息的共享。Consul的设计目标是对DevOps社区和应用程序开发人员友好适合现代化、弹性基础架构的需求。
Consul配置示例
Maven依赖
首先你需要在你的pom.xml文件中添加Consul客户端的依赖。这里使用的是consul-api和consul-session客户端库。
xml
dependencies!-- Consul API --dependencygroupIdcom.orbitz.consul/groupIdartifactIdconsul-client/artifactIdversion1.4.2/version/dependency!-- Consul Session --dependencygroupIdcom.orbitz.consul/groupIdartifactIdconsul-session/artifactIdversion1.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();// 获取所有服务ListCatalogService services consul.catalogClient().getServices().getResponse();// 打印服务名称for (CatalogService service : services) {System.out.println(service.getServiceName());}}
}3.1.2.5 总结 参考资料
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)