文章目录
前言
在开始学习 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">
- spring boot (这里 Http 本地测试服务使用的就是这种方式)