本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2024-11(3)

尚硅谷—Cloud—GetWay 新一代网关(66~73)

发布于2021-05-30 00:38     阅读(605)     评论(0)     点赞(6)     收藏(2)


一:概念简介
二:三大核心概念
三:Gateway 工作流程
四:入门配置
五:通过 微服务名 实现动态路由
六:Predicate 的使用
七:Filter 的使用

 

一:概念简介

             1)官网:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gateway-starter

             2)是什么:
                           a:Spring Cloud 全家桶中,有个很重要的组件,就是网关,在 1.x 版本中都是采用的 Zuul 网关。
                           b:2.x 中,使用 SpringCloud Getway 代替了 Zuul。(netty视频:https://www.bilibili.com/video/BV1DJ411m7NR
                           c:一句话:SpringCloud Getway 使用的 WebFlux 中的 reactor-netty 响应式编程组件,底层使用量 Netty 通讯框架。





             3)能干嘛:
                           a:反向代理:
                           b:鉴权:
                           c:限流:
 
                          d:熔断:重试、安全、
                           e:日志监控/指标:
                           f:。。。。。


             4)微服务架构中,网关在哪里:(网关是 所有 为服务的 入口)



             5)有 Zuul 了,怎么又来了 Getway:
                           a:为什么我们选择 Getway:

                                - SpringCloud Getway 特性:(Getway:异步非阻塞模型)


                                - pringCloud Getway 与 Zuul 区别:


                           b:Zuul 1.x 模型:




                           c:GetWay 模型:(WebFlux)(异步非阻塞)

 

二:三大核心概念

             1)Route(路由)
                           a:概念:



             2)Predicate(断言)
                           a:概念:



             3)Filter(过滤)
                           c:概念:




             4)总体:

 

三:Gateway 工作流程

             1)官网总结




             2)核心逻辑:路由转发 + 执行过滤链

 

