ToB企服应用市场:ToB评测及商务社交产业平台

标题: 详解Java Chassis 3与Spring Cloud的互操作 [打印本页]

作者: 笑看天下无敌手    时间: 2024-5-16 21:25
标题: 详解Java Chassis 3与Spring Cloud的互操作
本文分享自华为云社区《Java Chassis 3技术解密:与Spring Cloud的互操作》,作者: liubao68。
Java Chassis 3一个很重要的设计原则:利用架构的韧性设计来解决兼容性问题。

比如通过引入微服务网关,来解决不同语言、不同框架、遗留系统之间的互操作问题。 本文在这个架构原则基础上,讨论一个更加细粒度的互操作问题,并借此解密Java Chassis3在运行时设计依赖上的技术细节。
首先,我们形貌一个互操作的场景和假设。

从技术原理上梳理下上述互操作需要满足的条件:
Java Chassis区别于Spring Cloud的REST调用的部分,就是左券依赖。 Spring Cloud通过FeignClient来声明客户端左券,客户端都需要在FeignClient中重复誊写REST标签;Java Chassis有两种模式发现左券:从注册中央发现和从Provider实例发现。 Java Chassis3默认采用从Provider实例发现, Java Chassis2采用从注册中央发现。 从Provider发现的利益是可以降低对于注册中央元数据管理能力的要求,本例既可以采用 Service Center 作为注册中央,也可以选择 Nacos 作为注册中央。
从Provider发现,要求Provider实现如下接口:
  1. /**
  2. * Java Chassis internal management apis.
  3. */
  4. @Path("/scb/management")
  5. public interface ManagementEndpoint {
  6.   String NAME = "scb-management";
  7.   /**
  8.    * Health of this instance. If the instanceId match this instance, and this service is ready
  9.    * to service return true. Otherwise, return false.
  10.    *
  11.    * This api is for internal instance status usage. Load balancer will call this api to check if
  12.    * the target instance is alive.
  13.    */
  14.   @GET
  15.   @Path("/health")
  16.   boolean health(@QueryParam("instanceId") String instanceId, @QueryParam("registryName") String registryName);
  17.   /**
  18.    * Schemas of this instance.
  19.    *
  20.    * This api is for internal schema loading usage.
  21.    */
  22.   @POST
  23.   @Path("/schema/contents")
  24.   Map<String, String> schemaContents();
  25. }
复制代码
它包含一个健康检查接口和一个查询左券的接口。 当Spring Cloud应用实现上述接口以后,它就具备了Java Chassis微服务需要的基础特征,这样Java Chassis就可以像访问本框架的微服务一样访问Spring Cloud框架开发的微服务应用。 为了简化,在Spring Cloud简朴素现了该接口,该实现接口从 export 目次加载左券信息,只需要将Spring Cloud需要对外暴露的 REST 接口的符合 Open API 3.0规范的左券文件放到这个目次下面 。
  1. @RestController
  2. @RequestMapping(("/scb/management"))
  3. public class JavaChassisManagementEndpoint {
  4.   private static final Logger LOGGER = LoggerFactory.getLogger(JavaChassisManagementEndpoint.class);
  5.   @Autowired
  6.   private Registration registration;
  7.   @GetMapping(path = "/health")
  8.   public boolean health(@RequestParam("instanceId") String instanceId,
  9.       @RequestParam("registryName") String registryName) {
  10.     return "sc-registry".equals(registryName) && registration.getInstanceId().equals(instanceId);
  11.   }
  12.   @PostMapping(path = "/schema/contents")
  13.   public Map<String, String> schemaContents() {
  14.     try {
  15.       List<URI> resourceUris = ResourceUtil.findResourcesBySuffix("export", ".yaml");
  16.       Map<String, String> result = new HashMap<>(resourceUris.size());
  17.       for (URI uri : resourceUris) {
  18.         String path = uri.toURL().getPath();
  19.         String[] segments = path.split("/");
  20.         if (segments.length < 2 || !"export".equals(segments[segments.length - 2])) {
  21.           continue;
  22.         }
  23.         result.put(segments[segments.length - 1].substring(0, segments[segments.length - 1].indexOf(".yaml")),
  24.             IOUtils.toString(uri, StandardCharsets.UTF_8));
  25.       }
  26.       return result;
  27.     } catch (IOException | URISyntaxException e) {
  28.       LOGGER.error("Load schema ids failed from microservices. {}.", e.getMessage());
  29.       return Collections.emptyMap();
  30.     }
  31.   }
  32. }
复制代码
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接口来实现其特殊功能。通过这种架构韧性的理念,降低了技术持续演进的包袱,为敏捷迭代,持续创新奠定了方向,减少了兼容性问题的争论。
 
点击关注,第一时间相识华为云新鲜技术~
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4