Soul网关中的Apache Dubbo插件

今天体验的是Soulapache dubbo插件,如果业务系统是由apache dubbo构建而成的,又需要网关的支持,那么可以直接使用Soul

1.Soul官方在soul-examples模块提供了测试样例,其中的soul-examples-apache-dubbo-service模块演示的是Soul网关对apache dubbo 系统的支持。模块目录及配置信息如下:

1

soul.dubbo是有关Souldubbo插件支持的配置,adminUrlSoul的后台管理地址,contextPath是业务系统的请求路径。

2.在项目的pom文件中引入soul相关依赖,当前版本是2.2.1

        <dependency>
            <groupId>org.dromara</groupId>
            <artifactId>soul-spring-boot-starter-client-apache-dubbo</artifactId>
            <version>${soul.version}</version>
        </dependency>

3.在需要被代理的接口上使用注解@SoulDubboClient,@SoulDubboClient注解会把当前接口注册到soul`网关中。使用方式如下:

1

如果其他接口也想被网关代理,使用方式是一样的。在@SoulDubboClient注解中,指定path即可。

运行TestApacheDubboApplication,启动soul-examples-apache-dubbo-service项目。Dubbo是需要注册中心的,可以使用zookeeper或者nacos。本文使用的是zookeeper,启动也很简单。在官网下载,然后解压,直接运行zkServer.cmd就可以运行。

4.参考上一篇的Soul入门,启动Soul AdminSoul BootstrapSoul的后台界面如下:

1

如果dubbo插件没有开启,那么手动开启一下啊。

1

Soul Bootstrap中,加入相关依赖:

 <!--soul  apache dubbo plugin start-->
        <dependency>
            <groupId>org.dromara</groupId>
            <artifactId>soul-spring-boot-starter-plugin-apache-dubbo</artifactId>
            <version>${project.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.7.5</version>
        </dependency>
        <!-- Dubbo zookeeper registry dependency start -->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-client</artifactId>
            <version>4.0.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>4.0.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>4.0.1</version>
        </dependency>
        <!-- Dubbo zookeeper registry dependency end -->
        <!-- soul  apache dubbo plugin end-->

5.三个系统(本身的业务系统(这里就是soul-examples-apache-dubbo-service),Soul后台管理系统Soul Admin,Soul核心网关Soul Bootstrap)都启动成功后,就能够测试一把。

1

	 //实际dubbo提供的服务
    @SoulDubboClient(path = "/findAll", desc = "Get all data")
    public DubboTest findAll() {
        DubboTest dubboTest = new DubboTest();
        dubboTest.setName("hello world Soul Apache, findAll");
        dubboTest.setId(String.valueOf(new Random().nextInt()));
        return dubboTest;
    }

上面向网关发起了一个请求http://localhost:9195/dubbo/findAll,实际被调用的是dubbo的服务。

另外也可以发起一个POST请求,下面向网关发起了一个请求http://localhost:9195/dubbo/insert,实际被调用的是dubbo的服务。

1

   //实际dubbo提供的服务
	@SoulDubboClient(path = "/insert", desc = "Insert a row of data")
    public DubboTest insert(final DubboTest dubboTest) {
        dubboTest.setName("hello world Soul Apache Dubbo: " + dubboTest.getName());
        return dubboTest;
    }

最后,这篇文章主要介绍了SoulApache Dubbo提供的支持,结合实际案例进行了演示。

Soul网关中的Divide插件

今天体验的是Souldivide插件,主要作用是用于http的代理。

请求转发

1.Soul官方在soul-examples模块提供了测试样例,其中的soul-examples-http模块演示的通http发起请求到soul网关,然后再到真实的服务。模块目录及配置信息如下:

1

soul.http是有关Soul的配置,adminUrlSoul的后台管理地址,port是业务系统的端口,contextPath是业务系统的请求路径。

2.在项目的pom文件中引入soul相关依赖,当前版本是2.2.1

        <dependency>
            <groupId>org.dromara</groupId>
            <artifactId>soul-spring-boot-starter-client-springmvc</artifactId>
            <version>${soul.version}</version>
        </dependency>

3.在需要被代理的接口上使用注解@SoulSpringMvcClient@SoulSpringMvcClient注解会把当前接口注册到soul网关中。使用方式如下:

1

如果其他接口也想被网关代理,使用方式是一样的,在@SoulSpringMvcClient注解中,指定path即可。

4.参考上一篇的Soul入门,启动Soul AdminSoul BootstrapSoul的后台管理地址,是一个SpringBoot项目,只需要修改一下数据库的地址就可以运行了。项目会自动创建对应的库和表。项目启动后的登录地址是http://localhost:9095/,用户名是admin,密码是123456。后台界面如下:

1

5.运行SoulTestHttpApplication,启动soul-examples-http项目。

6.三个系统(本身的业务系统,Soul后台管理系统Soul Admin,Soul核心网关Soul Bootstrap)都启动成功后,就能够测试一把。

发起一个Get请求: http://localhost:8188/order/findById?id=99 
得到的响应结果:
{
  "id": "99",
  "name": "hello world findById"
}

上面就是一个普通的http请求,直接请求业务系统的后端服务,现在通过Soul网关来访问该服务。

同样发起一个Get请求:http://localhost:9195/http/order/findById?id=99
得到的响应结果:
{
  "id": "99",
  "name": "hello world findById"
}

这个localhost:9195地址就是网关的地址,/http是业务系统在网关中的名称。那么,现在的请求就是先通过Soul网关,再由网关转发到实际的请求接口。

通过后台管理系统可以发现:主要模块有插件列表和系统管理,在插件列表中可以对各个插件进行管理,每个插件都可以添加多个选择器,每个选择器都可以添加多条规则。实际这就是Soul拦截URL后的匹配规则:插件->选择器->规则,这个后面再细说。

以上就是Soul作为一个网关起到转发的作用,这个功能模块对应的插件是divide插件。其实,这个插件还能完成负载均衡的功能。

负载均衡

  1. 修改soul-examples-http项目端口(比如8189),在Idea中运行这个项目(设置为可以并行运行)。

    server:
      port: 8189
      address: 0.0.0.0
       
       
    soul:
      http:
        adminUrl: http://localhost:9095
        port: 8189
        contextPath: /http
        appName: http
        full: false
    

    1

  2. 启动成功后,在Soul的后台系统中的divide插件中可以看到这个项目的地址信息了。现在再来发起请求。

    同样发起一个Get请求:http://localhost:9195/http/order/findById?id=99
    得到的响应结果:
    {
      "id": "99",
      "name": "hello world findById"
    }
    

    1

    以上请求总共发现四次,然后我们观察一下soul-bootstrap的控制台信息:

    1

    通过日志信息可以清楚的看到4次请求localhost:9195,分别转发到192.168.1.6:8188192.168.1.6:8189192.168.1.6:8188192.168.1.6:8189。这个转发还是很均衡,可以通过在后台地址修改权重,将请求分配到指定的地方。

  3. 修改权重,将请求转发到192.168.1.6:8189

1

现在再来发起4次请求。

同样发起一个Get请求:http://localhost:9195/http/order/findById?id=99
得到的响应结果:
{
  "id": "99",
  "name": "hello world findById"
}

以上请求总共发现四次,然后我们观察一下soul-bootstrap的控制台信息:

1

通过日志信息可以清楚的看到4次请求localhost:9195,总是转发到192.168.1.6:8189192.168.1.6:8189192.168.1.6:8189192.168.1.6:8189。这样,我们就通过给不同配置设置不同权重,网关将根据权重分配请求。

最后,这篇文章主要介绍了Soul中的divide插件可以作为http的代理,也可以很容易实现负载均衡。

Soul入门

Soul是什么?引用Soul的官网:

这是一个异步的,高性能的,跨语言的,响应式的API网关。我希望能够有一样东西像灵魂一样,保护您的微服务。参考了KongSpring-Cloud-Gateway等优秀的网关后,站在巨人的肩膀上,Soul由此诞生!

好了,知道了Soul是一个网关,接下来就看看怎么使用它。 通过案例演示的方式比直接了解各个概念的方式更能激发兴趣。play it!

  1. 从官网拉取项目源码 git clone git@github.com:dromara/soul.git

  2. 创建并切换分支git checkout -b codeview,在本地跑,直接用master分分支也行。

  3. 使用Idea打开项目,然后本地编译一下,确保没有错。

    mvn clean install
    

    第一次编译会很慢,需要下载依赖。当然,也可以跳过测试和注释,会快一点。

    mvn clean install -Dmaven.test.skip=true -Dmaven.javadoc.skip=true
    
  4. 启动Soul的后台管理地址,就是项目源码中的soul-admin模块,这是一个SpringBoot项目,只需要修改一下数据库的地址就可以运行了。项目会自动创建对应的库和表。

    1

    项目启动后的登录地址是http://localhost:9095/,用户名是admin,密码是123456。后台界面如下:

    1

    主要模块有插件列表和系统管理,在插件列表中可以对各个插件进行管理,每个插件都可以添加多个选择器,每个选择器都可以添加多条规则。实际这就是Soul拦截URL后的匹配规则:插件->选择器->规则,这个后面再细说。

  5. 启动Soul的核心模块soul-bootstrap,这是网关的核心处理逻辑。不要怕他,这个模块本身不复杂,目录结构如下:

    1

    启动成功后,就可以访问这个网关了http://127.0.0.1:9195/,返回信息如下:

    {"code":-107,"message":"Can not find selector, please check your configuration!","data":null}
    
  6. 通过上述步骤,就成功的搭建起Soul网关服务了,后面就是在自己的业务系统上使用网关。使用例子可以参考soul-examples模块。

  7. 现在已经站在案例和源代码的层面了解了Soul网关,最后,看看Soul的特点和架构图吧。

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

    架构图

    1

    接下来会运行soul-examples下面的 http服务,结合divde插件,发起http请求soul网关,体验http代理。

    参考文献: