8.4 day05软件学习

news2024/11/17 15:40:10

文章目录

  • 微服务的概念
    • 微服务的原则
    • 微服务的特征:
    • 集群介绍
  • spring aop

在家学习效率真不高,下午好兄弟喊出去玩,一直到晚上才回来,赶紧总结一下早上学习的内容。

继续看java基础进阶的思想,之前学的很多都忘了。

微服务的概念

优质的微服务架构说明文章

微服务 是分布式架构的一种,分布式架构就是把服务做一个拆分,springcloud就是解决拆分过程的服务治理问题

微服务相关的技术栈

1注册中心 一个业务一般需要多个服务来实现,a调用b,b调用c,c调用d,当业务变得很复杂的时候,这些服务之间调用关系很复杂,就需要一个注册中心用来记录每一个服务的ip、端口以及他们能完成的功能,然后这些服务之间相互调用的时候,不需要记录服务的ip,只要到注册中心就可以了;

2配置中心
每一个服务都有配置文件,而一个上线的项目可能存在成百上千的服务,这些配置文件不能一个个去修改,需要一个配置中心。用来统一管理整个服务集群成千上百的配置,需要某个配置的时候,只要找到配置中心即可

3网关
所有请求进来,不能直接访问对应的服务,需要通过一个网关服务,由它来路由对应的服务

4分布式缓存
即使数据库是集群部署的,也很难抵抗高并发,还需要一个缓存集群。把数据库的数据搬到内存中以提高访问效率。请求先查询缓存,缓存为命中再查询数据库

5分布式搜索
对于一些复杂的数据搜索、统计、分析,我们还需要使用搜索集群

6消息队列
一个业务可能调用多个服务,不能等到所有服务都执行完成再返回相应数据,使用消息队列,让服务发送消息通知其他服务去执行指定的认为,而自己可以结束运行,提高响应速度。

7分布式日志服务
分布式日志服务:主要用来统计成百上千的服务的运行日志,方便系统出问题时的定位。

8系统监控链路追踪
系统监控链路追踪:可以实时监控整个服务集群的所有节点的运行状态。

在这里插入图片描述
在这里插入图片描述

单体服务
在这里插入图片描述
分布式架构,耦合度低,有利于服务升级拓展
在这里插入图片描述

微服务的原则

不同微服务,不要重复开发相同的业务;

微服务数据独立,不要访问其他微服务的数据库;

微服务可以将自己的业务暴露为接口,供其他微服务调用。

微服务的特征:

单一职责:
微服务拆分粒度更小,每一个服务都对应唯一的业务能力,做到单一职责,避免重复业务开发;

面向服务:
微服务对外暴露业务接口;

自治:
团队独立,技术独立,数据独立,部署独立;

隔离性强:
服务调用做好隔离、容错、降级、避免出现级联问题。

在这里插入图片描述

集群介绍

在上面的图解中其实是存在问题的,比如Tomcat存在单点故障问题,一旦Tomcat所在的服务器宕机不可用了,我们就无法提供服务了,所以针对单点故障问题,我们会使用集群来解决.那什么是集群模式呢

单机处理到达瓶颈的时候,你就把单机复制几份,这样就构成了一个“集群”。集群中每台服务器就叫做这个集群的一个“节点”,所有节点构成了一个集群。每个节点都提供相同的服务,那么这样系统的处理能力就相当于提升了好几倍(有几个节点就相当于提升了这么多倍)。

但问题是用户的请求究竟由哪个节点来处理呢?最好能够让此时此刻负载较小的节点来处理,这样使得每个节点的压力都比较平均。要实现这个功能,就需要在所有节点之前增加一个“调度者”的角色,用户的所有请求都先交给它,然后它根据当前所有节点的负载情况,决定将这个请求交给哪个节点处理。这个“调度者”有个牛逼了名字——负载均衡服务器(Nginx)。

spring aop

spring的两大核心功能 控制反转ioc,可以降低系统之间的耦合度。

Spring IOC(Inversion of Control,控制反转)是Spring框架的核心概念之一,它是一种设计原则和模式,旨在降低系统之间的耦合度,提高代码的可维护性和可测试性。

