详解Java Chassis 3与Spring Cloud的互操作
本文分享自华为云社区《Java Chassis 3技术解密:与Spring Cloud的互操作》,作者: liubao68。
Java Chassis 3一个很重要的设计原则:利用架构的韧性设计来解决兼容性问题。
比如通过引入微服务网关,来解决不同语言、不同框架、遗留系统之间的互操作问题。 本文在这个架构原则基础上,讨论一个更加细粒度的互操作问题,并借此解密Java Chassis3在运行时设计依赖上的技术细节。
首先,我们描述一个互操作的场景和假设。
- Spring Cloud和Java Chassis应用同时注册到注册中心。引入了Spring Cloud Gateway作为网关,网关也注册到注册中心。
- Spring Cloud微服务和Java Chassis微服务相互调用。它们彼此作为消费者的时候,不需要感知对方是不同的框架,做到透明调用。
从技术原理上梳理下上述互操作需要满足的条件:
- Spring Cloud和Java Chassis需要有相互认识的注册信息。核心包括:应用名称、服务名称、地址信息和格式等。 需要的共同注册中心越少,越容易对注册中心和客户端进行选型。 在本例子中,我们选择
Service Center
或者Nacos
作为注册中心,并选择Spring Cloud Huawei实现Spring Cloud注册。 - Spring Cloud访问Java Chassis,只需要一个地址信息,依赖较少。 Java Chassis访问Spring Cloud,需要知道Spring Cloud应用提供的契约信息。
Java Chassis区别于Spring Cloud的REST调用的部分,就是契约依赖。 Spring Cloud通过FeignClient来声明客户端契约,客户端都需要在FeignClient中重复书写REST标签;Java Chassis有两种模式发现契约:从注册中心发现和从Provider实例发现。 Java Chassis3默认采用从Provider实例发现, Java Chassis2采用从注册中心发现。 从Provider发现的好处是可以降低对于注册中心元数据管理能力的要求,本例既可以采用 Service Center
作为注册中心,也可以选择 Nacos
作为注册中心。
从Provider发现,要求Provider实现如下接口:
/** * Java Chassis internal management apis. */ @Path("/scb/management") public interface ManagementEndpoint { String NAME = "scb-management"; /** * Health of this instance. If the instanceId match this instance, and this service is ready * to service return true. Otherwise, return false. * * This api is for internal instance status usage. Load balancer will call this api to check if * the target instance is alive. */ @GET @Path("/health") boolean health(@QueryParam("instanceId") String instanceId, @QueryParam("registryName") String registryName); /** * Schemas of this instance. * * This api is for internal schema loading usage. */ @POST @Path("/schema/contents") Map<String, String> schemaContents(); }
它包含一个健康检查接口和一个查询契约的接口。 当Spring Cloud应用实现上述接口以后,它就具备了Java Chassis微服务需要的基础特征,这样Java Chassis就可以像访问本框架的微服务一样访问Spring Cloud框架开发的微服务应用。 为了简化,在Spring Cloud简单实现了该接口,该实现接口从 export
目录加载契约信息,只需要将Spring Cloud需要对外暴露的 REST 接口的符合 Open API 3.0规范的契约文件放到这个目录下面 。
@RestController @RequestMapping(("/scb/management")) public class JavaChassisManagementEndpoint { private static final Logger LOGGER = LoggerFactory.getLogger(JavaChassisManagementEndpoint.class); @Autowired private Registration registration; @GetMapping(path = "/health") public boolean health(@RequestParam("instanceId") String instanceId, @RequestParam("registryName") String registryName) { return "sc-registry".equals(registryName) && registration.getInstanceId().equals(instanceId); } @PostMapping(path = "/schema/contents") public Map<String, String> schemaContents() { try { List<URI> resourceUris = ResourceUtil.findResourcesBySuffix("export", ".yaml"); Map<String, String> result = new HashMap<>(resourceUris.size()); for (URI uri : resourceUris) { String path = uri.toURL().getPath(); String[] segments = path.split("/"); if (segments.length < 2 || !"export".equals(segments[segments.length - 2])) { continue; } result.put(segments[segments.length - 1].substring(0, segments[segments.length - 1].indexOf(".yaml")), IOUtils.toString(uri, StandardCharsets.UTF_8)); } return result; } catch (IOException | URISyntaxException e) { LOGGER.error("Load schema ids failed from microservices. {}.", e.getMessage()); return Collections.emptyMap(); } } }
Java Chassis与Spring Cloud互操作的例子放到了ServiceComb Samples , 这个例子也提供了使用 Nacos 作为注册中心和配置中心的实现, 只需要将 Profile 设置为 Nacos 即可。
客户故事:在架构选型变化的时候,解决功能迁移和兼容性问题是最大的挑战。一些客户将Spring Cloud应用改造为Java Chassis的过程中,发现一些功能不支持,比如SseEmitter、WebSocket等。 如果选择支持这些能力,Java Chassis需要实现很多Servlet能力,这些能力规划会和微服务技术架构存在冲突。 对于这些场景,我们选择通过架构韧性来保留这些功能,比如将提供SseEmitter、WebSocket功能的独立出微服务,采用Spring Boot开发,这些应用可以通过调用Java Chassis微服务的REST接口来实现其特殊功能。通过这种架构韧性的理念,降低了技术持续演进的包袱,为敏捷迭代,持续创新奠定了方向,减少了兼容性问题的争论。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
武汉大学 “雷军班”今年招 30 人、培养具备计算机全栈能力的多元化人才
武汉大学公众号今日发文介绍了今年在计算机学院新开设的“雷军班”,称该班计划招收30人,旨在培养具备计算机全栈工程能力与企业家创新创业品质的领军人才。 下面是“雷军班”的核心信息: 项目背景:武汉大学为推进拔尖创新人才培养综合改革,加强高层次应用型专门人才培养,于2024年起在计算机学院开设雷军班,计划招收30名学生。 师资力量:雷军班将配备最优师资力量,实行小班教学,并提供学业导师选择。同时,聘请企业界知名创新创业导师和顶尖工程师组成导师团队,进行因材施教。 校企合作:与小米等国内头部企业开展深度合作,引入互联网思维方法论和前沿技术课程,进行高水平科研训练和工程实践。 培养模式:雷军班学生将享受灵活的培养模式,包括个性化学制选择、灵活的学分认定制度、本硕博自主定制(可100%具备保研资格)等,以及保障培养质量的准入准出流动机制。 教育资源:学生将享有丰富的教育资源,包括优先实习机会、专项经费支持参加国内外研修和学术会议,以及雷军专项奖助学金等。 目标与愿景:雷军班旨在培养未来计算机科学与技术领域的创新创业领军人才,为武汉大学计算机学院打造成国内外知名学术高地贡献力量。 原文https:...
- 下一篇
大量数据如何做分页处理
本文分享自华为云社区《应用中大量数据的分页处理》,作者:码乐。 简介 大批量数据的展示一直被视为一个必须要解决的问题。 一个经典的思想就是分批展示和处理它们。 1 查询时外键的处理 如果在django model 中模型使用了外键,通过on_delete 来定义关联操作。 CASCADE: 级联操作。如果外键那条数据删除了,这条数据也将被删除 PROTECT: 受保护,只要这条数据引用了外键的那条数据,旧不能删除外键数据,如果强行删除,Django框架将报错 SET_NULL: 设置为空,如果外键数据被删除,本条数据设置为空,前提是 可以设置本条数据为空 SET_DEFAULT: 设置默认值,如果外键数据删除了,设置这个数据的值为默认,前提是有默认值 SET()函数: 如果外键那条数据被删除,那么将会获取SET函数的值作为外键的值。Set()函数可以接受可调用对象,可调用对象的返回值作为结果设置回去。 DO_NOTHING: 不采取任何行为,一切看数据库级别的行为。 数据库层面的约束: PESTRICT: 默认选项,如果要删除父表记录,如果子表有关联记录,则不允许删除 NO...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS8编译安装MySQL8.0.19
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Red5直播服务器,属于Java语言的直播服务器
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7