技术/杨33


一、Gateway是什么

为微服务提供一种简单有效的统一的API路由管理方式。

Gateway是基于WebFlux框架实现的,而WebFlux框架底层使用了高性能的Reactor模式通讯框架Netty。

二、Gateway的三大核心概念

Route路由、Predicate断言、Filter过滤。

  • Route路由

路由是构建网关的基本模块,它由ID、目标URL、一系列的断言和过滤器组成,如果断言为true,则匹配该路由。

  • Predicate断言

开发人员可以匹配HTTP请求中的所有内容,例如:请求头或请求参数,如果请求与断言相匹配,则进行路由。

  • Filter过滤

指的是Spring中的GatewayFilter的实例,使用过滤器,可以在请求被路由前或之后对请求进行修改。

三、网关Gateway的工作流程

客户端向Spring Cloud Gateway发出请求,然后在Gateway Handler Mapping中找到与请求相匹配的路由,将其发送到Gateway Web Handler。Handler再通过指定的过滤器链,将请求发送到我们实际的服务执行业务逻辑,然后返回。

四、Java代码编码体验

1、pom.xml文件依赖包配置

org.springframework.cloud

spring-cloud-starter-gateway

2、application.yml配置文件

server:

port: 9527

spring:

application:

name: cloud-gateway

cloud:

gateway:

routes:

- id: paymentRoute1 #路由的id,没有固定的规则,但要求唯一

uri: http://localhost:8001 #匹配后提供服务的路由地址

predicates:

- Path=/payment/getPayment/** #断言,路径相匹配的进行路由

eureka:

client:

register-with-eureka: true #true表示向注册中心注册自己

fetch-registry: true #是否从EurekaServer抓取已有的注册信息

service-url:

#defaultZone: http://localhost:7001/eureka/ #单机服务注册中心的地址

defaultZone: http://eureka7001.com:7001/eureka/ #集群服务

3、添加主启动类

@SpringBootApplication

@EnableEurekaClient

public class GatewayMain9527 {

public static void main(String[] args) {

SpringApplication.run(GatewayMain9527.class, args);

}

}

4、分别启动服务注册中心服务cloud-eureka-server7001、服务提供者服务cloud-provider-payment8001、网关服务cloud-gateway-gateway9527

访问接口:

5、网关gateway通过注册中心的微服务名称,动态路由服务提供者的接口

修改application.yml配置文件

server:

port: 9527

spring:

application:

name: cloud-gateway

cloud:

gateway:

discovery:

locator:

enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由

routes:

- id: paymentRoute1 #路由的id,没有固定的规则,但要求唯一

uri: lb://cloud-provider-payment #微服务名称

predicates:

- Path=/payment/getPayment/** #断言,路径相匹配的进行路由

eureka:

client:

register-with-eureka: true #true表示向注册中心注册自己

fetch-registry: true #是否从EurekaServer抓取已有的注册信息

service-url:

#defaultZone: http://localhost:7001/eureka/ #单机服务注册中心的地址

defaultZone: http://eureka7001.com:7001/eureka/ #集群服务

五、gateway的核心之一:Predicate断言,常用类型

官网上可以看到所有的类型:https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.2.RELEASE/reference/html/#gateway-request-predicates-factories

- After=2017-01-20T17:42:47.789-07:00[America/Denver]

这样的时间串生成方式:

ZonedDateTime zonedDateTime = ZonedDateTime.now();

System.out.println(zonedDateTime);

六、gateway的核心之一:Filter过滤

  • gatewayfilter-factories

官网上可以看到所有的类型:https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.2.RELEASE/reference/html/#gatewayfilter-factories

包含30种类型:

  • global-filters

官网上可以看到所有的类型:https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.2.RELEASE/reference/html/#global-filters

七、自定义过滤器Filter,实际工作用这个比较多

新建Java类,需实现接口GlobalFilter, Ordered

package com.cloud.filter;

import org.springframework.cloud.gateway.filter.GatewayFilterChain;

import org.springframework.cloud.gateway.filter.GlobalFilter;

import org.springframework.core.Ordered;

import org.springframework.http.HttpStatus;

import org.springframework.stereotype.Component;

import org.springframework.web.server.ServerWebExchange;

import reactor.core.publisher.Mono;

/**

* @author 杨33

* @date 2020/5/1 20:56

*/

@Component

public class MyGatewayFilter implements GlobalFilter, Ordered {

/**

* 过滤方法

* @param exchange

* @param chain

* @return

*/

@Override

public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {

String serial = exchange.getRequest().getQueryParams().getFirst("serial");

if (serial == null) {

System.out.println("serial名是非法的");

exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);

return exchange.getResponse().setComplete();

}

return chain.filter(exchange);

}

@Override

public int getOrder() {

return 0;

}

}

这样的代码,就可以过滤掉请求参数只要不是serial,那么不能完成正确的请求。


