目标
- 本地搭建soul开发调试环境
- Intellij Idea准备
- soul v2.3.0源码环境搭建
- mysql/h2
- jdk1.8.x
- 本地编译源码,然后运行soul-admim 和soul-bootstrap
- 到soul 官网查看soul核心介绍
- 记录总结心得
本地搭建Soul开发调试环境
Intellij Idea准备
如果没有正版授权码,开源社区版本也是可以的.
Soul V2.3.0 源码环境搭建
- 点击 soul github 地址 进入网页之后点击Fork,将源码克隆到自己的仓库,后面也方便自己去提交Pull Request.
-
到自己仓库将Fork的源码Clone到本地
3.使用Git命令进行clone代码
git clone https://github.com/xxxxxxx/soul.git -- 等待下载完成
cd soul
MySQL/H2
- MySQL
<pre>spring:
#profiles:
# active: h2
thymeleaf:
cache: true
encoding: utf-8
enabled: true
prefix: classpath:/static/
suffix: .html
datasource:
url: jdbc:mysql://localhost:3306/soul?useUnicode=true&characterEncoding=utf-8
username: root
password:
driver-class-name: com.mysql.jdbc.Driver</pre>
如果使用MySQL实体数据库,那么就要准备一个MySQL5.6.X/5.7.X 版本的数据库
- H2
spring:
profiles:
active: h2
thymeleaf:
cache: true
encoding: utf-8
enabled: true
prefix: classpath:/static/
suffix: .html
datasource:
url: jdbc:mysql://localhost:3306/soul?useUnicode=true&characterEncoding=utf-8
username: root
password:
driver-class-name: com.mysql.jdbc.Driver
如果本地没有数据库,可以使用soul自带的H2内存数据库,只要将profiles.active:h2 注释解开即可
JDK1.8.X
本地使用JDK版本要JDK1.8.X+
本地编译源码,然后运行soul-admim 和soul-bootstrap
使用Intellij Idea或者Terminal控制端
- Intellij idea 就直接 Maven install 即可
- 遇到错误(别慌,找到问题根源将其解决)
java.rmi.ConnectIOException: error during JRMP connection establishment; nested exception is:
java.net.SocketTimeoutException: Read timed out
at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:307)
at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:129)
at javax.management.remote.rmi.RMIServerImpl_Stub.newClient(Unknown Source)
at javax.management.remote.rmi.RMIConnector.getConnection(RMIConnector.java:2430)
at javax.management.remote.rmi.RMIConnector.connect(RMIConnector.java:308)
at javax.management.remote.JMXConnectorFactory.connect(JMXConnectorFactory.java:270)
at org.dromara.soul.metrics.prometheus.impl.collector.JmxScraper.doScrape(JmxScraper.java:137)
at org.dromara.soul.metrics.prometheus.impl.collector.JmxScraperTest.testJmxScraperWithNonEmptyJmxUrlThenReceivedByReceiverDefaultExport(JmxScraperTest.java:187)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)
at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:220)
at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:53)
Caused by: java.net.SocketTimeoutException: Read timed out
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
at java.net.SocketInputStream.read(SocketInputStream.java:171)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:246)
at java.io.BufferedInputStream.read(BufferedInputStream.java:265)
at java.io.DataInputStream.readByte(DataInputStream.java:265)
at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:246)
... 32 more
在install时候发现Test类报错了,我们根据提示是 Read timed out ,这时候定位问题,肯定是哪里跟网关相关的接口发生读超时,我就debug测试类发现是
testJmxScraperWithNonEmptyJmxUrl test error
testJmxScraperWithNonEmptyJmxUrlThenReceivedByReceiverDefaultExport test error
细看代码执行这两个之前是要执行如下代码。继续往下走 发生在 register 时候,我发现绑定的IP 是我电脑的其他IP,而后面的操作都是基于 127.0.0.1 执行的,所以关掉对应IP就可以了,或者这里 测试IP 不要写死也是可以的。
final String mockJmxUrl = "service:jmx:rmi:///jndi/rmi://127.0.0.1:9876/jmxrmi";
@BeforeClass
public static void setup() throws Exception {
mockJmxServer = new MockJmxServer(MOCK_JMX_SERVER_REGISTRY_PORT);
mockJmxServer.start();
mockJmxServer.register(new MockMetrics(11, "foo", new Date(), buildMockCompositeData(), buildMockTabularData(), new int[0], new String[0]),
new ObjectName("JmxTest:name=mock1"));
}
- 终端进入目录之后执行
mvn clean package install
-Dmaven.test.skip=true
-Dmaven.javadoc.skip=true
-Drat.skip=true -Dcheckstyle.skip=true</pre>
5.编译成功
出现上图显示的样子并且显示BUILD SUCCESS 恭喜你编译成功
Soul简介
soul
是一个 异步的
, 高性能的
, 跨语言的
, 响应式
的 API网关
。设计的初衷是希望能够有一样东西像灵魂一样,保护您的微服务!
架构图
Soul核心Feature
- 支持各种语言(http协议),支持 dubbo,springcloud,sofa-rpc协议。
- 插件化设计思想,插件热插拔,易扩展。
- 灵活的流量筛选,能满足各种流量控制。
- 内置丰富的插件支持,鉴权,限流,熔断,防火墙等等。
- 流量配置动态化,性能极高,网关消耗在 1~2ms。
- 支持集群部署,支持 A/B Test, 蓝绿发布。
总结
经过这一小节我们了解到了,Soul 是高性能、高可用、异步、响应式的API网关,采用插件化设计思想,易拓展,支持集群部署。后面将围绕这些特性逐一展开介绍。