1. 网关做什么使用的?
不同的微服务有不同的接口地址,我们目前开发都是前后端分离的项目,我们后端开发了很多的服务,没用网关的时候,对前端就不太友好了,因为我们不同服务的接口地址都不一样,前端调用起来就很麻烦,所以这个时候我们就需要使用API网关统一代理,有API网关转发到不同的服务
为什么不使用nginx呢?
如果你是同一个项目部署了两份可以用nginx来做负载均衡,但是我们现在是微服务,是不同的项目,如果我们使用nginx的话,总不能一会请求这个服务,一会请求另外一个服务吧,所以这个时候使用nginx是不现实的,nginx的使用场景是对于同一个项目来说一台服务器顶不住了所以需要配置来用nginx做负载均衡,并不适用于我们现在的微服务
nginx对于同一个项目可以做负载均衡,而API网关也可以,对于同一个项目做负载均衡,对于不同的项目可以做路由,而且,对于不同的服务间如果需要登录才能访问,网关可以写过滤器进行过滤,这些都是就是网关的强大之处
2. GateWay三大功能
路由 + 过滤 + 断言
3. GateWay怎么使用
1)创建网关服务:springcloud_gateway_service
2)导入网关依赖:注意,在网关微服务中就不能导入spring-cloud-start-web依赖了,这两个之间会产生冲突
3)网关也可以整合到nacos上
在application.yml文件中配置网关信息:网关是怎么路由服务的呢?首先通过访问网关服务,那么在我们找到我们path路径,然后就去找id上的服务,然后通过访问对应url的地址,就路由到我们真正的服务上去了server:
port: 7001 spring: application: name: springcloud-gateway-service cloud: gateway: # 是否和服务注册与发现组件结合,设置为 true 后可以直接使用应用名称调用服务 discovery: locator: enabled: true lower-case-service-id: true # 服务名称转成小写 routes: #配置网关的路由服务,如果想要路由多个服务,就继续追加 - id: order-service #路由的id 一般是服务名 uri: http://127.0.0.1:8080 predicates: - Path=/order/**,/ts/** # 如果有多个controller就配置多个,如果匹配所有路径那就/**
http://127.0.0.1:7001/order-service/order/12
4)如果我们想上面访问的时候需要手动写死url的地址,如果服务地址发生更改,然后我们还需要来网关中作修改,显然这样是不方便的,所以,网关需要和nacos注册中心结合时候,如下
当然,在网关服务中还是需要导入nacos对应的依赖包的
spring: cloud: gateway: # 是否和服务注册与发现组件结合,设置为 true 后可以直接使用应用名称调用服务 discovery: locator: enabled: true lower-case-service-id: true # 服务名称转成小写 routes: - id: babytree-admin-service #文件微服务 uri: lb://babytree-admin-service predicates: - Path=/babytree/**,/tCookbooks/**,/tDish/** ,/tIngredien/**,/tInStep/** ,/tClass/** # 如果有多个controller就配置多个,如果匹配所有路径 - id: babytree-file-service #文件微服务 uri: lb://babytree-file-service predicates: - Path=/file/**
小知识:为什么nacos没有负载均衡?
nacos不仅仅支持springcloud组件,还支持其他的组件,所以就没有集成
5)将网关服务配置到nacos上,导入nacos配置中心对应的依赖包
注意:在网关配置中,path中的路径不允许出现重名的情况,否则会导致404找不到
6)关于网关配置的其他信息
表示请求中是否包含我们指定的参数
注:多个路由规则可以一起使用
此时如果在路径上不加orderName就会报404错误
routes: - id: springcloud-order-service #路由的id 一般是服务名 uri: lb://springcloud-order-service predicates: #表示判断条件 - Path=/order/**,/ts/** - Query=orderName #匹配请求的参数中必须包含orderName参数
匹配请求方式
如果请求方式不是get,delete就会报405
routes: - id: springcloud-order-service #路由的id 一般是服务名 uri: lb://springcloud-order-service predicates: #表示判断条件 - Path=/order/**,/ts/** # - Query=orderName #匹配请求的参数中必须包含orderName参数 - Method=GET,DELETE #匹配所有GET、delete请求
可以实现秒杀的网关过滤
routes: - id: order-service #路由的id 一般是服务名 uri: http://127.0.0.1:8080 predicates: - Path=/order/**,/ts/** # 如果匹配所有路径那就/** # - Query=orderName #匹配请求的参数中必须包含orderName参数 - Method=GET,DELETE #匹配所有GET、delete请求 - After=2022-03-17T20:42:47.789-07:00[Asia/Shanghai] # 匹配Shanghai时间 2022年03月17号以后的请求
匹配请求头
- id: order-service #路由的id 一般是服务名 uri: http://127.0.0.1:8080 predicates: # - Query=orderName #匹配请求的参数中必须包含orderName参数 - Method=GET,DELETE #匹配所有GET、delete请求 - After=2022-03-17T20:42:47.789-07:00[Asia/Shanghai] # 匹配Shanghai时间 2022年03月17号以后的请求 - Header=AuthToken #匹配规则是请求头必须携带名字叫AuthToken的值才可以访问
远程ip地址 ip白名单
routes: - id: order-service #路由的id 一般是服务名 uri: http://127.0.0.1:8080 predicates: - Path=/order/**,/ts/** # 如果匹配所有路径那就/** # - Query=orderName #匹配请求的参数中必须包含orderName参数 - Method=GET,DELETE #匹配所有GET、delete请求 - After=2022-03-17T20:42:47.789-07:00[Asia/Shanghai] # 匹配Shanghai时间 2022年03月17号以后的请求 - Header=AuthToken #匹配规则是请求头必须携带名字叫AuthToken的值才可以访问 - RemoteAddr=10.112.3.147,192.168.56.1,192.168.142.1 # 只允许访问此ip才可以访问到