转载

SpringCloud (GreenwichR2) 第三章 Gateway 入门 附源码

官方文档

cloud.spring.io/spring-clou…

为什么需要它???

如果让客户端直接与各个微服务通信,会有以下的问题:

  1. 客户端会多次请求不同的微服务,增加了客户端的复杂性。
  2. 存在跨域请求,在一定场景下处理相对复杂。
  3. 认证复杂,每个服务都需要独立认证。
  4. 难以重构,随着项目的迭代,可能需要重新划分微服务。例如,可能将多个服务合并成一个或者将一个服务拆分成多个。如果客户端直接与微服务通信,那么重构将会很难实施。
  5. 某些微服务可能使用了防火墙 / 浏览器不友好的协议,直接访问会有一定的困难。

so 我们需要一个网关能统一处理这些问题,包括授权、限流、日志、安全等系统常用功能。

Gateway必须掌握的

  • 路由:路由网关的基本构建块。它由ID,目标URI,谓词集合和过滤器集合定义。如果聚合谓词为真,则匹配路由。
  • 谓词:这允许开发人员匹配来自HTTP请求的任何内容,例如标头或参数。
  • 过滤器:这些是使用特定工厂构建的Spring FrameworkGatewayFilter实例。这里,可以在发送下游请求之前或之后修改请求和响应。

gateway在微服务中扮演角色就是一个优秀的"皇宫护卫"吧

摘抄下网络的的原理图吧

SpringCloud (GreenwichR2) 第三章 Gateway 入门 附源码

接着我们创建一个Gateway模块

这边还是接着第二章的Demo开始 ,选中scloud项目,右击 New - Module - Spring Initializr

SpringCloud (GreenwichR2) 第三章 Gateway 入门 附源码

next

SpringCloud (GreenwichR2) 第三章 Gateway 入门 附源码

选择两个依赖包Gateway 和 Euraka Discovery Client

SpringCloud (GreenwichR2) 第三章 Gateway 入门 附源码

SpringCloud (GreenwichR2) 第三章 Gateway 入门 附源码

接着 我们还是和上一章创建服务消费者一样 修改pom.xml 和 application.yml(这边我把默认的.properties修改成.yml文件)

application.yml 内容如下

SpringCloud (GreenwichR2) 第三章 Gateway 入门 附源码

在启动类加入注解

@SpringBootApplication
@EnableEurekaClient
public class EurekaGatewayApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaGatewayApplication.class, args);
    }

}复制代码

好了到此为止网关应该搭建结束了

我们以此启动eureka_server模块,eureka_client模块,eureka_consumer_openfeign 模块,eureka_gateway模块。

问题来了,当启动eureka_gateway模块的时候报错了!

一个警告:

********************************************************** 
 Spring MVC found on classpath, which is incompatible with Spring Cloud Gateway at this time. Please remove spring-boot-starter-web dependency.
 **********************************************************
复制代码

报错部分截图:

SpringCloud (GreenwichR2) 第三章 Gateway 入门 附源码

经过搜索各大论坛,说是 spring-cloud-starter-gateway 和  spring-boot-starter-web 都用了webflux架包产生冲突!

解决方法:对我这个项目,就是把  spring-boot-starter-web 不放入主pom.xml引用,各个模块自己依赖spring-boot-starter-web,主pom.xml修改如下

最终gateway 的 pom.xml 包如下

SpringCloud (GreenwichR2) 第三章 Gateway 入门 附源码

我们在启动eureka_gateway 模块,OK,现在全部启动起来了

SpringCloud (GreenwichR2) 第三章 Gateway 入门 附源码

访问下 http://localhost:8666 看下注册的服务,都有了。

SpringCloud (GreenwichR2) 第三章 Gateway 入门 附源码

现在我们从浏览器网关端口访问服务 http://localhost:8671/test/sayHello/world (8671 后面的路径也就是服务消费者提供的Restful api)

SpringCloud (GreenwichR2) 第三章 Gateway 入门 附源码

至此,网关已经通了,就这么简单???

当然不是!!!现在只是走通请求,还有...

Predicate Factory (表明在哪种条件下,该路由配置生效)

GatewayFilter Factory (用于过滤请求,比较复杂)

除了本身的一些特性学习外,网关这个模块还需要集成断路器Hystrix、Security(认证、授权)、token 等,内容还是比较多且丰富的,为了条例清晰些节约每个内容的篇幅,下一节在记录下Predicate Factory的使用。

源码地址: gitee.com/dolan/sclou…

切换到分支 f_gateway !!!

原文  https://juejin.im/post/5d79990e6fb9a06ad45171ad
正文到此结束
Loading...