《大型网站系统与Java中间件》读书笔记 (中)

简介: 前言 只有光头才能变强。 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 回顾上一篇: 《大型网站系统与Java中间件》读书笔记(一) 这周周末读了第四章,现在过来做做笔记,希望能帮助到大家。

前言

只有光头才能变强。

文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y

回顾上一篇:

这周周末读了第四章,现在过来做做笔记,希望能帮助到大家。

注:在看这篇文章之前,强烈建议先看看我之前写过的一篇SpringCloud入门文章:外行人都能看懂的SpringCloud,错过了血亏!。看完再回头看这篇文章,你会发现:这本书讲的设计与实现在SpringCloud中几乎都有对应的组件支持。

一、服务框架的设计

从上一篇我们讲到,应用拆开了以后,不同功能/模块之间的调用不再单纯通过本机调用,引入了远程的服务调用

服务拆分

而远程的服务调用这个东东会很难吗?说白了,不就是两台服务器之间通信吗?

远程的服务调用

这时候,你能想到什么?必定是Socket吧。没错,我们通过Socket肯定是可以完成两个系统之间的通信的问题的。(Socket相信大家在学习基础的时候已经写过Demo了,这我就不多BB了)

Socket完成系统之间的通信

一两个系统的Socket写起来没啥,但我们应用拆分之后,系统可是会变得很多很多。

系统会变得非常多

