java生成json字符串,威力加强版

策略 1——停止挖掘

Law of Holes 是说当自己进洞就应该停止挖掘。对于单体式应用不可管理时这是最佳建议。换句话说,应该停止让单体式应用继续变大,也就是说当开发新功能时不应该为旧单体应用添加新代码,最佳方法应该是将新功能开发成独立微服务。如下图所示:

除了新服务和传统应用,还有两个模块,其一是请求路由器,负责处理入口(http)请求,有点像之前提到的 API 网关。路由器将新功能请求发送给新开发的服务,而将传统请求还发给单体式应用。

另外一个是胶水代码(glue code),将微服务和单体应用集成起来,微服务很少能独立存在,经常会访问单体应用的数据。胶水代码,可能在单体应用或者为服务或者二者兼而有之,负责数据整合。微服务通过胶水代码从单体应用中读写数据。

微服务有三种方式访问单体应用数据:

  • 换气单体应用提供的远程 API
  • 直接访问单体应用数据库
  • 自己维护一份从单体应用中同步的数据

胶水代码也被称为容灾层(anti-corruption layer),这是因为胶水代码保护微服务全新域模型免受传统单体应用域模型污染。胶水代码在这两种模型间提供翻译功能。术语 anti-corruption layer 第一次出现在 Eric Evans 撰写的必读书 Domain Driven Design,随后就被提炼为一篇白皮书。开发容灾层可能有点不是很重要,但却是避免单体式泥潭的必要部分。

将新功能以轻量级微服务方式实现由很多优点,例如可以阻止单体应用变的更加无法管理。微服务本身可以开发、部署和独立扩展。采用微服务架构会给开发者带来不同的切身感受。

然而,这方法并不解决任何单体式本身问题,为了解决单体式本身问题必须深入单体应用做出改变。我们来看看这么做的策略。

策略 2——将前端和后端分离

减小单体式应用复杂度的策略是讲表现层和业务逻辑、数据访问层分开。典型的企业应用至少有三个不同元素构成:

  1. 表现层——处理 HTTP 请求,要么响应一个 RESTAPI 请求,要么是提供一个基于 HTML 的图形接口。对于一个复杂用户接口应用,表现层经常是代码重要的部分。

  2. 业务逻辑层——完成业务逻辑的应用核心。

  3. 数据访问层——访问基础元素,例如数据库和消息代理。

在表现层与业务数据访问层之间有清晰的隔离。业务层有由若干方面组成的粗粒度(coarse-grained)的 API,内部包含了业务逻辑元素。API 是可以将单体业务分割成两个更小应用的天然边界,其中一个应用是表现层,另外一个是业务和数据访问逻辑。分割后,表现逻辑应用远程调用业务逻辑应用,下图表示迁移前后架构不同:

单体应用这么分割有两个好处,其一使得应用两部分开发、部署和扩展各自独立,特别地,允许表现层开发者在用户界面上快速选择,进行 A/B 测试;其二,使得一些远程 API 可以被微服务调用。

然而,这种策略只是部分的解决方案。很可能应用的两部分之一或者全部都是不可管理的,因此需要使用第三种策略来消除剩余的单体架构。

策略 3——抽出服务

第三种迁移策略就是从单体应用中抽取出某些模块成为独立微服务。每当抽取一个模块变成微服务,单体应用就变简单一些;一旦转换足够多的模块,单体应用本身已经不成为问题了,要么消失了,要么简单到成为一个服务。

排序那个模块应该被转成微服务

一个巨大的复杂单体应用由成十上百个模块构成,每个都是被抽取对象。决定第一个被抽取模块一般都是挑战,一般最好是从最容易抽取的模块开始,这会让开发者积累足够经验,这些经验可以为后续模块化工作带来巨大好处。

转换模块成为微服务一般很耗费时间,一般可以根据获益程度来排序,一般从经常变化模块开始会获益最大。一旦转换一个模块为微服务,就可以将其开发部署成独立模块,从而加速开发进程。

将资源消耗大户先抽取出来也是排序标准之一。例如,将内存数据库抽取出来成为一个微服务会非常有用,可以将其部署在大内存主机上。同样的,将对计算资源很敏感的算法应用抽取出来也是非常有益的,这种服务可以被部署在有很多 CPU 的主机上。通过将资源消耗模块转换成微服务,可以使得应用易于扩展。

查找现有粗粒度边界来决定哪个模块应该被抽取,也是很有益的,这使得移植工作更容易和简单。例如,只与其他应用异步同步消息的模块就是一个明显边界,可以很简单容易地将其转换为微服务。

如何抽取模块

