soul从入门到进阶01——soul网关初体验
笔者的环境
- MacBook Pro
- 处理器 2.8 GHz 四核Intel Core i7
- 内存 16 GB 1600 MHz DDR3
- 其他环境准备 maven、jdk、git
概要简介
- 本篇文章主要是简单认识一下soul网关,搭建本机测试环境,熟悉整体框架
- 读者可以参考soul极简入门,看一下soul的简介
1. clone 并编译项目
- 打开终端
- git clone https://github.com/dromara/soul.git
- cd soul
- mvn clean install
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 09:43 min
[INFO] Finished at: 2021-01-13T21:27:26+08:00
[INFO] ------------------------------------------------------------------------
这里编译过程可能会比较慢,在笔者的环境下,拉取最新的master代码,整个编译下来需要将近10分钟。可以尝试下面的命令跳过test、javadoc、checkstyle 速度会快一些
- mvn clean install -Dmaven.test.skip=true -Dmaven.javadoc.skip=true -Drat.skip=true -Dcheckstyle.skip=true
这次编译时间比较短,只需要1分多钟
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:11 min
[INFO] Finished at: 2021-01-13T21:32:59+08:00
[INFO] ------------------------------------------------------------------------
2. 运行soul-admin(使用mysql作为数据库)
这个是soul的管理平台
- cd soul-admin
- 运行 soul-admin模块
mvn spring-boot:run
- 查看报错信息,以下为报错信息的最后几行
Caused by: java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: NO)at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:965) ~[mysql-connector-java-5.1.47.jar:5.1.47]at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3978) ~[mysql-connector-java-5.1.47.jar:5.1.47]at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3914) ~[mysql-connector-java-5.1.47.jar:5.1.47]at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:871) ~[mysql-connector-java-5.1.47.jar:5.1.47]at com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication(MysqlIO.java:1714) ~[mysql-connector-java-5.1.47.jar:5.1.47]at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1224) ~[mysql-connector-java-5.1.47.jar:5.1.47]at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2199) ~[mysql-connector-java-5.1.47.jar:5.1.47]at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2230) ~[mysql-connector-java-5.1.47.jar:5.1.47]at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2025) ~[mysql-connector-java-5.1.47.jar:5.1.47]at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:778) ~[mysql-connector-java-5.1.47.jar:5.1.47]at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47) ~[mysql-connector-java-5.1.47.jar:5.1.47]at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_111]at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:1.8.0_111]at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.8.0_111]at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[na:1.8.0_111]at com.mysql.jdbc.Util.handleNewInstance(Util.java:425) ~[mysql-connector-java-5.1.47.jar:5.1.47]at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:386) ~[mysql-connector-java-5.1.47.jar:5.1.47]at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:330) ~[mysql-connector-java-5.1.47.jar:5.1.47]at java.sql.DriverManager.getConnection(DriverManager.java:664) ~[na:1.8.0_111]at java.sql.DriverManager.getConnection(DriverManager.java:247) ~[na:1.8.0_111]at org.dromara.soul.admin.service.init.LocalDataSourceLoader.init(LocalDataSourceLoader.java:62) ~[classes/:na]at org.dromara.soul.admin.service.init.LocalDataSourceLoader.postProcessAfterInitialization(LocalDataSourceLoader.java:51) ~[classes/:na]at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:431) ~[spring-beans-5.2.2.RELEASE.jar:5.2.2.RELEASE]at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1800) ~[spring-beans-5.2.2.RELEASE.jar:5.2.2.RELEASE]at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:595) ~[spring-beans-5.2.2.RELEASE.jar:5.2.2.RELEASE]... 143 common frames omitted
可以看到 Caused by: java.sql.SQLException: Access denied for user ‘root’@‘localhost’ (using password: NO) 和 at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:965) ~[mysql-connector-java-5.1.47.jar:5.1.47]
这两行信息,说明是mysql连接的用户名密码发生了错误。
- 启动mysql
brew services start mysql
- 修改配置文件中的用户名和密码
- vim src/main/resources/application.yml
- 可以看到第30-32行 是mysql的链接、用户名、密码
- 根据自己的配置修改即可
url: jdbc:mysql://localhost:3306/soul?useUnicode=true&characterEncoding=utf-8
username: root
password:
- 重新运行soul-admin
mvn spring-boot:run
- 可以看到最后的两条信息,tomcat 启动成功,占用9095端口
2021-01-13 22:11:55.569 INFO 30284 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 9095 (http) with context path ''
2021-01-13 22:11:55.573 INFO 30284 --- [ main] o.dromara.soul.admin.SoulAdminBootstrap : Started SoulAdminBootstrap in 4.512 seconds (JVM running for 4.825)
- 查看数据库信息
$ mysql -uroot -pmysql> show databases;
- 发现多了一个soul的 database;也就是说,启动soul-admin模块的时候,会自动创建一个数据库
- 在浏览器打开 http://localhost:9095
- 用户名 admin 密码 123456
- 登录进去之后,可以看到【插件列表】和 【系统管理】两个模块
- 【插件列表】里面有很多插件
- divide
- hystrix
- sign
- sofa
- sentinel
- resilience4j
- tars
- context_path
- waf
- rewrite
- rate_limiter
- dubbo
- monitor
- springCloud
- soul网关的一个特点就是使用了插件化设计,所有的插件都可以热插拔,非常容易扩展。
3. 运行soul-bootstrap
这个是soul的核心模块
- 打开另一个命令行
- cd soul-bootstrap
- mvn spring-boot:run
2021-01-13 23:16:07.685 INFO 30866 --- [ main] o.s.b.web.embedded.netty.NettyWebServer : Netty started on port(s): 9195
2021-01-13 23:16:07.688 INFO 30866 --- [ main] o.d.s.b.SoulBootstrapApplication : Started SoulBootstrapApplication in 2.445 seconds (JVM running for 2.794)
- 这里端口信息很重要(9195),我们下面测试会用到这个端口
4. 运行soul-example-http
在soul官网介绍中,我们看到 soul 支持 http协议 dubbo协议,spring cloud 协议。所以我们 来逐一运行一下
- 打开另一个命令行
- cd soul-examples
- 可以看到 soul-examples 下面有6个模块
- soul-examples-http
- soul-examples-dubbo
- soul-examples-springcloud
- soul-examples-eureka
- soul-examples-sofa
- soul-examples-tars
- cd soul-examples-http
- mvn spring-boot:run
可以看到以下的打印信息,Netty启动成功,占用8188端口,和几个http client 注册成功的信息。
2021-01-13 22:53:14.429 INFO 30647 --- [pool-1-thread-1] o.d.s.client.common.utils.RegisterUtils : http client register success: {"appName":"http","context":"/http","path":"/http/test/**","pathDesc":"","rpcType":"http","host":"127.0.0.1","port":8188,"ruleName":"/http/test/**","enabled":true,"registerMetaData":false}
2021-01-13 22:53:14.463 INFO 30647 --- [pool-1-thread-1] o.d.s.client.common.utils.RegisterUtils : http client register success: {"appName":"http","context":"/http","path":"/http/order/path/**","pathDesc":"","rpcType":"http","host":"127.0.0.1","port":8188,"ruleName":"/http/order/path/**","enabled":true,"registerMetaData":false}
2021-01-13 22:53:14.486 INFO 30647 --- [pool-1-thread-1] o.d.s.client.common.utils.RegisterUtils : http client register success: {"appName":"http","context":"/http","path":"/http/order/path/**/name","pathDesc":"","rpcType":"http","host":"127.0.0.1","port":8188,"ruleName":"/http/order/path/**/name","enabled":true,"registerMetaData":false}
2021-01-13 22:53:14.517 INFO 30647 --- [pool-1-thread-1] o.d.s.client.common.utils.RegisterUtils : http client register success: {"appName":"http","context":"/http","path":"/http/order/findById","pathDesc":"Find by id","rpcType":"http","host":"127.0.0.1","port":8188,"ruleName":"/http/order/findById","enabled":true,"registerMetaData":false}
2021-01-13 22:53:14.543 INFO 30647 --- [ main] o.s.b.web.embedded.netty.NettyWebServer : Netty started on port(s): 8188
2021-01-13 22:53:14.544 INFO 30647 --- [pool-1-thread-1] o.d.s.client.common.utils.RegisterUtils : http client register success: {"appName":"http","context":"/http","path":"/http/order/save","pathDesc":"Save order","rpcType":"http","host":"127.0.0.1","port":8188,"ruleName":"/http/order/save","enabled":true,"registerMetaData":false}
2021-01-13 22:53:14.546 INFO 30647 --- [ main] o.d.s.e.http.SoulTestHttpApplication : Started SoulTestHttpApplication in 1.394 seconds (JVM running for 1.833)
- 查看管理平台
- 此时在管理平台 【divide 插件】可以看到 【选择器规则列表】有 5 条规则,分别对应 soul-example-http启动时打印的5条信息。
- order 相关的注册了4个接口
- 另外注册了test下面所有的接口
- 测试原生http接口 和 注册到网关的http接口
- 我们以 order/findById 这个接口为例来测试
- 访问 http://localhost:8188/order/findById?id=1
- 返回结果如下
{"id":"1","name":"hello world findById"}
- 访问 http://localhost:9195/http/order/findById?id=1
- /http/order/findById 是 soul-example-http启动时注册到 soul 上面的路径
- 9195是 soul-bootstrap的端口
- 返回结果如下
{"id":"1","name":"hello world findById"}
- 我们发现 原生http接口 返回结果和 网关的返回结果相同
- 此时 soul-bootstrap 模块打印了日志如下
2021-01-13 23:25:35.032 INFO 30866 --- [-work-threads-4] o.d.soul.plugin.base.AbstractSoulPlugin : divide selector success match , selector name :/http
2021-01-13 23:25:35.032 INFO 30866 --- [-work-threads-4] o.d.soul.plugin.base.AbstractSoulPlugin : divide selector success match , selector name :/http/order/findById
2021-01-13 23:25:35.033 INFO 30866 --- [-work-threads-4] o.d.s.plugin.httpclient.WebClientPlugin : The request urlPath is http://127.0.0.1:8188/order/findById?id=1, retryTimes is 0
- 关闭规则
- 在soul管理平台 【divide 插件】选择器规则列表中,找到 /http/order/findById这一条规则,点击【修改】,将【是否开启】按钮置灰。并保存设置。
- 再次 访问 http://localhost:9195/http/order/findById?id=1
- 返回结果如下
{"code":-102,"message":"Rule not found!","data":null}
总结
到此为止,我们搭建了一个soul的单机版demo,并测试了soul网关对http协议的支持。
- soul-admin主要是一些插件和规则的配置
- soul-bootstrap是soul网关的核心
- 我们启动的soul-example-http是 我们提供的springmvc服务
- 根据官网的介绍数据配置流程 soul网关的配置数据在修改后立即同步到soul gateway 中,不需要重启,性能高,生效快。
- 我们配置的数据同步到soul gateway 中之后,最终写入数据库中。
soul从入门到进阶01——soul网关初体验相关推荐
- [菜鸟SpringCloud实战入门]第九章:服务网关Zuul体验
前言 欢迎来到菜鸟SpringCloud实战入门系列(SpringCloudForNoob),该系列通过层层递进的实战视角,来一步步学习和理解SpringCloud. 本系列适合有一定Java以及Sp ...
- python--爬虫入门(七)urllib库初体验以及中文编码问题的探讨
python系列均基于python3.4环境 ---------@_@? --------------------------------------------------------------- ...
- soul从入门到进阶04——压测soul网关
这篇文章的主题是对soul网关进行压测 笔者的环境 MacBook Pro 处理器 2.8 GHz 四核Intel Core i7 内存 16 GB 1600 MHz DDR3 1. 压测soul-e ...
- soul从入门到进阶02——soul-admin的数据同步流程
soul-admin 的数据同步流程分析 在上一篇文章中我们提到,根据官网的介绍数据配置流程 soul网关的配置数据在修改后立即同步到soul gateway 中,不需要重启,性能高,生效快. 这个特 ...
- soul从入门到进阶05——soul-bootstrap数据同步流程
我们在 soul-admin的数据同步流程中分析了admin的数据同步流程,这篇我们来看看soul-bootstrap的数据同步流程 启动 soul-bootstrap 打印如下日志,我们同样从日志着 ...
- INFINI GATEWAY 极限网关初体验 ElasticSearch 两个集群数据同步
文章目录 极限网关-配置说明 配置文件 日志.数据目录 定义入口 定义路由 定义流程 定义资源 使用Demo 写入两个ES集群 极限网关-常见问题 shutdown: ORM handler is n ...
- lua语言入门学习(四)项目初体验之抽奖转盘(1)
lua语言入门学习 今天前辈教我看了项目,感觉果然公司级的项目分工都比较严谨,很多东西都是略懂功能,但对于底层逻辑的实现并不清楚. 为了保护公司这个游戏具体实现功能上本身的隐私,日常代码分享中不会分享 ...
- lua语言入门学习(八)项目初体验之玩家事件(2)
lua语言入门学习 今天是实习的第二周,前辈给我的任务是熟悉playerevent中每个函数的基本功能. 文章目录 lua语言入门学习 前言 一.代码 1.代码功能自己简析 1.代码功能自己简析 2. ...
- webpack从入门到精通(一)初体验
1. webpack简介 1.1 webpack是什么 webpack 是一种前端资源构建工具,一个静态模块打包器(module bundler). 在 webpack 看来, 前端的所有资源文件(j ...
最新文章
- 遴选中计算机类,计算机卓越班遴选办法-计算机学院
- python运维开发常用模块(四)文件对比模块difflib
- boost::python模块实现使用原始指针访问数据的示例
- 在Ubuntu下安装Bazaar
- 面试题收集——Java基础部分(一)
- LeetCode-38 报数
- SQL Server使用convert对datetime日期数据进行转换
- 欢迎使用CSDN-markdown编辑器1212131
- 实现自己的.NET Core配置Provider之Yaml
- JS阻止冒泡方法(转)
- emui内核支持kvm吗_Linux专题—使用kvm搭建虚拟机
- iphone5信号无服务器,南京苹果维修点告诉你iPhone手机显示无信号、wifi故障该怎么处理?...
- 星起航:抖音小店截流是什么,怎么玩?
- Paper Reading||Overcoming Oscillations in Quantization-Aware Training
- [转]Form中控制Tab画布不同标签间切换的方法
- 一文搭建Vuepress博客/文档系统:搭建,导出,SEO,自动编译和部署,域名,HTTPS,备案等
- 圣墟手游怎么在电脑上玩 圣墟PC版玩法教程
- Trias发起的世界区块链黑客松,牛津启动会首秀成功!
- 史上最全的BAT Mysql面试题在这里
- <linux> busybox制作rootfs