IOC的基本思想是由容器负责对象的创建和管理,而不是由程序员显式地创建和管理对象。在传统的应用程序中,程序员通常通过使用 new 关键字在代码中直接创建对象,并且对象之间的依赖关系也是在代码中硬编码的,这样导致了程序之间的紧密耦合。

而使用IOC,它将创建和管理对象的责任委托给了一个称为IOC容器的机制。在Spring框架中,IOC容器负责创建、组装和管理应用程序中的对象,以及解决对象之间的依赖关系。程序员只需通过配置文件或注解等方式来描述对象之间的依赖关系,然后由IOC容器根据这些描述来创建和装配对象。

通过IOC,对象之间的关系变得松散耦合,代码变得更加灵活和可扩展。它有以下几个关键概念:

Bean:在Spring中,Bean是指由IOC容器管理的对象。它们是应用程序的基本构建块,由Spring容器创建、组装和管理。
容器:Spring IOC容器负责创建、组装和管理Bean。常见的容器实现包括ApplicationContext和BeanFactory。
配置:通过XML配置文件、注解或Java配置方式,描述Bean之间的依赖关系和其他配置信息。
依赖注入(Dependency Injection,DI):IOC容器通过依赖注入为Bean提供它们所需要的依赖项,即创建对象并将依赖项设置到对象中。依赖注入可以通过构造函数、Setter方法或字段注入来实现。
生命周期管理:IOC容器负责管理Bean的生命周期,包括创建、初始化、使用和销毁等阶段。
通过使用IOC,我们可以实现松散耦合的组件化开发,并使得对象的创建和管理更加灵活。它提供了很多好处,如简化对象创建、易于测试和维护、提高代码的可读性和可维护性等。Spring框架通过IOC容器的实现,使得IOC的使用变得更加便捷和强大。

切面编程
不修改源代码的请跨下,给程序动态统一添加额外功能的一种技术。

aop的一些核心概念

在这里插入图片描述

spring aop 通知类
在这里插入图片描述

苍穹外卖是采用Aspectj实现切面,基于注解的方式

定义注解AutoFill,用于标识需要进行公共字段自动填充的方法
自定义切面类,统一拦截加入AutoFill的方法,通过反射为公共字段赋值

技术点 枚举 注解 反射 AOP;

自定义注解

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface AutoFill {
    
    OperationType value(); //指定数据库曹操作类型
    
}

切面类

package com.sky.aspect;

import com.sky.annotation.AutoFill;
import com.sky.constant.AutoFillConstant;
import com.sky.context.BaseContext;
import com.sky.enumeration.OperationType;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
import java.lang.reflect.Method;
import java.time.LocalDateTime;

/**
 * 自定义切面,实现公共字段自动填充处理逻辑
 */
@Aspect
@Component
@Slf4j
public class AutoFillAspect {

    /**
     * 切入点
     */
    @Pointcut("execution(* com.sky.mapper.*.*(..)) && @annotation(com.sky.annotation.AutoFill)")
    public void autoFillPointCut(){}

    /**
     * 前置通知,在通知中进行公共字段的赋值
     */
    @Before("autoFillPointCut()")
    public void autoFill(JoinPoint joinPoint){
        log.info("开始进行公共字段自动填充...");

        //获取到当前被拦截的方法上的数据库操作类型
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();//方法签名对象
        AutoFill autoFill = signature.getMethod().getAnnotation(AutoFill.class);//获得方法上的注解对象
        OperationType operationType = autoFill.value();//获得数据库操作类型

        //获取到当前被拦截的方法的参数--实体对象
        Object[] args = joinPoint.getArgs();
        if(args == null || args.length == 0){
            return;
        }

        Object entity = args[0];

        //准备赋值的数据
        LocalDateTime now = LocalDateTime.now();
        Long currentId = BaseContext.getCurrentId();

        //根据当前不同的操作类型,为对应的属性通过反射来赋值
        if(operationType == OperationType.INSERT){
            //为4个公共字段赋值
            try {
                Method setCreateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_TIME, LocalDateTime.class);
                Method setCreateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_USER, Long.class);
                Method setUpdateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME, LocalDateTime.class);
                Method setUpdateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER, Long.class);

                //通过反射为对象属性赋值
                setCreateTime.invoke(entity,now);
                setCreateUser.invoke(entity,currentId);
                setUpdateTime.invoke(entity,now);
                setUpdateUser.invoke(entity,currentId);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }else if(operationType == OperationType.UPDATE){
            //为2个公共字段赋值
            try {
                Method setUpdateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME, LocalDateTime.class);
                Method setUpdateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER, Long.class);

                //通过反射为对象属性赋值
                setUpdateTime.invoke(entity,now);
                setUpdateUser.invoke(entity,currentId);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

