写点什么

Spring Cloud Gateway 实战之二:更多路由配置方式

  • 2022 年 4 月 14 日
  • 本文字数:2681 字

    阅读完需:约 9 分钟

  • 写完代码后,先确保 nacos 已经启动

  • 在启动 provider-hello 工程,启动成功后去看 nacos,确认已经注册:



  • 准备完毕,可以开始实战了

[](()目标地址支持用服务名(取代之前的 IP+端口)

  • 咱们从最简单的开始,先看前文的路由配置,如下图红框,目标地址是 IP+端口:


![在这里插入图片描述](https://img-blog.csdnimg.cn/1048a420152e4993aadb79574be6e9b1.png?x-oss-process=image/watermark,type_ZmFuZ3po Java 开源项目【ali1024.coding.net/public/P7/Java/git】 ZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2JvbGluZ19jYXZhbHJ5,size_16,color_FFFFFF,t_70#pic_center)


  • 玩过 Spring Cloud 的您自然看出了问题所在:没有注册发现,确实,这样将地址和端口写死在配置文件中是不合适的,咱们先来解决这个问题;

  • 新增名为 gateway-by-loadbalance 的子工程,其 pom.xml 中的依赖情况如下,可见重点是 spring-cloud-starter-loadbalancer


<dependencies>


<dependency>


<groupId>com.bolingcavalry</groupId>


<artifactId>common</artifactId>


<version>${project.version}</version>


</dependency>


<dependency>


<groupId>org.springframework.cloud</groupId>


<artifactId>spring-cloud-starter-gateway</artifactId>


</dependency>


<dependency>


<groupId>io.projectreactor</groupId>


<artifactId>reactor-test</artifactId>


<scope>test</scope>


</dependency>


<dependency>


<groupId>org.springframework.boot</groupId>


<artifactId>spring-boot-starter-test</artifactId>


<scope>test</scope>


</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>


  • 启动类的代码省去了(和前文的一样)

  • 配置信息如下,重点是 uri 的值 lb://provider-hello,用了前缀 lb:,后面的 provider-hello 就是在 nacos 注册的服务名:


server:


#服务端口


port: 8085


spring:


application:


name: gateway-by-loadbalance


cloud:


nacos:

注册中心的配置

discovery:


server-addr: 127.0.0.1:8848


gateway:


routes:


  • id: path_route_lb


uri: lb://provider-hello


predicates:


  • Path=/lbtest/**


  • 单元测试类:


package com.bolingcavalry.gateway;


import com.bolingcavalry.common.Constants;


import org.junit.jupiter.api.Test;


import org.junit.jupiter.api.extension.ExtendWith;


import org.springframework.beans.factory.annotation.Autowired;


import org.springframework.boot.test.autoconfigure.web.reactive.AutoConfigureWebTestClient;


import org.springframework.boot.test.context.SpringBootTest;


import org.springframework.http.MediaType;


import org.springframework.test.context.junit.jupiter.SpringExtension;


import org.springframework.test.web.reactive.server.WebTestClient;


import static org.junit.jupiter.api.Assertions.assertTrue;


@SpringBootTest


@ExtendWith(SpringExtension.class)


@AutoConfigureWebTestClient


public class HelloTest {


@Autowired


private WebTestClient webClient;


@Test


void testLoadBalance() {


webClient.get()


.uri("/lbtest/str")


.accept(MediaType.APPLICATION_JSON)


.exchange()


// 验证状态


.expectStatus().isOk()


// 验证结果,注意结果是字符串格式


.expectBody(String.class).consumeWith(result -> assertTrue(result.getResponseBody().contains(Constants.LB_PREFIX)));


}


}


  • 运行单元 《一线大厂 Java 面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》开源 测试,通过,可见上述配置可以通过前缀 lb:准确找到服务:


[](()支持在 nacos 上配置

  • 将所有配置信息写在 application.yml 中有个问题:不能远程配置,这在应用数量较多的场景就不方便了,好在 nacos 提供了远程配置的能力,应用启动后可以从 nacos 取得自己的配置信息,咱们来试试

  • 新增名为 gateway-nacos-config 的子工程,其 pom.xml 中的依赖情况如下,请注意里面的中文注释,每指明了每一个依赖的作用:


<dependencies>


<dependency>


<groupId>com.bolingcavalry</groupId>


<artifactId>common</artifactId>


<version>${project.version}</version>


</dependency>


<dependency>


<groupId>org.springframework.cloud</groupId>


<artifactId>spring-cloud-starter-gateway</artifactId>


</dependency>


<dependency>


<groupId>io.projectreactor</groupId>


<artifactId>reactor-test</artifactId>


<scope>test</scope>


</dependency>


<dependency>


<groupId>org.springframework.boot</groupId>


<artifactId>spring-boot-starter-test</artifactId>


<scope>test</scope>


</dependency>


<dependency>


<groupId>org.springframework.cloud</groupId>


<artifactId>spring-cloud-starter-bootstrap</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-config</artifactId>


</dependency>


<dependency>


<groupId>com.alibaba.cloud</groupId>


<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>


</dependency>


</dependencies>


  • 本地的配置文件 bootstrap.yml,非常简单,就是 nacos 的地址和远程配置信息:


spring:


application:


name: gateway-nacos-config


cloud:


nacos:


config:


server-addr: 127.0.0.1:8848


file-extension: yml


group: DEFAULT_GROUP


  • 接下来再 nacos 增加一个配置文件,操作如下图红框:



  • 增加一个配置,要注意的地方如下(配置信息的文本稍后给出,便于复制):



  • 上图中完整的配置信息如下:


server:


port: 8083


spring:

如何快速更新自己的技术积累?

  • 在现有的项目里,深挖技术,比如用到 netty 可以把相关底层代码和要点都看起来。

  • 如果不知道目前的努力方向,就看自己的领导或公司里技术强的人在学什么。

  • 知道努力方向后不知道该怎么学,就到处去找相关资料然后练习。

  • 学习以后不知道有没有学成,则可以通过面试去检验。


我个人觉得面试也像是一场全新的征程,失败和胜利都是平常之事。所以,劝各位不要因为面试失败而灰心、丧失斗志。也不要因为面试通过而沾沾自喜,等待你的将是更美好的未来,继续加油!


以上面试专题的答小编案整理成面试文档了,文档里有答案详解,以及其他一些大厂面试题目




用户头像

还未添加个人签名 2022.04.13 加入

还未添加个人简介

评论

发布
暂无评论
Spring Cloud Gateway实战之二:更多路由配置方式_Java_爱好编程进阶_InfoQ写作平台