摘要

对于小项目而言,SpringBoot够用了,完全没必要上SpringCloud+Nacos,因为实在太重了,部署、配置均麻烦的一批。但是一些应用场景下,比如开发者想脱身的时候,使用这套技术栈,就可以做到完全甩锅给运维!

正文

先说下版本对应关系,官方文档里倒是提到了springboot、springcloud、springcloudalibaba之间的对应关系,但是文档存在更新不及时问题。因此,版本对应关系,可以直接使用提供的脚手架。

脚手架生成服务

脚手架生成配置截图

image-20250509231829850.jpg

image-20250509231905047.jpg

一、SpringCloudGateway

创建一个空Maven项目,pom.xml中添加如下内容。

xml
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<properties>
    <java.version>1.8</java.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <spring-boot.version>2.6.13</spring-boot.version>
    <spring-cloud.version>2021.0.5</spring-cloud.version>
</properties>
<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter</artifactId>
    </dependency>
    <!-- 异步网关。对应的还有基于Servlet-API的同步网关spring-cloud-starter-gateway-mvc -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-gateway</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>
<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>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>${spring-boot.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

配置示例application.yml

yaml
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
server:
  port: 80
spring:
  cloud:
    gateway:
      # spring-cloud-gateway:https://docs.spring.io/spring-cloud-gateway/docs/
      # predicate 文档:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gateway-request-predicates-factories
      # filter 文档:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gatewayfilter-factories
      routes:
        - id: test
          # 用户访问http://127.0.0.1:80/data/a/b/c 实际代理地址http://127.0.0.1:8080/api/a/b/c
          predicates:
            - Path=/data/**
          filters:
            - StripPrefix=1
            # 使用 (?<segment>.*) 是为了捕获路径部分,后续用 ${segment} 进行替换。
            # 也可以不叫segment
            - RewritePath=/(?<segment>.*), /api/${segment}
          uri: http://127.0.0.1:8080
        - id: name
          # 用户访问http://127.0.0.1:80/ta/tb/tc 实际代理地址http://127.0.0.1:8080/root/ta/tb/tc
          predicates:
            - Path=/**
          filters:
            - RewritePath=/(?<segment>.*), /root/${segment}
          uri: http://127.0.0.1:8080

参考文档

直接上源码

二、Nacos配置管理与服务发现

2.1 Nacos编译与使用

了解Nacos可以直接阅读官方文档

使用Nacos,我们需要有Nacos-Server,此处就不使用官方提供的release版本了,而是自己编译,因为本来就是Java开发的,所以对于Javaer来说也没啥难度!

sh
1
2
3
4
git clone https://github.com/alibaba/nacos.git
cd nacos
git checkout 2.2.4
mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U

只需要四行命令,即可实现编译,要求编译时有网络环境。

image-20240321153454197.png

之后,进入到distribution/target,即可获取压缩包。

image-20240321153754565.png

解压后,进入bin目录,执行命令启动nacos服务即可

sh
1
startup.cmd -m standalone

2.2 实现动态数据源切换

创建项目时,需要添加配置管理依赖和服务发现依赖。

image-20240321155014761.png

image-20240321155158016.png

“Talk is cheap. Show me the code.”,直接上源码

核心在于@RefreshScope这个注解,被该注解标识后,表示这个Bean在运行时是可刷新的。并且所有基于该Bean的依赖也会被刷新,这些复杂的工作都是springcloud做的,开发者不需要关心。

整体流程如图所示

image-20240321161819113.png

至于Nacos如何配置,参照Nacos 融合 Spring Cloud,成为注册配置中心 | Nacos

展示一下最后的成果。

image-20240321170918264.png

参考