ShenYu 网关源码学习(1)- 简单介绍、编译和测试

前言

在开始学习 ShenYu之前,我们先来了解一下 ShenYu 到底是什么?ShenYu 的前名是 soul,最近正式加入了 Apache 的孵化器,因此改名为 ShenYu。其是一个异步的,高性能的,跨语言的,响应式的API网关,并在此基础上提供了非常丰富的扩展功能:

  • 支持各种语言(http协议),支持Dubbo, Spring-Cloud, Grpc, Motan, Sofa, Tars等协议。
  • 插件化设计思想,插件热插拔,易扩展。
  • 灵活的流量筛选,能满足各种流量控制。
  • 内置丰富的插件支持,鉴权,限流,熔断,防火墙等等。
  • 流量配置动态化,性能极高。
  • 支持集群部署,支持 A/B Test,蓝绿发布。

环境配置

  • GitHub:https://github.com/dromara/soul
  • 官方文档:https://dromara.org/zh-cn/docs/soul/soul.html

建议先 fork 到自己的 githup 仓库,再 clone 到本地,通过 idea 我们能看到大体的项目结构:

启动

编译

mvn clean package install -Dmaven.test.skip=true -Dmaven.javadoc.skip=true -Drat.skip=true -Dcheckstyle.skip=true

启动 ShenYu - admin

admin 的后台数据是通过 Mysql 来存储的,所以首先需要在 application.yaml 文件中 设置你的 Mysql 连接:
在这里插入图片描述
然后直接启动 org.apache.shenyu.admin.SoulAdminBootstrap 即可。浏览器访问 http://localhost:9095/#/user/login,如果出现登录界面,表示 Admin 启动成功(默认的账号密码:admin 123456)。

启动网关服务

ShenYu-bootstrap 是网关的服务端,这是一个 SpringBoot 的工程,启动非常简单,直接run起来即可。

测试

Shen-Yu 的源码中有提供不同协议的测试客户端,我们通过这些简单的测试先来了解一下 Shen-Yu 的使用。

Http 代理测试

网关服务配置

网关服务引入插件依赖:Shen-Yu 是通过插件方式来提供不同的功能,如果需要使用某个功能需要在 Pom 文件中引入相关插件的依赖,反之如果想屏蔽某个功能,则直接把相应的插件从依赖中去掉即可。

检测 Pom 文件中是否有 http 协议的相关插件,如果没有需要引入并且重启:

<!--if you use http proxy start this-->
<dependency>
    <groupId>org.apache.shenyu</groupId>
    <artifactId>shenyu-spring-boot-starter-plugin-divide</artifactId>
    <version>${project.version}</version>
</dependency>

<!-- shenyu httpclient plugin start-->
<dependency>
    <groupId>org.apache.shenyu</groupId>
    <artifactId>shenyu-spring-boot-starter-plugin-httpclient</artifactId>
    <version>${project.version}</version>
</dependency>
<!-- shenyu httpclient plugin end-->

网关 Admin 配置

登录 ShenYu-admin -> 基础配置 -> 插件管理 -> 开启 divide 插件:
在这里插入图片描述

本地测试服务配置

首先进入模块 shenyu-examples/shenyu-examples-http,检测 application.yaml 的配置:
在这里插入图片描述
配置代理的路由规则

