架构师课程笔记day02——单体应用构建过程

企业级AI多Agent架构:告别单体LLM,构建可演进的专家系统 在大模型应用落地中,'单体Agent'因认知负荷超限、语义冲突、调试困难与安全不可控等根本缺陷,难以支撑高并发、多角色、强合规的企业场景。基于信息论与零信任原则,多Agent系统通过职责分离、状态隔离与中间件强制鉴权,将复杂性转化为可维护性。本文聚焦子Agent边界定义、Orchestrator意图路由、ACL动态权限控制等核心实践,结合Deep Analysis、Metric Innovation、Exploration等典型专家角色,提供经生产验证的模块化架构方案,适用于金融、零售、SaaS等需高可靠A 阅读详情

技术选型所需考虑

技术选型-后端

技术选型-前端

 开发模式

项目构建工具

 聚合工程中父子模块之间的关系

 1.创建maven project 以及子module

 2.如下分别是在上面的project上创建 module  然后 pojo 依赖 common mapper依赖pojo

service依赖mapper api依赖service 因为依赖可以传递 所以api可以调用 common module中的

代码  然后执行maven install 部署到本地

 

 

2.事务的传播

敲代码前了解下 springboot中对事务传播的控制的一些关键字

比如面试题 在一个单体应用中:

存在 A方法, A方法中又先后调用了B,C方法

1.如果想要C方法异常时 B方法回滚 A方法中其它代码不回滚 

2.C方法异常 A,B方法都不回滚

3.C方法异常时 A,B方法都回滚

要分别使用以上图中哪些注解(这个问题再复习时要能答出来)

3.使用 swagger2 管理API

1.加个类

package com.imooc.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@Configuration
@EnableSwagger2
public class Swagger2 {

//    http://localhost:8088/swagger-ui.html     原路径
//    http://localhost:8088/doc.html     原路径

    // 配置swagger2核心配置 docket
    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)  // 指定api类型为swagger2
                    .apiInfo(apiInfo())                 // 用于定义api文档汇总信息
                    .select()
                    .apis(RequestHandlerSelectors
                            .basePackage("com.imooc.controller"))   // 指定controller包
                    .paths(PathSelectors.any())         // 所有controller
                    .build();
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("天天吃货 电商平台接口api")        // 文档页标题
                .contact(new Contact("imooc",
                        "https://www.imooc.com",
                        "abc@imooc.com"))        // 联系人信息
                .description("专为天天吃货提供的api文档")  // 详细信息
                .version("1.0.1")   // 文档版本号
                .termsOfServiceUrl("https://www.imooc.com") // 网站地址
                .build();
    }

}

 2.加几个依赖

        <!-- swagger2 配置 -->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.4.0</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.4.0</version>
        </dependency>
        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>swagger-bootstrap-ui</artifactId>
            <version>1.6</version>
        </dependency>

3.访问

http://localhost:8088/doc.html

4.添加corsConfig 来允许某些跨域 或者拦截非法访问

package com.imooc.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;

@Configuration
public class CorsConfig {

    public CorsConfig() {
    }

    @Bean
    public CorsFilter corsFilter() {
        // 1. 添加cors配置信息
        CorsConfiguration config = new CorsConfiguration();
        config.addAllowedOrigin("http://localhost:8080");
        config.addAllowedOrigin("http://shop.z.mukewang.com:8080");
        config.addAllowedOrigin("http://center.z.mukewang.com:8080");
        config.addAllowedOrigin("http://shop.z.mukewang.com");
        config.addAllowedOrigin("http://center.z.mukewang.com");
        config.addAllowedOrigin("*");

        // 设置是否发送cookie信息
        config.setAllowCredentials(true);

        // 设置允许请求的方式
        config.addAllowedMethod("*");

        // 设置允许的header
        config.addAllowedHeader("*");

        // 2. 为url添加映射路径
        UrlBasedCorsConfigurationSource corsSource = new UrlBasedCorsConfigurationSource();
        corsSource.registerCorsConfiguration("/**", config);

        // 3. 返回重新定义好的corsSource
        return new CorsFilter(corsSource);
    }

}

