• 微服务 | Springboot整合GateWay+Nacos实现动态路由


    1、简介

    路由转发 + 执行过滤器链

    ​ 网关,旨在为微服务架构提供一种简单有效的统一的API路由管理方式。同时,基于Filter链的方式提供了网关的基本功能,比如:鉴权、流量控制、熔断、路径重写、黑白名单、日志监控等。

    基本功能如下:

    • 统一入口:暴露出网关地址,作为请求唯一入口,隔离内部微服务,保障了后台服务的安全性
    • 鉴权校验:识别每个请求的权限,拒绝不符合要求的请求
    • 动态路由:动态的将请求路由到不同的后端集群中

    在这里插入图片描述

    2、gateway核心概念

    • 路由(Route):由一个ID,一个目标URI(最终路由到的url地址),一组断言(匹配条件判断)和一组过滤器定义。如果断言为真,则路由匹配。

    • 断言(Predicate):通过断言匹配http请求中的任何内容(请求头、请求参数等),如果匹配成功,则匹配断言所在路由。

    • 过滤器(Filter):在请求前后执行业务逻辑,比如鉴权、日志监控、流量控制、修改请求头、修改响应等。

    3、路由

    spring:
      cloud:
    	gateway:
    	  routes:
    	  - id: manager						# 路由唯一标识
    		uri: lb://manager_server		# 路由指向目的地URL或服务名,客户端请求最终被转发到的微服务 									
    		predicates:
    		- Path=/manager/** 				# 断言:以manager开头的请求都负载到manager_server服务
    		filters:
    		- RewritePath=/manager/(?>.*), /$\{segment} # 过滤器:过滤掉url里的manager,例如http://ip:port/manager/test -> http://ip:port/test
    		order: 5						# 用于多个Route之间的排序,数值越小越靠前,匹配优先级越高
    

    4、实战练习

    1、项目结构

    在这里插入图片描述

    2、依赖
    1、父依赖
    <properties>
            <maven.compiler.source>8maven.compiler.source>
            <maven.compiler.target>8maven.compiler.target>
            <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
            <dubbo.version>3.2.0-beta.4dubbo.version>
            <spring-boot.version>2.6.11spring-boot.version>
        properties>
    
    
        <dependencyManagement>
            <dependencies>
                
                <dependency>
                    <groupId>org.springframework.bootgroupId>
                    <artifactId>spring-boot-starter-webartifactId>
                    <version>${spring-boot.version}version>
                    <type>pomtype>
                    <scope>importscope>
                dependency>
    
                
                <dependency>
                    <groupId>com.alibaba.cloudgroupId>
                    <artifactId>spring-cloud-alibaba-dependenciesartifactId>
                    <version>2021.0.4.0version>
                    <type>pomtype>
                    <scope>importscope>
                dependency>
    
                
                <dependency>
                    <groupId>com.alibaba.cloudgroupId>
                    <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
                    <version>2021.0.4.0version>
                    <type>pomtype>
                    <scope>importscope>
                dependency>
            dependencies>
        dependencyManagement>
    
    
    2、服务提供者依赖(provider)
        <dependencies>
    
            
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-webartifactId>
            dependency>
    
    
            
            <dependency>
                <groupId>com.alibaba.cloudgroupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
            dependency>
        dependencies>
    
    3、网关依赖(gateway)
        <dependencies>
            
            
            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-starter-gatewayartifactId>
                <version>3.1.2version>
            dependency>
    
            
            <dependency>
                <groupId>com.alibaba.cloudgroupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
            dependency>
    
            
            
            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-starter-loadbalancerartifactId>
                <version>3.1.1version>
            dependency>
        dependencies>
    
    3、配置文件
    1、服务提供者1配置(provider)
    server:
      port: 9002 
    spring:
      application:
        name: SpringBoot-Nacos-Dubbo-provider #Nacos注册中心服务名称
      cloud:
        nacos:
          discovery:
            server-addr: 127.0.0.1:8848 #Nacos注册中心地址
    

    服务提供者2复制修改端口即可

    2、gateway配置(路由配置方式1)
    server:
      port: 8080
    
    spring:
      application:
        name: gateway
      cloud:
        nacos:
          discovery:
            server-addr: localhost:8848 #注册到nacos中
        gateway:
          routes:
            - id: gateway1 #路由的ID,没有固定规则但要求唯一,建议配合服务名
              uri: http://localhost:9002 #匹配后提供服务的路由地址
              predicates:
                - Path=/provider/** # 断言,路径相匹配的进行路由
    
    4、服务提供者Controller
    @RestController
    @RequestMapping("/provider")
    public class ProviderController {
        @Value("${server.port}")
        private String post;
    
    
        @GetMapping("/getpost")
        public String getPost(){
            return "当前端口:"+post;
        }
    }
    
    5、项目启动

    启动服务提供者9002 浏览器访问localhost:8080/provider/getpost

    在这里插入图片描述

    6、gateway配置(路由配置方式2(动态配置))

    负载均衡

    传统模式

    在这里插入图片描述

    gateway

    在这里插入图片描述

    1、配置文件
    server:
      port: 8080
    
    spring:
      application:
        name: gateway
      cloud:
        nacos:
          discovery:
            server-addr: localhost:8848 #注册到nacos中
        gateway:
          discovery:
            locator:
              enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由
          routes:
            - id: gateway1 #路由的ID,没有固定规则但要求唯一,建议配合服务名
              uri: lb://SpringBoot-Nacos-Dubbo-provider #匹配后提供服务的名称 用于负载均衡
              predicates:
                - Path=/provider/** # 断言,路径相匹配的进行路由
    

    分别启动服务提供者9002、9001 浏览器访问localhost:8080/provider/getpost 实现负载均衡

    在这里插入图片描述

    在这里插入图片描述

  • 相关阅读:
    牛客训练3
    静态链接与动态链接
    批量下载Sentinel数据脚本2023
    《HelloGitHub》第 90 期
    面向对象实验一 类的建立与应用
    Zabbix自定义脚本监控MySQL数据库
    Linux关机命令、选项和原理详解
    kmp算法要点和难点具体应用场景
    Arduino与Proteus仿真实例-简单红外寻迹小车控制仿真
    Redis高可用之主从复制、哨兵、cluster集群
  • 原文地址:https://blog.csdn.net/m0_60500421/article/details/139961443