抽取模块第一步就是定义好模块和单体应用之间粗粒度接口,由于单体应用需要微服务的数据,反之亦然,因此更像是一个双向 API。因为必须在负责依赖关系和细粒度接口模式之间做好平衡,因此开发这种 API 很有挑战性,尤其对使用域模型模式的业务逻辑层来说更具有挑战,因此经常需要改变代码来解决依赖性问题,如图所示:

一旦完成粗粒度接口,也就将此模块转换成独立微服务。为了实现,必须写代码使得单体应用和微服务之间通过使用进程间通信(IPC)机制的 API 来交换信息。如图所示迁移前后对比:

此例中,正在使用 Y 模块的 Z 模块是备选抽取模块,其元素正在被 X 模块使用,迁移第一步就是定义一套粗粒度 APIs,第一个接口应该是被 X 模块使用的内部接口,用于激活 Z 模块;第二个接口是被 Z 模块使用的外部接口,用于激活 Y 模块。

迁移第二步就是将模块转换成独立服务。内部和外部接口都使用基于 IPC 机制的代码,一般都会将 Z 模块整合成一个微服务基础框架,来出来割接过程中的问题,例如服务发现。

抽取完模块,也就可以开发、部署和扩展另外一个服务,此服务独立于单体应用和其它服务。可以从头写代码实现服务;这种情况下,将服务和单体应用整合的 API 代码成为容灾层,在两种域模型之间进行翻译工作。每抽取一个服务,就朝着微服务方向前进一步。随着时间推移,单体应用将会越来越简单,用户就可以增加更多独立的微服务。 将现有应用迁移成微服务架构的现代化应用,不应该通过从头重写代码方式实现,相反,应该通过逐步迁移的方式。有三种策略可以考虑:将新功能以微服务方式实现;将表现层与业务数据访问层分离;将现存模块抽取变成微服务。随着时间推移,微服务数量会增加,开发团队的弹性和效率将会大大增加。

最后

需要的朋友可以点击:戳这里免费领取

还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书+2021年最新大厂面试题。
试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书+2021年最新大厂面试题。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/385851.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java生成二维码读取二维码,面试真题解析

拼多多一面 首先自我介绍 参加过哪些项目 并发编程三要素? 实现可见性的方法有哪些? 多线程的价值? 创建线程的三种方式的对比? 画出线程的状态流转图 常用的并发工具类有哪些? CyclicBarrier 和 CountDownLatch 的区…

Java春招实习面试经验汇总,面试篇

Part1 SpringIOC 学习Spring最重要的无非是Spring IOC以及Spring AOP,首先咱们把Spring IOC吃透,以下内容将截图展示。 Spring IOC主要学习内容分为以下7点: ①Spring框架 ②Spring lOC容器Bean对象实例化模拟实现 ③Spring IOC容器Bean对象…

Java最新大厂面试真题总结,瞬间高大上了!

什么是分布式锁?在回答这个问题之前,我们先回答一下什么是锁。 普通的锁,即在单机多线程环境下,当多个线程需要访问同一个变量或代码片段时,被访问的变量或代码片段叫做临界区域,我们需要控制线程一个一个…

php列表框怎么用,PHP+Mysql+jQuery查询和列表框选择操作实例讲解

这篇文章主要介绍了PHPMysqljQuery查询和列表框选择操作实现过程,需要的朋友可以参考下本文讲解如何通过ajax查询mysql数据,并将返回的数据显示在待选列表中,再通过选择最终将选项加入到已选区,可以用在许多后台管理系统中。本文列…

Java未来路在何方?图文详解!

Spring Security观后感——手绘思维脑(供参考) Spring Security手绘思维脑图 手绘的思维导图,是我自己根据自身的情况读完这套阿里出品的Spring Security王者晋级文档之后所绘的,相当于是一个知识的总结与梳理,我将其分为***“核心组件”与“…

Java未来路在何方?挑战大厂重燃激情!

字节跳动一面: 自我介绍,主要讲讲做了什么和擅长什么看你项目做Spring比较多, 问一下Spring相关的东西, IoC是什么概念?Bean的默认作用范围是什么?其他的作用范围?索引是什么概念有什么作用? MySQL里主要有哪些索弓|结构?哈希索弓和B树索引比较?平常用线程主…

php如何修改文件名,php修改文件名的实现方法_后端开发

c是什么意思_后端开发C是C语言的继承,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。php修改文件名的实现方法在php中可以使用rename函数修改文…

Java架构师必备框架技能核心笔记,工作感悟

