Java 微服务实用指南(一)( 二 )
复制代码
@Controllerclass BankController {@Autowiredprivate HttpClient httpClient;@PostMapping("/users/register")public void register(RegistrationForm form) {validate(form);httpClient.send(riskRequest, responseHandler());setupAccount(form);// 略......}}
看到这段代码就会发现 , 现在必须部署两个 Java(微) 服务:Bank 和 RiskCheck 服务 。 最终会得到两个 jvm , 两个进程 。 之前的关系图看起来将是这样的:
文章插图
这就是开发一个 Java 微服务项目所需的全部内容:构建和部署更小的部件 (.jar 或.war 文件) 。
但这就留下了一个问题:你究竟如何切分或配置这些微服务?这些小部件是什么?多大合适?
让我们来看看现状 。
Java 微服务体系结构【Java 微服务实用指南(一)】实际上 , 公司可以通过各种方式来设计或架构微服务项目 。 具体情况取决于你是试图将一个现有的大型独体应用变成一个微服务项目 , 还是从一个全新的项目开始 。
从大型独体应用到微服务一个更有机的想法是将微服务从现有的整体中分离出来 。 请注意 , 这里的“微”实际上并不意味着提取出来的服务本身很小 , 它们本身可能仍然相当大 。
我们来看一些理论 。
想法:将一个大型独体应用拆分成微服务
将遗留项目转换为微服务 , 主要是出于以下三个原因:
- 它们通常难以维护 / 变更 / 扩展 。
- 每个人 , 都想让事情变得更简单 , 从开发人员、运维人员到管理人员 。
- 在某种程度上 , 你对你的领域有着明确的边界界定 , 也就是说:你知道你的软件应该做什么 。
- 你可以得出这样的结论:应该有一个“账户管理”微服务 , 它可以处理用户的姓名、地址、电话号码等数据 。
- 还有前面提到过的“风险模块” , 用来检查用户的风险级别 , 可以供公司的许多其他项目甚至部门使用 。
- 还有一个发票模块 , 它通过 PDF 或实际的邮件发送发票 。
虽然这种方法在在纸上和 uml 类图上呈现出来很美 , 但是它也有缺点 。 最主要的一点是 , 使用这种方法需要很强的技术能力 。 为什么呢?
因为在理解将高度耦合的帐户管理模块从你的大型独体应用中提取出来是个好主意是一回事 , 正确地去执行它是另一回事 , 两者之间存在着巨大的差异 。
大多数企业项目都到了这样一个阶段 , 即开发人员不敢将已经用了 7 年的 Hibernate 版本升级到新的版本 , 这只是更新一个类库而已 , 但也需要做大量工作以确保不会破坏任何东西 。
这些开发人员现在要深入挖掘旧的遗留代码(它们没有清晰的数据库事务边界) , 并提取定义良好的微服务?可能是吧 , 但通常是真正的挑战 , 是无法在白板或架构会议上解决的了的 。
文章插图
这是本文中第一次引用推特上 @simonbrown 的话:
我一直都说……如果你不能正确地构建大型独体应用 , 那么微服务也帮不了你 。 Simon Brown
全新项目的微服务架构开发全新的 Java 项目时 , 情况看起来有点不同 。 现在 , 这三点与之前那三点略有不同:
- 你要从头开始 , 所以没有要保留的旧包袱 。
- 开发人员希望事情在未来保持简单 。
- 问题:你对领域边界的认识还非常模糊:你不知道你的软件实际上想要做什么(提示:敏捷) 。
技术型微服务架构
对于开发人员来说 , 马上就会想到这样一种方法 , 尽管我们强烈建议不要使用它 。Hadi Hariri 在 IntelliJ 中提出了“提取微服务(Extract Microservice)”重构功能 , 这一点很是值得称道 。
文章插图
下面的例子做了极度的简化 , 但实际项目中的情况却与之非常接近 。
微服务之前
复制代码
@Serviceclass UserService {public void register(User user) {String email = user.getEmail();String username =email.substring(0, email.indexOf("@"));// ...}}
使用了一个 substring 的 Java 微服务复制代码
@Serviceclass UserService {@Autowiredprivate HttpClient client;public void register(User user) {String email = user.getEmail();// 在这里 , 通过 http 调用 substring 微服务String username =httpClient.send(substringRequest(email), responseHandler());// ...}}
- 人民币|天猫国际新增“服务大类”,知舟集团提醒入驻这些类目的要注意
- 现状|程序员现状揭秘:平均年薪20.36万,Java人才需求量最大
- 出海|出海日报丨短视频生产服务商小影科技完成近4亿元 C 轮融资;华为成为俄罗斯在线出售智能手机的第一品牌
- 成为佛山移动服务体验官 表白留言赢取百元话费
- 正确|新昌消防丨听说,这才是微信新表情的正确打开方式
- 优化|微软亚洲研究院发布开源平台“群策 MARO” 用于多智能体资源调度优化
- 手机|原来微信一键就能拼接长图,朋友圈可发送几十张照片,涨知识了
- 试试|手机内存不够用,咋办?试试关闭微信这两步操作,轻松腾出几个G
- 微信群|社区团购的前世今生
- 纳闷|英媒纳闷:安道尔这个国家微信用户高达2000万,可只有8.5万人!