乐趣区

关于nacos:Nacos集成Spring-Cloud-Gateway实现动态路由

Nacos 集成 Spring Cloud Gateway 实现动静路由

后面咱们曾经介绍了 Nacos 的装置与配置,Spring Cloud 集成 Nacos 作为服务的注册核心和配置核心,集成 Nacos 实现服务的负载平衡和一些常见的负载平衡策略、应用 Dubbo、OpenFegin 进行 RPC 调用以及整合 Spring Cloud Gateway 作为服务的网关和 Gateway 的过滤器配置
接下来就让咱们一起来看看 Spring Cloud Gateway 的动静路由以及负载平衡
关联服务名的动静路由
之前咱们都是这样来配置的路由

service-url:user-service: http://localhost:...
spring:
  cloud:
    gateway:
      routes:
        - id: path_route
          uri: ${service-url.user-service}/user/get/{id}
          predicates:
            - Path=/user/get/{id}

复制代码
置信同学们都发现了一个问题,在微服务集群部署中一个服务可能会有多台主机,咱们这样配置路由不够灵便,每更改一次服务的主机信息都要从新编写一次配制文件,而后还须要重启 Gateway 服务器。咱们要晓得,在真正的我的项目中重启服务是很耗时的,咱们应该尽量避免这种状况
Spring Cloud Gateway 提供了 lb// 服务名的形式来动静的配置路由,网关会依据注册核心的服务名动静的获取服务的 URL,这样即使该服务的某一台主机地址扭转或者挂掉,网关都不用再跟着扭转
因而,咱们能够将路由更改成这种形式

spring:
  cloud:
    gateway:
      routes:
        - id: path_route
          # uri: ${service-url.user-service}/user/get/{id}
          uri: lb://user-service
          predicates:
            - Path=/user/get/{id}

复制代码
留神,引入依赖时须要排除 Nacos 中 ribbon 的依赖,而后再导入 loadbalancer 的依赖

因为 Netflix Ribbon 进入停更维护阶段,因而 SpringCloud 2020.0.1 版本之后 删除了 eureka 中的 ribbon,代替 ribbon 的是 spring cloud 自带的 LoadBalancer,默认应用的是轮询的形式。新版本的 Nacos discovery 都曾经移除了 Ribbon,此时咱们须要引入 loadbalancer 代替,能力调用服务提供者提供的服务

       `
<dependency>
           <groupId>com.alibaba.cloud</groupId>
           <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
           <exclusions>
               <!– 将 ribbon 排除 –>
               <exclusion>
                   <groupId>org.springframework.cloud</groupId>
                   <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
               </exclusion>
           </exclusions>
       </dependency>

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

复制代码
咱们启动网关,和 8080,8081 这两个服务来进行测试,如图所示

![图片](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/454a5a0804724059ad2fb1eb45e2730a~tplv-k3u1fbpfcp-zoom-in-crop-mark:3024:0:0:0.awebp)

咱们再来看看 Naocs 的控制台

![图片](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/fbdbad19bf624fb295c77d260050e617~tplv-k3u1fbpfcp-zoom-in-crop-mark:3024:0:0:0.awebp)

而后拜访进行测试(拜访屡次),察看控制台输入

![图片](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/00e7bb0afe0741bbbbf155ead4f85722~tplv-k3u1fbpfcp-zoom-in-crop-mark:3024:0:0:0.awebp)


![图片](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/0427ef79d41e4ee1966fb502ed86d788~tplv-k3u1fbpfcp-zoom-in-crop-mark:3024:0:0:0.awebp)


![图片](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/4c0228e45c564efc9dc015357ea19c69~tplv-k3u1fbpfcp-zoom-in-crop-mark:3024:0:0:0.awebp)

从图中能够看到,通过 lb:// 服务名 的形式配置该服务的各个主机都有被拜访过,这是因为集成了 LoadBalancer 是实现了负载平衡,默认轮询
基于 Nacos 配置中的动静路由
后面咱们做到了网关屏蔽服务的高低线的细节,然而,当咱们想要对路由进行减少,或者服务全副下线删除该服务的路由的状况咱们还是须要更改配制文件,而后重启网关。所以,咱们能够基于配置核心来实现路由的动静扩容,配置核心我应用的 Nacos
导入对应依赖
     ```
   <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
        </dependency>

复制代码
编写对应的配制文件
编写 bootstrap.yml , 次要是对 Nacos 配置核心的一些设置

