在开始学习 ShenYu之前,我们先来了解一下 ShenYu 到底是什么?ShenYu 的前名是 soul,最近正式加入了 Apache 的孵化器,因此改名为 ShenYu。其是一个异步的,高性能的,跨语言的,响应式的API网关,并在此基础上提供了非常丰富的扩展功能:
建议先 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 的使用。
网关服务引入插件依赖: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>
登录 ShenYu-admin -> 基础配置 -> 插件管理 -> 开启 divide 插件:
首先进入模块 shenyu-examples/shenyu-examples-http,检测 application.yaml 的配置:
配置代理的路由规则
ShenYu 配置代理路由规则有两种方式:
引入 ShenYu 相关代理 client 的依赖,通过 XML 或者注解的方式进行代理规则的配置。这种方式需要添加额外的依赖同时对原来的代码具有一定的侵入性,但是能大大降低手工配置的工作量,如果是自己开发的服务,同时又能容忍这点侵入性的话,个人比较推荐这种方式。
对于这种方式,官方分别提供了 spring framework 和 spring boot 的 client 集成依赖包,更加详细的内容同学们可以直接参考官方文档。
<dependency>
<groupId>org.apache.shenyugroupId>
<artifactId>shenyu-spring-boot-starter-client-springmvcartifactId>
<version>${shenyu.version}version>
dependency>
配置:
<dependency>
<groupId>org.dromaragroupId>
<artifactId>soul-client-springmvcartifactId>
<version>${last.version}version>
dependency>
配置:
<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 界面通过手动的方式进行配置,这种方式对原来的代码没有侵入性,但工作量相对较大,而且容易出错。
然后启动 http 测试服务,登录 shenyu-admin -> 插件列表 -> divide,我们能看见 http 测试服务的接口已经自动配置到控制台:
到这里一个简单 http 服务代理就搭建完成了。
接着我们简单测试一下,首先测试 http 服务器本身是否能访问:
从上面可以看到 http 的测试服务器能正常访问,接着我们通过网关来请求:
测试完 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>
登录 ShenYu-admin -> 基础配置 -> 插件管理 -> 开启 double 插件:
进入测试模块 shenyu-examples/shenyu-examples-dubbo/shenyu-examples-apache-dubbo-service,检测 application.yaml 配置:
修改 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>
@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 直接请求即可:
添加以下依赖:
<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>
登录 ShenYu-admin -> 基础配置 -> 插件管理 -> 开启 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>
启动本地服务 :
和 dubbo 一样,shenYu 是通过 Http 协议对外提供 sofa 服务的,因此通过 Http 直接请求即可:
添加以下依赖:
<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
登录 ShenYu-admin -> 基础配置 -> 插件管理 -> 开启 spring cloud 插件:
首先启动 Spring Cloud 的注册中心:shenyu-examples/shenyu-examples-eureka
本地 Spring Cloud 测试服务配置:
<dependency>
<groupId>org.apache.shenyugroupId>
<artifactId>shenyu-spring-boot-starter-client-springcloudartifactId>
<version>${shenyu.version}version>
dependency>
@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) {...}
}
本篇文章的内容其实就官方文档的搬运工,没有太多原创的内容,只是简单地做了一些演示,但是作为系列文章的第一篇,对于环境的搭建和测试还是必须的。所以如果同学们需要了解更加详细的使用教程,最好去 dromara 社区,那里有更新更详细的信息。