简介

最近都在弄微服务的东西,现在来记录下收获。我从一知半解到现在能从0搭建使用最大的感触有两点

1.微服务各大组件的版本很多,网上很多博客内容不一定适合你的版本,很多时候苦苦琢磨都是无用功

2.网上博客参差不齐,有些甚至错误的。更离谱的是,好的文章阅读量除非高出天际,不然就都很低,比那些复制粘贴,随便应付的都低(这个搜索推荐算法不知道基于什么的)

通过这段时间学习,我觉得最重要是从好的博客入手,先不要着急怎么组件怎么使用,而是先了解组件的作用,大概的原理,然后才是使用,这样搭建和尝试的过程中才能更好的定位问题,最后再次回到原理和一些实际问题的处理(不知道实际问题怎样的,直接搜那个组件的面试题往往效果最好)

接下来的内容,都以导航的形式展现给大家(毕竟优秀的轮子很多,直接看大佬写的不香嘛),再顺带提些自己的理解

传送门

更多微服务的介绍可点击下方链接

微服务介绍Nginx导航Nacos导航Gateway导航Ribbon导航Feign导航Sentinel导航

博主微服务git练手项目:https://github.com/NiceJason/SpringCloudDemo

Gateway简介

SpringCloudGateway的简介:http://www.ityouknow.com/springcloud/2018/12/12/spring-cloud-gateway-start.html

Gateway主要由:路由(Route)、断言(Predicate)和过滤器(Filter)3个部分组成

1个路由可以由多个断言和多个过滤器共同组成,而组件自身为我们准备了很多断言可以直接使用,具体看简介

自定义过滤器如何实现:https://blog.csdn.net/forezp/article/details/85057268

这里提个坑:

全网网关拦截器若想要生效,以下条件之一需要符合
1.当前网关必须配置其他非全网拦截器(还真的很神奇)
2.全网网关拦截器必须实现Ordered接口

自定义断言如何实现:https://blog.csdn.net/qq_29064815/article/details/107236161

下面说些不一样的

1.Gateway不依赖Web

Spring Cloud Gateway 是使用 netty+webflux实现,webflux与web是冲突的。所以Maven依赖不能用Web相关的内容,这句话说的很简单,但是做起来却不容易。特别是Maven依赖混乱的项目更难抽离,例如公共服务里包含了Web依赖,那么你的Gateway服务就不能引用公共服务了,这样会导致Gateway服务需要自身拷贝一份公共服务的代码,所以好的Maven模块化依赖是很重要的。

Springboot十分方便,但又不能直接引用,但是不引用第三方组件没准又有问题,可以在父类做如下引用

 1 <dependencyManagement>
2 <dependencies>
3 <dependency>
4 <groupId>org.springframework.boot</groupId>
5 <artifactId>spring-boot-dependencies</artifactId>
6 <version>${spring-boot.version}</version>
7 <type>pom</type>
8 <scope>import</scope>
9 </dependency>
10 </dependencies>
11 </dependencyManagement>

2.不要在Gateway做复杂的逻辑

首先要知道,网关的作用只有一个,那就是这个请求到底是放行还是拒绝,所以不要在这里做复杂的操作,对于http请求最好做到只读,通过读取的内容就能完成逻辑,而不需要往请求里增删改一些东西(如Cookie,body参数等等),因为这操作是很困难的,而且即使成功了没准也问题多多(项目里就试过操作Session导致Set-Cookie变成小写,微信浏览器识别不了而导致错误)

 1 @Component