这部分的作用是简化代码的开发。

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

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

相关文章

网工内推 | 实施、售后工程师,厂商认证优先

01 安井食品集团股份有限公司 招聘岗位:网络工程师 职责描述: 1.负责集团组网的网络规划、实施、维护工作; 2.负责公司局域网的网络规划、实施、维护工作; 3.负责公司企业安全系统规划、实施、维护工作; 4、负责公…

百度UEditor编辑器如何关闭抓取远程图片功能

百度UEditor编辑器如何关闭抓取远程图片功能 这个坑娘的功能,开始时居然不知道如何触发,以为有个按钮,点击一下触发,翻阅了文档,没有发现,然后再网络上看到原来是复制粘贴非白名单内的图片到编辑框时触发&a…

LT6711A 是一款HDMI 2.0转DP 1.2/EDP 1.4的芯片,实用于AR或者PC以及PAD

LT6711A 1.概述: Lontium LT6711A是HDMI2.0到DP1.2转换器,内部有c型替代模式开关和PD控制器。对于HDMI输入,LT6711A具有一个HDMI2.0接收器,有1个时钟通道和3个数据通道,每个数据通道最大运行6Gb/s,最大输…

DAY02_Spring第三方资源配置管理Spring容器Spring注解开发Spring整合Mybatis和Junit

目录 一 第三方资源配置管理1 管理DataSource连接池对象问题导入1.1 管理Druid连接池1.2 管理c3p0连接池 2 加载properties属性文件问题导入2.1 基本用法2.2 配置不加载系统属性2.3 加载properties文件写法 二 Spring容器1 Spring核心容器介绍问题导入1.1 创建容器1.2 获取bean…

智能汽车驾驶演进:虚拟ECU种类与优劣分析

现代汽车更安全、更舒适、更智能的代价是车载ECU(Electronic Control Unit)数量的迅速增长,与之相对应的是ECU上规模软件越来越大、软件开发成本在整车制造成本中的占比越来越高。车企可以从规则与方法两个角度入手来解决上述问题&#xff1a…

ES6新增的语法

ES6实际上是一个泛指,泛指 ES2015 及后续的版本 1,let用于声明变量的关键字 let 声明的变量只在所处于的代码块内有效 if (true) { let a 10 } console.log(a) // a is not defined 2, let 不存在变量提升 console.log(a) // a is not deined let a 1…

元素2D转3D 椭圆形旋转实现

椭圆旋转功能展示 transform-style: preserve-3d;(主要css代码) gif示例(背景图可插入透明以此实现边框线的旋转) 导致的无法点击遮挡问题可以参考我的另一个文章 穿透属性-----------------------css穿透属性 实时代码展示

如何与 Boot Barn 建立 EDI 连接?

Boot Barn 专注于提供各种高品质的靴子、鞋类和西部服饰。其经营范围广泛,为广大顾客提供最新潮流和经典款式的选择。 Boot Barn 的使命是成为顾客在西部风格时尚领域的首选购物地点。多年来,Boot Barn 凭借卓越的服务和优质的产品赢得了众多客户的信赖和…

LabVIEW使用DSA技术从X射线图像测量肺气容量

LabVIEW使用DSA技术从X射线图像测量肺气容量 相衬X射线(PCX)成像技术利用相邻介质之间折射率的微小差异来增强传统X射线成像通常不可见的物体的边界。事实证明,这一进展在一系列生物医学和材料科学中非常有益于材料表征、疾病检测以及解剖形…

