软件系统开发定制三、Gateway实现负载均衡

文章目录


Gateway实现

通过Gateway软件系统开发定制实现负载均衡有两种方式,软件系统开发定制一种是自动的负载均衡,软件系统开发定制一种是手动的负载均衡。

软件系统开发定制自动负载均衡

Gateway软件系统开发定制还提供了和Zuul软件系统开发定制类似的自动路由规则,软件系统开发定制具体配置如下:

  1. discovery.locator.enabled= true 这个配置默认为false,但是如果为true,就是开启了通过serviceId转发到具体的服务实例。即:“localhost:9999/ServiceID/demo/**”。

    所以我们修改一下cloud-gateway-service-9999服务的application.yml配置,屏蔽掉网关的路由的routes配置

    server:  port: 9999spring:  application:    name: cloud-gateway-service  cloud:    nacos:      discovery:        server-addr: localhost:8848    gateway:      discovery:        locator:          enabled: true #开启注册中心路由功能          #是否与服务发现组件进行结合,通过serviceId转发到具体的服务实例。默认为false,设为true便开启通过服务中心的自动根据 serviceId 创建路由的功能#      routes:  # 路由#        - id: nacos-provider #路由ID,没有固定要求,但是要保证唯一,建议配合服务名#          uri: http://localhost:9001/nacos-provider # 匹配提供服务的路由地址#          predicates: # 断言#            - Path=/demo/** # 断言,路径相匹配进行路由
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

  2. 在配置好这些以后,重启服务,我们可以直接通过服务名称来进行访问Nacos中注册的服务和对应的接口,例如:(中间多了一个服务名称:/nacos-provider)

  1. Gateway在开启了自动路由之后,自带负载均衡

    首先,我们再创建一个服务demo-9002

具体配置如下:

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 https://maven.apache.org/xsd/maven-4.0.0.xsd">    <modelVersion>4.0.0</modelVersion>    <parent>        <groupId>com.example</groupId>        <artifactId>spring-cloud-gateway</artifactId>        <version>0.0.1-SNAPSHOT</version><!--        <relativePath/> &lt;!&ndash; lookup parent from repository &ndash;&gt;-->    </parent>    <groupId>com.son</groupId>    <artifactId>demo-9002</artifactId>    <version>0.0.1-SNAPSHOT</version>    <name>demo</name>    <description>Demo project for Spring Boot</description>    <properties>        <java.version>1.8</java.version>    </properties>    <dependencies>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-web</artifactId>        </dependency>        <dependency>            <groupId>com.alibaba.cloud</groupId>            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>        </dependency>    </dependencies></project>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

application.yml配置:

server:  port: 9002spring:  application:    name: nacos-provider  cloud:    nacos:      discovery:        server-addr: localhost:8848management:  endpoint:    web:      exposure:        include: '*'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

由于此服务也是配合Nacos使用,所以启动器要加上@EnableDiscoveryClient注解:

新建DemoController文件,里面的hello方法与springcloudalibaba-nacos-9001服务中的DemoController保持一致:

package com.example.demo.controller;import org.springframework.beans.factory.annotation.Value;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RestController@RequestMapping("/demo") //路由路径public class DemoController {    @Value("${server.port}")    private String serverPort;    @GetMapping(value = "/hello")    public String getServerPort(){        return "Hello! port: "+ serverPort;    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

然后我们将cloud-gateway-service-9999网关服务,以及2个微服务springcloudalibaba-nacos-9001、demo-9002启动起来

接着,我们访问地址:, 可以看到是走的9001服务

接着,我们刷新页面再次访问,可以看到是走的9002服务,所以Gateway在开启了自动路由之后(discovery.locator.enabled=true)自带负载均衡功能

手动负载均衡

在以上的配置中,其实是有问题的,问题在于当前的服务名称暴露,并且太过于灵活,那么如果想解决的话,其实我们可以进行手动配置(将uri配置中的http改为lb,lb代表开启负载均衡)。

修改一下cloud-gateway-service-9999网关服务的application.yml配置:

server:  port: 9999spring:  application:    name: cloud-gateway-service  cloud:    nacos:      discovery:        server-addr: localhost:8848    gateway:      discovery:        locator:          enabled: true #开启注册中心路由功能          #是否与服务发现组件进行结合,通过serviceId转发到具体的服务实例。默认为false,设为true便开启通过服务中心的自动根据 serviceId 创建路由的功能      routes:  # 路由        - id: nacos-provider #路由ID,没有固定要求,但是要保证唯一,建议配合服务名          uri: lb://nacos-provider # 匹配提供服务的路由地址 lb://代表开启负载均衡          predicates: # 断言            - Path=/demo/** # 断言,路径相匹配进行路由
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

注意:如果我们配置了discovery.locator.enabled= true,并且配置了路由routes规则之后,会根据predicates断言地址匹配对应的服务,就不会走自动路由配置。

接着,我们重启网关服务cloud-gateway-service-9999,然后访问:

再次访问:

此时,就实现了手动的负载均衡,服务名称就被隐藏了。

Gateway路由中uri的三种配置方式

上面我们讲到了http方式和lb注册中心服务方式,其实还有一种websocket方式

在gateway中配置uri配置有三种方式,包括:

http方式

gateway:      discovery:        locator:          enabled: true #开启注册中心路由功能          #是否与服务发现组件进行结合,通过serviceId转发到具体的服务实例。默认为false,设为true便开启通过服务中心的自动根据 serviceId 创建路由的功能      routes:  # 路由        - id: nacos-provider #路由ID,没有固定要求,但是要保证唯一,建议配合服务名          uri: http://localhost:9001/nacos-provider          predicates: # 断言            - Path=/demo/** # 断言,路径相匹配进行路由
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

websocket方式

gateway:      discovery:        locator:          enabled: true #开启注册中心路由功能          #是否与服务发现组件进行结合,通过serviceId转发到具体的服务实例。默认为false,设为true便开启通过服务中心的自动根据 serviceId 创建路由的功能      routes:  # 路由        - id: nacos-provider #路由ID,没有固定要求,但是要保证唯一,建议配合服务名          uri: ws://localhost:8888          predicates: # 断言            - Path=/demo/** # 断言,路径相匹配进行路由
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

注册中心服务方式

gateway:      discovery:        locator:          enabled: true #开启注册中心路由功能          #是否与服务发现组件进行结合,通过serviceId转发到具体的服务实例。默认为false,设为true便开启通过服务中心的自动根据 serviceId 创建路由的功能      routes:  # 路由        - id: nacos-provider #路由ID,没有固定要求,但是要保证唯一,建议配合服务名          uri: lb://nacos-provider          predicates: # 断言            - Path=/demo/** # 断言,路径相匹配进行路由
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发