前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何基于盘古开发框架开发Dubbo微服务网关

如何基于盘古开发框架开发Dubbo微服务网关

原创
作者头像
码农大熊
发布2022-05-06 13:26:46
5400
发布2022-05-06 13:26:46
举报
文章被收录于专栏:盘古开发框架

在上文《如何开发微服务应用》中,已经介绍了如何开发一个微服务应用以及微服务模块之间的互相调用。本文介绍如何将微服务发布为 HTTP 接口供前端调用。

技术实现方案

在盘古开发框架下实现将微服务发布为 HTTP 接口有两种方式。一种是基于 pangu-web 模块的接口调用模式;一种是基于 ShenYu 网关的泛化调用模式。

pangu-web 模块的接口调用模式

  • 实现原理undefined基于 Spring MVC,依赖 Servlet 容器。
  • Dubbo集成undefined依赖接口 JAR ,接口调用 Dubbo 服务。
  • 性能 & 复杂度undefined性能高,开发简单,部署运维简单。
  • 其它特性undefined支持跨域配置、流量控制、鉴权、熔断、白名单等(配置简单且与盘古开发框架浑然一体)。

ShenYu 网关的泛化调用模式

  • 实现原理undefined基于 Webflex,依赖 Netty框架。
  • Dubbo集成undefined不依赖接口 JAR,泛化调用 Dubbo 服务。
  • 性能 & 复杂度undefined网关自身性能较高(Webflex非阻塞模型),但泛化调用性能有损耗(10%~20%)。开发部署运维极其复杂,带来的成本不可小觑。
  • 其它特性undefined支持流量控制、鉴权、熔断等(配置复杂)。

上述是从不同维度简单粗暴的以定性的角度给出了一些比较,结论是孤立且脱离项目背景和业务场景的,仅供参考。采用什么样的开发模式不能一概而论,需要综合实际情况酌情选择。但对于大部分盘古开发项目而言,我们推荐整体性价比较高的方案一。当然,如果您的项目背景适合使用 ShenYu网关,我们也给出了详细的集成方案。详见:盘古开发框架集成 Apache ShenYu 网关。

编程实战一:基于 Spring MVC 开发

此种模式基于 SpringMVC 通过 Controller 调用后端 Dubbo 服务。依赖 Servlet 容器,需要引入服务接口包。对于 HTTP 接口层面的鉴权、流控等需求都需要自己用Web拦截器来实现。高可用和性能提升可通过Nginx反向代理后端多个 Web 节点实现。

安装相关盘古模块

代码语言:jsx
复制
<parent>
	<groupId>com.gitee.pulanos.pangu</groupId>
	<artifactId>pangu-parent</artifactId>
	<version>latest.version.xxx</version>
	<relativePath/>
</parent>
代码语言:jsx
复制
<dependency>
    <groupId>com.gitee.pulanos.pangu</groupId>
    <artifactId>pangu-spring-boot-starter</artifactId>
</dependency>
代码语言:jsx
复制
<dependency>
	<groupId>com.gitee.pulanos.pangu</groupId>
	<artifactId>pangu-dubbo-spring-boot-starter</artifactId>
</dependency>
代码语言:jsx
复制
<dependency>
    <groupId>com.gitee.pulanos.pangu</groupId>
    <artifactId>pangu-web-spring-boot-starter</artifactId>
</dependency>
代码语言:jsx
复制
<dependency>
    <groupId>com.gitee.pulanos.pangu</groupId>
    <artifactId>pangu-examples-dubbo-api</artifactId>
    <version>1.0.0</version>
</dependency>

本地配置

为便于理解,本文基于本地配置的方式编写。若改为标准的 Nacos 配置中心模式,请参阅:配置中心 章节。

代码语言:jsx
复制
spring.application.name=pangu-examples-webapi-dubbo-service-based
spring.jackson.time-zone=GMT+8

pangu.web.cross-origin=true

dubbo.protocol.name=dubbo
dubbo.protocol.port=-1 
dubbo.consumer.timeout=5000
dubbo.registry.address=nacos://${nacos.server-addr}?namespace=${nacos.namespace}
dubbo.consumer.check=false

logging.level.root=INFO

调用微服务接口

可以在任何一个 SpringBean 组件中(针对网关模块而言一般是 Controller 中),引入服务接口后就像本地接口调用一样调用远程服务。Dubbo 将提供高性能的基于代理的远程调用能力,服务以接口为粒度,为开发者屏蔽远程调用底层细节。

如下所示,通过 Cotroller 调用远程服务接口,实现将微服务接口发布为 WebAPI。

代码语言:jsx {2,13} title="DemoController.java"
复制
// 注入 Dubbo 服务接口
@Reference(version = "1.0.0", group = "pangu-examples-dubbo-service")
private UserService userService;

/**
 * 通过 Spring MVC 将 Duboo 微服务接口发布为 HTTP API
 * @return
 */
@RequestMapping("/case1")
public Result<List<UserOut>> case1() {
	log.info("call case1...");
	UserIn userIn = new UserIn().setUserType("1");
	List<UserOut> userOuts = userService.listUserOuts(userIn);
	return Result.success(userOuts);
}

启动入口

代码语言:jsx {1}
复制
@EnableDubbo
@SpringBootApplication
public class DubboProviderApplication {
	public static void main(String[] args) {
		PanGuApplicationBuilder.init(DubboProviderApplication.class).run(args);
	}
}

本范例源码

  • pangu-examples-dubbo-api:Dubbo 服务接口包
  • pangu-examples-dubbo-service:Dubbo 服务提供者
  • pangu-examples-webapi-dubbo-service-based:基于 SpringMVC 将 Dubbo 服务发布为 HTTP 接口

编程实战二:基于 ShenYu 网关开发

盘古开发框架下发布 Dubbo 服务为 HTTP 接口的缺省标准姿势已调整为基于 pangu-web 模块的传统接口调用模式(见上文)。基于 ShenYu 网关的开发模式已降级为一种可选方案,其文档已迁移到了博客专栏。详见:盘古开发框架集成 Apache ShenYu 网关。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 技术实现方案
    • pangu-web 模块的接口调用模式
      • ShenYu 网关的泛化调用模式
      • 编程实战一:基于 Spring MVC 开发
        • 安装相关盘古模块
          • 本地配置
            • 调用微服务接口
              • 启动入口
                • 本范例源码
                • 编程实战二:基于 ShenYu 网关开发
                相关产品与服务
                容器服务
                腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档