笔者的环境

  • MacBook Pro
  • 处理器 2.8 GHz 四核Intel Core i7
  • 内存 16 GB 1600 MHz DDR3
  • 其他环境准备 maven、jdk、git

概要简介

  • 本篇文章主要是简单认识一下soul网关,搭建本机测试环境,熟悉整体框架
  • 读者可以参考soul极简入门,看一下soul的简介

1. clone 并编译项目

  1. 打开终端
  2. git clone https://github.com/dromara/soul.git
  3. cd soul
  4. 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 速度会快一些

  1. 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的管理平台

  1. cd soul-admin
  2. 运行 soul-admin模块
mvn spring-boot:run
  1. 查看报错信息,以下为报错信息的最后几行
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连接的用户名密码发生了错误。

  1. 启动mysql
brew services start mysql
  1. 修改配置文件中的用户名和密码

    • vim src/main/resources/application.yml
    • 可以看到第30-32行 是mysql的链接、用户名、密码
    • 根据自己的配置修改即可
url: jdbc:mysql://localhost:3306/soul?useUnicode=true&characterEncoding=utf-8
username: root
password:
  1. 重新运行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)
  1. 查看数据库信息
$ mysql -uroot -pmysql> show databases;
  • 发现多了一个soul的 database;也就是说,启动soul-admin模块的时候,会自动创建一个数据库
  1. 在浏览器打开 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的核心模块

  1. 打开另一个命令行
  2. cd soul-bootstrap
  3. 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)
  1. 这里端口信息很重要(9195),我们下面测试会用到这个端口

4. 运行soul-example-http

在soul官网介绍中,我们看到 soul 支持 http协议 dubbo协议,spring cloud 协议。所以我们 来逐一运行一下

  1. 打开另一个命令行
  2. cd soul-examples
  3. 可以看到 soul-examples 下面有6个模块
    • soul-examples-http
    • soul-examples-dubbo
    • soul-examples-springcloud
    • soul-examples-eureka
    • soul-examples-sofa
    • soul-examples-tars
  4. cd soul-examples-http
  5. 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)
  1. 查看管理平台
  • 此时在管理平台 【divide 插件】可以看到 【选择器规则列表】有 5 条规则,分别对应 soul-example-http启动时打印的5条信息。
  • order 相关的注册了4个接口
  • 另外注册了test下面所有的接口
  1. 测试原生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
  1. 关闭规则
  • 在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网关初体验相关推荐

  1. [菜鸟SpringCloud实战入门]第九章:服务网关Zuul体验

    前言 欢迎来到菜鸟SpringCloud实战入门系列(SpringCloudForNoob),该系列通过层层递进的实战视角,来一步步学习和理解SpringCloud. 本系列适合有一定Java以及Sp ...

  2. python--爬虫入门(七)urllib库初体验以及中文编码问题的探讨

    python系列均基于python3.4环境 ---------@_@? --------------------------------------------------------------- ...

  3. soul从入门到进阶04——压测soul网关

    这篇文章的主题是对soul网关进行压测 笔者的环境 MacBook Pro 处理器 2.8 GHz 四核Intel Core i7 内存 16 GB 1600 MHz DDR3 1. 压测soul-e ...

  4. soul从入门到进阶02——soul-admin的数据同步流程

    soul-admin 的数据同步流程分析 在上一篇文章中我们提到,根据官网的介绍数据配置流程 soul网关的配置数据在修改后立即同步到soul gateway 中,不需要重启,性能高,生效快. 这个特 ...

  5. soul从入门到进阶05——soul-bootstrap数据同步流程

    我们在 soul-admin的数据同步流程中分析了admin的数据同步流程,这篇我们来看看soul-bootstrap的数据同步流程 启动 soul-bootstrap 打印如下日志,我们同样从日志着 ...

  6. INFINI GATEWAY 极限网关初体验 ElasticSearch 两个集群数据同步

    文章目录 极限网关-配置说明 配置文件 日志.数据目录 定义入口 定义路由 定义流程 定义资源 使用Demo 写入两个ES集群 极限网关-常见问题 shutdown: ORM handler is n ...

  7. lua语言入门学习(四)项目初体验之抽奖转盘(1)

    lua语言入门学习 今天前辈教我看了项目,感觉果然公司级的项目分工都比较严谨,很多东西都是略懂功能,但对于底层逻辑的实现并不清楚. 为了保护公司这个游戏具体实现功能上本身的隐私,日常代码分享中不会分享 ...

  8. lua语言入门学习(八)项目初体验之玩家事件(2)

    lua语言入门学习 今天是实习的第二周,前辈给我的任务是熟悉playerevent中每个函数的基本功能. 文章目录 lua语言入门学习 前言 一.代码 1.代码功能自己简析 1.代码功能自己简析 2. ...

  9. webpack从入门到精通(一)初体验

    1. webpack简介 1.1 webpack是什么 webpack 是一种前端资源构建工具,一个静态模块打包器(module bundler). 在 webpack 看来, 前端的所有资源文件(j ...

最新文章

  1. 遴选中计算机类,计算机卓越班遴选办法-计算机学院
  2. python运维开发常用模块(四)文件对比模块difflib
  3. boost::python模块实现使用原始指针访问数据的示例
  4. 在Ubuntu下安装Bazaar
  5. 面试题收集——Java基础部分(一)
  6. LeetCode-38 报数
  7. SQL Server使用convert对datetime日期数据进行转换
  8. 欢迎使用CSDN-markdown编辑器1212131
  9. 实现自己的.NET Core配置Provider之Yaml
  10. JS阻止冒泡方法(转)
  11. emui内核支持kvm吗_Linux专题—使用kvm搭建虚拟机
  12. iphone5信号无服务器,南京苹果维修点告诉你iPhone手机显示无信号、wifi故障该怎么处理?...
  13. 星起航:抖音小店截流是什么,怎么玩?
  14. Paper Reading||Overcoming Oscillations in Quantization-Aware Training
  15. [转]Form中控制Tab画布不同标签间切换的方法
  16. 一文搭建Vuepress博客/文档系统:搭建,导出,SEO,自动编译和部署,域名,HTTPS,备案等
  17. 圣墟手游怎么在电脑上玩 圣墟PC版玩法教程
  18. Trias发起的世界区块链黑客松,牛津启动会首秀成功!
  19. 史上最全的BAT Mysql面试题在这里
  20. <linux> busybox制作rootfs

热门文章

  1. WeWork入华 盈利奇迹能否复制
  2. h264基本编码参数
  3. crontab在线生成工具
  4. 通过Python分析2020年全年微博热搜数据
  5. CSS字体、行高等其他样式
  6. 关于QQWry.dat格式
  7. Win10--开启FTP的方法
  8. 小说作者推荐:臣年合集
  9. 路由环路的产生及解决
  10. 50个Java精品源码免积分下载