如何统一服务调用框架?

转载本文需注明出处:微信公众号EAWorld,违者必究。

引言:

目前在Java 微服务领域Spring Cloud 和Dubbo体系都被广泛使用。不同的用户会根据项目的需要选择合适的架构。但是在有些跨系统的场景下会涉及到两种体系间的混合调用。怎么做到较小修改就支持Spring Cloud和Dubbo两种体系的混合调用?本文将介绍一下我们在较小修改情况下统一Spring CLoud和Dubbo服务调用框架。

目前Spring Cloud和Dubbo体系发展都比较成熟,不少客户已有一些采用它们开发的系统。好的微服务开发平台需要支持这两种体系。统一开发体验和降低开发复杂度的同时,保留两种体系各自的优势。

现有企业IT架构

服务调用场景

IT企业根据不同系统有不同的现状和技术发展路线。针对新系统,采用优先常用的Spring Coud应用调用Spring Cloud应用或Dubbo应用调用Dubbo应用。

但是针对已有系统进行架构调整改造,即如有系统A是Spring Cloud体系,想新增或者改造一些服务为Dubbo形式,反之亦然,就会出现2、4的混合服务调用场景,这类场景主要是通过兼容来保证平滑升级过度。

基于使用场景推论,原有系统可能是Spring Cloud或者是Dubbo,所以服务注册中心需要支持Eureka和Zookeeper,调用协议需要支持Http(Restful)或RPC协议。

运行逻辑可以拆分以下几段:

  1. 服务提供方可以根据配置项,将具体服务对外提供为Spring Cloud(Restful)和Dubbo(RPC)协议服务
  2. 服务提供方根据提供的服务协议类型,转换为对应的服务契约,注册到Eureka和Zookeeper
  3. 服务消费方从Eureka和Zookeeper中获取服务注册信息,根据服务契约解析
  4. 服务消费方根据配置项、获取的服务契约,调用服务提供方的服务
  • 采用统一声明式调用方式使得开发人员比较容易开发应用,调用实现通过服务类型区分,分别采用Feign,Dubbo采用自带实现,这样可以有效支持已有系统调用,降低学习成本。
  • 独立注解可以统一规范开发,控制平台调用规则处理需要提供和消费的接口。
  • 服务类型控制应用是服务提供方还是服务消费方,可以在同一应用中支持服务双体系和消费双体系。
  • 灵活配置的服务体系规则,便于根据需要调整服务体系,如应用总体为Spring Cloud,新增提供和消费服务都是Dubbo,可以在原有的配置中,增加这些新服务为Dubbo体系规则即可。

定义期决定运行的过程

服务类型是针对具体的服务提供类型为Spring Cloud(Restful)服务还是Dubbo(RPC)服务,提供对应的服务契约(完整的服务描述Swagger)。

注册中心类型就是基于启动依赖和配置项,决定连接的注册中心具体为Eureka还是Zookeeper,提供对应的服务发布格式(注册中心存储的服务格式)。

服务类型决定应用、包、接口类型定义的优先级依次递增,即如果都有配置时,以接口配置为准。服务类型的切换,可以通过配置文件的修改调整,无需调整代码。

服务提供和服务调用的关键逻辑:

1. 根据配置,扫描EOSService接口。

2. 判断服务提供类型,包含多层级优先级判断,确定服务提供类型。

a ) Dubbo类型:仿照Dubbo本身服务发布的形式,注册Dubbo bean实例

b ) Spring Cloud类型:根据约定发布对应Restful服务(因为为方便开发采用声明式调用,所以需要平台约定如url、type等规则)

3. 判断服务调用类型,包含多层级优先级判断,确定服务调用方式。

a ) Dubbo类型:仿照Dubbo本身服务发布的形式,注册Dubbo bean实例

b ) Spring Cloud类型:根据约定注册Feign bean。调用时,通过Feign调用服务。

注册中心根据如上依赖项决定,启动bean加载不同。

不同的注册中心保留的服务发布时机和格式有不同。同体系的注册中心因为需要对接已有系统,所以服务发布格式都延用同体系内容,如Spring Cloud服务发布到Eureka,和Dubbo服务发布到Zookeeper中的服务格式同原有系统其他服务,不做特殊处理。

服务发布和服务获取的关键逻辑:

1. 根据依赖项,启动不同注册中心初始化过程。

2. 判断注册中心类型,替换服务注册实例。

a ) Zookeeper类型:启动Zookeeper注册和监听实例,根据服务提供类型,组织服务发布格式到Zookeeper节点(具体格式后面有示例)。

b ) Eureka类型:Spring Cloud同原有,Dubbo服务通过异步扫描,放置到对应的扩展属性。