四:入门配置

             1)新建 Module:cloud-getway-getway-9527
             2)POM:

  1. <dependencies>
  2. <dependency>
  3. <groupId>com.atguigu.springcloud</groupId>
  4. <artifactId>cloud-api-commons</artifactId>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.springframework.cloud</groupId>
  8. <artifactId>spring-cloud-starter-gateway</artifactId>
  9. </dependency>
  10. <dependency>
  11. <groupId>org.springframework.cloud</groupId>
  12. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  13. </dependency>
  14. <dependency>
  15. <groupId>org.springframework.boot</groupId>
  16. <artifactId>spring-boot-devtools</artifactId>
  17. <scope>runtime</scope>
  18. <optional>true</optional>
  19. </dependency>
  20. <dependency>
  21. <groupId>org.projectlombok</groupId>
  22. <artifactId>lombok</artifactId>
  23. <optional>true</optional>
  24. </dependency>
  25. <dependency>
  26. <groupId>org.springframework.boot</groupId>
  27. <artifactId>spring-boot-starter-test</artifactId>
  28. <scope>test</scope>
  29. </dependency>
  30. </dependencies>
  31. </project>


             3)YML:

  1. server:
  2. port: 9527
  3. spring:
  4. application:
  5. name: cloud-getway-getway-9527
  6. eureka:
  7. instance:
  8. hostname: cloud-getway-service
  9. client:
  10. register-with-eureka: true
  11. fetch-registry: true
  12. service-url:
  13. defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka


             4)业务类:无


             5)主启动类:

  1. @EnableEurekaClient
  2. @SpringBootApplication
  3. public class GetwayGetway9527 {
  4. public static void main(String[] args) {
  5. SpringApplication.run(GetwayGetway9527.class, args);
  6. }
  7. }


             6)9527 网关,如何做路由映射:
                           a:cloud-provider-payment-8001 看看Controller的 访问地址:(localhost:8001/getPayment?id=1)
                           b:我们不想暴露 8001 端口,希望在 8001 外面套一层 9527:

             7)YML 新增网关配置:

  1. server:
  2. port: 9527
  3. spring:
  4. application:
  5. name: cloud-getway-getway-9527
  6. cloud:
  7. gateway:
  8. routes: # 路由:(id、目标URL、断言和过滤器)
  9. - id: payment_route # 路由的 id:没有固定规则但要求 唯一,建议配合 服务名
  10. uri: http://localhost:8001 # 断言 匹配后,提供服务的 路由地址
  11. predicates: # 断言:请求 和 断言 匹配的,则进行路由
  12. - Path=/getPayment/**
  13. - id: payment_route_2
  14. uri: http://localhost:8001
  15. predicates:
  16. - Path=/create/**
  17. eureka:
  18. instance:
  19. hostname: cloud-getway-service
  20. client:
  21. register-with-eureka: true
  22. fetch-registry: true
  23. service-url:
  24. defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
  1. spring:
  2. cloud:
  3. gateway:
  4. routes: // # 路由:(id、目标URL、断言和过滤器)
  5. - id: payment_route // # 路由的 id:没有固定规则但要求 唯一,建议配合 服务名
  6. uri: http://localhost:8001 // # 断言 匹配后,提供服务的 路由地址
  7. predicates: // # 断言:请求 和 断言 匹配的,则进行路由
  8. - Path=/getPayment/**





             8)测试:

                           a:正常访问:(localhost:8001/getPayment?id=1
                           b:通过网关访问:(localhost:9527/getPayment?id=1


             9)YML 配置说明:
                           a:Getway 网关路由有两种配置方式:
                                     1.在 配置文件 yml 中配置:
                                     2.代码中 注入 RouteLocator 的 Bean:


             10)编码方式 进行 网关配置:
                           a:官网案例:



                           b:百度国内新闻地址,需要外网:
                           c:自己写一个:

  1. @Configuration
  2. public class GetwayConfig {
  3. @Bean
  4. public RouteLocator routeLocator(RouteLocatorBuilder routeLocatorBuilder) {
  5. // 访问: http://localhost:9527/guonei
  6. // 跳转到:https://news.baidu.com/guonei
  7. RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes();
  8. routes.route("path_route_baidu", (r) -> r.path("/guonei")
  9. .uri("https://news.baidu.com/guonei")).build();
  10. return routes.build();
  11. }
  12. }






 

五:通过 微服务名 实现动态路由

 

 


 

             1)默认情况下:Getway 会根据注册中心注册的服务列表,以 注册中心上的微服务名称 为路径,创建 动态路由进行转发,从而实现动态路由功能。


             2)启动:7001/7002 + 8001/8002 + 
             3)POM:

  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  4. </dependency>


             4)YML:

  1. spring:
  2. application:
  3. name: cloud-getway-getway-9527
  4. cloud:
  5. gateway:
  6. discovery:
  7. locator:
  8. enabled: true # 开启从 注册中心,动态创建路由的功能,利用为服务名进行路由。
  9. routes: # 路由:(id、目标URL、断言和过滤器)
  10. - id: payment_route # 路由的 id:没有固定规则但要求 唯一,建议配合 服务名
  11. uri: lb://CLOUD-PROVIDER-PAYMENT # 断言 匹配后,提供服务的 路由地址
  12. predicates: # 断言:请求 和 断言 匹配的,则进行路由
  13. - Path=/paymentInfo_OK/**
  14. - id: payment_route_2
  15. uri: lb://CLOUD-PROVIDER-PAYMENT
  16. predicates:
  17. - Path=/create/**



             5)测试:(localhost:9527/getPayment?id=1)通过gateway 实现了 负载均衡。





 

六:Predicate 的使用

             1)是什么:启动 9527
                           a:启动中会显示如下:就有这么断言的方式。(11种)




             2)Route Predicate Factories 是什么:



             3)常用的 Route Predicate:
                      1.After:规定时间之后:2021-05-26T15:21:50.293+08:00[Asia/Shanghai]
                      2.Before:规定时间之前
                            --获取时间:

                      3.Between:规定区间时间之内
                      4.Cookie:规定携带什么样Cookie 才匹配:- Cookie=chocolate, ch.p(也就是 K:V)
                              
                               测试:curl  http://localhost:9527/discover --cookie "username=zhangsan"

                      5.Header:
规定携带什么样 Header 才匹配: - Header=X-Request-Id, \d+(K,V)


                      6.Host:根据主机进行拦截:- Host=**.somehost.org,**.anotherhost.org
                                        

                      7.Method:
根据请求方法类型进行拦截:- Method=GET,POST:

                      8.Path:根据请求路径进行拦截:- Path=/red/{segment},/blue/{segment}

                      9.Query:带查询条件,要带参数查询条件,值为参数才进行拦截:- Query=red, gree

                      10.小总结:
                               - 说白了,Predicate 就是为了实现一组匹配规则,让请求过来,找到我们对应的路由,进行处理。




 

七:Filter 的使用

             1)是什么:




             2)SpringCloud Gateway 的 Filter:
                           a:生命周期,Only Two:
                       
             - pre:前置拦截
                                     - post:后置拦截

                           b:种类,Only Two:
                         
           - Gateway Filter:(31种之多)
                                     - Global Filter:(10 种之多)

             3)常见的 GatewayFilter:



             4)自定义 过滤器:(自定义全局 Global Filter )
                           a:两个主要接口介绍:
                                    - implements GlobalFilter ,Orderd
                           b:能干嘛:
                   
                - 全局日志记录:
                                    - 统一网关鉴权:
                                    - 。。。。。

                           c:案例代码:(判断请求是不是每次都带着 username 参数)
                                    - 自定义 日志实现类:继承两个接口:

  1. @Slf4j
  2. @Component
  3. public class MyLogGatewayFilter implements GlobalFilter, Ordered {
  4. @Override
  5. public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
  6. System.out.println("come in MyLogGatewayFilter" + new Date());
  7. String username = exchange.getRequest().getQueryParams().getFirst("username");
  8. if (username == null) {
  9. System.out.println("用户名为 null,非法");
  10. exchange.getResponse().setStatusCode(HttpStatus.MULTI_STATUS);
  11. return exchange.getResponse().setComplete();
  12. }
  13. //继续传下去
  14. return chain.filter(exchange);
  15. }
  16. @Override
  17. public int getOrder() {
  18. //过滤链,数字越小,优先级越高。Ordered.HIGHEST_PRECEDENCE
  19. return 0;
  20. }
  21. }


                           d:测试:(localhost:9527/getPayment?username=11)






 

 

原文链接:https://blog.csdn.net/qq_43056248/article/details/117263559



所属网站分类: 技术文章 > 博客

作者:我很伤感

链接:http://www.javaheidong.com/blog/article/207997/c67107198b5b73021afe/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

6 0
收藏该文
已收藏

评论内容:(最多支持255个字符)