https://www.cnblogs.com/three-fighter/p/14971538.html
http://javadaily.cn/articles/2020/01/16/1579160378591.html
SpringCloud Gateway是基于WebFlux框架实现的,而WebFlux框架底层则使用了高性能的Reactor模式通信框架Netty。
Spring Cloud Gateway 的目标,不仅提供统一的路由方式,并且基于 Filter 链的方式提供了网关基本的功能,例如:安全,监控/指标,和限流。
- Nginx: Nginx由内核和模块组成,内核的设计非常微小和简洁,完成的工作也非常简单,仅仅通过查找配置文件与客户端请求进行 URL 匹配,用于启动不同的模块去完成相应的工作。
- Kong: Kong是一款基于OpenResty(Nginx + Lua模块)编写的高可用、易扩展的,由Mashape公司开源的API Gateway项目。Kong是基于NGINX和Apache Cassandra或PostgreSQL构建的,能提供易于使用的RESTful API来操作和配置API管理系统,所以它可以水平扩展多个Kong服务器,通过前置的负载均衡配置把请求均匀地分发到各个Server,来应对大批量的网络请求
- Zuul 是 Netflix 开源的微服务网关组件,它可以和 Eureka、Ribbon、Hystrix 等组件配合使用。社区活跃,融合于 SpringCloud 完整生态,是构建微服务体系前置网关服务的最佳选型之一。
- Spring Cloud Gateway 是Spring Cloud的一个全新的API网关项目,目的是为了替换掉Zuul1。Gateway可以与Spring Cloud Discovery Client(如Eureka)、Ribbon、Hystrix等组件配合使用,实现路由转发、负载均衡、熔断等功能,并且Gateway还内置了限流过滤器,实现了限流的功能。
- bootstap.yml:在配置文件里除了应用名称,我们还配置了Nacos的相关配置,不太清楚的同学可以查看上一节。
###服务名称(服务注册到nacos名称,如serviceId)
spring:
cloud:
nacos:
discovery:
server-addr: http://www.XXXX.com:8848
namespace: de4a857c-8341-4d3d-a1e0-f2e64eaf8c97
config:
server-addr: http://www.XXXXX.com:8848
file-extension: yaml
#name: ${spring.application.name}
prefix: ${spring.application.name} #nacos 配置中心文件前缀
group: DEFAULT_GROUP
#变更刷新
refresh: true
remote-first: true
enabled: true
namespace: de4a857c-8341-4d3d-a1e0-f2e64eaf8c97
我们在里面进行了路由转发的配置,也就是routes
,我们来看一看这些配置项都是什么意思:
- id: 路由的
唯一
标识,用以和其它Route区分 - uri: 请求要转发到的地址,lb 指的是从nacos中按照名称获取微服务,并遵循负载均衡策略
- predicates: 路由需要满足的条件,也是个数组(这里是
或
的关系) - filters: 过滤器,请求在传递过程中可以通过过滤器对其进行一定的修改
在这个配置项里,我们定义了user
开头的请求,分发到user-service
这个服务。
接下来我们看看效果吧!
到此,我们已经引入了Spring Cloud Gateway作为微服务网关,并完成了基本的路由转发的功能。
除了基本的路由转发,服务网关还可以完成权限校验、限流、API校验等功能,后续我们会继续深入,敬请期待!
server:
port: 8001
#开启actuator管理api http://localhost:8080/actuator/gateway/routes
management:
endpoints:
web:
exposure:
include: "*"
###服务名称(服务注册到nacos名称,如serviceId)
spring:
cloud:
gateway:
discovery:
locator:
# 是否可以通过其他服务的serviceId来转发到具体的服务实例。默认为false
# 为true,自动创建路由,路由访问方式:http://Gateway_HOST:Gateway_PORT/大写的serviceId/**,
# 其中微服务应用名默认大写访问
enabled: true
#为true表示服务名称(小写)
lower-case-service-id: true
routes:
- id: box-mall-gather
uri: lb://box-mall-gather
predicates:
- Path=/open/mall/**
filters:
# 表示截取路径的个数
- StripPrefix=1
#- AddRequestHeader=X-Request-Foo, Bar #对请求头部添加X-Request-Foo = Bar 信息
#- AddRequestParameter=foo, bar #对匹配的请求,会额外添加foo=bar的请求参数
#- AddResponseHeader=X-Response-Foo, Bar #响应返回时会额外添加X-Response-Foo:Bar的header返回
- id: box-transaction-service
uri: lb://box-transaction-service
predicates:
- Path=/open/trade/**
filters:
# 表示截取路径的个数
- StripPrefix=1
- id: box-member-service
uri: lb://box-member-service
predicates:
- Path=/open/member/**
filters:
# 表示截取路径的个数
- StripPrefix=1
- id: box-marketing-service
uri: lb://box-marketing-service
predicates:
- Path=/open/marketing/**
filters:
# 表示截取路径的个数
- StripPrefix=1
- id: box-merchants-service
uri: lb://box-merchants-service
predicates:
- Path=/open/merchants/**
filters:
# 表示截取路径的个数
- StripPrefix=1
- id: box-items-service
uri: lb://box-items-service
predicates:
- Path=/open/items/**
filters:
# 表示截取路径的个数
- StripPrefix=1
################### redis start ##########################
redis:
database: 1
host: 47.103.104.148
port: 6379
password: life201911
timeout: 500
pool:
# 连接池最大连接数(使用负值表示没有限制
max-active: 20
# 连接池最大阻塞等待时间(使用负值表示没有限制
max-wait: -1
# 连接池中的最大空闲连接
max-idle: 8
# 连接池中的最小空闲连接
min-idle: 0
################### my config start ##########################
box:
gateway:
###不需要验证白名单
white:
List:
- /member/appAuth/login
- /member/appAuth/regist
- /mall/user/initLogin
- /member/oldBoxLife/getScoreDetailList
- /member/oldBoxLife/getScoreDetailUsedList
- /member/oldBoxLife/getMemberScoreRecord
- /member/oldBoxLife/getMemberScoreRecordUsed
- /member/oldBoxLife/regist
- /member/oldBoxLife/login
- /mall/merchants/brand/list
- /mall/merchants/market/list
- /member/oldBoxLife/getBoxsMemberByUid
- /mall/oldBoxLife/getUserMemberPoint
- /mall/integral/getIndexGoodsList
- /mall/integral/getPracticalGoodsList
- /mall/coupon/getExchangeCouponTypeList
- /mall/integral/getGoodsDetail
config:
## 测试环境签名调试 生产设置false
debug: true
## 验签公钥
publicKey: MIGfMA0GCSqGSIb3DQEBAQUA11A4GNADCBiQKBgQC+bjf2zNvnUYdZNciVLleJrZqk2jPpafFth/ock5TwvyEK//JKKLu3nC3CjB0FZiDV6FDpY/T404hPpNhgMT+F/i8PAbsJ11ssCx/YZySA9kKbx0fnvYRQCmx+TMDocId08ZkCZjbIGsc1YibsE2sR+T25p+FkMRpF9wCEh+pvUQIDAQAB
## 加签私钥
privateKey: MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAL5uN/bM2+dRh1k1yJUuV4mtmqTaM+lp8W2H+hyTlPC/IQr/8koou7ecLcKMHQVmINXoUOlj9PjTiE+k2GAxP4X+Lw8BuwnXWywLH9hnJID2QpvHR+e9hFAKbH5MwOhwh3TxmQJmNsgaxzViJuwTaxH5Pbmn4WQxGkX3AISH6m9RAgMBAAECgYAe4ndXIrCDmrht4ogukb6GyM4s8Gq8737Feek5m0HrrcPpKcuc9XBEfiL5y4mlZ114PpzWzZ/WkstfoEmMKzDymzBL03HfA+fFu8oQYkE4634I4vQEa75lVIuaiccWpLvZukqkUFBd80cUeb086zM5H72ex3iJYuNBv+1Lhl/AkQsQJBAPCdeQ6/NtkVV7tC9xFjIyfZZmed48uSOHqMxW0sdl0WNjpiwbO7oLTHdQnyLmF8x4u0cZDCUNloJWglnq1pEq0CQQDKm0ukoFbFquP5FwTkS60o8ffTRdE+lHKtWI3t2DFvGc9Gt98VRb/xBEbZe1uvvBAxRI5SL1Bd+irAusyyw4e1AkAfrkxDMdAR8ypzAJUxV+FIHOrL19Ene6AuGpzgDAulpAgN1fT1Kk41n1F8tsN+mIRZk6+kRMGKbpkGRnXHFV+dAkBSAsp7uOtm1+WvzkGMp5VQHaHTQ0+PpUdGI7JPtFNORYRBe+wxECrBxJlpLyXN3LIxPy7c1YoSgFEN8o8pTTyBAkEA2YvOI2/04tRApZdPFrCqOq5AWefk12znDVrWayKk9BKHhVrqNnJvvNLC99j3N/7wfSVRTShRnm75Bs/OXuBatw==