开发者学堂课程【全面讲解 Spring Cloud Alibaba 技术栈(知识精讲+项目实战)第三阶段:Gateway 从 nacos 中获取服务信息】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/685/detail/11888
Gateway 从 nacos 中获取服务信息
内容介绍
一、引言
二、具体步骤
一、引言
在入门案例中,通过客户端向 api 网关发送一个请求,通过 api 网关将请求转发到商品微服务并获取信息的效果,但是,我们也留下了疑问,微服务中具体的地址是写死的,但如果地址端网号变了,那是否要更改具体地址的配置呢?
要更改的话会很不方便,另外一个问题就是目前只有一个 product,我们之前做的product2,在这种情况下我们希望它可以负载均衡,当这种配置也是实现不了负载均衡。
下面入门案例做一点增强。实现地址不再写死,而是从 NACOS 中获取,要实现这种方式,那我们就要将网关作为一种微服务,注册到 NACOS 上,然后向订单微服务一样,做服务发现从这里面拉起的所有微服务的地址和端口号,然后就可以进行转发。
步骤如下,
第一,在网关中加入 NACOS 依赖,
第二,在主类上添加注解,
第三,修改配置文件,修改部分分为三部分,首先是 NACOS 相关的,要把我们的服务注册到 NACOS 上,所以要写一下 NACOS 的地址。
第二部分是开启 API 网关对 gateway 的支持,相当于能让网关从 NACOS 中拉取服务,最后我们要配置,直接写 NACOS 的服务名称,前边的 lb 指的就是负载均衡的意思,那是内部是预置了这样的一种东西,只要这样一写就自带负载均衡,是比较方便的,最后一步测试。
二、具体步骤
1、加入 NACOS 的依赖
<?xm1 version="1.0"encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/xMLSchema-instance"
xsi:schemaLocation-"http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/mave
<parent>
<artifactId>springcloud-alibaba</
artifactid><groupId>com.itheima</groupid><version>1.0-SNAPSHOT</version></parent>
<modelVersion>4.0.0</modelVersion>
<artifactid>api-gateway</artifactid>
<dependencies>
<!--gateway注意此模块不能引入
starter-web--><dependency>
<groupId>org.springframework.cloud</groupid>
<artifactid>spring-cloud-starter-gateway</artifactid></
dependency>
<!--nacos 服务发现-->
<dependency>
<groupId>com.alibaba.cloud</groupid>
<artifactid>spring-cloud-starter-alibaba-nacos-discovery</artifactid></dependency>
</dependencies>
</project>
2、找到我们的组类添加注解
package com.itheima;
import org.springframework.boot.SpringApplication;
import
org.springframework.boot.autoconfigure.SpringBootApplication;
import
org.springframework.cloud.client.discovery.EnableDiscoveryclient;
@SpringBootApplication
@EnableDiscoveryClient
public class ApiGatewayApplication{
public static void main(string[] args) {
springApplication.run(ApiGatewayApplication.class);
3、修改配置文件
首先,打通和 NACOS 的连接,地址是 localhost:8848,是注册中心的地址,将gateway 注册到 NACOS。第二,要开启从 NACOS 中获取服务,直接拷贝。
最后修改配置,lb 代表负载均衡,直接写 NACOS 的服务地址。
完整内容如下:
server:
port:7000 spring:
application:
name:api-gateway cloud:
nacos:
discovery:
server-addr: localhost:8848 #
将 gateway
注册到 nacos gateway:
di scovery:
locator:
enabled:true#
让 gateway从nacos 中获取服务信息
routes:#
路由数组[路由 就是指当请求满足什么样的条件的时候转发到哪个微服务上]
- id: product route #
当前路由发的标识,要求唯一默认是 UUID
uri:http://localhost:8081#
请求最终要被转发到的地址
uri:1b://service-product #
lb 指的是负载均衡,后面跟的是具体微服务在nacos 中的标识
order:1#
路由的优先级,数字越小代表路由的优先级越高
predicates:#
断言(条件判断,返回值是 boolean 转发请求要满足的条件)
- Path=/product-serv/**#
当请求路径满足 Path 指定的规则时,此路由信息才会正常转发 filters:#过滤器(在请求传递过程中对请求做一些手脚)
-stripPrefix=1#
在请求转发之前去掉一层路径
重新启动 gateway 进行访问测试,使用 product2,发现结果没有问题,这样,我们就解决了上节课遗留的问题,现在我们的网关就和 NACOS 打通了,可以从中拉取服务列表。
除我们使用的增强版之外,还有一个简写版,不需要配置路由,以下部分可以注掉,
routes:#
路由数组[路由 就是指当请求满足什么样的条件的时候转发到哪个微服务上]
- id: product route #
当前路由发的标识,要求唯一默认是 UUID
uri:http://localhost:8081#
请求最终要被转发到的地址
uri:1b://service-product #
lb 指的是负载均衡,后面跟的是具体微服务在nacos 中的标识
order:1#
路由的优先级,数字越小代表路由的优先级越高
predicates:#
断言(条件判断,返回值是 boolean 转发请求要满足的条件)
- Path=/product-serv/**#
当请求路径满足 Path 指定的规则时,此路由信息才会正常转发 filters:#过滤器(在请求传递过程中对请求做一些手脚)
-stripPrefix=1#
在请求转发之前去掉一层路径
这因为它有默认路由,重启刷新我们看一下效果,发现结果是错的,此时将地址改为 service-product,此时发现结果可用,这表示它默认的做了一个路由,只是将地址与之前的进行了调换,这种方法很少应用。