5.cookie 与 session

cookie就是浏览器级别的 缓存 有默认过期时间 的键值对

session 就是会话级别的 存在服务器的 键值对  浏览器获取时会 通过新增一个 jsessionid为key的键值对保存在浏览器端

 详细见下图:

6.最快的连接池Hikari

一般最大最小连接数默认就好(10 10) 最大连接数不是越大越好

  4核或者往上最大连接数再整20 

spring:
  datasource: # 数据源的相关配置
      type: com.zaxxer.hikari.HikariDataSource # 数据源类型:HikariCP
      driver-class-name: com.mysql.jdbc.Driver # mysql驱动
      url: jdbc:mysql://49.235.78.53/foodie?useUnicode=true&useSSL=false&characterEncoding=UTF-8&autoReconnect
      username: root
      password: root

  hikari:
    connection-timeout: 30000 # 等待连接池分配连接的最大时长(毫秒),超过这个时长还没可用的连接则发生SQ
    minimum-idle: 5 # 最小连接数
    maximum-pool-size: 20 # 最大连接数
    auto-commit: true # 自动提交
    idle-timeout: 600000 # 连接超时的最大时长(毫秒),超时则被释放(retired),默认:10分钟
    pool-name: DateSourceHikariCP # 连接池名字
    max-lifetime: 1800000 # 连接的生命时长(毫秒),超时而且没被使用则被释放(retired),默认:30分钟
    connection-test-query: SELECT 1

7.通过切面编程 计算并打印 每个方法被调用时的耗时

并根据耗时时长打印不同类型的日志

package com.imooc.aspect;

import org.aopalliance.intercept.Joinpoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class ServiceLogAspect {

    public static final Logger log =
            LoggerFactory.getLogger(ServiceLogAspect.class);

    /**
     * AOP通知:
     * 1. 前置通知:在方法调用之前执行
     * 2. 后置通知:在方法正常调用之后执行
     * 3. 环绕通知:在方法调用之前和之后,都分别可以执行的通知
     * 4. 异常通知:如果在方法调用过程中发生异常,则通知
     * 5. 最终通知:在方法调用之后执行
     */

    /**
     * 切面表达式:
     * execution 代表所要执行的表达式主体
     * 第一处 * 代表方法返回类型 *代表所有类型
     * 第二处 包名代表aop监控的类所在的包
     * 第三处 .. 代表该包以及其子包下的所有类方法
     * 第四处 * 代表类名,*代表所有类
     * 第五处 *(..) *代表类中的方法名,(..)表示方法中的任何参数
     *
     * @param joinPoint
     * @return
     * @throws Throwable
     */
    @Around("execution(* com.imooc.service.impl..*.*(..))")
    public Object recordTimeLog(ProceedingJoinPoint joinPoint) throws Throwable {

        log.info("====== 开始执行 {}.{} ======",
                        joinPoint.getTarget().getClass(),
                        joinPoint.getSignature().getName());

        // 记录开始时间
        long begin = System.currentTimeMillis();

        // 执行目标 service
        Object result = joinPoint.proceed();

        // 记录结束时间
        long end = System.currentTimeMillis();
        long takeTime = end - begin;

        if (takeTime > 3000) {
            log.error("====== 执行结束,耗时:{} 毫秒 ======", takeTime);
        } else if (takeTime > 2000) {
            log.warn("====== 执行结束,耗时:{} 毫秒 ======", takeTime);
        } else {
            log.info("====== 执行结束,耗时:{} 毫秒 ======", takeTime);
        }

        return result;
    }

}

软考架构师90天冲刺|DAY03·架构风格-微服务架构 微服务架构已成为2024年软考高级系统架构设计师考试重点,案例分析占比30%。本文深入解析微服务架构核心概念、五大特征(独立部署、单一职责等),并与单体架构进行全面对比。重点分析微服务在可扩展性、技术灵活性等方面的优势,以及运维复杂性、数据一致性等挑战。通过2024年真题案例和电商系统拆分实例,详细讲解微服务拆分策略、数据库拆分方案和服务间通信方式。强调微服务架构需根据业务发展阶段选择,避免过早拆分增加复杂度,为构建高可用系统提供实践指导。 阅读详情

