0
点赞
收藏
分享

微信扫一扫

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


文章目录

  • ​​一、前言​​
  • ​​二、Gateway、Nacos集成案例​​
  • ​​0、最上层父项目spring-cloud-alibaba-center​​
  • ​​1)pom.xml​​
  • ​​1、普通服务nacos-provider-service​​
  • ​​1、pom.xml​​
  • ​​2、application.yml​​
  • ​​3、启动类NacosProviderApplication​​
  • ​​4、HelloController​​
  • ​​5、启动nacos-provider-service​​
  • ​​6、启动nacos-provider-service-10002​​
  • ​​7、进入Nacos DashBoard​​
  • ​​2、搭建nacos-gateway​​
  • ​​1、pom.xml​​
  • ​​2、application.yml​​
  • ​​3、启动类NacosGatewayApplication​​
  • ​​4、启动gnacos-gateway​​
  • ​​5、Nacos Dashboard​​
  • ​​3、路由/负载均衡效果验证​​
  • ​​负载均衡效果​​
  • ​​四、总结​​

一、前言

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

  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。

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

其中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项目整体代码结构目录如下:

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

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

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

启动成功后,控制台输出如下:

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

6、启动nacos-provider-service-10002

进入​​Edit Configurations​​​,复制一个​​NacosProviderApplication​​​,命名为​​NacosProviderApplication-10002​​​,并在Program arguments中设置​​--server.port=10002​

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


启动NacosProviderApplication-10002,控制台日志输出如下:

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

7、进入Nacos DashBoard

此时的服务注册信息如下:gateway-nacos-provider服务两个实例;

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

2、搭建nacos-gateway

nacos-gateway整体代码结构目录如下:

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

其中包含一个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:
# 路由转发请求时,移除一层路径
-

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

启动成功后,控制台输出如下:

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

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

5、Nacos Dashboard

此时的服务注册信息如下:gateway-nacos-provider服务两个实例、nacos-gateway服务一个实例;

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

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

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

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

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

负载均衡效果

1> 先看NacosProviderApplication控制台的输出:

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

2> 先看NacosProviderApplication-10002控制台的输出:

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


结合两个服务实例的控制台输出来看,通过Gateway访问Nacos中注册的服务实例实现了负载均衡。

四、总结

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

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


举报

相关推荐

0 条评论