【云原生&微服务>SCG网关篇九】Spring Cloud Gateway集成Nacos实现请求负载详细案例

一、前言

至此微服务网关系列文章已出:

  1. 【云原生&微服务>SCG网关篇一】为什么要有网关、生产环境如何选择网关
  2. 云原生&微服务>SCG网关篇二】生产上那些灰度发布方式
  3. 【云原生&微服务>SCG网关篇三】Spring Cloud Gateway是什么、详细使用案例
  4. 云原生&微服务>SCG网关篇四】Spring Cloud Gateway内置的11种PredicateFactory如何使用
  5. 【云原生&微服务>SCG网关篇五】Spring Cloud Gateway自定义PredicateFactory
  6. 【云原生&微服务>SCG网关篇六】Spring Cloud Gateway内置的18种Filter使用姿势
  7. 【云原生&微服务>SCG网关篇七】Spring Cloud Gateway基于内置Filter实现限流、熔断、重试
  8. 【云原生&微服务>SCG网关篇八】Spring Cloud Gateway三种自定义Filter、GlobalFilter的方式

聊了以下问题:

  1. 为什么要有网关?网关的作用是什么?
  2. 网关的分类?
  3. 网关的技术选型?
  4. 使用网关时常用的灰度发布方式有哪些?
  5. Spring Cloud Gateway是什么?详细使用案例?
  6. Spring Cloud Gateway内置的11种PredicateFactory
  7. 如何自定义PredicateFactory?
  8. Spring Cloud Gateway内置的18种常用的Filter
  9. Spring Cloud Gateway基于内置Filter实现限流、熔断、重试
  10. Spring Cloud Gateway三种自定义Filter、GlobalFilter的方式

本文接着聊Spring Cloud Gateway和Nacos服务注册中心的集成案例

PS:SpringCloud版本信息:

<properties>
    <spring-boot.version>2.4.2</spring-boot.version>
    <spring-cloud.version>2020.0.1</spring-cloud.version>
    <spring-cloud-alibaba.version>2021.1</spring-cloud-alibaba.version>
