Spring Cloud Gateway 实战之二:更多路由配置方式
写完代码后,先确保 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 可以把相关底层代码和要点都看起来。
如果不知道目前的努力方向,就看自己的领导或公司里技术强的人在学什么。
知道努力方向后不知道该怎么学,就到处去找相关资料然后练习。
学习以后不知道有没有学成,则可以通过面试去检验。
我个人觉得面试也像是一场全新的征程,失败和胜利都是平常之事。所以,劝各位不要因为面试失败而灰心、丧失斗志。也不要因为面试通过而沾沾自喜,等待你的将是更美好的未来,继续加油!
以上面试专题的答小编案整理成面试文档了,文档里有答案详解,以及其他一些大厂面试题目
评论