盘古开发框架下实现微服务网关的缺省姿态为基于 pangu-web 模块的传统接口调用模式,具体请参考文档:如何公布微服务 (API 网关)。本文提供另外一种通过集成 Apache ShenYu 实现网关泛化调用 Dubbo 服务将其公布为 HTTP 接口的可选办法。
ShenYu 网关介绍
ShenYu 网关基于 Webflex 非阻塞模型通过泛化调用后端 Dubbo 服务。依赖 Netty 不须要 Servlet 容器,不须要引入服务接口包即可通过 Dubbo 泛化调用服务接口的形式就能够将后端 Dubbo 服务转换为 HTTP API。同时网关反对鉴权、动静限流、熔断、防火墙、灰度公布等。
相干名词解释
- shenyu-admin
网关插件和元数据信息配置管理后盾。独立 JAR,须要独自部署。 - shenyu-gateway
网关模块,代理 Http 申请,泛化调用后端 Dubbo 服务。此模块负责接管 Http 申请。 - 数据同步
数据同步是指在 ShenYu-Admin 后盾操作数据当前,应用何种策略将数据同步到 ShenYu Gateway 网关模块。ShenYu 以后反对 ZooKeeper、WebSocket、Http 长轮询、Nacos、Etcd 和 Consul 进行数据同步。盘古开发应用的是 WebSocket 形式进行数据同步。 - 插件
ShenYu 应用插件化设计思维,实现插件的热插拔。内置丰盛的插件,包含 RPC 代理、熔断和限流、权限认证、监控等等。 - 选择器
每个插件可设置多个选择器,对流量进行初步筛选。 - 规定
每个选择器可设置多个规定,对流量进行更细粒度的管制。
网关调用结构图
ShenYu 网关实战
ShenYu 网关提供的性能十分多,这里咱们只关注 HTTP 申请代理性能。即代理前端 HTTP 申请,通过 Dubbo 泛化调用后端 Dubbo 服务。
装置相干模块
-
盘古 Parent
<parent> <groupId>com.gitee.pulanos.pangu</groupId> <artifactId>pangu-parent</artifactId> <version>latest.version.xxx</version> <relativePath/> </parent>
-
根底模块
<dependency> <groupId>com.gitee.pulanos.pangu</groupId> <artifactId>pangu-spring-boot-starter</artifactId> </dependency>
-
Dubbo 模块
<dependency> <groupId>com.gitee.pulanos.pangu</groupId> <artifactId>pangu-dubbo-spring-boot-starter</artifactId> </dependency>
-
网关模块
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </dependency> <dependency> <groupId>org.apache.shenyu</groupId> <artifactId>shenyu-spring-boot-starter-gateway</artifactId> </dependency> <dependency> <groupId>org.apache.shenyu</groupId> <artifactId>shenyu-spring-boot-starter-sync-data-websocket</artifactId> </dependency> <dependency> <groupId>org.apache.shenyu</groupId> <artifactId>shenyu-spring-boot-starter-plugin-apache-dubbo</artifactId> </dependency>
基于 ShenYu 网关开发模式不须要引入 Dubbo 服务接口 Jar,网关会依据服务接口的元数据信息,泛化调用 Dubbo 服务接口。服务接口的元数据信息则依据 Dubbo 服务利用中的配置主动上传到 ShenYu 网关管理系统。此内容在下文会持续解说。
本地配置
为便于了解,本文基于本地配置的形式编写。若改为规范的 Nacos 配置核心模式,请参阅:配置核心 章节。
server:
port: 9090
spring:
main:
allow-bean-definition-overriding: true
shenyu:
cross:
enabled: true
allowedHeaders:
allowedMethods: "*"
allowedOrigin: "*"
allowedExpose: "*"
maxAge: "18000"
allowCredentials: true
switchConfig:
local: true
file:
enabled: true
maxSize : 10
sync:
websocket:
urls: ${shenyu.websocket.urls:ws://localhost:9095/websocket}
dubbo:
parameter: multi
exclude:
enabled: false
paths:
- /favicon.ico
extPlugin:
path:
enabled: true
threads: 1
scheduleTime: 300
scheduleDelay: 30
scheduler:
enabled: false
type: fixed
threads: 16
upstreamCheck:
enabled: false
timeout: 3000
healthyThreshold: 1
unhealthyThreshold: 1
interval: 5000
printEnabled: true
printInterval: 60000
要害配置项阐明
- shenyu.sync.websocket.urls
示意网关和 ShenYu Admin 之间应用 Websocket 的形式进行数据同步,这里是配置 ShenYu Admin 提供的 Websocket 数据同步服务的地址(反对集群,逗号宰割)。
上表中提到到 ShenYu Admin 是 ShenYu 网关框架的配置 & 元数据管理后盾。这里蕴含了网关模块本人的配置信息也蕴含了后盾服务接口元数据信息,这理的配置信息和元数据信息须要和网关模块同步。ShenYu 反对多种数据同步计划,Websocket 只是盘古开发选用的一种缺省计划。
调用微服务接口
基于 ShenYu 的网关开发模式既不须要引入服务接口 JAR,也不须要编写具体的调用代码。齐全由网关依据服务接口元数据进行 Dubbo 泛化调用。
网关是如何晓得 Dubbo 服务接口元数据的呢?
- 通过 ShenYu Admin 后盾零碎,『根底配置 -> 元数据管理』菜单,手工新增每一个接口的元数据,而后将数据主动同步到网关模块。(不倡议,量大的话太繁琐)
- 对 Dubbo 服务提供者减少 ShenYu Client 反对,通过在接口办法上应用注解
@ShenyuDubboClient
来主动采集上传接口元数据到 ShenYu Admin,而后将数据主动同步到网关模块。(具体实现见下文所述)
革新 Dubbo 服务端,主动上传接口元数据
对原 Dubbo 服务端做一些配置变更,使其能主动将接口元数据上传到 ShenYu Admin 后盾零碎。
装置 ShenYu Client 依赖包
<dependency>
<groupId>org.apache.shenyu</groupId>
<artifactId>shenyu-spring-boot-starter-client-apache-dubbo</artifactId>
</dependency>
减少配置项
shenyu.client.register-type=http
shenyu.client.server-lists=${shenyu.server-lists:http://localhost:9095}
shenyu.client.props.contextPath=/dubbo
- shenyu.client.register-type
服务接口元数据采集形式,可选 http 直连模式或配置核心 zookeeper、etcd、consul 和 nacos。盘古开发采集接口元数据缺省抉择 http 间接 ShenYu Admin 的形式。 - shenyu.client.server-lists
ShenYu Admin 地址或配置核心地址。集群时多个地址用逗号离开。 - shenyu.client.props.contextPath
本服务在网关中的路由前缀, 可自定义按需配置。
主动上报服务接口元数据
在 Dubbo 服务实现类的办法上应用注解 @ShenyuDubboClient
标记,示意该接口办法元数据主动上传到 ShenYu Admin。如下代码所示。
@Service(version = "1.0.0", group = "pangu-examples-dubbo-gateway-service")
public class UserServiceImpl implements UserService {
@Override
@ShenyuDubboClient(path = "/findUserEntity", desc = "查问用户信息")
public UserEntity findUserEntity(Long id) {
...
return userEntity;
}
}
配置网关泛化调用 Dubbo 服务所需的注册核心地址
通过 ShenYu Admin 后盾零碎『根底配置 -> 插件治理』菜单,启用 dubbo 插件
并填入注册核心地址。比方,我测试用的注册核心地址:nacos://169.188.88.140:1688?namespace=pangu-dev
。如下图所示。
重启服务提供者
- 进入 ShenYu Admin 后盾零碎的『根底配置 -> 元数据管理』菜单,会看到主动上报的服务元数据信息。如下图所示。
- 进入 ShenYu Admin 后盾零碎的『插件列表 -> proxy -> dubbo』菜单,会看到主动注册的选择器和规定信息。如下图所示。
启动入口
@SpringBootApplication
public class WebApiGatewayApplication {public static void main(String[] args) {PanGuApplicationBuilder.init(WebApiGatewayApplication.class).run(args);
}
}
网关申请 URL
至此,网关就能够调用 Dubbo 服务了。然而,如何确定 Dubbo 服务对应的申请 url 地址呢?
- 由网关模块配置文件可知网关利用端口是
9090
。 - Dubbo 服务的配置项 shenyu.client.props.contextPath 为
/dubbo
。 - Dubbo 办法通过 @ShenyuDubboClient 标记的 path 属性为:
/findUserEntity
。
综上,Dubbo 服务 UserService#findUserEntity 的残缺申请地址为:http://localhost:9090/dubbo/findUserEntity
。
参数阐明
通过 http 协定,post 形式拜访网关。在 http body 中传入 json 格局的参数。
申请示例
curl --location --request POST 'http://127.0.0.1:9090/dubbo/findUserEntity' \
--header 'Content-Type: application/json' \
--data '{id=1}'
{
"code": 200,
"message": "Access to success!",
"data": {
"name": "云南码农大熊",
"id": 1,
"userType": 2,
}
}
本范例源码
- pangu-examples-dubbo-api:Dubbo 服务接口包
- pangu-examples-dubbo-gateway-shenyu-service:Dubbo 服务提供者(反对接口元数据上传到网关零碎)
- pangu-examples-webapi-gateway-shenyu-based:基于 ShenYu 网关将 Dubbo 服务公布为 HTTP 接口
参考文献
- 如何开发微服务
- 如何公布微服务 (API 网关)
- 盘古开发框架简介