ShenYu 配置代理路由规则有两种方式:

  • 引入 ShenYu 相关代理 client 的依赖,通过 XML 或者注解的方式进行代理规则的配置。这种方式需要添加额外的依赖同时对原来的代码具有一定的侵入性,但是能大大降低手工配置的工作量,如果是自己开发的服务,同时又能容忍这点侵入性的话,个人比较推荐这种方式。

    对于这种方式,官方分别提供了 spring framework 和 spring boot 的 client 集成依赖包,更加详细的内容同学们可以直接参考官方文档

    • spring boot (这里 Http 本地测试服务使用的就是这种方式)
      依赖:
      <dependency>
          <groupId>org.apache.shenyu</groupId>
          <artifactId>shenyu-spring-boot-starter-client-springmvc</artifactId>
          <version>${shenyu.version}</version>
      </dependency>
      
      配置:
      • 在你的 controller 的接口上加上 @SoulSpringMvcClient 注解。
      • 你可以把注解加到 Controller 类上面,里面的path属性则为前缀,如果含有 /** 代表你的整个接口需要被网关代理。
      • 具体可以参考上面测试模块 :
        shenyu-examples/shenyu-examples-http/org.apache.shenyu.examples.http.controller.OrderController
    • spring framework
      依赖:
      <dependency>
         <groupId>org.dromara</groupId>
         <artifactId>soul-client-springmvc</artifactId>
         <version>${last.version}</version>
      </dependency>
      
      配置:
      在你的 bean定义的xml文件中新增如下:
      <bean id ="springMvcClientBeanPostProcessor" class ="org.dromara.soul.client.springmvc.init.SpringMvcClientBeanPostProcessor">
           <constructor-arg  ref="soulRegisterCenterConfig"/>
      </bean>
          
      <bean id="soulRegisterCenterConfig" class="org.dromara.soul.register.common.config.SoulRegisterCenterConfig">
           <property name="registerType" value="http"/>
           <property name="serverList" value="http://localhost:9095"/>
           <property name="props">
                <map>
                  <entry key="contextPath" value="/你的contextPath"/>
                  <entry key="appName" value="你的名字"/>
                  <entry key="port" value="你的端口"/>
                  <entry key="isFull" value="false"/>
                </map>
           </property>
      </bean>
      
  • 在 admin 界面通过手动的方式进行配置,这种方式对原来的代码没有侵入性,但工作量相对较大,而且容易出错。

    • 由于官方只提供了 Spring framewor 和 Spring boot 的 client 依赖包,因此如果是非 Spring 框架或者非 java 语言,可能需要自己手动配置,或者自定义开发相应的插件。
    • 如果你对当前管理的服务,不具有修改的权力,那也可以通过这种方式进行配置。

然后启动 http 测试服务,登录 shenyu-admin -> 插件列表 -> divide,我们能看见 http 测试服务的接口已经自动配置到控制台:
在这里插入图片描述
到这里一个简单 http 服务代理就搭建完成了。

接着我们简单测试一下,首先测试 http 服务器本身是否能访问:
在这里插入图片描述
从上面可以看到 http 的测试服务器能正常访问,接着我们通过网关来请求:
在这里插入图片描述

dubbo 代理测试

测试完 Http 协议的代理后,我们再来简单测试一下 double 服务的代理。对于环境搭建的步骤和上面 Http 的大同小异:网关服务引入 double 协议相关插件依赖,admin 控制台开启插件支持,本地服务添加路由规则自动配置 client 依赖。

这里我们以 apache double 为例,至于 alibaba double 同学们可以直接参考官方文档,哪里有更加详细的配置说明。

网关服务配置

添加以下依赖:

<!--soul apache dubbo plugin start-->
<dependency>
   <groupId>org.dromara</groupId>
   <artifactId>soul-spring-boot-starter-plugin-apache-dubbo</artifactId>
   <version>${last.version}</version>
</dependency>
<!--soul apache dubbo plugin end-->
    
<dependency>
   <groupId>org.apache.dubbo</groupId>
   <artifactId>dubbo</artifactId>
   <version>2.7.5</version>
</dependency>
<!-- Dubbo Nacos registry dependency start -->
<dependency>
   <groupId>org.apache.dubbo</groupId>
   <artifactId>dubbo-registry-nacos</artifactId>
   <version>2.7.5</version>
</dependency>
<dependency>
   <groupId>com.alibaba.nacos</groupId>
   <artifactId>nacos-client</artifactId>
   <version>1.1.4</version>
</dependency>
<!-- Dubbo Nacos registry dependency  end-->
    
<!-- 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 -->

网关 Admin 配置

登录 ShenYu-admin -> 基础配置 -> 插件管理 -> 开启 double 插件:
在这里插入图片描述

本地服务配置

进入测试模块 shenyu-examples/shenyu-examples-dubbo/shenyu-examples-apache-dubbo-service,检测 application.yaml 配置:
在这里插入图片描述
修改 spring-dubbo.xml,这里官方的配置有点错误:

<!--这是原来的配置,会发生 ClasNotFoundException  -->
<!--    <dubbo:service timeout="10000" interface="DubboTestService" ref="dubboTestService"/>-->
<!--    <dubbo:service timeout="10000" interface="DubboMultiParamService" ref="dubboMultiParamService"/>-->
    
<!--修改为如下-->
<dubbo:service timeout="10000" interface="org.apache.shenyu.examples.dubbo.api.service.DubboTestService"
               ref="dubboTestService"/>
<dubbo:service timeout="10000" interface="org.apache.shenyu.examples.dubbo.api.service.DubboMultiParamService"
               ref="dubboMultiParamService"/>

配置路由规则:

  • 依赖
    <!--和 Http 协议代理一样,dubbo 官方同样提供了 Spring boot 和 Spring framework 两个 client 的依赖包-->
    <!--其他需要自己开发或者在 admin 界面手动配置路由规则-->
    <dependency>
        <groupId>org.apache.shenyu</groupId>
        <artifactId>shenyu-spring-boot-starter-client-apache-dubbo</artifactId>
        <version>${shenyu.version}</version>
    </dependency>
    
  • 配置:
    在具体的服务中,为需要代理的接口添加注解 @SoulDubboClient,例如:
    @Override
    @SoulDubboClient(path = "/findById", desc = "Query by Id")
    public DubboTest findById(final String id) {
        DubboTest dubboTest = new DubboTest();
        dubboTest.setId(id);
        dubboTest.setName("hello world Soul Apache, findById");
        return dubboTest;
    }
    

本地启动一个 zookeeper,作为 double 服务的注册中心。 然后直接运行本地 double 测试服务,然后登录 shenyu-admin -> 插件列表 -> doulbe,我们能看见 http 测试服务的接口已经自动配置到控制台:
在这里插入图片描述
shenYu 是通过 Http 协议对外提供 dubbo 服务的,因此通过 Http 直接请求即可:
在这里插入图片描述

sofa 代理测试

网关服务配置

添加以下依赖:

<!--shenyu sofa plugin start-->
<dependency>
    <groupId>com.alipay.sofa</groupId>
    <artifactId>sofa-rpc-all</artifactId>
    <version>5.7.6</version>
</dependency>
<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>
<dependency>
    <groupId>org.apache.shenyu</groupId>
    <artifactId>shenyu-spring-boot-starter-plugin-sofa</artifactId>
    <version>${project.version}</version>
</dependency>
<!--shenyu sofa plugin end-->

网关 Admin 配置

登录 ShenYu-admin -> 基础配置 -> 插件管理 -> 开启 sofa 插件:
在这里插入图片描述

本地 sofa 服务配置

进入模块 soul-examples/soul-examples-sofa 添加依赖:

  • Spring Boot

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

    Application.yaml 添加下面的配置:

    soul:
      sofa:
        adminUrl: http://localhost:9095
        contextPath: /sofa
        appName: sofa
     # adminUrl: 为你启动的soul-admin 项目的ip + 端口,注意要加 http://
     # contextPath: 为你的这个项目在soul网关的路由前缀,这个你应该懂意思把? 比如/order ,/product 等等,网关会根据你的这个前缀来进行路由.
     # appName:你的应用名称,不配置的话,会默认取sofa配置中application 中的名称
    
  • Spring framework

    <dependency>
        <groupId>org.dromara</groupId>
        <artifactId>soul-client-sofa</artifactId>
        <version>${project.version}</version>
    </dependency>
    

    添加Bean定义:

    <bean id="sofaServiceBeanPostProcessor" class="org.dromara.soul.client.sofa.SofaServiceBeanPostProcessor">
    	<constructor-arg  ref="sofaConfig"/>
    </bean>
    <bean id="sofaConfig" class="org.dromara.soul.client.sofa.common.config.SofaConfig">
         <property name="adminUrl" value="http://localhost:9095"/>
         <property name="contextPath" value="/你的contextPath"/>
         <property name="appName" value="你的名字"/>
    </bean>
    

启动本地服务 :

在这里插入图片描述
和 dubbo 一样,shenYu 是通过 Http 协议对外提供 sofa 服务的,因此通过 Http 直接请求即可:
在这里插入图片描述

Spring Cloud 代理测试

网关服务配置

添加以下依赖:

<!-- shenyu springCloud plugin start-->
<dependency>
     <groupId>org.apache.shenyu</groupId>
     <artifactId>shenyu-spring-boot-starter-plugin-springcloud</artifactId>
     <version>${project.version}</version>
 </dependency>

 <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-commons</artifactId>
     <version>2.2.0.RELEASE</version>
 </dependency>
 
 <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
     <version>2.2.0.RELEASE</version>
 </dependency>
 
 <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
     <version>2.2.0.RELEASE</version>
 </dependency>
<!-- shenyu springCloud plugin start end-->

添加 Spring Cloud 注册中心信息,这里使用的是 eureka:

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
  instance:
    prefer-ip-address: true

网关 Admin 配置

登录 ShenYu-admin -> 基础配置 -> 插件管理 -> 开启 spring cloud 插件:
在这里插入图片描述

本地 Spring Cloud 服务配置

首先启动 Spring Cloud 的注册中心:shenyu-examples/shenyu-examples-eureka
在这里插入图片描述
本地 Spring Cloud 测试服务配置:

  • 添加依赖:
     <dependency>
         <groupId>org.apache.shenyu</groupId>
         <artifactId>shenyu-spring-boot-starter-client-springcloud</artifactId>
         <version>${shenyu.version}</version>
     </dependency>
    
  • 注解配置:
    • 在你的 controller的接口上加上 @SoulSpringCloudClient 注解。
    • 你可以把注解加到 Controller 类上面, 里面的path属性则为前缀,如果含有 /** 代表你的整个接口的所有方法需要被网关代理。
    @RestController
    @RequestMapping("/test")
    // save 和 findByUserId 都被代理
    @SoulSpringCloudClient(path = "/test/**")
    public class TestController {
    	@PostMapping("/save")
        public UserDTO post(@RequestBody final UserDTO userDTO) {...}
        
        @GetMapping("/findByUserId")
        public UserDTO findByUserId(@RequestParam("userId") final String userId) {...}
    }
    
  • 修改 application.yaml
    在这里插入图片描述
    启动服务,测试:
    在这里插入图片描述

结语

本篇文章的内容其实就官方文档的搬运工,没有太多原创的内容,只是简单地做了一些演示,但是作为系列文章的第一篇,对于环境的搭建和测试还是必须的。所以如果同学们需要了解更加详细的使用教程,最好去 dromara 社区,那里有更新更详细的信息。

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
shenyu网关是一款开源的API网关软件,它可以帮助开发者实现对接口的统一管理和流量控制。shenyu网关提供了多种功能,包括请求转发、请求过滤、流量限制、负载均衡等,帮助用户实现高可用和高稳定性的系统架构。 shenyu网关基于Java开发,使用简单方便,支持多种开源框架和中间件,如Spring Boot、Dubbo、Motan等。通过使用shenyu网关,开发者可以快速搭建起一个完善的微服务架构,可以轻松地管理和监控各个微服务之间的通信和流量。 另外,shenyu网关还提供了可视化的管理界面,方便用户进行参数配置、资源管理、性能监控等操作。用户可以通过该界面对各个服务进行细粒度的管理,实现功能的灵活配置和动态调整。 码云是中国最大的代码托管平台,类似于国外的GitHub。用户可以通过码云托管自己的代码仓库,并利用这个平台进行团队协作和项目管理。码云提供了Git版本控制、代码托管、代码审查等功能,支持多种开发语言和开发工具。 与GitHub不同的是,码云在国内具有更好的访问速度和稳定性,同时还提供了国内常用的Git代码托管服务,支持国内的开发者更方便地使用和访问。用户可以在码云上创建自己的项目仓库,与其他开发者进行交流学习,并共同进行开发和维护。 综上所述,shenyu网关和码云都是开发者常用的工具。shenyu网关可以帮助开发者实现API网关的功能,提供统一的接口管理和流量控制;码云则是代码托管平台,提供代码的版本控制和团队协作功能。两者的结合可以帮助开发者更好地进行微服务架构的开发和管理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值