MarcoBehler 策划
田晓旭 本文将为大家介绍什么是Java微服务,了解Java微服务的体系架构,以及如何设计、开发、部署和测试Java微服务。 1Java微服务:基础
要真正理解Java微服务,就必须从最基本的东西开始:为人诟病的Java大型单体应用是什么,它的优点和缺点是什么。
什么是Java大型单体应用?假设你正在为一家银行或一家金融科技初创公司工作。你为用户提供一款可以用它来开设新的银行账户的移动应用程序。
如果用Java代码来写,实现一个简化版的控制器类如下所示:
ControllerclassBankController{PostMapping("/users/register")publicvoidregister(RegistrationFormform){validate(form);riskCheck(form);openBankAccount(form);//略……}}这段代码要:
验证注册表单。
对用户的地址进行风险检查,以决定是否可以给他一个银行帐户。
打开这个银行账户
部署的时候,你会将BankController类与所有其他源代码一起打包到bank.jar或bank.war中:在远古时期,这个庞然大物还是不错的,它包含你的银行系统运行所需的所有代码。(粗略估算,一开始你的jar或war文件的大小会在1-MB范围之内。)
然后在服务器上运行.jar文件——这就是部署Java应用程序所需要做的全部工作。
Java大型单体应用存在什么问题?本质上,Java大型单体应用没有什么问题。但通过以往的项目经验,我们可以明显发现,如果你让许多不同的程序员/团队/顾问面临着高压和不明确需求,围绕同一款大型单体应用工作好几年,那么你那个小小的bank.jar文件就会变成一只巨大的、有千兆字节的代码怪物,每个人都不敢部署它。
如何让Java大型单体应用变得更小?这自然就引出了如何缩小大型单体应用的问题。现在,你的bank.jar是在一个JVM中运行的,一台服务器上运行一个进程。
这时,你可能会产生一个想法:风险检查服务是公司其他部门使用的,我的这款银行应用与它没什么关系,不妨把它分离出去,将它作为自己的产品去部署,作为单独的进程来运行。
什么是Java微服务?实际上,这意味着你不需要在你的BankController中调用riskCheck()方法,而是将该方法或bean及其所有辅助类移动到它自己的Maven/Gradle项目中,对其进行源代码配置管理,并将其独立部署,不依赖于你的银行系统。
整个提取过程本身会不会使你新的RiskCheck模块成为微服务呢?大家对微服务定义有着不同的解释:
如果它里面只有5-7个类,那么算不算微?
或者0个类仍然算是微吗?
微服务和类的数量有什么关系吗?
我们不去钻理论上的牛角尖,而是