论起微服务,哪能不谈网关,老将有Zuul,后继有Gateway,但这些都和SpringCloud关系密切,其他网关如Kong,因Lua原因,玩起来略不顺手。这不,就来了个Soul,我顺便拿来整进了我在写的项目中,感觉还行,也发现了些问题,表现有待观察,另一方面发现Soul资料略少,我就出点实例供看官参考参考。

准备:

Idea2019.03/Gradle6.0.1/JDK11.0.4/Lombok0.28/SpringBoot2.2.2RELEASE/mybatisPlus3.3.0/Sou2.1.2/Dubbo2.7.5/Mysql8.0.11

难度: 新手--战士--老兵--大师

目标:

1.实现http模式下使用soul网关转发

2.使用soul网关多服务实例负载均衡

步骤:

为了遇见各种问题,同时保持时效性,我尽量使用最新的软件版本。代码地址:https://github.com/xiexiaobiao/vehicle-shop-admin

1 Soul 网关特点

  • 插件式管理,动态热加载
  • 独立式部署,带web管理界面
  • 可对接HTTP,Restful,websocket,dubbo和springcloud

2 http模式使用

2.1 项目中加入依赖:dubbo接入使用soul-client-apache-dubbo包,http接入使用:soul-client-springmvc包。

2.2 定义配置:

重点就是“contextPath”,即这个插件匹配到uri路径为 “ /stock/** ”

2.3 在Controller的方法上使用@SoulClient注解,比如:

@SoulClient(path = "/vehicle/stock/brand/list", desc = "获取所有品牌列表")

此处因为我整个项目加了context-path: /vehicle,故有/vehicle前缀:

使用http接入需要使用zk,否则控制台会报错,但经测试不使用zk功能上也可以,官方也说明已脱离对zk强依赖,应该是历史遗留问题。

2.4 先启动zookeeper(非必需),再启动soul-admin.jar,再启动soul-bootstrap.jar(这两个可以官网下载,依照说明使用),最后启动项目。

结构关系如下:

2.5 使用http接入为例,启动完毕后访问 http://localhost:9095/index.html 默认的用户名:admin 密码:123456,发现已自动加入了定义的“选择器”和“选择器规则”:

选择器详细:

“http配置”可以有多个目标地址,即多个微服务实例,再配合选择器规则即可做负载均衡。“权重”越大,random模式下分配到的概率越大。本机的话ip也可以直接用127.0.0.1,“条件”推荐使用uri模式匹配,这也是网关核心之一的路由功能了!

选择器规则详细:

这里可以配置负载均衡策略,三种:hash、random和robin。

2.6 并先关闭其他插件,只保留divide:

2.7 测试:

直接http访问项目API:

使用soul网关访问,注意对比url地址。注意这里是soulClient的端口,不是soulAdmin的!!

同时可以看到soul-bootstrap控制台进行http路由转发的信息:

总结

1.使用发现对RESTFUL支持只有GET/POST,其他如PUT/DELETE,总是导致携带的参数丢失,无法转发到目标地址,可能设计上就只支持GET/POST。

2.Soul热插件和web端操作,还是体验较好的,我使用的项目代码较多,看官完全可以自己写一个简单的SpringbootMVC项目来测试。

3.请期待我的后续:集群部署和Dubbo接入。

全文完!


推荐阅读:

最新文章

  1. Target runtime com.genuitec.runtime.generic.jee60 is not defined
  2. 【PostgreSQL】PostgreSQL添加新服务器连接时,报错“Server doesn't listen ”,已解决。
  3. KnockoutJS 3.X API 第七章 其他技术(3) 延迟更新
  4. MyBatis操作指南-配置结果映射一对一,一对多,多对多(基于注解)
  5. 【iOS】Quartz2D图形上下文
  6. sass,compass让开发效率飞起
  7. 007--VS2013 C++ 显示位图半透明化
  8. arm linux kernel 从入口到start_kernel 的代码分析
  9. 牛客_剑指offer_重建二叉树,再后续遍历_递归思想_分两端
  10. c#类的初始化顺序
  11. Xcode换版本或者改名字后无法使用simpholders2
  12. jquery 变量和原生js变量的关系
  13. Docker部署Zabbix监控MariaDB主从同步(Percona Monitoring Plugins for Zabbix)
  14. 深入理解JAVA中的代理模式
  15. Missile Command 导弹指令
  16. Python学习—数据库篇之pymysql
  17. golang写业务代码,用全局函数还是成员函数
  18. 喜闻乐见-Android LaunchMode
  19. CentOS 7 安装配置带用户认证的squid代理服务器
  20. 【转】64位系统下无法使用libpam-mysql的md5

热门文章

  1. 个性化重排--Personalized Re-ranking for Recommendation
  2. CSRF 详解:攻击,防御,Spring Security应用等
  3. 【一起学源码-微服务】Feign 源码二:Feign动态代理构造过程
  4. 学习集合Collection_通用方法
  5. Java爬虫一键爬取结果并保存为Excel
  6. three.js入门第一个案例
  7. 带 sin, cos 的线段树 - 牛客
  8. 读取Core下的appsettings.json的值的时候中文乱码
  9. 华为,小米部分机型微信浏览器rem不适配的解决方案
  10. javaweb-codereview 学习记录-1