springcloud学习笔记

owofile Lv5

springcloud学习笔记

Spring Cloud是一个基于Spring Boot的微服务架构,它提供了一整套的开发工具包,包括服务治理、服务注册与发现、负载均衡、数据监控、REST API发布等,基本涵盖了分布式框架所需要的所有功能。

使用Spring Cloud的原因主要有以下几点:

  1. 简化开发:Spring Cloud利用Spring Boot的开发便利性,简化了分布式系统基础设施的开发。它提供了一系列的工具,如配置管理、服务发现、断路器、路由、微代理、事件总线等,这些都可以用Spring Boot的开发风格做到一键启动和部署。
  2. 易于维护:Spring Cloud的各个组件都是高度抽象和封装的,这使得它在处理复杂系统时能够提供更清晰、更易于维护的代码结构。
  3. 快速部署:由于Spring Cloud是基于微服务架构的,因此每个服务都可以独立地进行开发和部署,这大大提高了开发效率和系统的可扩展性。
  4. 高度可扩展:由于微服务架构的特点,Spring Cloud可以轻松地扩展服务以处理更多的流量或增加更多的功能,而不会影响整个系统的稳定性。
  5. 安全性高:Spring Cloud提供了强大的安全保障,包括服务认证、访问控制和数据加密等功能,可以有效地保护系统的安全性和隐私性。

部署Spring Cloud项目

环境

首先创建一个Spring Cloud项目,本次部署环境为

IDEA.2023

JAVA 1.8

java 21 (这个版本是用来创建 创建完成后降级)

apache-maven-3.8.1-bin

有关Macen的部署和使用不再赘述

创建项目

如果是使用的是官方源创建https://start.spring.io

可能会提示JDK版本太低,这时候你可以选择使用阿里云源创建,里面有低版本的配置

阿里云源:https://start.aliyun.com/

注意:使用低版本部署可能会出现pom.xml里没有parent

1
2
3
4
5
6
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>

这种情况建议使用高版本创建然后降级使用

创建完成后进入配置依赖勾选lombok,然后确保你的IDEA里下载了lombok插件一般默认自带

创建完成后正式进入部署环节

tip:可以删除不需要的文件夹来让项目整体更容易阅读,推荐删除父模块的src文件夹

一个SpringCloud项目可能具有多个模块,右键你的父模块可以同时创建多个子模块

比如我们创建一个eureka模块

同样的创建操作,这次不需要勾选lombok

创建完成后再父模块的pom里需要进行修改

首先就是将你刚刚创建的子模块链接到父模块

1
2
3
4
<!-- 模块导入-->
<modules>
<module>spring-eureka</module>
</modules>

使用Cloud微服务框架

1
2
3
4
5
6
7
8
9
10
11
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

通过在父pom里添加dependencyManagement声明依赖的管理策略来实现搭建Cloud

<dependencyManagement> 是 Maven 的一个配置元素,用于声明项目依赖的管理策略。这个元素通常出现在 Maven 项目的 pom.xml 文件的 <dependencies> 元素之前。

通过 <dependencyManagement>,您可以定义一组通用的依赖项,这些依赖项将应用于项目中的所有模块(如果这些模块没有定义自己的依赖项)。这使得您可以在多个模块之间共享相同的依赖版本,从而确保整个项目的一致性。

然后你需要修改一些配置让项目能准确识别

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
父模块的pom
<!-- 父亲-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<!-- 自己-->
<groupId>com.example</groupId>
<artifactId>springcloud</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springcloud</name>
<description>springcloud</description>
<!-- 这里需要加pom-->
<packaging>pom</packaging>
<properties>
<java.version>1.8</java.version>
<!-- 使用cloud需要导入相关-->
<spring-cloud.version>Hoxton.SR1</spring-cloud.version>
</properties>

一下是这些代码的说明,方便理解

  1. 父依赖管理 (<parent>):
    • <groupId>org.springframework.boot</groupId>: 指定父依赖的组ID,这里是Spring Boot的组ID。
    • <artifactId>spring-boot-starter-parent</artifactId>: 指定父依赖的构件ID,这是一个Spring Boot的父POM文件,它包含了所有Spring Boot项目的默认设置。
    • <version>2.2.0.RELEASE</version>: 指定父依赖的版本号。
    • <relativePath/>: 父POM文件的位置。这里为空意味着Maven将尝试在仓库中查找该父POM文件。
  2. 项目信息 (<groupId>, <artifactId>, <version>, <name>, <description>):
    • <groupId>com.example</groupId>: 指定项目所属的组织或公司的标识符。
    • <artifactId>springcloud</artifactId>: 指定项目的名称。
    • <version>0.0.1-SNAPSHOT</version>: 指定项目的版本号,这里的“SNAPSHOT”表示这是一个开发快照版本。
    • <name>springcloud</name>: 项目的名称。
    • <description>springcloud</description>: 对项目的简短描述。
  3. 项目包装类型 (<packaging>):
    • 这里指定了项目的包装类型为pom,意味着这是一个POM项目,而不是一个JAR或WAR项目。POM项目主要用于组织和管理其他项目。
  4. 项目属性 (<properties>):
    • <java.version>1.8</java.version>: 指定项目使用的Java版本,这里是Java 1.8(也称为Java 8)。
    • <spring-cloud.version>Hoxton.SR1</spring-cloud.version>: 指定Spring Cloud的版本号,这里使用的是Hoxton.SR1版本。