系统很多的情况下,我们在写远程调用代码的时候就可能要考虑到以下的问题:

  1. 我们肯定是不希望每次远程调用的时候都贴上重复的Socket代码,要是调用远程方法像调用本地方法一样简单就好了。
  2. 某个服务应用为了实现高可用,集群了(多台机器部署同一套应用)。那我远程调用的时候选择哪一台机器进行调用?
  3. 网络之间的传输协议用现成的HTTP呢?还是自定义一套通信协议呢?
  4. 因为我们想调用远程方法像调用本地方法一样,那么在网络上就需要传输Java对象,要传输Java对象,就必须得对其进行序列化和反序列化的处理。能实现序列化的操作也有很多,选择哪一种方式呢?
  5. 网络之间的通讯也有bio、nio、以及aio这几种模式,一般来说我们会选择哪种比较多?如果不了解nio的同学,可以阅读我以前写过的笔记(nio你了解多少?
  6. ….等等等

由于系统之间的调用会非常多,我们自然是不希望写重复的代码的,所以服务框架(也可以说是RPC框架)就应运而生了【说白了就是专门处理远程服务调用的框架】。有了服务框架,我们就可以实现多个系统之间以统一的方式来进行远程调用了。

一个服务框架需要考虑的问题其实远不止上面所列出的那些,比如说:

  • 服务框架与Web应用和Web容器的关系是什么?服务框架和应用是绑定在一起吗?(服务框架作为Web应用的一个依赖包),还是说服务框架只是Web应用的一个扩展(没有和Web应用打包绑定在一起)
  • 服务框架的jar包和Web应用的jar包冲突了怎么办?
  • 为了保证系统的稳定性,流量控制也应该要考虑到
  • 在远程调用的时候,需不需要以更细粒度的方式来进行选择(之前说的是选择哪台机器,但可以细粒度到机器下的接口或者方法)
  • ....等等

二、服务框架的技术实现思路

在书中给出了设计服务框架时需要考虑的问题的同时也给出了一些实现思路,我摘录一些我觉得比较有参考意义的说说。

2.1 像本地一样调用远程服务

比如服务消费方在执行orderService.buy("HHKB键盘")时,实质上调用的是远端的服务

这用到啥技术?明显就是动态代理(给女朋友讲解什么是代理模式

在实现的时候有三个基础属性可以参考一下:

  • interfaceName— 确定调用的是哪一个接口
  • version— 如果接口进行升级了,可以使用version来进行区分和隔离
  • group— 对远程服务的机器进行分组,那么调用的时候就可以选择不同的分组来调用(调用者对统一服务的调用进行隔离)

2.2 其他

  1. 当远程调用服务的时候,不需要每次都要去注册中心查找可用的地址,而是把地址缓存在调用方。当服务有变化的时候,主动告诉调用者就行了。
  2. 流量控制一般会基于两个维度去考虑:一、自身的接口和方法。二、请求的来源
  3. 并不是所有的请求都要经过服务提供者。像走缓存这样频繁的操作(而且大多数都是会成功的),直接在调用方调用就ok了

直接在调用方走缓存

最后

总的来说,书的第四章主要是在讲解在设计服务框架的时候应该要考虑到哪些方面,可以以什么方案来解决,看得还是非常过瘾的(这只是我的个人笔记,书上还有很多的内容)。强烈建议配合我之前写过的一篇SpringCloud入门文章:外行人都能看懂的SpringCloud,错过了血亏!食用。

乐于输出干货的Java技术公众号:Java3y。公众号内有200多篇原创技术文章、海量视频资源、精美脑图,关注即可获取!

觉得我的文章写得不错,点

目录
相关文章
|
6月前
|
JavaScript Java 大数据
基于JavaWeb的销售管理系统设计系统
本系统基于Java、MySQL、Spring Boot与Vue.js技术,构建高效、可扩展的销售管理平台,实现客户、订单、数据可视化等全流程自动化管理,提升企业运营效率与决策能力。
|
5月前
|
移动开发 监控 小程序
java家政平台源码,家政上门清洁系统源码,数据多端互通,可直接搭建使用
一款基于Java+SpringBoot+Vue+UniApp开发的家政上门系统,支持小程序、APP、H5、公众号多端互通。涵盖用户端、技工端与管理后台,支持多城市、服务分类、在线预约、微信支付、抢单派单、技能认证、钱包提现等功能,源码开源,可直接部署使用。
427 24
|
5月前
|
设计模式 消息中间件 传感器
Java 设计模式之观察者模式:构建松耦合的事件响应系统
观察者模式是Java中常用的行为型设计模式,用于构建松耦合的事件响应系统。当一个对象状态改变时,所有依赖它的观察者将自动收到通知并更新。该模式通过抽象耦合实现发布-订阅机制,广泛应用于GUI事件处理、消息通知、数据监控等场景,具有良好的可扩展性和维护性。
477 8
|
5月前
|
安全 前端开发 Java
使用Java编写UDP协议的简易群聊系统
通过这个基础框架,你可以进一步增加更多的功能,例如用户认证、消息格式化、更复杂的客户端界面等,来丰富你的群聊系统。
247 11
|
5月前
|
机器学习/深度学习 人工智能 自然语言处理
Java与生成式AI:构建内容生成与创意辅助系统
生成式AI正在重塑内容创作、软件开发和创意设计的方式。本文深入探讨如何在Java生态中构建支持文本、图像、代码等多种生成任务的创意辅助系统。我们将完整展示集成大型生成模型(如GPT、Stable Diffusion)、处理生成任务队列、优化生成结果以及构建企业级生成式AI应用的全流程,为Java开发者提供构建下一代创意辅助系统的完整技术方案。
337 10
|
5月前
|
人工智能 监控 Java
Java与AI智能体:构建自主决策与工具调用的智能系统
随着AI智能体技术的快速发展,构建能够自主理解任务、制定计划并执行复杂操作的智能系统已成为新的技术前沿。本文深入探讨如何在Java生态中构建具备工具调用、记忆管理和自主决策能力的AI智能体系统。我们将完整展示从智能体架构设计、工具生态系统、记忆机制到多智能体协作的全流程,为Java开发者提供构建下一代自主智能系统的完整技术方案。
776 4
|
6月前
|
NoSQL Java 关系型数据库
超全 Java 学习路线,帮你系统掌握编程的超详细 Java 学习路线
本文为超全Java学习路线,涵盖基础语法、面向对象编程、数据结构与算法、多线程、JVM原理、主流框架(如Spring Boot)、数据库(MySQL、Redis)及项目实战等内容,助力从零基础到企业级开发高手的进阶之路。
485 1
|
5月前
|
机器学习/深度学习 分布式计算 Java
Java与图神经网络:构建企业级知识图谱与智能推理系统
图神经网络(GNN)作为处理非欧几里得数据的前沿技术,正成为企业知识管理和智能推理的核心引擎。本文深入探讨如何在Java生态中构建基于GNN的知识图谱系统,涵盖从图数据建模、GNN模型集成、分布式图计算到实时推理的全流程。通过具体的代码实现和架构设计,展示如何将先进的图神经网络技术融入传统Java企业应用,为构建下一代智能决策系统提供完整解决方案。
543 0
|
6月前
|
安全 Cloud Native Java
Java 模块化系统(JPMS)技术详解与实践指南
本文档全面介绍 Java 平台模块系统(JPMS)的核心概念、架构设计和实践应用。作为 Java 9 引入的最重要特性之一,JPMS 为 Java 应用程序提供了强大的模块化支持,解决了长期存在的 JAR 地狱问题,并改善了应用的安全性和可维护性。本文将深入探讨模块声明、模块路径、访问控制、服务绑定等核心机制,帮助开发者构建更加健壮和可维护的 Java 应用。
556 0
|
7月前
|
Java 数据库 前端开发
分享44个java系统,总有一款适合您
分享44个微信小程序,总有一款适合您
142 0