</properties>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>${spring-boot.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <!--整合spring cloud-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <!--整合spring cloud alibaba-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>${spring-cloud-alibaba.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

二、Gateway、Nacos集成案例

整体项目目录包括两个Module,分别为:nacos-gateway、nacos-provider-service。
在这里插入图片描述

其中nacos-gateway作为路由网关、nacos-provider-service作为一个普通的微服务被整合到Gateway中。

0、最上层父项目spring-cloud-alibaba-center

spring-cloud-alibaba-center项目下只保留一个跟pom,用于做整体项目的maven依赖管理

1)pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.2</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>spring-cloud-alibaba-center</artifactId>
    <groupId>com.saint</groupId>
    <version>0.0.1-SNAPSHOT</version>
    <name>spring-cloud-alibaba-center</name>
    <packaging>pom</packaging>

    <modules>
        <module>gateway-center</module>
        <module>simple-service</module>
    </modules>

    <properties>
        <java.version>1.8</java.version>
        <spring-boot.version>2.4.2</spring-boot.version>
        <spring-cloud.version>2020.0.1</spring-cloud.version>
        <spring-cloud-alibaba.version>2021.1</spring-cloud-alibaba.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--整合spring cloud-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--整合spring cloud alibaba-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <!-- java编译插件 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

1、普通服务nacos-provider-service

nacos-provider-service项目整体代码结构目录如下:
在这里插入图片描述

包含一个pom.xml文件、一个application.yml配置文件、一个启动类、一个Controller。

扫描二维码关注公众号,回复: 14379934 查看本文章

1、pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>spring-cloud-alibaba-center</artifactId>
        <groupId>com.saint</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>nacos-gateway</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <description>nacos-gateway</description>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>

        <!--负载均衡器,如果不引入,或报错503-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-loadbalancer</artifactId>
        </dependency>

        <!--集成nacos-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

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

    </dependencies>

</project>

2、application.yml

设置服务的端口和程序名称、并将服务注册到服务注册中心Nacos。

server:
  port: 10001

spring:
  application:
    name: gateway-nacos-provider
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

3、启动类NacosProviderApplication

package com.saint.nacos;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * @author Saint
 */
@SpringBootApplication
public class NacosProviderApplication {
    
    
    public static void main(String[] args) {
    
    
        SpringApplication.run(NacosProviderApplication.class, args);
    }
}

4、HelloController

package com.saint.nacos.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author Saint
 */
@RestController
@RequestMapping("hello")
public class HelloController {
    
    

    @GetMapping("/sayHello")
    public String say() {
    
    
        System.out.println("[simple-service]:say Hello!");
        return "[simple-service]:say Hello!";
    }
}

5、启动nacos-provider-service

启动成功后,控制台输出如下:
在这里插入图片描述

6、启动nacos-provider-service-10002

进入Edit Configurations,复制一个NacosProviderApplication,命名为NacosProviderApplication-10002,并在Program arguments中设置--server.port=10002
在这里插入图片描述
启动NacosProviderApplication-10002,控制台日志输出如下:

在这里插入图片描述

7、进入Nacos DashBoard

此时的服务注册信息如下:gateway-nacos-provider服务两个实例;
在这里插入图片描述

2、搭建nacos-gateway

nacos-gateway整体代码结构目录如下:
在这里插入图片描述

其中包含一个pom.xml文件、一个application.yml配置文件、一个启动类;

1、pom.xml

pom文件中有两个点需要注意一下:

  1. 由于Gateway使用的是Reactive,所以不可以应用spring-boot-starter-web依赖;
  2. 因为服务存在多个实例,所以需要引入spring-cloud-loadbalancer来做负载均衡;
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>spring-cloud-alibaba-center</artifactId>
        <groupId>com.saint</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>nacos-gateway</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <description>nacos-gateway</description>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>

        <!--负载均衡器,如果不引入,或报错503-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-loadbalancer</artifactId>
        </dependency>

        <!--集成nacos-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

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

    </dependencies>

</project>

2、application.yml

server:
  port: 9999

spring:
  application:
    name: nacos-gateway
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
    gateway:
      discovery:
        locator:
          # 开启从注册中心动态创建路由的功能
          enabled: true
          # 是否使用service-id的小写,默认是大写
          lower-case-service-id: true
      routes:
        - id: gateway-nacos-service-route
          # 其中配置的lb://表示从注册中心获取服务,后面的gateway-nacos-provider表示目标服务在注册中心上的服务名
          uri: lb://gateway-nacos-provider
          predicates:
            - Path=/nacos/**
          filters:
            # 路由转发请求时,移除一层路径
            - StripPrefix=1

3、启动类NacosGatewayApplication

package com.saint.gateway;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * @author Saint
 */
@SpringBootApplication
public class NacosGatewayApplication {
    
    
    public static void main(String[] args) {
    
    
        SpringApplication.run(NacosGatewayApplication.class, args);
    }
}

4、启动gnacos-gateway

启动成功后,控制台输出如下:
在这里插入图片描述

可以看到Gateway对外提供服务的Netty Server端口号为我们自定义的9999;

5、Nacos Dashboard

此时的服务注册信息如下:gateway-nacos-provider服务两个实例、nacos-gateway服务一个实例;
在这里插入图片描述

3、路由/负载均衡效果验证

上述步骤中,我们已经依次启动了nacos-provider-service、nacos-gateway;

通过Gateway访问nacos-provider-service(访问四次):

在这里插入图片描述

负载均衡效果

1> 先看NacosProviderApplication控制台的输出:
在这里插入图片描述

2> 先看NacosProviderApplication-10002控制台的输出:
在这里插入图片描述
结合两个服务实例的控制台输出来看,通过Gateway访问Nacos中注册的服务实例实现了负载均衡。

四、总结

Spring Cloud Gateway 集成Nacos是目前Spring Cloud生态的主流集成方案,整体案例还是很简单的。

后续博文我们继续聊Spring Cloud Gateway中如何集成actuator实现服务状态追踪、集成zipkin实现服务调用链路信息追踪。

猜你喜欢

转载自blog.csdn.net/Saintmm/article/details/125832522