consul + gateway + ribbon实现负载均衡

  • 前言:
  • 1.Gateway环境搭建
    • 2.测试
      • 3.总结

 

前言:

使用的consul服务注册中心,所以需要单独建立一个gateway子项目,然后引入gateway和consul的依赖,注册到consul服务端
并且为了测试,还注册了category服务和goods服务,其中goods服务含有两个节点,模拟集群

consul + gateway + ribbon实现负载均衡_consul

1.Gateway环境搭建

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">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.jw</groupId>
    <artifactId>springcloud_parent</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>springcloud_08_gateway</module>
    </modules>

    <!-- 继承   -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.5.RELEASE</version>
    </parent>

    <!--定义springcloud使用版本号-->
    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Hoxton.SR6</spring-cloud.version>
    </properties>

    <!--全局管理springcloud版本,并不会引入具体依赖-->
    <dependencyManagement>
        <dependencies>
            <dependency>
<!--    这里发现多了<type>选项,表示引入的cloud是一个项目(工程),不是平常的一个jar,因为cloud是许多子项目的工具集
        由于一个pom文件只能有一个父项目,
        如果还想把另一个项目中的依赖引入,就得使用这种形式  -->
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

</project>

子项目

<?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>springcloud_parent</artifactId>
        <groupId>com.jw</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>springcloud08_gateway</artifactId>

    <dependencies>
        <!--引入gateway网关依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>

        <!--引入consul依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-consul-discovery</artifactId>
        </dependency>

        <!-- 这个包是用做健康度监控的-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
    </dependencies>

</project>

application配置文件

server:
  port: 7878
spring:
  application:
    name: GATEWAY
  cloud:
    gateway:
      routes:
        - id: CategoryRoute # 指定路由唯一标识
          uri: http://localhost:8081/ # 指定路由服务的地址
          predicates:
            - Path=/category/** # 指定路由规则
        - id: GoodsRoute
          uri: lb://GOODS
          predicates:
            - Path=/goods/**
    consul:
      host: localhost
      port: 8500

如果要查看路由列表规则
需要在配置文件中添加

management:
  endpoints:
    web:
      exposure:
        include: "*"   #开启所有web端点暴露

访问 http://localhost:7878/actuator/gateway/routes
consul + gateway + ribbon实现负载均衡_ribbon_02

2.测试

发现通过网关访问goods服务时,第一次访问的是8082端口服务,第二次是8083端口服务,
这里默认采用的是负载轮询的策略
测试通过
consul + gateway + ribbon实现负载均衡_gateway_03
consul + gateway + ribbon实现负载均衡_gateway_04
下面访问category服务,只有一个节点,不用负载均衡
consul + gateway + ribbon实现负载均衡_consul_05

3.总结

引入consul依赖时,底层已经引入了ribbon依赖,无需手动添加

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