spring-cloud-alibaba的低版本
如果所用的SpringCloud和Nacos的版本信息如下:
<spring-cloud.version>Hoxton.SR10</spring-cloud.version>
<spring-cloud-alibaba.version>2.2.6.RELEASE</spring-cloud-alibaba.version>
网关的依赖如下:
<dependencies>
    <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>
</dependencies>
看下它是如何做路由转发的。
 在org.springframework.cloud.gateway.handler.FilteringWebHandler.GatewayFilterAdapter#filter()上打断点:
 
继续往下执行:
 这里就把请求匹配到了路由表中的某条路由记录,然后把请求的url做了重写。
 
 

 以上可以看出来,底层还是用ribbon做的负载均衡。
从nacos的依赖中也能看出来:
 
spring-cloud-alibaba的高版本
Springcloud2020开始弃用了Ribbon,因此Alibaba在2021版本nacos中删除了Ribbon的jar包,改用SpringCloudLoadbalancer 来实现负载均衡,因此如果SpringCloud的版本和SpringCloudAlibaba的版本是如下
<spring-cloud.version>2021.0.5</spring-cloud.version>
<spring-cloud-alibaba.version>2021.0.4.0</spring-cloud-alibaba.version>
gateway是需要单独引入负载均衡组件的:
<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-gateway</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-loadbalancer</artifactId>
    </dependency>
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
</dependencies>
gateway的配置:
spring:
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
    loadbalancer:
      enabled: true # 默认就是true
      nacos:
        enabled: true # 默认没有开启
    gateway:
      discovery:
        locator:
          # true 默认路由机制
          # 开启服务注册和发现功能,服务网关自动根据服务发现为每一个服务创建一个路由,这个路由将以(大写服务名)开头的请求路径转发到对应的服务中
          # 访问地址:127.0.0.1:8800/大写服务名/服务上下文/Controller/Method
          #
          # false 关闭默认路由机制,需要手动配置routes,默认通过路由名进行跳转的方式将失效,将请求路径上的服务名配置为小写
          # 访问地址:127.0.0.1:8800/小写写服务名/服务上下文/Controller/Method
          enabled: false # 默认就是false
          lower-case-service-id: true
      routes:
        - id: userservice
          uri: lb://userservice
          predicates:
            - Path=/user/**
同样打断点跟一下:
 
 
 

 测试代码下载:https://github.com/xjs1919/enumdemo/tree/master/gateway-demo
 



















