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

文章目录

  • 前言
  • 环境配置
  • 启动
  • 测试
    • Http 代理测试
      • 网关服务配置
      • 网关 Admin 配置
      • 本地测试服务配置
    • dubbo 代理测试
      • 网关服务配置
      • 网关 Admin 配置
      • 本地服务配置
    • sofa 代理测试
      • 网关服务配置
      • 网关 Admin 配置
      • 本地 sofa 服务配置
    • Spring Cloud 代理测试
      • 网关服务配置
      • 网关 Admin 配置
      • 本地 Spring Cloud 服务配置
  • 结语

前言

在开始学习 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 连接:
ShenYu 网关源码学习(1)- 简单介绍、编译和测试_第1张图片
然后直接启动 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 协议的相关插件,如果没有需要引入并且重启:


<dependency>
    <groupId>org.apache.shenyugroupId>
    <artifactId>shenyu-spring-boot-starter-plugin-divideartifactId>
    <version>${project.version}version>
dependency>


<dependency>
    <groupId>org.apache.shenyugroupId>
    <artifactId>shenyu-spring-boot-starter-plugin-httpclientartifactId>
    <version>${project.version}version>
dependency>

网关 Admin 配置

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

本地测试服务配置

首先进入模块 shenyu-examples/shenyu-examples-http,检测 application.yaml 的配置:
ShenYu 网关源码学习(1)- 简单介绍、编译和测试_第2张图片
配置代理的路由规则

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

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

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

    • spring boot (这里 Http 本地测试服务使用的就是这种方式)
      依赖:
      <dependency>
          <groupId>org.apache.shenyugroupId>
          <artifactId>shenyu-spring-boot-starter-client-springmvcartifactId>
          <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.dromaragroupId>
         <artifactId>soul-client-springmvcartifactId>
         <version>${last.version}version>
      dependency>
      
      配置:
      在你的 bean定义的xml文件中新增如下:
      
           <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 测试服务的接口已经自动配置到控制台:
ShenYu 网关源码学习(1)- 简单介绍、编译和测试_第3张图片
到这里一个简单 http 服务代理就搭建完成了。

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

dubbo 代理测试

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

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

网关服务配置

添加以下依赖:


<dependency>
   <groupId>org.dromaragroupId>
   <artifactId>soul-spring-boot-starter-plugin-apache-dubboartifactId>
   <version>${last.version}version>
dependency>

    
<dependency>
   <groupId>org.apache.dubbogroupId>
   <artifactId>dubboartifactId>
   <version>2.7.5version>
dependency>

<dependency>
   <groupId>org.apache.dubbogroupId>
   <artifactId>dubbo-registry-nacosartifactId>
   <version>2.7.5version>
dependency>
<dependency>
   <groupId>com.alibaba.nacosgroupId>
   <artifactId>nacos-clientartifactId>
   <version>1.1.4version>
dependency>

    

<dependency>
   <groupId>org.apache.curatorgroupId>
   <artifactId>curator-clientartifactId>
   <version>4.0.1version>
dependency>
<dependency>
   <groupId>org.apache.curatorgroupId>
   <artifactId>curator-frameworkartifactId>
   <version>4.0.1version>
dependency>
<dependency>
   <groupId>org.apache.curatorgroupId>
   <artifactId>curator-recipesartifactId>
   <version>4.0.1version>
dependency>

网关 Admin 配置

登录 ShenYu-admin -> 基础配置 -> 插件管理 -> 开启 double 插件:
ShenYu 网关源码学习(1)- 简单介绍、编译和测试_第4张图片

本地服务配置

进入测试模块 shenyu-examples/shenyu-examples-dubbo/shenyu-examples-apache-dubbo-service,检测 application.yaml 配置:
ShenYu 网关源码学习(1)- 简单介绍、编译和测试_第5张图片
修改 spring-dubbo.xml,这里官方的配置有点错误:




    

<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"/>

配置路由规则:

  • 依赖
    
    
    <dependency>
        <groupId>org.apache.shenyugroupId>
        <artifactId>shenyu-spring-boot-starter-client-apache-dubboartifactId>
        <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 网关源码学习(1)- 简单介绍、编译和测试_第6张图片
shenYu 是通过 Http 协议对外提供 dubbo 服务的,因此通过 Http 直接请求即可:
在这里插入图片描述

sofa 代理测试

网关服务配置

添加以下依赖:


<dependency>
    <groupId>com.alipay.sofagroupId>
    <artifactId>sofa-rpc-allartifactId>
    <version>5.7.6version>
dependency>
<dependency>
    <groupId>org.apache.curatorgroupId>
    <artifactId>curator-clientartifactId>
    <version>4.0.1version>
dependency>
<dependency>
    <groupId>org.apache.curatorgroupId>
    <artifactId>curator-frameworkartifactId>
    <version>4.0.1version>
dependency>
<dependency>
    <groupId>org.apache.curatorgroupId>
    <artifactId>curator-recipesartifactId>
    <version>4.0.1version>
dependency>
<dependency>
    <groupId>org.apache.shenyugroupId>
    <artifactId>shenyu-spring-boot-starter-plugin-sofaartifactId>
    <version>${project.version}version>
dependency>

网关 Admin 配置

登录 ShenYu-admin -> 基础配置 -> 插件管理 -> 开启 sofa 插件:
ShenYu 网关源码学习(1)- 简单介绍、编译和测试_第7张图片

本地 sofa 服务配置

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

  • Spring Boot

    <dependency>
        <groupId>org.dromaragroupId>
        <artifactId>soul-spring-boot-starter-client-sofaartifactId>
        <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.dromaragroupId>
        <artifactId>soul-client-sofaartifactId>
        <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>
    

启动本地服务 :

ShenYu 网关源码学习(1)- 简单介绍、编译和测试_第8张图片
和 dubbo 一样,shenYu 是通过 Http 协议对外提供 sofa 服务的,因此通过 Http 直接请求即可:
ShenYu 网关源码学习(1)- 简单介绍、编译和测试_第9张图片

Spring Cloud 代理测试

网关服务配置

添加以下依赖:


<dependency>
     <groupId>org.apache.shenyugroupId>
     <artifactId>shenyu-spring-boot-starter-plugin-springcloudartifactId>
     <version>${project.version}version>
 dependency>

 <dependency>
     <groupId>org.springframework.cloudgroupId>
     <artifactId>spring-cloud-commonsartifactId>
     <version>2.2.0.RELEASEversion>
 dependency>
 
 <dependency>
     <groupId>org.springframework.cloudgroupId>
     <artifactId>spring-cloud-starter-netflix-ribbonartifactId>
     <version>2.2.0.RELEASEversion>
 dependency>
 
 <dependency>
     <groupId>org.springframework.cloudgroupId>
     <artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
     <version>2.2.0.RELEASEversion>
 dependency>

添加 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
ShenYu 网关源码学习(1)- 简单介绍、编译和测试_第10张图片
本地 Spring Cloud 测试服务配置:

  • 添加依赖:
     <dependency>
         <groupId>org.apache.shenyugroupId>
         <artifactId>shenyu-spring-boot-starter-client-springcloudartifactId>
         <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
    ShenYu 网关源码学习(1)- 简单介绍、编译和测试_第11张图片
    启动服务,测试:
    在这里插入图片描述

结语

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

你可能感兴趣的:(Soul网关,Java,java,网关)