2 public class MsgGatewayFilterFactory extends AbstractGatewayFilterFactory {
3
4 /**
5 * Cookie里是否有token
6 * 如果没有则拒绝请求
7 * @param config
8 * @return
9 */
10 @Override
11 public GatewayFilter apply(Object config) {
12 return ((exchange, chain) -> {
13 System.out.println("进入MsgGatewayFilterFactory");
14 ServerHttpRequest serverRequest = exchange.getRequest();
15 HttpCookie tokenCookie = serverRequest.getCookies().getFirst("token");
16 if(tokenCookie ==null || StringUtils.isEmpty(tokenCookie.getValue())){
17 System.out.println("MsgGatewayFilterFactory拦截 因为cookie里未找到token");
18 //这里也可以return Mono.empty()
19 throw new SystemException("cookie里未找到token");
20 }
21 System.out.println("获取到token = "+tokenCookie.getValue());
22
23 System.out.println("退出MsgGatewayFilterFactory");
24 return exchange.getSession().flatMap(webSession -> {
25 System.out.println("Gateway开始操作WebSession");
26 ServerHttpResponse response = exchange.getResponse();
27
28 //获得全局拦截器的记录
29 String globalMsg = webSession.getAttribute("GlobalGateway");
30 System.out.println(globalMsg);
31
32 //这Session只能在网关里用
33 //除非这里自己存到缓存里去,像做SpringSession那样,不然分布式不了
34 webSession.getAttributes().put("Gateway","Gateway记录了值");
35 JSONObject message = new JSONObject();
36
37
38 //操作头部,body,cookie
39 ServerHttpRequest request = exchange.getRequest();
40
41 HttpHeaders headers = request.getHeaders();
42 MultiValueMap<String, HttpCookie> cookies = request.getCookies();
43 MultiValueMap<String, String> queryParams = request.getQueryParams();
44 Flux<DataBuffer> body = request.getBody();
45
46 //想要操作body的值不容易的
47 //参考:https://blog.csdn.net/seantdj/article/details/100546713
48 //参考:https://www.haoyizebo.com/posts/876ed1e8/
49
50 //头部里面放值,会报错,这是个ReadOnlyHttpHeaders
51 //headers.add("GatewayKey-header","GatewayValue-header");
52 //想要设置要这样设,传输中文需要编码,不然乱码
53 try{
54 request.mutate().header("GatewayKey-header", URLEncoder.encode("mutate的方式设置头的值是可以的","UTF-8"));
55 }catch (Exception e){
56 System.out.println("Gateway头部设置信息出错");
57 System.out.println(e);
58 }
59
60
61 //cookie里面放值,会报错,只能读
62 //cookies.add("GatewayKey-cookie",new HttpCookie("GatewayCookieKey","GatewayCookieValue"));
63
64 //往参数里面放,会报错,只能读
65 //queryParams.add("GatewayKey-param","GatewayValue-param");
66
67 return chain.filter(exchange);
68 });
69 });
70 }
71 }

其实很重要的一点Gateway使用的是响应式编程。这部分架构、理念、用法不熟悉的话不要弄骚操作,出BUG都不知道怎么整

真的想搞幺蛾子看:https://blog.csdn.net/u010647035/article/details/84726266

里面有各式的过滤器去操作http请求,搜索你想要了解的过滤器,去结合源码和网上内容做自定义改造

小结

本篇博客主要介绍常用的方式,对于具体的原理和高深的用法都没怎么涉及(菜鸡一枚,真的不太懂响应式编程),希望能帮到大家~

