SpringCloud——分布式为什么越来越热门(上)

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: SpringCloud——分布式为什么越来越热门


服务注册和发现


Spring Cloud提供了多种服务注册和发现的方式,包括Eureka、Consul、Zookeeper等。通过这些工具,我们可以轻松地实现服务注册和发现。


1.1 服务注册和发现的概念


在微服务架构中,服务实例的数量通常会非常大,而每个服务实例都有一个唯一的网络地址。服务注册和发现是指将这些服务实例的网络地址注册到一个位置,并使其他服务能够发现它们。


服务注册是指将服务实例的信息(例如IP地址、端口号等)注册到服务注册表中。服务注册表是一个集中式的数据库,用于存储所有可用的服务实例的信息。


服务发现是指查找可用服务实例的过程。调用方向服务注册表发送请求,以获取特定服务的可用实例列表。服务注册表返回一个服务实例的列表,调用方可以从中选择一个实例进行调用。


1.2 Spring Cloud中服务注册和发现的实现


Spring Cloud提供了多种服务注册和发现的方式,包括Eureka、Consul、Zookeeper等。下面我们来介绍一下它们的具体实现:


1.2.1 Eureka


Eureka是Netflix开源的服务发现框架,Spring Cloud提供了对Eureka的集成支持。通过Eureka,我们可以轻松地实现服务的注册和发现。


首先,在pom.xml文件中添加以下依赖:

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>


然后,创建一个简单的Eureka服务器,只需要在启动类上添加@EnableEurekaServer注解即可:

@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
   public static void main(String[] args) {
      SpringApplication.run(EurekaServerApplication.class, args);
   }
}


接下来,我们需要将服务注册到Eureka服务器中。首先,在pom.xml文件中添加以下依赖:

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>


然后,在应用程序的配置文件中添加以下内容:

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/


其中,defaultZone属性指定了Eureka服务器的地址。最后,在启动类上添加@EnableDiscoveryClient注解即可:

@SpringBootApplication
@EnableDiscoveryClient
public class ServiceApplication {
   public static void main(String[] args) {
      SpringApplication.run(ServiceApplication.class, args);
   }
}


1.2.2 Consul


Consul是一个开源的分布式服务发现和配置管理系统,Spring Cloud提供了对Consul的集成支持。通过Consul,我们可以轻松地实现服务的注册和发现。


首先,在pom.xml文件中添加以下依赖:

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>


然后,在应用程序的配置文件中添加以下内容:

spring:
  cloud:
    consul:
      host: localhost
      port: 8500
      discovery:
        instance-id: ${spring.cloud.client.ipAddress}:${server.port}
        service-name: service


其中,instance-id属性指定了服务实例的唯一标识符,service-name属性指定了服务名称。最后,在启动类上添加@EnableDiscoveryClient注解即可:

@SpringBootApplication
@EnableDiscoveryClient
public class ServiceApplication {
   public static void main(String[] args) {
      SpringApplication.run(ServiceApplication.class, args);
   }
}


1.2.3 Zookeeper


Zookeeper是一个开源的分布式协调服务,Spring Cloud提供了对Zookeeper的集成支持。通过Zookeeper,我们可以轻松地实现服务的注册和发现。


首先,在pom.xml文件中添加以下依赖:

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
</dependency>


然后,在应用程序的配置文件中添加以下内容:

spring:
  cloud:
    zookeeper:
      connect-string: localhost:2181
      discovery:
        instance-id: ${spring.cloud.client.ipAddress}:${server.port}
        service-name: service


其中,connect-string属性指定了Zookeeper的连接地址,instance-id属性指定了服务实例的唯一标识符,service-name属性指定了服务名称。最后,在启动类上添加@EnableDiscoveryClient注解即可:

@SpringBootApplication
@EnableDiscoveryClient
public class ServiceApplication {
   public static void main(String[] args) {
      SpringApplication.run(ServiceApplication.class, args);
   }
}


1.3 服务注册和发现的Java代码详解


在Spring Cloud中,服务注册和发现通常需要使用到以下几个注解和类:


1.3.1 @EnableDiscoveryClient注解


