Spring-Gateway整合Nacos实现动态网关

2 篇文章 0 订阅
2 篇文章 0 订阅

一、部署并启动Nacos

该部分非本文的核心内容,故将直接使用docker单机部署的方式快速启动。

# 拉取镜像
docker pull nacos/nacos-server
# 启动容器,nacos的默认端口号为8848
docker run -itd \
  --name nacos \
  -p 8848:8848 \
  -e MODE=standalone \
  nacos/nacos-server

从浏览器打开http://10.144.0.8:8848/nacos/,可以看到已经启动成功了。
Nacos启动成功

二、Spring Gateway

(一)作为独立模块,不接入Nacos

1. pom.xml

<parent>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-parent</artifactId>
	<version>2.4.12</version>
</parent>
<dependencies>
	<dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-starter-gateway</artifactId>
		<version>3.0.0</version>
	</dependency>
</dependencies>

2. application.yml

spring:
  application:
    name: gateway
  cloud:
    gateway:
      routes:
      - id: nacos
        order: 0
        filters:
        - StripPrefix=0
        predicates:
        - Path=/nacos/**
        uri: http://10.144.0.8:8848

3. GatewayApplication.java

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

@SpringBootApplication
public class GatewayApplication {
	public static void main(String[] args) {
		SpringApplication.run(GatewayApplication.class, args);
	}
}

4. 启动Gateway

运行Spring Boot项目,打开http://10.144.0.1:8080/nacos/可以看到,我们也能打开如(一)中的nacos页面,说明已经启动并配置成功。

(二)使用Nacos作为配置中心

1. pom.xml

<dependencies>
	<dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-starter-gateway</artifactId>
		<version>3.0.0</version>
	</dependency>
	<dependency>
		<groupId>com.alibaba.cloud</groupId>
		<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
		<version>2021.1</version>
	</dependency>
	<dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-starter-bootstrap</artifactId>
		<version>3.0.0</version>
	</dependency>
</dependencies>

2. bootstrap.yml

此处需注意,采用nacos配置中心,需要从nacos读取配置信息,因此必须将配置中心的信息写在bootstrap.yml中,而非application.yml中,否则将无法从配置中心加载。
同时,在3.0以上版本的Spring Cloud中,需要手动导入bootstrap依赖。

spring:
  application:
    name: gateway
  cloud:
    nacos:
      config:
        server-addr: http://10.144.0.8:8848
        username: nacos
        password: nacos
        file-extension: yaml

3. GatewayApplication.java

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

@SpringBootApplication
public class GatewayApplication {
	public static void main(String[] args) {
		SpringApplication.run(GatewayApplication.class, args);
	}
}

4. Nacos配置管理

打开nacos配置列表,创建一个新的配置。要求满足:

  • Data IDbootstrap.yml中的spring.application.name相同;
  • Groupbootstrap.yml中的spring.cloud.nacos.config.group相同;
  • 配置格式bootstrap.yml中的spring.cloud.nacos.config.file-extension相同;
  • 配置内容与(一)中的application.yml格式相同,例如:
spring:
  cloud:
    gateway:
      routes:
      - id: nacos
        order: 0
        filters:
        - StripPrefix=0
        predicates:
        - Path=/nacos/**
        uri: http://10.144.0.8:8848

再次打开http://10.144.0.1:8080/nacos/,可以发现与上述(一)中的效果完全一致

(三)接入Nacos注册中心并自动转发路由

1. pom.xml

因为nacos已经不再支持ribbon组件,因此此处需要手动导入spring-cloud-loadbalancer

<dependencies>
	<dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-starter-gateway</artifactId>
		<version>3.0.0</version>
	</dependency>
	<dependency>
		<groupId>com.alibaba.cloud</groupId>
		<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
		<version>2021.1</version>
	</dependency>
	<dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-starter-bootstrap</artifactId>
		<version>3.0.0</version>
	</dependency>
	<dependency>
		<groupId>com.alibaba.cloud</groupId>
		<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
		<version>2021.1</version>
	</dependency>
	<dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-starter-loadbalancer</artifactId>
		<version>3.0.0</version>
	</dependency>
</dependencies>

2. bootstrap.yml

spring:
  application:
    name: gateway
  cloud:
    nacos:
      config:
        server-addr: http://10.144.0.8:8848
        username: nacos
        password: nacos
        file-extension: yaml
      discovery:
        server-addr: http://10.144.0.8:8848
        username: nacos
        password: nacos

3. GatewayApplication.java

需要在GatewayApplication上添加EnableDiscoveryClient注解以开启服务发现。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient
public class GatewayApplication {
	public static void main(String[] args) {
		SpringApplication.run(GatewayApplication.class, args);
	}
}

启动后,可以看到Gateway服务已经成功注册到nacos了。
Nacos服务列表

4. 自动转发已注册的服务

application.ymlbootstrap.yml中添加以下内容启用网关发现功能:

spring:
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true
          lower-case-service-id: true
          filters:
          - StripPrefix=1

5. 测试过程

(1)创建python-flask服务并注册到nacos。
#/usr/bin/python3

# 创建flask服务
from flask import Flask
app = Flask(__name__)
@app.get("/hello")
def hello():
    return "Hello, world."

# 将flask服务注册到nacos
from nacos import NacosClient
client = NacosClient(
    "10.144.0.8:8848",  # nacos地址
    username="nacos",
    password="nacos",
)
client.add_naming_instance(
    service_name="flask",
    ip="10.144.0.1",  # flask服务地址
    port=5000,        # flask服务端口
    ephemeral=False,
)

# 启动flask
if __name__ == '__main__':
    app.run(
        host='0.0.0.0',
        port=5000
    )
(2)查看nacos服务列表

Nacos服务列表
可以看到已经注册成功。

(3)请求服务
# 直接请求:
curl http://10.144.0.1:5000/hello
# Hello, world.

# 使用网关:
curl http://10.144.0.1:8080/flask/hello  # 其中 /flask/ 为服务在nacos注册的服务名
# Hello, world.

可以看到两种方法都可以成功。
请求服务成功

(四)补充:lb的使用

在nacos配置中心中添加以下内容:

spring:
  cloud:
    gateway:
      routes:
      - id: flask
        order: 0
        filters:
        - StripPrefix=0
        predicates:
        - Path=/hello
        uri: lb://flask/hello

即将/hello的请求转发到flask服务下的/hello路由,同样可以成功。
请求服务成功

自此,一个基础的Spring Gateway网关就搭建完成了。

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Cloud Gateway 是一个基于 Spring Framework 5、Project Reactor 和 Spring Boot 2 的反应式 API 网关。它旨在为微服务架构提供一种简单而有效的方式来路由请求,并提供一些常见的网关功能,如过滤器、负载均衡、熔断等。 而 Nacos 是一个动态服务发现、配置管理和服务管理平台,它提供了一种简单易用的方式来管理和配置微服务。可以通过 Nacos 提供的配置中心功能,实现动态配置 Spring Cloud Gateway 的路由规则。 下面是使用 Nacos 配置文件的动态路由的步骤: 1. 添加依赖:在 pom.xml 文件中添加以下依赖: ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> ``` 2. 配置 Nacos:在 application.properties 或 application.yml 文件中配置 Nacos 的地址和其他相关配置: ```yaml spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 spring.cloud.nacos.config.server-addr=127.0.0.1:8848 ``` 3. 创建动态路由配置文件:在 Nacos 的配置中心创建一个配置文件,例如 `gateway-route.yaml`,内容如下: ```yaml spring: cloud: gateway: routes: - id: demo_route uri: http://httpbin.org:80 predicates: - Path=/get ``` 4. 启用动态路由配置:在 Spring Cloud Gateway 的配置类中添加 `@RefreshScope` 注解,以支持动态刷新配置: ```java @Configuration @RefreshScope public class GatewayConfig { // 配置相关的 Bean } ``` 5. 启动应用程序:启动 Spring Boot 应用程序,并确保 Nacos 服务正常运行。 6. 动态刷新路由配置:在 Nacos 的配置中心修改 `gateway-route.yaml` 文件中的路由信息,并发布配置。 7. 查看动态路由:访问 Spring Cloud Gateway 的管理端点 `/actuator/gateway/routes`,可以看到动态路由已经生效。 通过以上步骤,就可以实现基于 Nacos 配置文件的动态路由。需要注意的是,Nacos 配置中心支持监听配置变更,当配置文件发生变化时,Spring Cloud Gateway 会自动刷新路由配置,无需重启应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值