Gateway导航的更多相关文章

  1. Nginx导航

    简介 最近都在弄微服务的东西,现在来记录下收获.我从一知半解到现在能从0搭建使用最大的感触有两点 1.微服务各大组件的版本很多,网上很多博客内容不一定适合你的版本,很多时候苦苦琢磨都是无用功 2.网上 ...

  2. Ribbon导航

    简介 最近都在弄微服务的东西,现在来记录下收获.我从一知半解到现在能从0搭建使用最大的感触有两点 1.微服务各大组件的版本很多,网上很多博客内容不一定适合你的版本,很多时候苦苦琢磨都是无用功 2.网上 ...

  3. Sentinel导航

    简介 最近都在弄微服务的东西,现在来记录下收获.我从一知半解到现在能从0搭建使用最大的感触有两点 1.微服务各大组件的版本很多,网上很多博客内容不一定适合你的版本,很多时候苦苦琢磨都是无用功 2.网上 ...

  4. python web server gateway interface (wsgi ) notes

    前言: 注:如果需要得到支持批Python3.x以及包含了勘误表,附录,和说明的更新版规范,请查看PEP 3333 摘要: 这篇文档详细说明了一套在web服务器与Python web应用程序(web框 ...

  5. nginx设置导航&安装showdoc&创建文件服务&zabbix&grafana

    安装环境: [root@nginx showdoc]# cat /etc/centos-release #系统版本 CentOS Linux release 7.5.1804 (Core) [root ...

  6. 使用Spring Cloud Gateway保护反应式微服务(二)

    抽丝剥茧,细说架构那些事——[优锐课] 接着上篇文章:使用Spring Cloud Gateway保护反应式微服务(一) 我们继续~ 将Spring Cloud Gateway与反应式微服务一起使用 ...

  7. 使用Spring Cloud Gateway保护反应式微服务(一)

    反应式编程是使你的应用程序更高效的一种越来越流行的方式.响应式应用程序异步调用响应,而不是调用资源并等待响应.这使他们可以释放处理能力,仅在必要时执行处理,并且比其他系统更有效地扩展. Java生态系 ...

  8. 透过 Chrome 深入理解浏览器导航过程

    网络的导航,是从输入 url 到最终获取到文件的过程.其中牵扯到浏览器架构.操作系统.网络等一系列知识.本文将从各个角度详细论述这一过程,涉及广度与深度.如果您是已经有一定基础的同学,那么本文可以快速 ...

  9. “四核”驱动的“三维”导航 -- 淘宝新UI(需求分析篇)

    前言 孔子说:"软件是对客观世界的抽象". 首先声明,这里的"三维导航"和地图没一毛钱关系,"四核驱动"和硬件也没关系,而是为了复杂的应用而 ...

随机推荐

  1. 浅谈意图识别各种实现&数学原理

    \[ J_\alpha(x) = \sum_{m=0}^\infty \frac{(-1)^m}{m! \Gamma (m + \alpha + 1)} {\left({ \frac{x}{2} }\ ...

  2. OO第三单元个人总结

    OO第三单元个人总结 JML理论与基础与应用工具链 JML是什么? Java建模语言(JML)是一种行为接口规范语言,可用于指定Java模块的行为 .它结合了Eiffel的契约设计方法 和Larch ...

  3. (十六)Struts2的标签库

    一.简介 Struts2的标签库使用OGNL为基础,大大简化了数据的输出,也提供了大量标签来生成页面效果,功能非常强大. 在早期的web应用开发中,jsp页面主要使用jsp脚本来控制输出.jsp页面嵌 ...

  4. 前端 JS 问题记录

    立即执行函数 !function(){}() function 前面增加符号 ! ~ + - 之类,都是告诉浏览器自动执行这个匿名函数,因为这些符号的运算级别都是高的 (function(){... ...

  5. 自动化kolla-ansible部署ubuntu20.04+openstack-victoria之基础配置-04

    自动化kolla-ansible部署ubuntu20.04+openstack-victoria之基础配置-04 欢迎加QQ群:1026880196 进行交流学习 近期我发现网上有人转载或者复制原创博 ...

  6. 源码编译安装MySQL8.0.20

    1 概述 本文章主要讲述了如何从源码编译安装MySQL社区版8.0.20,首先会介绍一些编译安装的相关知识,然后开始编译安装 2 源码编译安装的相关知识 2.1 make与configure make ...

  7. 由孙悟空的七十二变看Java设计模式:装饰者模式

    目录 应用场景 代码示例 改进代码 装饰者模式 定义 意图 主要解决问题 何时使用 优缺点 孙悟空的七十二变 应用场景 京东.天猫双十一,情人节商品大促销,各种商品有不同的促销活动 满减:满200减5 ...

  8. Borrowers UVA - 230

      I mean your borrowers of books - those mutilators of collections, spoilers of the symmetry of shel ...

  9. Alpine镜像

    Alpine Linux 是一个面向安全,轻量级的基于musl libc与busybox项目的Linux发行版. Alpine 提供了自己的包管理工具 apk,可以通过 https://pkgs.al ...

  10. 2021S软件工程——结对项目第三阶段

    2021S软件工程--结对项目第三阶段 2021春季软件工程(罗杰 任健) 项目地址 1020 1169 1 实践反思 1.1 问题分析 两人习惯不一致 没有具体制定时间节点 写完代码才开始" ...