这个注解用于标记应用程序为一个服务发现客户端。它会自动配置DiscoveryClient,并将其注入到Spring容器中。


1.3.2 DiscoveryClient类


这个类提供了服务发现的API,可以通过它查询服务实例的信息,例如IP地址、端口号等。


1.3.3 @LoadBalanced注解


这个注解用于标记RestTemplate或WebClient实例。通过这个注解,我们可以使用Ribbon进行负载均衡。


1.3.4 RibbonClientConfiguration类


这个类提供了Ribbon的配置信息。我们可以通过修改这些配置来修改Ribbon的行为,例如超时时间、重试次数等。


1.3.5 ServiceInstance类


这个类表示一个服务实例,包含了服务的名称、IP地址、端口号等信息。


下面是一个简单的Java代码示例,演示如何使用Eureka进行服务注册和发现:

@RestController
public class ServiceController {
   @Autowired
   private DiscoveryClient discoveryClient;
   @Autowired
   private RestTemplate restTemplate;
   @GetMapping("/service")
   public String getService() {
      List<ServiceInstance> instances = discoveryClient.getInstances("service");
      if (instances == null || instances.size() == 0) {
         return "No service available";
      }
      ServiceInstance instance = instances.get(0);
      String url = "http://" + instance.getHost() + ":" + instance.getPort() + "/hello";
      return restTemplate.getForObject(url, String.class);
   }
}


在这个示例中,我们使用DiscoveryClient查询服务实例的信息,并使用RestTemplate调用服务。其中,@LoadBalanced注解用于标记RestTemplate实例,以便使用Ribbon进行负载均衡。


配置中心


Spring Cloud Config可以将应用程序的配置从代码中分离出来,并提供一个中心化的配置管理系统。在运行时,应用程序会从配置中心获取需要的配置信息。


2.1 配置中心的概念


在微服务架构中,通常有很多个服务需要配置,例如数据库连接、日志级别等。如果将这些配置硬编码到代码中,会使得修改和维护变得困难。因此,使用一个配置中心来管理应用程序的配置是一种好的做法。


Spring Cloud Config是一个基于Git的配置中心,它可以将应用程序的配置从代码中分离出来,并提供一个中心化的配置管理系统。在运行时,应用程序会从配置中心获取需要的配置信息,以便进行初始化和启动。


2.2 Spring Cloud Config的实现


下面我们来介绍一下Spring Cloud Config的具体实现:


2.2.1 创建配置库


首先,我们需要创建一个Git仓库,用于存储应用程序的配置信息。例如,我们可以创建一个名为config-repo的Git仓库,目录结构如下:

config-repo/
├── application-dev.yml
└── application-prod.yml


其中,application-dev.yml和application-prod.yml分别存储了开发环境和生产环境下的配置信息。


2.2.2 创建配置中心


然后,我们需要创建一个Spring Cloud Config服务器,用于提供配置管理服务。首先,在pom.xml文件中添加以下依赖:

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-config-server</artifactId>
</dependency>


然后,在启动类上添加@EnableConfigServer注解即可:

@SpringBootApplication
@EnableConfigServer
public class ConfigServerApplication {
   public static void main(String[] args) {
      SpringApplication.run(ConfigServerApplication.class, args);
   }
}

接下来,在应用程序的配置文件中添加以下内容:

server:
  port: 8888
spring:
  cloud:
    config:
      server:
        git:
          uri: https://github.com/your-config-repo.git
          search-paths: '{application}'
          username: your-username
          password: your-password


其中,port属性指定了Spring Cloud Config服务器的端口号,git.uri属性指定了Git仓库的地址,search-paths属性指定了查找配置文件的路径,usernamepassword属性是可选的,用于对Git仓库进行身份验证。