3. 判断注册中心类型,替换服务实例获取方式。

a ) Zookeeper类型:启动Zookeeper注册和监听实例,根据服务提供类型,从 Zookeeper节点获取并解析服务格式(具体格式后面有示例)。

b ) Eureka类型:Spring Cloud同原有,Dubbo服务通过监听Eureka 扩展属性。

Spring Cloud服务的发布格式在Zookeeper中存储如上图,在Zookeeper中新增/spring-cloud-service目录,记录Spring Cloud服务访问所需要的要素。

<metadata>
<providers>
["dubbo://172.20.10.7:20882/com.primeton.eos.demo.sdk.server.core.api.DubboService?anyhost=true&application=provider&bean.name=ServiceBean:dubboServiceController:com.primeton.eos.demo.sdk.server.core.api.DubboService&default.deprecated=false&default.dynamic=false&default.register=true&default.timeout=1000&deprecated=false&dubbo=2.0.2&dynamic=false&generic=false&interface=com.primeton.eos.demo.sdk.server.core.api.DubboService&methods=addUserPost,addUser&pid=46073&register=true&release=2.7.1&side=provider&timestamp=1573006719825"]
</providers>
<management.port>9002</management.port>
<jmx.port>61441</jmx.port>
</metadata>

Dubbo服务的发布格式在Eureka中存储如上图,将完整的Dubbo服务所需要的要素全部存储到metadata中。

开发使用示例

关键时序处理链路示例实际运行过程,根据服务的具体配置项和注册中心有相应的差异。

【小结】统一调用框架就是怎么支持各种混合服务调用的场景,又能统一一种开发体验,根据需要灵活调整实际服务类型。框架解决的问题是开发期统一简单,运行期灵活多变,保证服务稳定。实现时需要约束服务类型规则和注册中心依赖形式,同时定义配套提供和调用规则。如定义Spring Cloud的服务地址规则。

【后记】在方案实现中遇到以下几类问题:

因具体问题与Spring Cloud、Dubbo和第三方具体jar版本有关,只能具体问题具体解决。

  • Jar版本冲突一般采用调整或锁定jar版本。
  • Bean冲突一般修改Bean的配置或者名称。
  • 配置项冲突需要自定义配置项处理过程,通过参数或启动脚本设置。
Image placeholder
maen693
未设置
  24人点赞

没有讨论,发表一下自己的看法吧

推荐文章
Beego:简约 & 强大并存的 Go 应用框架

引言:Beego是一个快速开发Go应用的HTTP框架,他可以用来快速开发API、Web及后端服务等各种应用,是一个RESTful的框架,主要设计灵感来源于tornado、sinatra和flask这三

vuetify是什么框架?

Vuetify是一个基于vue2.0,为移动而生的组件框架,一个渐进式的UI框架;旨在提供整洁、语义化和可重用的组件,使得构建应用程序更方便。Vuetify核心是为了提供各种可重复使用的,即插即用并且

react native是什么框架?

ReactNative使用Javascript语言,类似于HTML的JSX,以及CSS来开发移动应用,因此熟悉Web前端开发的技术人员只需很少的学习就可以进入移动应用开发领域。ReactNative使

有哪些常用jQuery UI框架?

jqueryUI框架1、国产jQueryUI框架(jUI)DWZDWZ富客户端框架(jQueryRIAframework),是中国人自己开发的基于jQuery实现的AjaxRIA开源框架.设计目标是简

layui是啥框架?

课程推荐:前端开发工程师--学习猿地精品课程 layui(谐音:类UI)是一款采用自身模块规范编写的前端UI框架,遵循原生HTML/CSS/JS的书写与组织形式,门槛极低,拿来即用。其外在极简,却又不

宜信微服务任务调度平台建设实践|分享实录

导读:如今,无论是互联网应用还是企业级应用,都充斥着大量的批处理任务,常常需要一些任务调度系统帮助我们解决问题。随着微服务化架构的逐步演进,单体架构逐渐演变为分布式、微服务架构。内容来源:宜信技术学院

宜信开源|微服务任务调度平台SIA-TASK入手实践

引言最近宜信开源微服务任务调度平台SIA-TASK,SIA-TASK属于分布式的任务调度平台,使用起来简单方便,非常容易入手,部署搭建好SIA-TASK任务调度平台之后,编写TASK后配置JOB进行调

一个简单的基于 Redis 的分布式任务调度器 —— Java 语言实现

折腾了一周的JavaQuartz集群任务调度,很遗憾没能搞定,网上的相关文章也少得可怜,在多节点(多进程)环境下Quartz似乎无法动态增减任务,恼火。无奈之下自己撸了一个简单的任务调度器,结果只花了

Peloton:优步开源的统一资源调度器

