springcloud整合Gateway
简介
1、是什么
springcloud gateway使用webflux的reactor-netty响应式编程组件,底层使用了Netty通讯框架
2、能干嘛
反向代理、鉴权、流量控制、熔断、日志监控
3、网关对比
gateway对比netflix和zuul来说都要靠谱一点
4、三大核心概念
路由(Route):链路URI和ID构成
断言(predicate):请求参数是否匹配断言条件,匹配则进行路由
过滤(filter):使用过滤器可以在请求被路由前或者路由后进行修改
实战
1、建module
gateway-gateway9527
2、改pom
<?xml 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/maven-4.0.0.xsd"><parent><artifactId>cloud2020</artifactId><groupId>com.atguigu.springcloud</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>cloud-gateway-gateway9527</artifactId><dependencies><!--gateway--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><!--eureka-client--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><!-- 引入自己定义的api通用包,可以使用Payment支付Entity --><dependency><groupId>com.atguigu.springcloud</groupId><artifactId>cloud-api-commons</artifactId><version>${project.version}</version></dependency><!-- <dependency>--><!-- <groupId>org.springframework.boot</groupId>--><!-- <artifactId>spring-boot-devtools</artifactId>--><!-- <scope>runtime</scope>--><!-- <optional>true</optional>--><!-- </dependency>--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies></project>
3、配yml
server:port: 9527spring:application:name: cloud-gatewaycloud:gateway:discovery:locator:enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由routes:- id: payment_routh #payment_route #路由的ID,没有固定规则但要求唯一,建议配合服务名#uri: http://localhost:8001 #匹配后提供服务的路由地址uri: lb://cloud-payment-service #匹配后提供服务的路由地址predicates:- Path=/payment/get/** # 断言,路径相匹配的进行路由- id: payment_routh2 #payment_route #路由的ID,没有固定规则但要求唯一,建议配合服务名#uri: http://localhost:8001 #匹配后提供服务的路由地址uri: lb://cloud-payment-service #匹配后提供服务的路由地址predicates:- Path=/payment/lb/** # 断言,路径相匹配的进行路由- After=2020-03-08T10:59:34.102+08:00[Asia/Shanghai]# - Before=2020-03-08T10:59:34.102+08:00[Asia/Shanghai]# - Between=2020-03-08T10:59:34.102+08:00[Asia/Shanghai] , 2020-03-08T10:59:34.102+08:00[Asia/Shanghai]# curl http://localhost:9527/payment/lb --cookie "username=zzyy"# - Cookie=username,zzyy #Cookie=cookieName,正则表达式# 请求头要有X-Request-Id属性并且值为整数的正则表达式 curl http://localhost:9527/payment/lb --cookie "username=zzyy" -H "X-Request-Id:11"
# - Header=X-Request-Id, \d+
# - Host=**.atguigu.com # curl http://localhost:9527/payment/lb -H "Host:afae.atguigu.com"eureka:instance:hostname: cloud-gateway-serviceclient: #服务提供者provider注册进eureka服务列表内service-url:register-with-eureka: truefetch-registry: truedefaultZone: http://eureka7001.com:7001/eureka
4、主启动
@SpringBootApplication
@EnableEurekaClient
public class CloudGateway9527Application {public static void main(String[] args) {SpringApplication.run(CloudGateway9527Application.class, args);System.out.println("启动成功");}
}
5、测试:
添加网关前:http://localhost:8001/payment/get/31
添加网关后:http://localhost:9527/payment/get/31
6、通过9527访问外网地址
config配置
@Configuration
public class GateWayConfig {@Beanpublic RouteLocator customRouteLocator(RouteLocatorBuilder routeLocatorBuilder) {RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes();routes.route("path_route_atguigu", r -> r.path("/guoji").uri("http://news.baidu.com/guonei")).build();return routes.build();}
}
通过微服务名进行动态路由
默认情况下Gateway会根据注册中心的服务列表,以注册中心上微服务名为路径创建动态路由进行转发,从而实现动态路由的功能
predicate配置
1、After
- After=2020-03-08T10:59:34.102+08:00[Asia/Shanghai]
2、Before
- Before=2020-03-08T10:59:34.102+08:00[Asia/Shanghai]
3、Between
- Between=2020-03-08T10:59:34.102+08:00[Asia/Shanghai] , 2020-03-08T10:59:34.102+08:00[Asia/Shanghai]
4、Cookie
需要配置两个参数,cookie name和正则表达式,当匹配上才会执行路由
- Cookie=username,zhangsan
5、Header
-Header=X-request-Id,\d+ #表示请求头要有X-request-Id属性,且还要有值为正数的表达式
6、Host
- Host=**.dsf.com
7、Method
- Method=GET
8、Query
- Query=username, \d+ #要有参数名称并且是正整数才能路由
总结
说白了,Predicate就是为了实现一组匹配规则,让请求过来找到对应的Route进行处理
Filter
1、能干嘛?
用于修改进入的HTTP请求和返回HTTP响应
2、内置的filter配置
spring.cloud.routes.filters:-AddRequestParameter=X-Request-Id,1024.表示属性为X-Request-Id的参数值为1024
3、自定义全局的Global过滤器
作用:全局日志记录、统一网关鉴权等
demo:
需要实现GlobalFilter和Ordered接口
@Component
@Slf4j
public class MyLogGateWayFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {log.info("***********come in MyLogGateWayFilter: " + new Date());// 获取请求参数中的 unameString uname = exchange.getRequest().getQueryParams().getFirst("uname");if (uname == null) {log.info("*******用户名为null,非法用户,o(╥﹏╥)o");exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);return exchange.getResponse().setComplete();}return chain.filter(exchange);}/*** 加载过滤器顺序,数字越小优先级越高** @return*/@Overridepublic int getOrder() {return 0;}
}
3、测试
正确:http://localhost:9527/payment/lb?uname=z3
错误:其他
springcloud整合Gateway相关推荐
- springcloud 整合gateway 网关
gateway网关 目录 gateway网关 一.gataway网关是什么? 1.依赖 2.配置文件 总结 一.gataway网关是什么? Spring Cloud Gateway 是 Spring ...
- Java微服务——SpringCloud实战篇2:整合Gateway、Config、Bus
Java微服务--SpringCloud实战篇2:整合Gateway.Config.Bus 如果小伙伴在阅读下列内容时,对于编写SpringCloud项目是零基础,那么请先阅读小编的另一篇博文:&qu ...
- Nacos整合Gateway实现动态路由
往期回顾 Nacos的安装与配置 Spring Cloud集成Nacos作为注册中心 LoadBalacer集成Nacos实现负载均衡 常见的负载均衡策略分析 Spring Cloud集成Dubbo实 ...
- SpringCloud 整合 Dubbo
目录 1.介绍 2.代码实现 2.1 抽取公共模块 2.2 改造服务提供者 2.3 改造服务消费者 3.启动测试 1.介绍 Dubbo有两种使用方式: 1.基于SOA的思想,将一个单体架构拆分为web ...
- SpringCloud 网关 Gateway
哈喽~大家好,这篇来看看SpringCloud 网关 Gateway.
- SpringCloud 整合 Seata
<分布式事务>https://blog.csdn.net/u011060911/article/details/122210788上面的文章系统介绍了分布式事务相关的理论知识,本文则通过代 ...
- 解决SpringCloud的Gateway网关无法访问服务的静态资源
解决SpringCloud的Gateway网关无法访问服务的静态资源 在重构项目的时候,配置gateway网关后,利用网关地址访问服务,发现服务的静态资源报了404 报错如下: gateway网关配置 ...
- SpringCloud - 整合Nacos启动报错Consider defining a bean of type IClientConfig
SpringCloud - 整合Nacos启动报错Consider defining a bean of type IClientConfig 前言 一. 尝试解决Bug的几种不合适方案 1.1 添加 ...
- SpringCloud整合TX-LCN5.0.2使用LCN模式实现分布式事务
一.TM配置 pom.xml文件中添加依赖: <dependency><groupId>com.codingapi.txlcn</groupId><artif ...
最新文章
- Dubbo 和 HSF 在阿里的实践:携手走向下一代云原生微服务
- 假如计算机是中国人发明的,那代码应该这么写
- java condition_死磕 java同步系列之ReentrantLock源码解析(二)
- 机器学习数据管理初创公司SafeGraph融资1600万美元
- java.lang.OutOfMemoryError:GC overhead limit exceeded
- bitnami mysql_最新 Bitnami redmine安装与配置
- 平衡二叉树建立、实现和判断
- CentOS的 ifconfig/mail/traceroute命令不存在
- 简化CommunityServer模板机制
- 网络系统设计综合布线方案
- 前端,html,css,js,vue
- NPN和PNP型传感器或开关如何接线?
- excel----分组后统计
- 武汉大学计算机学院 夏令营,武汉大学计算机学院2020保研夏令营通知
- android 屏蔽电源键,home键
- 如何升级composer
- 【TUN模式】对QQ或者微信域名、QQ邮箱、微信公众号文章、微信开发者社区相关的网站访问非常慢、图片加载不出来、网页空白的解决方案
- 选择报表工具软件的最新十大标准出炉
- 听我说北京之开篇寄语
- 值得长期持有的10只成长股
热门文章
- 盘点老外对女人的爆笑称呼
- Dart_Flutter【插件介绍+平台发布+视频】【180个网址导航】
- 【Linux学习】信号——信号保存 | 信号处理 | 不可重入函数,volatile,SIGCHLD信号
- 朋友走了 失落感来了
- 查看Linux下的文件
- 【腾讯云】云服务器 Nginx 内网访问 COS 省流量费
- java outer什么意思_java里面outer、 inner是什么意思
- 大数据可视化技术——平行坐标图、成对关系图、高级折线图
- java 图片添加水印(文字水印+图片水印)
- python数据分析项目之超市零售分析