共计 2911 个字符,预计需要花费 8 分钟才能阅读完成。
在上文《如何开发微服务利用》中,曾经介绍了如何开发一个微服务利用以及微服务模块之间的相互调用。本文介绍如何将微服务公布为 HTTP 接口供前端调用。
技术实现计划
在盘古开发框架下实现将微服务公布为 HTTP 接口有两种形式。一种是基于 pangu-web 模块的接口调用模式;一种是基于 ShenYu 网关的泛化调用模式。
pangu-web 模块的接口调用模式
- 实现原理
基于 Spring MVC,依赖 Servlet 容器。 - Dubbo 集成
依赖接口 JAR,接口调用 Dubbo 服务。 - 性能 & 复杂度
性能高,开发简略,部署运维简略。 - 其它个性
反对跨域配置、流量管制、鉴权、熔断、白名单等(配置简略且与盘古开发框架浑然一体)。
ShenYu 网关的泛化调用模式
- 实现原理
基于 Webflex,依赖 Netty 框架。 - Dubbo 集成
不依赖接口 JAR,泛化调用 Dubbo 服务。 - 性能 & 复杂度
网关本身性能较高(Webflex 非阻塞模型),但泛化调用性能有损耗(10%~20%)。开发部署运维极其简单,带来的老本不可小觑。 - 其它个性
反对流量管制、鉴权、熔断等(配置简单)。
上述是从不同维度简略粗犷的以定性的角度给出了一些比拟,论断是孤立且脱离我的项目背景和业务场景的,仅供参考。采纳什么样的开发模式不能一概而论,须要综合理论状况酌情抉择。但对于大部分盘古开发我的项目而言,咱们举荐整体性价比较高的计划一。当然,如果您的我的项目背景适宜应用 ShenYu 网关,咱们也给出了具体的集成计划。详见:盘古开发框架集成 Apache ShenYu 网关。
编程实战一:基于 Spring MVC 开发
此种模式基于 SpringMVC 通过 Controller 调用后端 Dubbo 服务。依赖 Servlet 容器,须要引入服务接口包。对于 HTTP 接口层面的鉴权、流控等需要都须要本人用 Web 拦截器来实现。高可用和性能晋升可通过 Nginx 反向代理后端多个 Web 节点实现。
装置相干盘古模块
<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>
<dependency>
<groupId>com.gitee.pulanos.pangu</groupId>
<artifactId>pangu-dubbo-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.gitee.pulanos.pangu</groupId>
<artifactId>pangu-web-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.gitee.pulanos.pangu</groupId>
<artifactId>pangu-examples-dubbo-api</artifactId>
<version>1.0.0</version>
</dependency>
本地配置
为便于了解,本文基于本地配置的形式编写。若改为规范的 Nacos 配置核心模式,请参阅:配置核心 章节。
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。
// 注入 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);
}
启动入口
@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 网关。
下一步
持续浏览其它章节获取你想要的答案或通过咱们的 开发者社区 寻求更多帮忙。
参考文献
- 如何开发微服务
- 如何公布微服务 (API 网关)
- 盘古开发框架集成 Apache ShenYu 网关