文章目录
前言
在开始学习 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>
- spring boot (这里 Http 本地测试服务使用的就是这种方式)
-
在 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 社区,那里有更新更详细的信息。