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这两个服务来进行测试,如图所示咱们再来看看Naocs的控制台而后拜访进行测试(拜访屡次),察看控制台输入从图中能够看到,通过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: 80spring: 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
能够看见,拜访频率大抵与权重相匹配