spring:
  application:
    name: gateway-service
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.199.128:8848 #Nacos 地址
      config:
        server-addr: 192.168.199.128:8848 #Nacos 地址
        file-extension: yaml #这里咱们获取的 yaml 格局的配置

复制代码
编写 application.yml , 启用对应环境

server:
  port: 80
spring:
  profiles:
    active: dev

复制代码
在 Nacos 后盾编写对应的配制文件,dataId 为 gateway-service-dev.yaml

spring:
  cloud:
    gateway:
      default-filters:
        - DedupeResponseHeader=Access-Control-Allow-Origin, RETAIN_UNIQUE
      globalcors:
        cors-configurations:
          '[/**]':
            allowedHeaders: '*'
            allowedMethods: '*'
            allowedOrigins: '*'
      routes:
        - id: path_route
          uri: lb://user-service
          predicates:
            - Path=/user/get/{id}
            
  ################## 省略数据库,redis 等其余配置 #########################

复制代码
启动网关和 user-service

增加路由
接下来咱们在 Nacos 配置核心增加新的路由

spring:
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true
      default-filters:
        - DedupeResponseHeader=Access-Control-Allow-Origin, RETAIN_UNIQUE
      globalcors:
        cors-configurations:
          '[/**]':
            allowedHeaders: '*'
            allowedMethods: '*'
            allowedOrigins: '*'
      routes:
        - id: path_route
          # uri: ${service-url.user-service}/user/get/{id}
          uri: lb://user-service
          predicates:
            - Path=/user/get/{id}
            
        - id: userservice_route
          uri: http://localhost:8080
          predicates:
            - Path=/user/test

复制代码
配置核心公布前拜访 http://localhost/user/test/ 试一试:

而后将新的配制文件公布,再拜访测试

察看控制台能够看到网关服务在配置核心公布新的配置后进行了更新

对于集成 Nacos 实现动静路由还有另外的形式,在配置核心创立 son 文件,而后通过 json 格局来治理各个路由,这种形式我就不再演示了,感兴趣的同学能够上网自行搜寻。集体认为 yml 的格局可读性要高一些

基于 Nacos 权重的负载平衡策略
应用 LoadBalancer 进行负载平衡后面文章曾经介绍过,如果还不是很相熟的同学请先浏览:
LoadBalacer 集成 Nacos 实现负载平衡
常见的负载平衡策略剖析
接下来我就简略的演示下基于 Nacos 权重的负载平衡吧

package cuit.epoch.pymjl.config;

import com.alibaba.cloud.nacos.NacosDiscoveryProperties;
import com.alibaba.cloud.nacos.loadbalancer.NacosLoadBalancer;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClients;
import org.springframework.cloud.loadbalancer.core.ReactorLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier;
import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.core.env.Environment;

import javax.annotation.Resource;

/**
 * @author Pymjl
 * @version 1.0
 * @date 2022/9/2 15:36
 **/
@LoadBalancerClients(defaultConfiguration = NacosLoadBalancerConfig.class)
public class NacosLoadBalancerConfig {
    @Resource
    NacosDiscoveryProperties nacosDiscoveryProperties;

    @Bean
    public ReactorLoadBalancer<ServiceInstance> reactorServiceInstanceLoadBalancer(
            Environment environment,
            LoadBalancerClientFactory loadBalancerClientFactory) {String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
        return new NacosLoadBalancer(loadBalancerClientFactory
                .getLazyProvider(name, ServiceInstanceListSupplier.class), name, nacosDiscoveryProperties);
    }
}

复制代码
启动服务

Nacos 配置核心的路由规定
spring:
cloud:

gateway:
  discovery:
    locator:
      enabled: true
  default-filters:
    - DedupeResponseHeader=Access-Control-Allow-Origin, RETAIN_UNIQUE
  globalcors:
    cors-configurations:
      '[/**]':
        allowedHeaders: '*'
        allowedMethods: '*'
        allowedOrigins: '*'
  routes:
    - id: path_route
      # uri: ${service-url.user-service}/user/get/{id}
      uri: lb://user-service
      predicates:
        - Path=/user/get/{id}
        
    - id: userservice_route
      uri: lb://user-service
      predicates:
        - Path=/user/test

复制代码
批改服务的权重

屡次拜访 http://localhost/user/test

能够看见,拜访频率大抵与权重相匹配

退出移动版