Soul API网关源码解析 01

目标

  • 本地搭建soul开发调试环境
    • Intellij Idea准备
    • soul v2.3.0源码环境搭建
    • mysql/h2
    • jdk1.8.x
  • 本地编译源码,然后运行soul-admim 和soul-bootstrap
  • 到soul 官网查看soul核心介绍
  • 记录总结心得

本地搭建Soul开发调试环境

Intellij Idea准备

Intellij Idea 下载链接

如果没有正版授权码,开源社区版本也是可以的.

Soul V2.3.0 源码环境搭建

  1. 点击 soul github 地址 进入网页之后点击Fork,将源码克隆到自己的仓库,后面也方便自己去提交Pull Request.
  2. 到自己仓库将Fork的源码Clone到本地


    image

    3.使用Git命令进行clone代码

git clone https://github.com/xxxxxxx/soul.git -- 等待下载完成
cd soul

MySQL/H2

  • MySQL
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

如果使用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

5.编译成功


image

出现上图显示的样子并且显示BUILD SUCCESS 恭喜你编译成功

Soul简介

soul 是一个 异步的 , 高性能的 , 跨语言的 , 响应式API网关 。设计的初衷是希望能够有一样东西像灵魂一样,保护您的微服务!

架构图

image

Soul核心Feature

  • 支持各种语言(http协议),支持 dubbo,springcloud,sofa-rpc协议。
  • 插件化设计思想,插件热插拔,易扩展。
  • 灵活的流量筛选,能满足各种流量控制。
  • 内置丰富的插件支持,鉴权,限流,熔断,防火墙等等。
  • 流量配置动态化,性能极高,网关消耗在 1~2ms。
  • 支持集群部署,支持 A/B Test, 蓝绿发布。

总结

经过这一小节我们了解到了,Soul 是高性能、高可用、异步、响应式的API网关,采用插件化设计思想,易拓展,支持集群部署。后面将围绕这些特性逐一展开介绍。

参考

soul github
soul document

你可能感兴趣的:(Soul API网关源码解析 01)