这段代码主要定义了一个Spring Boot项目及其相关的依赖关系和项目信息。通过这种方式,Maven可以知道如何构建、测试和打包这个项目,以及如何解析和管理项目的依赖关系。对于新手来说,理解这些内容将有助于更好地理解如何使用Maven来管理Java项目。

做完这一步,你已经成功配置了Cloud的项目,现在我们来测试使用一下子模块

之前我们已经创建了一个子模块叫做eureka

通过在子模块的pom.xml里修改和增加一些说明,来完善项目

配置子模块eureka

修改子模块pom.xml的parent

将parent里的内容修改为父模块的自己,只需要添加前三个即可

1
2
3
<groupId>com.example</groupId>
<artifactId>springcloud</artifactId>
<version>0.0.1-SNAPSHOT</version>

这样链接父模块的pom后可以实现依赖公用,只需要在父模块的Pom导入依赖,全项目都可以使用共同依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
子模块的pom
<!--连接父元素-->
<parent>
<groupId>com.example</groupId>
<artifactId>springcloud</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<!--自己的pom-->
<artifactId>spring-eureka</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-eureka</name>
<description>spring-eureka</description>
<!-- java版本-->
<properties>
<java.version>8</java.version>
</properties>

添加子模块依赖

1
2
3
4
5
<!-- 注册中心 eureka 服务依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

使用注册中心可以方便管理我们的项目配置完成后可以使用端口浏览

添加完成后在JAVA文件里添加相关配置信息即可

使用yml配置

1
2
3
4
5
6
7
8
9
10
server:
#访问端口号
port: 8081
spring:
application:
name: eureka-server
eureka:
client:
service-url:
defaultZone: http://localhost:8081/eureka

这段代码是一个YAML格式的配置文件,通常用于配置Spring Boot应用程序的参数。该文件配置了一个Eureka服务注册中心的服务器设置。下面是对每一部分的解释:

  1. server:
    • port: 8081
      • 这一行指定了服务器监听的端口号为8081。
  2. spring:
    • application
      • name: eureka-server
        • 这一部分定义了Spring Boot应用程序的名称为”eureka-server”。
  3. eureka:
    • client
      • service-url
        • defaultZone: http://localhost:8081/eureka
          • 这一部分定义了Eureka客户端的服务URL。在这里,服务将在本地机器的8081端口上注册,并使用基础URL “/eureka”。

为了方便新手理解:

  • YAML: 这是一个常见的配置文件格式,用于存储配置数据。它使用缩进和冒号来区分键和值。
  • Spring Boot: 是一个用于创建独立、生产级的基于Spring的应用程序的框架。它简化了Spring应用程序的初始化和开发过程。
  • Eureka: 是Netflix开发的服务发现组件,用于定位运行在AWS云或其他云平台上的中间层服务,从而实现中间层服务的故障转移和负载均衡。

总的来说,这个配置文件是用来设置一个Eureka服务注册中心的服务器,它将在本地的8081端口上运行,并使用默认的服务URL进行服务注册。

试运行

配置完成后再java里的SpringEurekaApplication里启动项目来访问服务

1
2
3
4
5
6
7
8
9
10
11
12
#SpringEurekaApplication.java
package com.example.springeureka;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class SpringEurekaApplication {
public static void main(String[] args) {
SpringApplication.run(SpringEurekaApplication.class, args);
}
}

这里需要添加**@EnableEurekaServer**后才能正常访问

配置子模块consumer

创建子模块consumer和配置上一个子模块过程一样,修改parent 修改对应版本JDK,增加相关依赖

注意:如果出现报错问题,请随时检查你的maven配置问题,绝大多数代码正确报错都是因为Maven下载依赖失败

修改配置文件

1
2
3
4
5
6
7
8
9
server:
port: 8082
eureka:
client:
service-url:
defaultZone: http://localhost:8081/eureka
spring:
application:
name: spring-consumer

和之前不一样的是,这次的端口号要发生改变,同样将这个模块注册到注册中心eureka,然后给新模块设置一个名字

完成后启动注册中心模块,再启动consumer模块,可以看到新DS Replicas的出现,由于我们注册中心本身也会被注册,如果不想它被注册,可以增加两行代码也设置