相关推荐

从混淆到清晰:实战解读LASSO回归图与交叉验证图(R glmnet二分类案例)

本文深入解析LASSO回归在R glmnet中的可视化应用,特别针对二分类问题。通过详细解读系数路径图和交叉验证误差图,帮助读者掌握变量筛选的关键技巧,并指导如何基于业务需求选择最优lambda值,实现从数据可视化到决策的完整流程。

weixin_32678995的博客 425

spring aop 实现日志统计service time

@Aspect @Component public class ServiceLogAspect { public static final Logger log = LoggerFactory.getLogger(ServiceLogAspect.class); /** * AOP通知: * 1. 前置通知:在方法调用之前执行 ...

kk屯学的博客 377

NS-3 和Aqua-sim-ng 学习笔记(一)

因为要搞水下网络,OMNET++不太合适,就转Aqua-sim。这是基于NS-2上的模型,NS-2需要额外学一门tcl脚本语言。 正好查到它的一个升级版Aqua-sim-NG,在github上,https://github.com/rmartin5/aqua-sim-ng是基于NS-3的,只需要基本的C++,不用学tcl语言。美滋滋。 装好ubuntu之后,安装NS-3和Aqu...

diboshang8820的博客 2191

浅析Spring事务的传播性

方法A和方法B的事务传播性都为PROPAGATION_REQUIRED 当方法A调用方法B, 方法B报错, 即使报错被外层捕获, 整体事务也会回滚.报错信息为UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only 代码演示 @Override publ...

juzhenxing的博客 618

EtherCAT简介

EtherCAT(EtherNet Control Automation Technology)是由德国公司BECKHOFF公司于2003年提出的实时工业以太网技术。其具有高速、高数据有效率的特点,支持多种设备的连接拓扑结构。从站节点使用专用的控制芯片,例如:microchip公司的Lan9252、BECKHOFF公司的ET1100等ESC(EtherCAT slave controller)芯片。主站的搭建方式有很多,例如:开源主站IGH、SOEM、商业化主站TwinCAT等。

m0_73482095的博客 1万+

大一Python之循环解决实际问题

pythin之循环解决实际问题

weixin_66263546的博客 2287

用 aop 记录日志

关于AOP,我之前对AOP和OOP进行过对比Spring——闲扯AOP与OOP,在宏观上对AOP部分知识有了一个较清晰的了解。但是AOP的应用只在声明式事务处理时用过。还不能够对AOP进行灵活运用。人尽言AOP是OOP的补充,下面就通过AOP处理log4j记录日志的例子,学习AOP。 首先,AOP处理日志是必需的,不使用AOP处理日志有诸多不便。 日志处理是每个项目当中一个非常

JackieLiuLixi的专栏 1267

Deepface实战避坑:人脸识别模型VGG-Face、Facenet、ArcFace怎么选?附各模型性能与速度实测对比

本文深入对比了DeepFace框架中VGG-Face、Facenet和ArcFace三种主流人脸识别模型的性能与适用场景,提供了详细的实测数据和选型建议。通过分析各模型在CPU/GPU环境下的推理速度、内存占用和准确率表现,帮助开发者根据实际需求(如门禁系统、相册分类或视频流分析)选择最优模型,并给出工程化部署的避坑指南和优化技巧。

weixin_42625070的博客 305

工程项目中打印SQL的执行时间的两种方式

1.使用log4jdbc打印SQL执行时间 本人项目使用的是apollo配置文件的: 1.导入需要的maven包 <!--监控sql日志--> <dependency> <groupId>org.bgee.log4jdbc-log4j2</groupId> <artifactId&...

weishuai528的博客 3268

CST毫米波雷达ADAS仿真:从直角反射器到距离多普勒(RD图)的实战解析

本文通过CST Studio Suite实战解析毫米波汽车雷达ADAS仿真,详细演示了从构建直角反射器目标、参数化定义速度、进行参数扫描到生成距离多普勒图(RD图)的全过程。文章深入探讨了雷达关键参数(如距离分辨率、速度分辨率)的设计权衡与工程逻辑,并提供了单位统一、速度范围设定等实用避坑指南,帮助工程师高效完成雷达系统性能的前期验证与优化。

weixin_29292535的博客 502

密码学与信息安全面试题及参考答案(2万字长文)

密码学是一门研究信息安全的学科,它涉及加密、解密以及保护数据免受非授权访问的技术和方法。这门学科的核心在于设计并分析各种协议,使通信双方即使在存在潜在敌手的环境中也能安全地传输信息。保密性:确保信息只能被预期的接收方读取,阻止未经授权的第三方获取信息的真实内容。完整性:保证数据在传输过程中不被篡改,确保接收方接收到的信息与发送方发送的信息完全一致。认证性:验证信息的来源,即确认信息确实是由声称的发送方发出的。不可否认性:确保发送方不能在事后否认曾经发送过某条信息。访问控制。

大模型大数据攻城狮的专栏 1994

通过日志监控service的执行时间

在config包中创建ServiceLogAspect类 @Aspect @Component public class ServiceLogAspect { public final static Logger log =LoggerFactory.getLogger(ServiceLogAspect.class); /** * AOP通知: * 1.前置通知: 在方法调用之前执行 * **2.后置通知: 在方法正常调用之后执行 (方法报异常,执行

Java追求者的博客 355

6、探索音乐结构中的统一性:贝多芬《英雄交响曲》第一乐章的深度剖析

本文深入剖析了贝多芬《英雄交响曲》第一乐章的音乐结构,探讨其统一性的来源及表现形式。通过主题与动机、和声与调性、旋律与节奏、织体与动态等多方面的分析,揭示了这部作品在技术层面和情感表达上的卓越成就。

b9c0d的博客 518

架构师课程笔记day03——单体应用开发过程中常用知识点及注意事项

架构师课程笔记

JavaCoder_juejue的博客 1023

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

架构师课程笔记day04——Nginx

nginx

JavaCoder_juejue的博客 1477

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

如何构建以应用为核心的运维体系

软件系统中,基础设施和组件都是为上层的一个个业务应用所服务的,识别和建立它们之间的关系的非常重要,这个是运维体系化的前提。

key_3_feng的博客 622

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

【软件系统架构师案例分析每日一耕 Day 11】可修改性战术:遗留单体系统向微服务演进

本文摘要: 某国有银行核心单体系统面临代码耦合、发布周期长、性能瓶颈等问题,需向微服务架构演进。采用绞杀者模式(分阶段替换)和防腐层(隔离新旧系统)策略,确保业务连续性。分析指出可修改性缺陷(变更范围大、成本高、影响广),强调局部化修改和防止连锁反应战术。实施方案包括路由控制、边缘模块先行、核心模块渐进迁移、数据双写对账等阶段。防腐层需实现模型转换和接口适配,双写阶段需防范数据不一致、性能下降等风险。最终通过渐进式改造实现零停机升级。 (148字)

youngerwang的博客 378

2026微服务实战生存指南:从单体拆分到稳定上线

微服务不是架构幻梦,而是开发者在资源受限、需求高压、系统耦合的现实环境中必须掌握的工程能力。其核心原理在于通过边界识别、渐进拆分与可观测性前置,实现系统演进的可逆性与可控性;技术价值体现在降低故障扩散、加速需求交付、提升团队自治能力;典型应用场景包括高痛苦指数模块(如库存、订单)的优先解耦、数据库三态迁移、轻量级网关灰度发布等。本文聚焦2026年中小团队真实落地场景,深度融合Monolith解耦实践与Developer Survival一线经验,提供可立即执行的代码级、配置级、运维级操作路径。

weixin_33835103的博客 343

12.16 Day 1 - 分布式系统架构的冰与火

Day 1

纽雪澳诺加海美德的博客 539

day31-网站架构开篇(上)

所谓的云平台,就是把海量机器资源,通过统一的资源管理,抽象为一个资源整体,在之上可按需动态申请硬件资源(如CPU、内存、网络等),并且之上提供通用的操作系统,提供常用的技术组件(如Hadoop技术栈,MPP数据库等)供用户使用,甚至提供开发好的应用,用户不需要关系应用内部使用了什么技术,就能够解决需求(如音视频转码服务、邮件服务、个人博客等)。到这里,就不是关乎于网站架构的性能问题了,而是成本问题,机器的运行、管理成本,服务器很贵的,部门每个月都有支出预算,这个月服务器费用是50万,如何降低个10万?

hcb20010421的博客 1266

Day926.架构是如何跟随业务演进的 -系统重构实战

从 Sharing 项目早期的问题来看,遗留系统带来的问题不仅仅降低了研发过程中的效率和质量,最终还导致产品的响应力和表现力都很差。由于代码耦合严重,无法拆分独立的组件。这样导致所有的需求需要统一规划发布, 灵活性差。另外,由于缺少足够的自动化测试覆盖,往往只能在最后的交付阶段进行人工测试,版本发布周期非常长。软件的架构就好比一座房子的地基,决定着这座房子能盖多少层楼。同样地,对于遗留系统来说,架构决定着软件产品能走多快、多远。要想解决遗留系统中一系列的问题,架构改造是关键的举措。

阿昌爱Java 621

cgb2010 第四阶段 day04

1.异步方式实现数据访问 1.2 ajax特点 特点:局部刷新 异步访问 ajax为什么可以实现异步? 1.3ajax业务说明 说明:用户通过http://localhost/ajaxUser跳转到ajaxUserList.jsp页面值中.其次通过ajax操作状态获取user集合数据,将数据在页面中进行展现 核心:1.跳转ajax发送请求的页面 2.编辑ajax发送请求获取结果,将数据在指定的位置进行展现 2.京淘项目后台架构设计 2.1单体架构设计存在的问题...

qq_42394133的博客 386

【笔记】架构上篇Day6b 法则四:架构设计中怎么判断和利用技术趋势?

法则四:架构设计中怎么判断和利用技术趋势?简介:包含模块一 架构师的六大生存法则-法则四:为什么要顺应技术的生命周期?&法则四:架构设计中怎么判断和利用技术趋势?你好,我是郭东白。上节课我们讲了为什么要顺应技术的生命周期。但是“往者不可谏,来者犹可追”,我们就不能抓住一个技术萌芽和发展的机会吗?今天我们就来探讨一下这个问题。

我的博客 1147

智能Agent场景实战指南 Day 30:构建企业级Agent平台架构

需求维度 | 具体指标 | 技术挑战 || 高可用 | 99.99% SLA | 故障自动恢复 || 可扩展 | 支持1000+ Agent | 资源动态分配 || 安全合规 | GDPR/等保合规 | 数据隔离审计 || 成本控制 | 单位成本下降30% | 资源利用率优化 || 运维监控 | 100+监控指标 | 全链路可观测 |分层架构:从基础设施到应用层的清晰边界核心模块:生命周期管理、任务调度、通信总线全球部署:区域化架构设计与数据合规工程实践:监控、扩缩容、灾备等生产级考量。

在未来等你的专栏 1173

还在加班写业务代码?1024节觉醒时刻:3年逆袭架构师实战路线

auto-generated

VarPerch的博客 845

从 Netflix 到 Spring Cloud差距不止一点点

从 Netflix 到 Spring Cloud差距不止一点点 Spring Cloud 自 2015 年 3 月推出之后,很快就在 Java 微服务生态中,成为开发人员的首选技术栈。 我们可以把Spring Cloud当成是微服务的一个大管家,根据官文可知Spring Cloud提供了构建分布式系统所需要的通用组件Spring boot、spring cloud Netflix、spring cloud task等等。 而通过在Spring Cloud中使用这些组件,我们能够迅速地构建可以简单部署的

m0_60720998的博客 191
上一篇: 架构师课程笔记day01 —— 知识大纲+大型网站演进+架构师素养+招聘要求与薪资待遇
下一篇: 架构师课程笔记day03——单体应用开发过程中常用知识点及注意事项
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我才是真的封不觉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值