mysql网关源码_Soul API网关源码解析 01

目标

本地搭建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.

dd2f076e9b7c

到自己仓库将Fork的源码Clone到本地

dd2f076e9b7c

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.编译成功

dd2f076e9b7c

image

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

Soul简介

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

架构图

dd2f076e9b7c

image

Soul核心Feature

支持各种语言(http协议),支持 dubbo,springcloud,sofa-rpc协议。

插件化设计思想,插件热插拔,易扩展。

灵活的流量筛选,能满足各种流量控制。

内置丰富的插件支持,鉴权,限流,熔断,防火墙等等。

流量配置动态化,性能极高,网关消耗在 1~2ms。

支持集群部署,支持 A/B Test, 蓝绿发布。

总结

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

参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值