- VisualStudio2022插件的安装及使用-编程手把手系列文章
- pprof-在现网场景怎么用
- C#实现的下拉多选框,下拉多选树,多级节点
- 【学习笔记】基础数据结构:猫树
本文分享自华为云社区《Java Chassis 3技术解密:与Spring Cloud的互操作》,作者: liubao68.
Java Chassis 3一个很重要的设计原则:利用架构的韧性设计来解决兼容性问题.
比如通过引入微服务网关,来解决不同语言、不同框架、遗留系统之间的互操作问题。 本文在这个架构原则基础上,讨论一个更加细粒度的互操作问题,并借此解密Java Chassis3在运行时设计依赖上的技术细节.
首先,我们描述一个互操作的场景和假设.
从技术原理上梳理下上述互操作需要满足的条件:
Service Center
或者 Nacos
作为注册中心,并选择Spring Cloud Huawei实现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接口来实现其特殊功能。通过这种架构韧性的理念,降低了技术持续演进的包袱,为敏捷迭代,持续创新奠定了方向,减少了兼容性问题的争论.
。
点击关注,第一时间了解华为云新鲜技术~ 。
。
最后此篇关于详解JavaChassis3与SpringCloud的互操作的文章就讲到这里了,如果你想了解更多关于详解JavaChassis3与SpringCloud的互操作的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
全称“Java Virtual Machine statistics monitoring tool”(statistics 统计;monitoring 监控;tool 工具) 用于监控虚拟机的各种运
主要是讲下Mongodb的索引的查看、创建、删除、类型说明,还有就是Explain执行计划的解释说明。 可以转载,但请注明出处。  
1>单线程或者单进程 相当于短链接,当accept之后,就开始数据的接收和数据的发送,不接受新的连接,即一个server,一个client 不存在并发。 2>循环服务器和并发服务器
详解 linux中的关机和重启命令 一 shutdown命令 shutdown [选项] 时间 选项: ?
首先,将json串转为一个JObject对象: ? 1
matplotlib官网 matplotlib库默认英文字体 添加黑体(‘SimHei')为绘图字体 代码: plt.rcParams['font.sans-serif']=['SimHei'
在并发编程中,synchronized关键字是常出现的角色。之前我们都称呼synchronized关键字为重量锁,但是在jdk1.6中对synchronized进行了优化,引入了偏向锁、轻量锁。本篇
一般我们的项目中会使用1到2个数据库连接配置,同程艺龙的数据库连接配置被收拢到统一的配置中心,由DBA统一配置和维护,业务方通过某个字符串配置拿到的是Connection对象。  
实例如下: ? 1
1. MemoryCahe NetCore中的缓存和System.Runtime.Caching很相似,但是在功能上做了增强,缓存的key支持object类型;提供了泛型支持;可以读缓存和单个缓存
argument是javascript中函数的一个特殊参数,例如下文,利用argument访问函数参数,判断函数是否执行 复制代码 代码如下: <script
一不小心装了一个Redis服务,开了一个全网的默认端口,一开始以为这台服务器没有公网ip,结果发现之后悔之莫及啊 某天发现cpu load高的出奇,发现一个minerd进程 占了大量cpu,googl
今天写这个是为了 提醒自己 编程过程 不仅要有逻辑 思想 还有要规范 代码 这样可读性 1、PHP 编程规范与编码习惯最主要的有以下几点: 1 文件说明 2 funct
摘要:虚拟机安装时一般都采用最小化安装,默认没有lspci工具。一台测试虚拟网卡性能的虚拟机,需要lspci工具来查看网卡的类型。本文描述了在一个虚拟机中安装lspci工具的具体步骤。 由于要测试
1、修改用户进程可打开文件数限制 在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统
目录 算术运算符 基本四则运算符 增量赋值运算符 自增/自减运算符 关系运算符 逻
如下所示: ? 1
MapperScannerConfigurer之sqlSessionFactory注入方式讲解 首先,Mybatis中的有一段配置非常方便,省去我们去写DaoImpl(Dao层实现类)的时间,这个
Linux的网络虚拟化是LXC项目中的一个子项目,LXC包括文件系统虚拟化,进程空间虚拟化,用户虚拟化,网络虚拟化,等等,这里使用LXC的网络虚拟化来模拟多个网络环境。 本文从基本的网络设备讲
? 1
我是一名优秀的程序员,十分优秀!