Peloton最初是在2018年11月份引入的,并在2019年3月份正式开源。Peloton是为像优步这样拥有数百万个容器和数万个节点的规模公司设计的,它提供了高级的资源管理特性,比如弹性资源共享、层

去哪儿网React Native 优先的多端统一化方案

课程推荐:前端开发工程师--学习猿地精品课程 一、方案背景长期以来APP、H5、小程序等各个端的定位和发展历程都不一样,各端技术栈差异性也较大,基于成本和效率考虑并不追求各端一致性,结果就是各端真的就

一文看懂web服务器、应用服务器、web容器、反向代理服务器区别与联系

课程推荐《web全栈开发就业班--拿到offer再缴学费--融职教育》 1.1.Web服务器概念与基本原理 1.1.1.Web服务器的历史1989年,互联网之父Berners-Lee向其雇主CERN提

js框架与css框架的区别?

js框架与css框架的区别?一、JavaScript框架●Javascript框架是指以Javascript语言为基础搭建的编程框架。●Javascript框架就是将常用的方法进行封装,方便调取使用。

如何调用不同css样式?

1、根据不同分辨率来调用不同css样式可以使用@media查询来根据不同分辨率调用不同css样式。使用@media查询,你可以针对不同的媒体类型定义不同的样式。@media可以针对不同的屏幕尺寸设置不

asp.net如何调用css

asp.net如何调用css1、静态方式调用在head标签中加入link标签2、引用了模板页的页面添加方式首先可以定义一个类:(相关课程推荐:css视频教程)staticpublicclassAddS

如何调用jquery?

如何调用jquery?调用jquery首先需要引入jquery文件,有两种方式引入,一种是本地引入,另一种是使用cdn引入。jquery是结构化的开源js文件,按照js文件引用方式使用。1、可以到jQ

微服务架构中如何构建一个数据报告服务?

场景描述在微服务架构中,每个微服务负责自己的数据库,微服务A是不允许直接连接微服务B的数据库进行操作的。现在有2个微服务,一个是订单服务,一个是用户服务。有一个数据报告的需求:生成一份包含用户信息的订

🚀 Hyperf 发布 v1.1.8 版本 | 企业级的 PHP 微服务云原生协程框架

更新内容 新增 #965新增RedisLua模块,用于管理Lua脚本; #1023hyperf/metric组件的Prometheus驱动新增CUSTOM_MODE模式; 修复 #1013修复Js

🚀 Hyperf 发布 v1.1.9 版本 | 企业级的 PHP 微服务云原生协程框架

更新内容 本周更新主要为DI组件新增了懒加载功能,配置为懒加载后,注入的对象为一个代理对象,在使用到时,才会实现对象的初始化。以及为DIContainer增加了set和define方法来动态的增加对象

🚀 Hyperf 发布 v1.1.9 版本 | 企业级的 PHP 微服务云原生协程框架

更新内容本周更新主要为DI组件新增了懒加载功能,配置为懒加载后,注入的对象为一个代理对象,在使用到时,才会实现对象的初始化。以及为DIContainer增加了set和define方法来动态的增加对象管

Hyperf 框架创建 JSON-rpc 服务

我们创建一个User服务供其他服务调用以实现认证和鉴权。创建文件UserService.phpcheckToken方法接收两个参数,一个token,一个permission,首先验证token获得us

美团大规模微服务通信框架及治理体系OCTO核心组件开源

微服务通信框架及治理平台OCTO作为美团基础架构设施的重要组成部分,目前已广泛应用于公司技术线,稳定承载上万应用、日均支撑千亿级的调用。业务基于OCTO提供的标准化技术方案,能够轻松实现服务注册/发现

一文读懂云原生 go-zero 微服务框架

课程推荐:GO开发工程师--学习猿地精品课程 go-zero介绍从今年8月7日github开源以来,已经获得了2700+star的go-zero是一个集成了各种工程实践的web和rpc框架。通过弹性设

用于构建API和微服务的流行JavaScript框架

课程推荐:Java开发工程师--学习猿地精品课程 近年来,随着jQuery、JSON(JavaScript的对象表示法)、MongoDB、ES6Generators的广泛使用,JavaScript发展

使用 *args 和 **kwargs 来调用函数

使用*args和**kwargs来调用函数 那现在我们将看到怎样使用*args和**kwargs来调用一个函数。假设,你有这样一个小函数: deftest_args_kwargs(arg1,arg2,

Python 使用 CTypes调用 C 方法

CTypes Python中的ctypes模块可能是Python调用C方法中最简单的一种。ctypes模块提供了和C语言兼容的数据类型和函数来加载dll文件,因此在调用时不需对源文件做任何的修改。也正