soul-网关实战(一)学习路线
- 学习开源项目该如何下手[^1]
-
- 阅读文档
-
- 了解项目的整体
- 基本概念或者名词
- 项目涉及自己不熟悉的技术栈
- 实战练习
-
- 源码拉取
- 项目编译
- 运行示例
- 源码刨析
- 学习路线思维导图
学习开源项目该如何下手1
为什么要学习开源项目?答案想必不用多说,但如果我们的业务系统已经投入使用或者打算投入使用,仅仅知道如何使用远远不够,你必须掌握他的实现原理和很多细节,这样才能有良好的使用体验。很简单的一个例子,当你的系统出现问题,又恰恰在度娘上找不到答案时,如果你明白它的实现原理,就很容易根据一些现象来排查问题原因。那么怎么样学习开源项目呢?接下来分享一些个人的学习路线。
阅读文档
通过阅读开源项目的相关文档(一定要是官方文档),通过看文档,你可以快速地掌握这个软件整体的结构,它有哪些功能特性,它涉及到的关键技术、实现原理和它的生态系统等等。在掌握了这些之后,你对它有个整体的了解,然后再去看它的源代码,就不会再有那种盲人摸象找不到头绪的感觉了。那么我们在阅读文档应该注意什么呢?
了解项目的整体
- 这个项目是干什么的? ,最好能知道这个项目的来龙去脉;
- 能解决哪些问题?
- 适合在哪些场景使用?
- 有哪些功能?
- 如何使用?
基本概念或者名词
你需要找到这个项目用到的一些基本概念或者名词的介绍文档,因为开源社区的开发者都有个爱好:发明概念。很多开源项目都会自己创造一些名词或者概念,了解这些基本概念才有可能看懂它项目的其他文档。比如说soul官方文档中提到的:元数据、选择器与规则等等
项目涉及自己不熟悉的技术栈
通过看文档,从中找到自己不熟悉的技术栈,提前进行了解,做一些知识储备,方便后面阅读源码少一些障碍。
实战练习
由于前面已经对项目做了充分的了解,通过阅读相关性的文档,知道项目都具有哪些功能,接下来可以趁热打铁,快速的进行入门级别的实战练习,根据官方提供的入门demo切实的感受一把。
源码拉取
git clone https://github.com/jcmob-afj/soul.git
cd soul
git fetch master
git checkout master
项目编译
mvn clean package -Dmaven.test.skip=true -Dmaven.javadoc.skip=true -Dcheckstyle.skip=true
运行示例
1.找到soul-admin项目,修改 /resources/application-local.yml 数据库链接,运行SoulAdminBootstrap.java 的main方法
spring:thymeleaf:cache: trueencoding: utf-8enabled: trueprefix: classpath:/static/suffix: .htmldatasource:url: jdbc:mysql://localhost:3306/soul?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2b8username: rootpassword: 123456driver-class-name: com.mysql.jdbc.Driver
2.找到soul-bootstrap项目,运行SoulBootstrapApplication.java 的main方法
3.找到soul-examples项目,我们这里选择http用户的接入方式,所以需要找到soul-examples-http项目,运行SoulTestHttpApplication.java 的main方法
4.访问http://localhost:9095/#/user/login 你会看到下图的登录页面,系统默认内置管理员账号「admin/123456」
5.保证divide插件的状态为开启
6.在插件列表中找到divide插件,你会发现soul-client会自动扫描带有@SoulSpringMvcClient 注解的接口服务。默认在选择器列表添加一个选择器,默认将扫描到的接口服务添加到选择器规则列表中。
7.访问网关地址:http://localhost:9195/http/order/findById?id=1 ,你会发现请求已经转发到soul-examples-http 端口为8188 项目的/order/findById 方法中
/*** Find by id order dto.** @param id the id* @return the order dto*/@GetMapping("/findById")@SoulSpringMvcClient(path = "/findById", desc = "Find by id")public OrderDTO findById(@RequestParam("id") final String id) {
OrderDTO orderDTO = new OrderDTO();orderDTO.setId(id);orderDTO.setName("hello world findById");return orderDTO;}
根据SoulBootstrapApplication :控制台也可以看出,请求已经被路由转发
2021-01-14 23:32:58.816 INFO 12256 --- [ main] o.s.b.web.embedded.netty.NettyWebServer : Netty started on port(s): 9195
2021-01-14 23:32:58.819 INFO 12256 --- [ main] o.d.s.b.SoulBootstrapApplication : Started SoulBootstrapApplication in 7.167 seconds (JVM running for 10.286)
2021-01-14 23:48:51.505 INFO 12256 --- [-work-threads-1] o.d.soul.plugin.base.AbstractSoulPlugin : divide selector success match , selector name :/http
2021-01-14 23:48:51.506 INFO 12256 --- [-work-threads-1] o.d.soul.plugin.base.AbstractSoulPlugin : divide selector success match , selector name :/http/order/findById
2021-01-14 23:48:51.516 INFO 12256 --- [-work-threads-1] o.d.s.plugin.httpclient.WebClientPlugin : you request,The resulting urlPath is :http://172.16.51.131:8188/order/findById?id=1, retryTimes: 0
8.到这里我们只看官网的例子,就可以很简单的进行divide插件测试,是不是很简单。
源码刨析
当我们根据官方文档,将每个用户怎么接入各种插件,都演示一遍后。根据我们的演示的结果,提出自己的疑问,比如说divide插件到底是在能不能进行路由转发,答案当然是可以的,因为我们已经动手实践了,那么此时你就可以带着问题以及结果,去猜想到底是哪个项目起到了转发的效果,debug去跟一下。使用这种以问题为阅读单元的方式来读源代码,你每次只要花很短的时间,阅读很少的一部分源码,就能解决一个问题,得到一些收获。这种方式其实是通过一个一个的问题,在网状的源代码中,每次去读几个点组成的那一两条线。随着你通过阅读源码了解的问题越来越多,你对项目源码的理解也会越来越全面和深入。
学习路线思维导图
消息队列高手课 ??