相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
相关文章
|
3月前
|
资源调度 Java 调度
Spring Cloud Alibaba 集成分布式定时任务调度功能
定时任务在企业应用中至关重要,常用于异步数据处理、自动化运维等场景。在单体应用中,利用Java的`java.util.Timer`或Spring的`@Scheduled`即可轻松实现。然而,进入微服务架构后,任务可能因多节点并发执行而重复。Spring Cloud Alibaba为此发布了Scheduling模块,提供轻量级、高可用的分布式定时任务解决方案,支持防重复执行、分片运行等功能,并可通过`spring-cloud-starter-alibaba-schedulerx`快速集成。用户可选择基于阿里云SchedulerX托管服务或采用本地开源方案(如ShedLock)
121 1
|
28天前
|
人工智能 文字识别 Java
SpringCloud+Python 混合微服务,如何打造AI分布式业务应用的技术底层?
尼恩,一位拥有20年架构经验的老架构师,通过其深厚的架构功力,成功指导了一位9年经验的网易工程师转型为大模型架构师,薪资逆涨50%,年薪近80W。尼恩的指导不仅帮助这位工程师在一年内成为大模型架构师,还让他管理起了10人团队,产品成功应用于多家大中型企业。尼恩因此决定编写《LLM大模型学习圣经》系列,帮助更多人掌握大模型架构,实现职业跃迁。该系列包括《从0到1吃透Transformer技术底座》、《从0到1精通RAG架构》等,旨在系统化、体系化地讲解大模型技术,助力读者实现“offer直提”。此外,尼恩还分享了多个技术圣经,如《NIO圣经》、《Docker圣经》等,帮助读者深入理解核心技术。
SpringCloud+Python 混合微服务,如何打造AI分布式业务应用的技术底层?
|
2月前
|
存储 NoSQL Redis
SpringCloud基础7——Redis分布式缓存,RDB,AOF持久化+主从+哨兵+分片集群
Redis持久化、RDB和AOF方案、Redis主从集群、哨兵、分片集群、散列插槽、自动手动故障转移
SpringCloud基础7——Redis分布式缓存,RDB,AOF持久化+主从+哨兵+分片集群
|
2月前
|
SQL NoSQL 数据库
SpringCloud基础6——分布式事务,Seata
分布式事务、ACID原则、CAP定理、Seata、Seata的四种分布式方案:XA、AT、TCC、SAGA模式
SpringCloud基础6——分布式事务,Seata
|
2月前
|
消息中间件 Java 对象存储
数据一致性挑战:Spring Cloud与Netflix OSS下的分布式事务管理
数据一致性挑战:Spring Cloud与Netflix OSS下的分布式事务管理
50 2
|
4月前
|
资源调度 Java 调度
Spring Cloud Alibaba 集成分布式定时任务调度功能
Spring Cloud Alibaba 发布了 Scheduling 任务调度模块 [#3732]提供了一套开源、轻量级、高可用的定时任务解决方案,帮助您快速开发微服务体系下的分布式定时任务。
14926 30
|
3月前
|
Java 微服务 Spring
SpringBoot+Vue+Spring Cloud Alibaba 实现大型电商系统【分布式微服务实现】
文章介绍了如何利用Spring Cloud Alibaba快速构建大型电商系统的分布式微服务,包括服务限流降级等主要功能的实现,并通过注解和配置简化了Spring Cloud应用的接入和搭建过程。
SpringBoot+Vue+Spring Cloud Alibaba 实现大型电商系统【分布式微服务实现】
|
3月前
|
关系型数据库 MySQL 数据库
SpringCloud2023中使用Seata解决分布式事务
对于分布式系统而言,需要保证分布式系统中的数据一致性,保证数据在子系统中始终保持一致,避免业务出现问题。分布式系统中对数据的操作要么一起成功,要么一起失败,必须是一个整体性的事务。Seata简化了这个使用过程。
85 2
|
3月前
|
Dubbo Java 调度
揭秘!Spring Cloud Alibaba的超级力量——如何轻松驾驭分布式定时任务调度?
【8月更文挑战第20天】在现代微服务架构中,Spring Cloud Alibaba通过集成分布式定时任务调度功能解决了一致性和可靠性挑战。它利用TimerX实现任务的分布式编排与调度,并通过`@SchedulerLock`确保任务不被重复执行。示例代码展示了如何配置定时任务及其分布式锁,以实现每5秒仅由一个节点执行任务,适合构建高可用的微服务系统。
66 0
|
3月前
|
Java 应用服务中间件 数据库
SpringCloud:服务保护和分布式事务详解
SpringCloud:服务保护和分布式事务详解
129 0

热门文章

最新文章