前言
刚刚Soul 网关发布里程碑式的 2.3.0 版本;最为体验和尝鲜的态度,试着体验的新的版本;同时也是因为之前的转载文章[转载]芋道 Soul 极简入门(国产微服务网关)实在是有点久了;一些方式发生了改变,就记录下过程。
一、2.3 更新内容?
通过 2.3 releases可以了解;做了如下的更新;这里简单的中文介绍:
soul-admin(dashboard)
admin
是整个网关的控制面板,掌管所有的流量,规则的匹配。
整合
shior
框架,完成了用户按钮级别的权限控制。模板化插件,让用户无需感知前端页面,只专注于数据的配置。
admin整个后端的国际化,支持中英文切换。
新增支持
H2
来存储数据。admin界面的美观优化(表格,按钮)。
新增单元测试,覆盖率达到百分之七十。
soul网关插件
插件新增
新增
GRPC
插件,全面支持GRPC
协议。新增
Tars
插件,支持腾讯tars RPC
协议。新增
Sofa
插件,支持sofa RPC
协议。新增
Sentinel
插件,整合sentinel
框架的熔断限流功能。新增
Resilience4j
插件,整合Resilience4j
框架的熔断限流功能。新增
Rediect
插件,支持用户的重定向。新增
Context-path
插件,支持用户自定义context-path
插件优化
Divide
插件 : 节点探活方式的优化,流量预热方式的优化。Ratelimiter
插件 :新增并发,漏桶等不同的限流算法,供用户选择。Sgin
插件 : 修复必须设置 url的bug,新增是否验证 标记,可以用来做开放平台的URI认证。Dubbo
插件 : 新增 form表单,URI参数请求, 新增注册中心直连,参数校验等功能。
Soul Client
soul-client只是提供一种快速接入网关的客户端,不是必须的。如果用户不使用,可以在soul-admin自行配置规则即可。
spring-mvc
客户端的优化,支持spring
,spring-boot
所有版本。spring-cloud
客户端的优化,支持spring
,spring-boot
所有版本。dubbo
客户端的优化,支持spring
,spring-boot
所有版本。新增
soul-grpc-client
支持grpc-java
用户接入。新增
soul-tars-client
支持tars-java
用户接入。新增
soul-sofa-client
支持sofa-java
用户接入。
在之前的版本中,只支持 http 方式接入 而这次新增注册中心方式接入。
新增
zookeeper
作为注册中心的方式接入soul
网关。新增
Nacos
作为注册中心的方式接入soul
网关。新增
Consul
作为注册中心的方式接入soul
网关。新增
Etcd
作为注册中心的方式接入soul
网关。
使用方式请参考: https://dromara.org/projects/soul/register-center-access/
Soul 数据同步
修复
Nacos
配置中心同步未设置NameSpace
的Bug。优化
Websocket
同步方式。解决
soul-admin
集群部署时候,Http
长轮询方式同步数据Bug。
二、动手运行--环境搭建
官方文档中的 环境搭建 · dromara(Open source organization) 本身详细的说明,启动搭建的方式:
- Docker
- 远程下载
- 本地搭建
本着学习的目的;这里推荐使用使用本地搭建的方式(笔者也是通过本地搭建的方式搭建的);其余两种方式适合快速搭建;大家可以试试。
1. Soul Admin 安装
<pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="" cid="n154" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--font-monospace); font-size: 0.85rem; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248) !important; position: relative !important; padding: 0.3rem 0px !important; width: inherit; border: 1px solid rgb(244, 244, 244); -webkit-font-smoothing: initial; line-height: 1.43rem; border-radius: 2px; overflow-wrap: normal; margin: 0.8rem 0px !important; color: rgb(52, 73, 94); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"> > git clone https://github.com/dromara/soul.git
cd soul</pre>
注意:启动 SoulAdminBootstrap
。
如果使用h2来存储,设置变量
--spring.profiles.active = h2
如果使用mysql来存储,修改
application.yaml
中的mysql
配置。
这里我们使用 h2
的内存数据库。
启动 SoulAdminBootstrap
类;看到如下内容启动成功:
访问 http://localhost:9095 用户名密码为: admin/123456
2. Soul Bootstrap 安装
<pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="" cid="n169" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--font-monospace); font-size: 0.85rem; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248) !important; position: relative !important; padding: 0.3rem 0px !important; width: inherit; border: 1px solid rgb(244, 244, 244); -webkit-font-smoothing: initial; line-height: 1.43rem; border-radius: 2px; overflow-wrap: normal; margin: 0.8rem 0px !important; color: rgb(52, 73, 94); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"> > git clone https://github.com/dromara/soul.git
cd soul</pre>
启动 SoulBootstrapApplication
类;看到 websocket
成功连接网关管理台的内容:
接入 Spring Boot 应用
写简单测试案例的时候;这次我们使用 示例代码 代码运行。
<pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="xml" cid="n186" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--font-monospace); font-size: 0.85rem; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248) !important; position: relative !important; padding: 0.3rem 0px !important; width: inherit; border: 1px solid rgb(244, 244, 244); -webkit-font-smoothing: initial; line-height: 1.43rem; border-radius: 2px; overflow-wrap: normal; margin: 0.8rem 0px !important; color: rgb(52, 73, 94); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"> <properties>
<soul.version>2.3.0-RELEASE</soul.version>
</properties>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>soul-spring-boot-starter-plugin-divide</artifactId>
<version>${last.version}</version>
</dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>soul-spring-boot-starter-plugin-httpclient</artifactId>
<version>${last.version}</version>
</dependency></pre>
application.yaml
关于soul的配置如下:
<pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="yaml" cid="n191" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--font-monospace); font-size: 0.85rem; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248) !important; position: relative !important; padding: 0.3rem 0px !important; width: inherit; border: 1px solid rgb(244, 244, 244); -webkit-font-smoothing: initial; line-height: 1.43rem; border-radius: 2px; overflow-wrap: normal; margin: 0.8rem 0px !important; color: rgb(52, 73, 94); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"> soul:
client:
registerType: http #zookeeper #etcd #nacos #consul
serverLists: http://localhost:9095 #localhost:2181 #http://localhost:2379 #localhost:8848 # Soul Admin 地址目前也支持注册中心
props:
contextPath: /http # 设置在 Soul 网关的路由前缀,例如说 /order、/product 等等。
后续,网关会根据该 context-path 来进行路由
appName: http #应用名。未配置情况下,默认使用 spring.application.name
配置项
port: 8189 #应用名端口;和配置server.port保持一致;作为路由端口
nacosNameSpace: SoulRegisterCenter</pre>
OrderController
内容:
<pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="java" cid="n209" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--font-monospace); font-size: 0.85rem; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248) !important; position: relative !important; padding: 0.3rem 0px !important; width: inherit; border: 1px solid rgb(244, 244, 244); -webkit-font-smoothing: initial; line-height: 1.43rem; border-radius: 2px; overflow-wrap: normal; margin: 0.8rem 0px !important; color: rgb(52, 73, 94); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"> @RestController
@RequestMapping("/order")
@SoulSpringMvcClient(path = "/order")
public class OrderController {
//...
@PostMapping("/save")
@SoulSpringMvcClient(path = "/save" , desc = "Save order")
public OrderDTO save(@RequestBody final OrderDTO orderDTO) {
orderDTO.setName("hello world save order");
return orderDTO;
}
//...
}</pre>
@SoulSpringMvcClient
注解;有如下内容:
path
:映射的 HTTP 接口的请求路径。desc
:接口的描述,便于知道其用途。enable
:是否开启,默认为true
开启。
启动 SoulTestHttpApplication
main方法启动项目。
访问 http://localhost:9195/http/order/save ;值得说明:9195
是soul网关地址;http
是配置的 contextpath
通过简单案例理解如下数据同步原理: