开发者学堂课程【全面讲解 Spring Cloud Alibaba 技术栈(知识精讲+项目实战)第三阶段:Gateway 入门案例】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/685/detail/11887
Gateway 入门案例
内容介绍
一、引言
二、要实现的功能
一、引言
从客户端发送一个请求,发送到 api 网关上。通过网关希望他可以把请求录入到商品微服务。
写入:要求通过浏览器访问 API 网关。然后通过网关将请求转发到商品微服务。
这个 API 网关可以被看做是一个独立的微服务。所以说我们需要建一个微服务。
1、创建一个 API gateway 的模块。导入相关依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactid></
dependency>,这里的依赖很简单,只有一个 get away starter。
注意,这里不能导入 web。因为这里用到的东西两者不一样。所以说不能导入web。
2、我们需要创建主类。
添加配置文件
上半部分跟以前是一样的。后半部分我们需要根据 gateway 配置一些路由的参数。什么是路由呢?
路由就是从客户端到 API 网关,再到商品微服务。这个需求就叫微服务,我们要通过一系列的参数配置实现路由的功能。启动项目,并通过网关去访问微服务。
二、要实现的功能
1、创建一个 API-gateway 的模块,导入相关依赖
建立一个 model,命名为 api-gateway,这样的话一个模块就好了,接下来导入依赖,
<?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--
注意:此模块不能引入 starte-web>
<dependency>
<groupId>org.springframework.cloud</groupid>
<artifactId>spring-cloud-starter-gateway</artifactid></dependency></dependencies>
</project>
第一步中处理好之后来看第二步
2、在 java 中新建一个组类,
放到com.ithemia.APIgateway.application.中,按照 spring boot 的要求,写入代码,
并加入注解
package com.iteima;
import org.springframework.boot.SpringApplication;import
org.springframework.boot.autoconfigure.SpringBootApplication,
@SpringBootApplication
public class ApiGatewayApplication{
public static void main(String[] args) {
SpringApplication.run(ApiGatewayApplication.class);
第二步结束,接下来进行最重要的第三步
3、添加配置文件
在 resources 中添加配置文件,命名为 application.yml,先配置基础的东西,端口7000作为网关,
以下是路由要配置的东西:
@NotEmpty
private string id
= UUID.randomUUID().tostring();@NotEmpty@Validprivate List<PredicateDefinition> predicates = new
ArrayList();@Valid
private list<FilterDefinition> filters = new
ArrayList();@NotNull
private uri uri;
private int order = 0;
先写简单再写难,在案例中,最终要转到商品微服务中,所以他的地址就是local host8081。
Predicate 就是来定义条件的,当请求路径以 product 结尾的时候,要转到商品微服务就是一种条件,反之亦然,要注意,这是一个数组,所以可以写多个条件。
Filters 也是一个数组,是过滤器,作用是在请求传递过程中,对请求做一些手脚,例如对路径加一些东西都是可以的。
如下
server:
port:7000 spring:
application:
name:api-gateway cloud:
gateway:
routes:#路由数组[路由 就是指当请求满足什么样的条件的时候转发到哪个微服务上]
-id:#当前路由发的标识,要求唯一
uri:#请求最终要被转发到的地址
order:#路由的优先级,数字越小代表路由的优先级越高
predicates:#断言(条件判断,返回值是 boolean 转发请求要满足的条件
filters:#过滤器(在请求传递过程中 对请求做一些手脚)
-
到此请求定义的内容就全部讲完了,接下来将这些填充就好。
如 id,有一个默认值 UUID.randomUUID().tostring(),一般是不会用默认值的,是自定义的。
请求以 order 开头的时候,转到订单微服务,以 product 开头的时候,转到商品微服务,借用 path,请求路径满足指定的规则时,路由信息才会正常转发。最后要加一个过滤器,不借用过滤器使得路径不正确,使用过滤器将多余的去掉,传递过程中删掉一些东西。过滤器 stripprofix 指的就是在请求转发之前删掉一层路径。
完整代码如下:
server:
port:7000 spring:
application:
name:api-gateway cloud:
gateway:
routes:#路由数组[路由 就是指当请求满足什么样的条件的时候转发到哪个微服务上]
id:product route#当前路由发的标识,要求唯一,默认是UUID uri:http://localhost:8081# 请求最终要被转发到的地址
order:1#路由的优先级,数字越小代表路由的优先级越高
predicates:#断言(条件判断,返回值是 boolean 转发请求要满足的条件)
-Path=/product-serv/**#当请求路径满足 Path 指定的规则时,此路由信息才会正常转发
filters:#过滤器(在请求传递过程中对请求做一些手脚)
- stripPrefix=1 #在请求转发之前去掉一层路径
# localhost:7000/product-serv/product/1-->http://localhost:8081/product/1
开始测试:
开始测试时先运行 product,接着运行 gateway。
先不使用网关,直接访问一次,访问 localhost:8081|product|1,可以发现没有问题;
接下来通过网关服务,访问
localhost:7000|product-serv|| product |1,这个过程中会转发到 local host 中,测试效果发现没有任何问题,这样我们就达到了通过 springcloud gateway 这样一个网关请求微服务的一个功能。