(apache-shenyu 2.4.3版本)apache shenyu前身soul网关,是一款java中spring5新引入的project-reactor的webflux,reactor-netty等为基础实现的高性能网关,现已进入apache孵化器,作者yu199195 (xiaoyu) (github.com)
作者也是国内知名开源社区dromara的创始人,并且作有多个开源产品,apache-shenyu是其中之一apache/incubator-shenyu: ShenYu is High-Performance Java API Gateway. (github.com)
2.4.3版本,目前作为apache孵化器项目迭代还是很快的。
为什么出一篇老年人教程。为了能够过渡一下接下来的探讨shenyu核心模块之一
shenyu-sync-data-center以及shenyu-client做准备,当然后续还会去学习shenyu-plugin(提供各种插件扩展)
开始之前可以看一下github上及其其他百度搜到的关于apache-shenyu网关的介绍,后续可以通过当前文章启动apache-shenyu然后根据页面以及接口来根据自己的想法进行测试,感受一下shenyu的魅力
那么开始了
- 下载代码apache/incubator-shenyu: ShenYu is High-Performance Java API Gateway. (github.com)
可以fork或者直接下载v2.4.3版本的源码 -
下载代码完毕后使用idea打开它,它长这个样子
apache-shenyu2.4.3版本的源码
简单了解一下各个模块的作用
- shenyu-admin:shenyu提供的页面可视化的网关配置页面的后端接口
- shenyu-alert:网关也提供报警功能,可以通过这个模块实现,目前还没有用到,大家继承shenyu网关时可以自己扩展
- shenyu-bootstrap:网关服务,真正做负载均衡,熔断,限流,路由等逻辑的网关,当然shenyu这里只有一个启动类,会加载其他模块的代码启动
- shenyu-client:作为网关,要路由到后端服务所提供的客户端模块,分别为core包,提供了所有client实现的聚合,目前支持的协议包括dubbo,grpc,http,motan,sofa,tars,websocket协议的后端
- shenyu-common:shenyu的工具类,定时逻辑(时间轮),多线程等通用封装
- shenyu-disruptor:shenyu对disruptor的封装。
- shenyu-dist:项目构建
- shenyu-examples:shenyu也提供了各种协议客户端(后端服务)的例子,也包括不同的数据同步机制的例子,例如eureka。也包含plugin等拓展。让我们快速上手,包括dubbo,eureka,grpc,http,https,motan,sofa,spring-cloud,springmvc,springmvc-tomcat,tars,websocket。
- shenyu-integrated-test:继承测试模块
- shenyu-loadbalancer:负载均衡模块,目前默认提供轮询,随机,hash。也可以自己扩展
- shenyu-plugin:插件扩展,shenyu的魅力之一就是提供了插件机制,方便我们扩展,各种维度的插件,和网关能搭上边的都可以
- shenyu-protocol:shenyu的协议模块,grpc,mqtt协议
- shenyu-register-center:注册中心。后面要研究的东西。用来后端的client注册,网关的client-server注册等等。
- shenyu-spi:参照dubbo的spi实现
- shenyu-spring-boot-starter:shenyu各种模块继承的spring-boot-starter
- shenyu-sync-data-center:与网关数据同步的模块封装,shenyu的网关uri,rule各种数据是动态的,运行时生效,这个模块封装了数据的同步,包括api(封装抽象的接口),consule,etcd,http,nacos,websocket,zookeeper数据同步方式
- shenyu-web:包括插件、请求路由和转发等的核心处理包
-
修改配置
修改admin
我们使用mysql数据库存储元数据,并创建一个库实例,默认会自动执行resources/sql-script/mysql下的sql初始化库以及数据
shenyu:
register:
// 我这里使用 nacos注册后端的实例(用于shenyu网关获取后端服务列表,这里直接配合我们实际使用什么样的注册中心即可)
registerType: nacos #http #zookeeper #etcd #nacos #consul
serverLists: localhost:8848 #localhost:2181 #http://localhost:2379 #localhost:8848 #http://localhost:9095
props:
sessionTimeout: 5000
connectionTimeout: 2000
checked: true
zombieCheckTimes: 5
scheduledTime: 10
nacosNameSpace: 设置你的namespace
// uri以及元数据的变化通过 websocket与shenyu的网关同步
sync:
websocket:
enabled: true
messageMaxSize: 10240
修改 网关服务的配置
网关
// 网关服务提供websocket与admin进行数据同步
shenyu:
sync:
websocket:
urls: ws://localhost:9095/websocket
spring:
// 省略一部分
cloud:
loadbalancer:
ribbon:
enabled: false
discovery:
// 这个一定要开启噢,如果使用spring-cloud(nacos也是spring-cloud一种实现)
enabled: true
nacos:
// 配置nacos
discovery:
server-addr: 127.0.0.1:8848 # Spring Cloud Alibaba Dubbo use this.
enabled: true
namespace: 设置为你的namespace
eureka:
client:
// 如果使用nacos 就关这个
enabled: false
serviceUrl:
defaultZone: http://localhost:8761/eureka/
instance:
prefer-ip-address: true
- nacos 我们直接使用当前自己所使用的服务,或者是eureka等等
- 后端业务服务配置以及使用
添加pom依赖
<dependency>
<groupId>org.apache.shenyu</groupId>
<artifactId>shenyu-spring-boot-starter-client-springcloud</artifactId>
<version>2.5.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.apache.shenyu</groupId>
<artifactId>shenyu-client-springcloud</artifactId>
<version>2.5.0-SNAPSHOT</version>
</dependency>
配置加 discovery
spring:
cloud:
// 一样开启这个 cloud
discovery:
enabled: true
shenyu:
register:
// 通过nacos注册,给shenyu拉取服务列表
registerType: nacos #zookeeper #etcd #nacos #consul
serverLists: localhost:8848 #localhost:2181 #http://localhost:2379 #localhost:8848
props:
username: admin
password: 123456
nacosNameSpace: xxx你的namespace
client:
springCloud:
props:
// 这个类似你的业务服务路径前缀
contextPath: /erha
springcloud模式通过注解到controller
@ShenyuSpringCloudClient
添加注解来将要被路由的uri注册到shenyu-admin
如上图,也可以注解到单个接口上,默认会添加一层contextPath: /erha
然后我们分别启动 shenyuAdmin,shenyuBootstrap和你的后端业务服务,包括nacos
登录页面admin/123456
Plugin
这里包含当前shenyu内置的所有plugin,是责任链模式执行噢,有一定的顺序
记得将springCloud插件开启
spring-cloud插件
插件内的规则设置
还可以设置对应插件的规则。
还有这老些功能呢,大家可以自行研究
进入到 代理,其实就是当前的网关暴露给外部,而用户端请求过来都会经过当前网关,则作为后端业务服务的proxy,我们直接来看springCloud
springCloud代理之前被注解的controller
可以看到之前被注解的controller已经全部出现在这里了
rules还可以设置一些匹配路由规则,其他的更多的使用方式以及扩展方式大家可以多尝试一下如何为自己的业务赋能。今天就到这里了。
网友评论