Hive 中把一行记录拆分为多行记录

背景 业务场景:统计每个小时视频同时在线观看人数,因后台的业务数据是汇总之后的,只有开始时间、结束时间,没有每小时的详细日志数据,无法直接进行统计,所以需要对每条业务数据进行拆分,来统计…

【redis】能ping通虚拟机但是telnet不通

问题 虚拟机上有redis,能ping通虚拟机的ip,但是telnet已启动的redis6379端口失败 基本情况 虚拟机网络模式是NAT模式,linux防火墙firewalld已关闭,没有iptables,主机和虚拟机能互相Ping通,主机telnet re…

后端进阶之路——Spring Security构建强大的身份验证和授权系统(四)

前言 「作者主页」:雪碧有白泡泡 「个人网站」:雪碧的个人网站 「推荐专栏」: ★java一站式服务 ★ ★前端炫酷代码分享 ★ ★ uniapp-从构建到提升★ ★ 从0到英雄,vue成神之路★ ★ 解决算法,一个专栏就够了★ ★ 架…

鸿蒙的初项目

经过这几天的了解,我还是决定挑战一下自己用ets语言去写一个鸿蒙的程序! 先创建了一个ets的项目,然后我发现这里面有一个组件叫Flex,跟css里面的弹性布局好像差不多,但是用法略有差异,这个Flex是在&#xf…

Python---Numpy

文章目录 1.Numpy是什么?2.ndarray2.1 什么是ndarray?2.2 ndarray的属性2.3 ndarray的类型 3.Numpy基本操作3.1 生成0或1的数组3.2 从现有数组生成数组拓展:浅拷贝和深拷贝 3.3 生成固定范围的数组3.4 生成随机数组3.4.1 正态分布3.4.2 均匀分布 3.5 形…

网络安全(黑客)工具篇

大家好,我是白菜。这篇文章给大家盘点那些年,我们一起玩过的网络安全工具。 一、反恶意代码软件 1.Malwarebytes 这是一个检测和删除恶意的软件,包括蠕虫,木马,后门,流氓,拨号器,…

3D视觉算法工程师的工资,真是离谱!

小凡:「与其服务一个公司,不如服务一个行业」 一 我的从业经历 大家好,我是小凡,「3D视觉从入门到精通」知识星球的星主。 这里简单介绍下的我的从业经历。 本科主要是做机械出身,研究生入行3D视觉,这里…

SSM(Vue3+ElementPlus+Axios+SSM前后端分离)--搭建Vue 前端工程[二]

文章目录 SSM--搭建Vue 前端工程--项目基础界面实现功能02-创建项目基础界面需求分析效果图思路分析 代码实现项目前后端分离情况项目前后端分离情况如图 注意事项和细节 SSM–搭建Vue 前端工程–项目基础界面 实现功能02-创建项目基础界面 需求分析 效果图 思路分析 使用V…

.Net6 Web Core API 配置 Autofac 封装 --- 依赖注入

目录 一、NuGet 包导入 二、Autofac 封装类 三、Autofac 使用 四、案例测试 下列封装 采取程序集注入方法, 单个依赖注入, 也适用, 可<依赖注入>的地方配置 一、NuGet 包导入 Autofac Autofac.Extensions.DependencyInjection Autofac.Extras.DynamicProxy 二、Auto…

【Linux】——信号量、线程池

目录 POSIX信号量 信号量的原理 信号量的概念 信号量函数接口 信号量与互斥锁 二元信号量 二元信号量模拟实现互斥功能 基于环形队列的生产消费模型 空间资源的数据资源 申请和释放资源 两个原则 Linux线程池 线程池的概念 线程池的应用场景 线程池的实现 线程…

【ASP.NET MVC】使用动软(二)(10)

一、添加动软生成工程 按前文添加动态到工程 双击动软 完成新建数据库服务器后 &#xff0c;需要关闭重新打开 选择简单三层&#xff0c;注意保存位置 注意切换数据库&#xff1a; 生成后拷贝五个文件夹到工程目录 注意目录结构&#xff1a; 添加四个项目到原来的工程&…