作者:杨33,北京互联网公司在职Java开发,专注分享写作干货。欢迎关注我,期待你的点赞评论。

gateway动态路由_微服务中的网关技术:Gateway相关推荐

  1. gateway动态路由_微服务与网关技术(SIA-GateWay)

    一.背景 软件架构,总是在不断的演进中... 把时间退回到二十年之前,当时企业级领域研发主要推崇的还是C/S模式,PB.Delphi这样的开发软件是企业应用开发的主流.随着时间的推移,基于浏览器的B/ ...

  2. nginx工作笔记005---nginx配置负载均衡_在微服务中实现网关集群_实现TCP传输层协议__http协议的负载均衡

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 我们在微服务中,由于网关的存在,后来,在nginx中都不需要在配置其他服务的地址了,只需要,配置一 ...

  3. python 微服务 网关_微服务中的 API 网关(API Gateway)

    我们知道在微服务架构风格中,一个大应用被拆分成为了多个小的服务系统提供出来,这些小的系统他们可以自成体系,也就是说这些小系统可以拥有自己的数据库,框架甚至语言等,这些小系统通常以提供 Rest Api ...

  4. iframe的src动态修改并刷新_微服务中配置中心Config+消息总线Bus,实现分布式自动刷新配置

    技术/杨33 一.分布式配置中心Config 一套集中的.动态的配置管理,实现统一配置微服务中的每个子服务. Spring Cloud Config为微服务架构提供了集中化的外部配置支持,配置服务器为 ...

  5. gateway动态路由_无语!SpringCloud Gateway动态路由之Nacos,我已经讲得很清楚了

    前言 当我们的网关Gateway程序开发完成之后,需要部署到生产环境,这个时候你的程序不能是单点运行的,肯定是多节点启动(独立部署或者docker等容器部署),防止单节点故障导致整个服务不能访问,网关 ...

  6. 降低代码执行中得内存消耗_微服务中使用 OpenJ9 JVM内存占用降低60%!

    专注于Java领域优质技术,欢迎关注 作者: 陈一乐 来自:陈一乐 随着微服务的普及,许多企业踏上微服务之旅. 微服务化后,应用数量可能高一个数量级.一般企业,以前三五个应用能支撑业务,微服务化之后应 ...

  7. 微服务中的网关到底是个什么鬼?

    前言 假设你正在开发一个电商网站,那么这里会涉及到很多后端的微服务,比如会员.商品.推荐服务等等. 那么这里就会遇到一个问题,APP/Browser怎么去访问这些后端的服务? 如果业务比较简单的话,可 ...

  8. 微服务中API网关的作用是什么?

    目录 什么是API网关? 为什么要用API网关? API网关架构 API网关是如何实现这些功能的? 协议转换 链式处理 异步请求 什么是API网关? Api网关是微服务的重要组成部分,封装了系统内部的 ...

  9. SpringCloud微服务架构之,Hystrix 熔断器,Gateway 网关

    Hystrix 概述 Hystix 是 Netflix 开源的一个延迟和容错库,用于隔离访问远程服务.第三方库,防止出现级联失败(雪崩). pom依耐 <!-- hystrix -->&l ...

最新文章

  1. linux shell脚本字符串连接符,学习Linux shell脚本中连接字符串的方法
  2. 推荐3个快速开发平台 前后端都有 项目经验又有着落了
  3. 八十、归并排序及其分而治之思想
  4. 在 Vue 中正确使用 防抖 和 节流
  5. 关于Web报表FineReport打印的开发应用案例
  6. 树莓派更换软件源提高下载速度
  7. TWRP-recovery中文界面安装方法[转]
  8. struct与typedef 结构体定义
  9. Silverlight 3一瞥
  10. Xcode7 低版本iOS系统上下有黑边的问题
  11. C中使用memset
  12. alias 为命令定义别名、unalias删除别名
  13. 国外RSGIS权威期刊杂志
  14. EXCEL数组公式(6),注意聚合函数在数组公式中的用法
  15. 《iRedMail邮件服务器搭建详细过程》
  16. 笔记本电脑插耳机后耳机无声音有外放情况,咋办??
  17. 用拉格朗日插值法,牛顿插值和分段线性插值计算近似值
  18. Windows Server 2016 (Updated Feb 2018) (x64)下载
  19. 安卓手机软件性能测试,手机性能评测软件
  20. Chuck语言学习笔记——0.前言:我为什么要学习这门语言

热门文章

  1. yii 操作数据库的三种方法
  2. 无法设置或未定义null引用的属性innerHTML
  3. C++的构造函数总结
  4. 学习Mahout(二)
  5. PGPDesktopWin32-10.2.0 加密与签名-软件实验8
  6. [基于子串搜索的方法] BNDM算法
  7. SQLServer扩展存储过程
  8. 3 ELK收集nginx正常和错误日志
  9. keepalived详解和实战
  10. Chrome浏览器 开发者工具中的 Performance