01 kafka入门 1.1 什么是kafka 1.2 kafka中的基本概念 1.2.1 消息和批次 1.2.2 主题和分区 1.2.3 生产者和消费者、偏移量、消费者群组 1.2.4 Broker和集群 1.2.5 保留消息 02 为什么选择kafka 2.1 优点 2.2 常见场景 2.2.1 活动跟踪 2.2.2 传递消息 2.2.3 收集指标和日志 2.2.…

Java架构师必备框架技能核心笔记,附相关架构及资料

技术焦虑 现在的技术圈子很火热,任何技术点,任何知识,只要你肯搜索,都能找到资料。但是现在技术圈确实有一个不好的地方,就是贩卖焦虑。这种贩卖焦虑的点并不在于形式,而是一种普遍的心态。特别是对于那种…

php智能裁剪黑边,图片裁剪去除黑边

前言从浏览器保存的图片有透明度,但是python打开其透明通道是黑色的,因此我利用python的OpenCV模块去除了其上下左右的黑边。效果展示计算机中效果python打开效果python裁剪后效果代码import cv2def change_size(read_file):image cv2.imread(read_file…

Java架构师教你如何突破瓶颈,持续更新中

1、上下文切换 上下文定义 cpu发生进程或者线程切换时,所依赖的数据集合,比如一个函数有外部变量,函数运行时,必须获取外部变量,这些变量值的集合就是上下文。 引发问题 对于CPU密集型任务,多线程处理会…

matlab dwt 多层分解,利用matlab对图片进行多层小波分解 会的加QQ511607771 加过作图之后积分加倍送...

利用matlab对图片进行多层小波分解 会的加QQ511607771 加过作图之后积分加倍送mip版 关注:96 答案:2 悬赏:0解决时间 2021-01-23 13:02已解决2021-01-23 04:23(Haar小波、Daubechies小波、Coiflets小波和Symlets小波) 三层分解下的去噪图可以直接发信息15836900853 立马上线…

Java校招面试经验汇总,最终入职阿里

一面 自我介绍项目中的监控:那个监控指标常见的有哪些?微服务涉及到的技术以及需要注意的问题有哪些?注册中心你了解了哪些?consul 的可靠性你了解吗?consul 的机制你有没有具体深入过?有没有和其他的注册…

Java校招面试经验汇总,看完直接跪服

美团技术一面20分钟 晚7点,因为想到下周一才面试,我刚准备出去打个羽毛球,北京的电话就来了。面试官各种抱歉,说开会拖延了。 1、自我介绍 说了很多遍了,很流畅捡重点介绍完。 2、问我数据结构算法好不好 挺好的&…

Java框架体系架构的知识,轻松拿下offer

算法 ⼏道常⻅的字符串算法题总结最⻓公共前缀回⽂串两数相加翻转链表链表中倒数第k个节点删除链表的倒数第N个节点合并两个排序的链表剑指offer部分编程题跳台阶问题变态跳台阶问题⼆维数组查找替换空格题⽬描述:数值的整数次⽅调整数组顺序使奇数位于偶数前⾯链表…

java开发学生管理系统,看这篇足矣了!

20道常见MySQL数据库面试题解析 事务四大特性(ACID)原子性、一致性、隔离性、持久性? 事务的并发?事务隔离级别,每个级别会引发什么问题,MySQL默认是哪个级别? MySQL常见的三种存储引擎&#…

java开发实战经典第二版百度网盘,灵魂拷问

一面(一个小时左右) 算法:写冒泡排序,问如何优化,简单讲了快排和堆排序的原理数据库:解释左连接数据库第一第二第三范式,数据库死锁linux:怎么查看内存;怎么查看进程&am…

php用户之间的数据,什么是位于用户与操作系统之间的一层数据管理软件

什么是位于用户与操作系统之间的一层数据管理软件?DBMS是位于用户与操作系统之间的一层数据管理软件。数据库管理系统(Database Management System)是一种操纵和管理数据库的大型软件,用于建立、使用和维护数据库,简称DBMS。它对数据库进行统…

java开发实战经典答案百度云,含面试题+答案

1、上下文切换 上下文定义 cpu发生进程或者线程切换时,所依赖的数据集合,比如一个函数有外部变量,函数运行时,必须获取外部变量,这些变量值的集合就是上下文。 引发问题 对于CPU密集型任务,多线程处理会…

java开发小程序好吗,看完必懂

1关于MySQL,面试官会问哪些问题? 第一个:MySQ性能优化最佳实践21个(有具体的解释)你知道哪些? 为查询缓存优化你的查询 EXPLAIN你的SELECT查询 当只要一行数据时使用LIMIT 1 为搜索字段建索引 在Join表…