1
2
3
4
5
6
7
8
9
注册中心配置文件 eureka
server:
port: 8081
eureka:
client:
service-url:
defaultZone: http://localhost:8081/eureka
fetch-registry: false
register-with-eureka: false

配值子模块provider

模块启动失败问题解决办法

如果遇到模块启动失败,依赖添加后还是无法正常启动,请打开项目管理-模块-找到启动失败的模块-修改模块SDK

即可解决依赖版本JDK冲突

熔断器hystrix

使用熔断器可以在报错时截取并且输出规定好的内容方便让服务者知道问题错误出在哪里

依赖(高版本会自带无需添加):

1
2
3
4
5
<!-- 容错器hystrix-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

配置:

1
2
3
feign:
hystrix:
enabled: true

创建的熔断器类:

1
2
3
4
5
6
7
8
9
10
11
12
package com.example.springconsumer;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class UserFeignHystrix implements UserService {
@Override
public boolean login(String username, String password) {
log.info("服务器抛锚");
return false;
}
}

Service类需要修改链接熔断器

1
2
3
4
5
6
7
8
9
package com.example.springconsumer;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
@FeignClient(value = "spring-provider",fallback = UserFeignHystrix.class)
public interface UserService {
@GetMapping("/login")
public boolean login(@RequestParam("username") String username,@RequestParam("password")String password);
}

主要在于这一句

1
@FeignClient(value = "spring-provider",fallback = UserFeignHystrix.class)

链接的刚刚创建的类,如果方法出现问题,就会打印log

这样当你访问此类的时候就会被熔断

负载均衡器分担方式

通过设置集群分担方式可以减轻负载,给多个集群平衡分担请求

通过一些设置可以实现不同的分担方式,默认是轮播分担

在启动类添加此方法修改分担方式

1
2
3
4
5
6
7
8
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
@Bean
public IRule randomRule(){
return new RandomRule();
}

完整类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package com.example.springconsumer;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
@EnableFeignClients
public class SpringConsumerApplication {
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
@Bean
public IRule randomRule(){
return new RandomRule();
}
public static void main(String[] args) {
SpringApplication.run(SpringConsumerApplication.class, args);
}
}

官方介绍:

要通过设置集群分担方式来减轻负载,可以使用负载均衡器来实现。负载均衡器是一种能够平衡多个服务器或集群之间负载的设备,它可以根据指定的策略将请求分发到不同的服务器,以确保各个服务器或集群负载均衡。负载均衡器可以通过多种算法进行请求分担,例如轮询、最少连接、IP哈希等。

对于新手来说,可以通过以下步骤来理解和使用负载均衡器:

  1. 了解负载均衡器的基本原理:新手可以先了解负载均衡器的工作原理,包括其作用、不同的负载均衡算法以及常见的应用场景。
  2. 选择适合的负载均衡器:根据自己的需求和环境选择合适的负载均衡器,比如Nginx、HAProxy等,并学习其基本配置和使用方法。
  3. 配置和部署负载均衡器:按照文档或教程的指导,配置和部署选定的负载均衡器,包括定义后端服务器、设置负载均衡策略等。
  4. 测试和监控:在配置完成后,进行测试以确保负载均衡器能够正常工作,并设置监控系统来实时监测负载均衡器的性能和状态。

通过以上步骤,新手可以逐步理解和应用负载均衡器来实现集群分担方式,从而减轻服务器负载并提高系统的可靠性和性能。

子模块gateway网关

创建子模块,注意下一步后不要勾选任何依赖尤其是SpringWeb。

添加依赖:

1
2
3
4
5
6
7
8
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

配置文件yml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
server:
port: 8080
eureka:
client:
service-url:
defaultZone: http://localhost:8081/eureka
spring:
application:
name: spring-gateway
cloud:
gateway:
routes:
- id: cloud-user-consumer #随便起名字
uri: spring-consumer #服务名称
predicates:
- Path=/consumer/\*\* #访问路径
# filters:
# - StripPrefix=1 #过滤前缀

过滤前缀后就无法通过consumer访问其下的方法

首先配置一个未被使用的端口号

使用eureka注册

使用spring-name设置名称

使用cloud设置路由

作用

使用网关的路由转发后,可以通过设置好的路径直接访问到对应端口的方法

转发前:

1
localhost:8082/toLogin?username=admin&password=admin

转发后:

1
http://localhost:8080/consumer/toLogin?username=admin&password=admin

因为设置了路由,所以无需再修改端口号,只需要访问网关的端口然后网关再自动访问其他端口就可以

  • Title: springcloud学习笔记
  • Author: owofile
  • Created at : 2024-01-03 11:22:40
  • Updated at : 2025-04-12 14:31:09
  • Link: https://owofile.github.io/blog/2024/01/03/springcloud学习笔记/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments