GATEWAY+nacos+config实现路由动态负载均衡

GATEWAY 路由使用

1 、路由的核心概念

1.1 router(路由)

路由是构建网关的基本模块,他由ID,目标的URI ,一系列的断言和过滤器组成,如果断言为true则匹配该路由

1.1.1 URI:的类型
  • http://hostname/ip:port http协议
  • ws://hostname/ip:port websocket 协议
  • lb://applicatin-ame 为通过注册中心,注册的应用名称对请求进行自动负载均衡(较为常见,下划线不能被用作应用名,否则不能通过网关)
1.2 predicate(断言)

参考是java8重点java.util.function.Predicate

开发人员可以匹配HTTP请求中的所有内容(请求头,请求参数),如果请求与断言想匹配则进行路由。

1.3 fiter(过滤)

spring框架中gatewayFilter的实例,使用过滤器,可以在请求被路由前,或者路由后对请求进行修改。

2 GATEWAY的原理

在这里插入图片描述

  • 客户端向springcloud gateway 发出请求。然后在gateway Handler mapping中找到与请求向匹配的路由,将其发送到Gateway web handler。

  • handler 在通过制定的过滤器链来讲请求发动到我们实际的服务之星业务逻辑。过滤器之间用虚线分开始分开是因为过滤器可能会再发送代理请求之前(“pre”) 或者之后(“post”)执行业务逻辑

  • filter 在 “pre” 类型的过滤器可以做参数的校验,权限校验,流量监控,日志输出,协议转换等。在“post”类型的过滤器中可以做响应内容、响应头的修改、日志输出,流量监控等有着非常重要的作用。

3 配置实例
3.1 创建父工程
<?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">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.liu</groupId>
    <artifactId>cloud-efk</artifactId>
    <version>1.0-SNAPSHOT</version>
    <modules>
      
    </modules>
    <packaging>pom</packaging>


    <!-- 统一管理jar包版本 -->
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <junit.version>4.12</junit.version>
        <log4j.version>1.2.17</log4j.version>
        <lombok.version>1.18.2</lombok.version>
        <mysql.version>8.0.15</mysql.version>
        <druid.version>1.1.10</druid.version>
        <mybatis.spring.boot.version>3.2.0</mybatis.spring.boot.version>
        <springfox.version>2.7.0</springfox.version>
        <hutool.version>4.6.3</hutool.version>
        <lang3.version>3.9</lang3.version>
        <beanutils.verson>1.9.2</beanutils.verson>
    </properties>


    <dependencies>

        <!--nacos-config-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <!--nacos-discovery-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

    </dependencies>


    <!-- 子模块继承之后,提供作用:锁定版本+子modlue不用写groupId和version  -->
    <dependencyManagement>
        <dependencies>
            <!--spring boot 2.2.2-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.2.2.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--spring cloud Hoxton.SR1-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--spring cloud alibaba 2.1.0.RELEASE-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.1.0.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--数据源-->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>${mysql.version}</version>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid-spring-boot-starter</artifactId>
                <version>${druid.version}</version>
            </dependency>
            <!-- mybatis-plugins-->
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-boot-starter</artifactId>
                <version>${mybatis.spring.boot.version}</version>
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>${junit.version}</version>
            </dependency>
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>${log4j.version}</version>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>${lombok.version}</version>
            </dependency>


            <!--swgger-->
            <dependency>
                <groupId>io.springfox</groupId>
                <artifactId>springfox-swagger2</artifactId>
                <version>${springfox.version}</version>
            </dependency>
            <dependency>
                <groupId>io.springfox</groupId>
                <artifactId>springfox-swagger-ui</artifactId>
                <version>${springfox.version}</version>
            </dependency>

            <dependency>
                <groupId>cn.hutool</groupId>
                <artifactId>hutool-all</artifactId>
                <version>${hutool.version}</version>
            </dependency>
            <!--commons-utils-->
            <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-lang3</artifactId>
                <version>${lang3.version}</version>
            </dependency>

            <dependency>
                <groupId>commons-beanutils</groupId>
                <artifactId>commons-beanutils</artifactId>
                <version>${beanutils.verson}</version>
            </dependency>

        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.0.1.RELEASE</version>
                <configuration>
                    <fork>true</fork>
                    <addResources>true</addResources>
                </configuration>
            </plugin>

        </plugins>
    </build>





</project>
3.2 创建网关
3.2.0 改pom
<?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>cloud-efk</artifactId>
        <groupId>com.liu</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>efk-gateway9001</artifactId>

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

</project>
3.2.1 bootstrap.yaml
server:
  port: 9001
spring:
  application:
    name: efk-gateway
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #服务注册中心地址
      config:
        server-addr: localhost:8848 #配置中心地址
        file-extension: yaml #指定yaml格式的配置
        #dataId 匹配规则 nacos
        #${spring.application.name}-${spring.profiles.active}.${spring.cloud.config.file-extension}

3.2.2 application.yml
spring:
  profiles:
    active: dev
3.2.3 启动类
package com.liu.efk;


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

import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
@EnableDiscoveryClient
public class Gateway9001 {


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



}

3.3 创建测试模块
3.3.0 测试项目结构

在这里插入图片描述

3.3.1 改pom
<?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>cloud-efk</artifactId>
        <groupId>com.liu</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>efk-gateway-test9002</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

</project>
3.3.2 启动类
//9002 项目
package com.liu.efk;

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

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


//9003 项目

package com.liu.efk;

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

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



3.3.3 修改配置类application.yaml
#9002
server:
  port: 9002 

spring:
  profiles:
    active: dev
  application:
    name: efk-gateway-test
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #服务注册中心地址
      config:
        server-addr: localhost:8848 # 配置中心地址
        file-extension: yaml #指定yaml格式的配置
        
#9003        
        
server:
  port: 9002 #9003

spring:
  profiles:
    active: dev
  application:
    name: efk-gateway-test
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #服务注册中心地址
      config:
        server-addr: localhost:8848 # 配置中心地址
        file-extension: yaml #指定yaml格式的配置        
3.4 配置中心文件

lb 协议: 通过应用服务名完成,负载均衡

spring:
  cloud:
    gateway:
      routes:
      - id: payment_routh #路由的ID,没有固定规则但要求唯一,建议配合服务名
        uri: lb://efk-gateway-test   #匹配后提供服务的路由地址
        predicates:
        - Path=/gateway/**   #断言,路径相匹配的进行路由

在这里插入图片描述

3.5 测试

localhost:9002/gateway/test

​ 这里返回的是9002

localhost:9003/gateway/test

这里返回的是9003

localhost:9001/gateway/test

在这里插入图片描述

在这里插入图片描述

3.6 结果

通过这个实例完成, nacos+config+gateway+appid 动态负载均衡

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值