# pando_springcloud **Repository Path**: bseaworkspace/pando_springcloud ## Basic Information - **Project Name**: pando_springcloud - **Description**: SpringCloud学习 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2023-09-24 - **Last Updated**: 2023-10-01 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 本教程目标 想要系统地学习 Spring Cloud Netflix, 把自己的学习过程记录下来。 ## 状态 持续更新中 ## 微服务架构 微服务架构是一种将应用程序拆分为一组独立的、可独立部署的服务的架构模式。每个服务都运行在自己的进程中,可以独立地进行开发、测试和部署。微服务架构可以提高应用程序的可扩展性、可维护性和可复用性。 在微服务架构中,服务之间的通信通常是通过API来进行的。每个服务都有自己的API,客户端可以通过这些API来调用服务,从而实现服务之间的通信。服务之间可以通过RESTful API、gRPC、Thrift等方式来进行通信。 微服务架构中的服务通常是由小型、自治的团队来开发和管理的。每个服务都有自己的数据库,可以独立地进行扩展和升级。服务之间的依赖关系通常是通过API接口来管理的,而不是通过硬编码的方式来管理的。 微服务架构的优点包括: - 可扩展性:由于每个服务都是独立的,因此可以根据需要对服务进行扩展,而不会影响其他服务的运行。 - 可维护性:由于每个服务都是独立的,因此可以对服务进行独立的维护和升级,而不会影响其他服务的运行。 - 可复用性:由于每个服务都是独立的,因此可以将服务复用在其他项目中,从而提高开发效率和代码质量。 - 可测试性:由于每个服务都是独立的,因此可以对服务进行独立的测试,而不会影响其他服务的运行。 微服务架构的缺点包括: - 部署和管理复杂性:由于每个服务都是独立的,因此需要对每个服务进行单独的部署和管理,这可能会增加部署和管理的复杂性。 - 故障隔离性:由于每个服务都是独立的,因此如果一个服务出现故障,可能会导致整个应用程序出现故障,这可能会增加故障隔离性的问题。 - 数据一致性:由于每个服务都是独立的,因此需要对数据一致性进行特殊的处理,这可能会增加数据一致性的问题。 - 性能问题:由于每个服务都是独立的,因此可能需要增加网络通信的成本,这可能会导致性能问题。 ## SpringCloud微服务架构 ![输入图片说明](image/springcloud.jpg) ## Eureka 介绍 Spring Cloud Netflix Eureka是一个Netflix公司开发的服务注册和发现工具。 在微服务架构中,服务之间需要互相调用和通信,而Eureka可以提供服务注册和发现的功能,使得服务之间可以互相调用和通信。 Eureka是一个基于REST的服务注册和发现工具,它可以注册和发现Spring Boot应用程序。Eureka服务器存储所有注册的应用程序的元数据,并提供一个简单的REST API来获取这些元数据。服务注册到Eureka时,它们会提供一些元数据,如服务名称、IP地址、端口号、服务健康状况等。服务发现使用这些元数据来找到其他服务,并可以执行一些操作,如心跳检测、服务下线、服务健康检查等。 Eureka提供了许多配置选项,可以根据具体需求进行配置。 例如,可以配置Eureka服务器是否启用JMX监控,Eureka客户端是否在启动时向Eureka服务器注册,Eureka客户端是否从Eureka服务器获取服务实例列表等。 #### Eureka 配置文件中常见的属性及其作用 | 属性名 | Eureka服务器 | Eureka客户端 | 作用 | | --- | --- | --- | --- | | server.port | 固定 | 动态 | Eureka服务器监听的端口号,通常为8761。 | | eureka.instance.metadata-map.app.instance-id | 固定 | 动态 | Eureka客户端发送到Eureka服务器的实例ID,通常为`@spring.application.name`。 | | eureka.instance.metadata-map.app.name | 固定 | 动态 | Eureka客户端发送到Eureka服务器的实例名,通常为`@spring.application.name`。 | | eureka.server.enable-jmx | 固定 | false | 是否启用JMX监控,通常为`false`。 | | eureka.server.jmx-port | 固定 | false | JMX监控的端口号,通常为`0`。 | | eureka.server.healthcheck.port | 固定 | false | 健康检查的端口号,通常为`0`。 | | eureka.server.auto-registration.enabled | 固定 | false | 是否自动注册服务到Eureka服务器,通常为`false`。 | | eureka.client.register-with-eureka | false | true | 是否注册服务到Eureka服务器,通常为`false`。 | | eureka.client.fetch-registry | false | true | 是否从Eureka服务器获取服务实例列表,通常为`false`。 | | eureka.client.healthcheck-interval-seconds | false | 30 | 健康检查的间隔时间(秒),通常为`30`。 | | eureka.client.register-on-startup | false | true | 是否在服务启动时向Eureka服务器注册,通常为`true`。 | | eureka.client.renewal-interval-seconds | false | 90 | 心跳检测的间隔时间(秒),通常为`90`。 | | eureka.client.region | 默认 | 默认 | 服务所在的区域,通常为空。 | ## 服务提供者和服务消费者 在Spring Cloud Netflix中,服务提供者(Service Provider)和服务消费者(Service Consumer)是两个核心的概念。 服务提供者,顾名思义,是提供服务的一方。它们是服务的被调用方,为其他服务提供所需的功能。在Spring Cloud Netflix中,服务提供者通常是一个独立的微服务应用,负责处理特定的业务逻辑,并通过Spring Cloud Netflix Eureka进行服务注册和发现。 服务消费者,则是调用服务的一方。它们是依赖其他服务的服务,通过Spring Cloud Netflix Ribbon和Feign进行服务的负载均衡和调用。服务消费者通过Eureka客户端获取服务提供者的信息,并使用Ribbon进行负载均衡,将请求分发到合适的服务实例上。 值得注意的是,服务提供者和服务消费者并不是唯一性的。一个服务既可以作为服务提供者,为其他服务提供功能,同时也可以作为服务消费者,调用其他服务的功能。这种设计使得微服务架构更加灵活和可扩展。 为了实现服务提供者和服务消费者之间的通信,Spring Cloud Netflix提供了一系列的组件。Eureka用于服务的注册和发现,Ribbon用于负载均衡,Feign则是一个声明式的Web服务客户端,使得编写HTTP客户端变得更简单。通过这些组件的组合使用,可以轻松地构建出一个分布式的、高可用的、弹性扩展的微服务系统。 ## Spring Cloud Ribbon Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现。通过Spring Cloud的封装,可以让我们轻松地将面向服务的REST模版请求自动转换成客户端负载均衡的服务调用。 Ribbon客户端组件提供了一系列完善的客户端负载均衡算法,包括轮询、随机、权重轮询、IP哈希、加权轮询等,用户可以根据自己的需求选择合适的算法。此外,Ribbon还提供了负载均衡的实时监控和日志记录功能,可以帮助我们更好地管理和优化负载均衡系统。 使用Ribbon时,我们只需要在服务提供者的配置类中,添加`@LoadBalanced`注解,即可让Spring Cloud自动使用Ribbon进行负载均衡。例如: ```java import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate; @Configuration @SpringBootApplication public class ProviderApplication { @LoadBalanced @Bean public RestTemplate restTemplate() { return new RestTemplate(); } public static void main(String[] args) { SpringApplication.run(ProviderApplication.class, args); } } ``` 在上述代码中,`@LoadBalanced`注解指定了Spring Cloud使用Ribbon进行负载均衡。`restTemplate`方法返回了一个`RestTemplate`实例,该实例将自动使用Ribbon进行负载均衡。 ## 代码 #### 1. eureka_server ###### 项目地址 [项目地址](https://gitee.com/bseaworkspace/pando_springcloud/tree/master/eureka_server) ``` https://gitee.com/bseaworkspace/pando_springcloud/tree/master/eureka_server ``` ##### 启动步骤 - 创建Eureka Server的配置文件,通常使用的是application.properties或application.yml文件。在配置文件中,需要配置Eureka Server的端口号、注册中心的地址等信息。例如: ``` server.port=8761 eureka.instance.metadata-map.app.instance-id=12345 eureka.instance.metadata-map.app.name=my-service eureka.client.register-with-eureka=false eureka.client.fetch-registry=false ``` - 创建Eureka Server的类,通常使用的是EurekaServerApplication类。在类中,需要使用@SpringBootApplication注解来启用Spring Boot的自动配置,并使用main方法来启动Eureka Server。例如: ``` package com.example.eureka.server; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class EurekaServerApplication { public static void main(String[] args) { SpringApplication.run(EurekaServerApplication.class, args); } } ``` - 使用IDEA或Maven等工具运行Eureka Server应用程序。在运行过程中,Eureka Server将会启动并监听指定的端口号,等待服务实例的注册和注销。 注意:在运行Eureka Server之前,需要确保Eureka Server的配置文件中的注册中心地址是正确的,并且已经启动了Eureka Server。 ##### 测试 访问路径 http://localhost:8761/ ![效果图片](image/eureka_server.jpg) #### 2. eureka_client ###### 项目地址 [项目地址](https://gitee.com/bseaworkspace/pando_springcloud/tree/master/eureka_client) ``` https://gitee.com/bseaworkspace/pando_springcloud/tree/master/eureka_client ``` ##### Eureka Client启动步骤 ###### 步骤1:添加依赖 在pom.xml文件中添加Eureka客户端的依赖: ``` org.springframework.cloud spring-cloud-starter-netflix-eureka-client ``` ###### 步骤2:配置Eureka Server的地址 在application.properties或application.yml文件中配置Eureka Server的地址: properties ``` server.port=8762 spring.application.name=eureka_client spring.cloud.eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/ spring.cloud.eureka.client.registerWithEureka=true spring.cloud.eureka.client.fetchRegistry=true ``` ###### 步骤3:启动Eureka Client 在主类上添加@EnableEurekaClient注解,启动Eureka Client: ``` @SpringBootApplication @EnableEurekaClient public class EurekaClientApplication { public static void main(String[] args) { SpringApplication.run(EurekaClientApplication.class, args); } } ``` ###### 步骤4:在服务实例中添加@Component注解 在服务实例中添加@Component注解: ``` @Component public class MyService { @Override public String toString() { return "MyService{}"; } } ``` ##### 测试 访问路径 http://localhost:8761/ ![效果图片](image/springcloudeurekaclient.jpg) #### 3. 服务提供者和服务消费者 ###### 项目地址 ``` https://gitee.com/bseaworkspace/pando_springcloud/tree/master/eureka_server https://gitee.com/bseaworkspace/pando_springcloud/tree/master/service_provider https://gitee.com/bseaworkspace/pando_springcloud/tree/master/service_consumer ``` ##### 测试 访问路径 http://localhost:8764/hello ![效果图片](image/provider_consumer.jpg)