8.4 day05软件学习

文章目录

  • 微服务的概念
    • 微服务的原则
    • 微服务的特征:
    • 集群介绍
  • 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.hqwc.cn/news/52651.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【JDK 11】【JDK 8】项目 jdk 版本升级,修改方案与实践

前言 工作中,难免会遇到升级版本的事情。这次由于两个系统中,系统 A 是用的 JDK8 版本,系统 B 是用 JDK11 版本;要求同步 JDK 版本,也就是升级到11版本。那么接下来将进行介绍~ 问题与解决 1. .sh 脚本启动无法启动…

JVM | 从类加载到JVM内存结构

引言 我在上篇文章:JVM | 基于类加载的一次完全实践 中为你讲解如何请“建筑工人”来做一些定制化的工作。但是,大型的Java应用程序时,材料(类)何止数万,我们直接堆放在工地上(JVM)…

死锁的发生原因和怎么避免

项目场景: 提示:这里简述项目相关背景: 例如:项目场景:示例:通过蓝牙芯片(HC-05)与手机 APP 通信,每隔 5s 传输一批传感器数据(不是很大) 问题描述 死锁,简单来说就是两个或者两个以上的线程在…

WebGL Shader着色器GLSL语言

在2D绘图中的坐标系统,默认情况下是与窗口坐标系统相同,它以canvas的左上角为坐标原点,沿X轴向右为正值,沿Y轴向下为正值。其中canvas坐标的单位都是’px’。 WebGL使用的是正交右手坐标系,且每个方向都有可使用的值的…

【物理】带电粒子在磁场和电场中移动的 3D 轨迹研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

轻松搭建酒店小程序

酒店小程序的制作并不需要编程经验,只需要按照以下步骤进行操作,就能很快地搭建自己的小程序商城。 第一步,注册登录账号进入操作后台,找到并点击【商城】中的【去管理】进入商城的后台管理页面,然后再点击【小程序商城…

Java on Azure Tooling 6月更新|标准消费和专用计划及本地存储账户(Azurite)支持

作者:Jialuo Gan - Program Manager, Developer Division at Microsoft 排版:Alan Wang 大家好,欢迎阅读 Java on Azure 工具的六月更新。在本次更新中,我们将介绍 Azure Spring Apps 标准消费和专用计划支持以及本地存储账户&…

RFID资产管理系统的选择

RFID资产管理是一种有效的资产过程控制方法,可以帮助企业实现高效的资产管理。选择RFID技术,可以高度集成各种资产信息,完成实时跟踪管理。   根据RFID资产管理系统,可以做到资产的实时管理,使企业管理者可以实时了解…

微信小程序iconfont真机渲染失败

解决方法: 1.将下载的.woff文件在transfonter转为base64, 2.打开网站,导入文件,开启base64按钮,下载转换后的文件 3. 在下载解压后的文件夹中找到stylesheet.css,并复制其中的base64 4. 修改index.wxss文…

vue使用拖拽功能实现仓库存放货物的需求

效果&#xff1a; 代码 <template><div><div class"bigTitle">xxxxxxxxxxxxxx仓库拖拽系统</div><div class"container2 flex-j-space-between"><div class"product-list"><div class"leftTree h…

Clickhouse 优势与部署

一、clickhouse简介 1.1clickhouse介绍 ClickHouse的背后研发团队是俄罗斯的Yandex公司&#xff0c;2011年在纳斯达克上市&#xff0c;它的核心产品是搜索引擎。我们知道&#xff0c;做搜索引擎的公司营收非常依赖流量和在线广告&#xff0c;所以做搜索引擎的公司一般会并行推…

网关gateway的简介和搭建过程

目录 1.什么是网关和网关的应用情景 2.网关是如何演化来的&#xff0c;在微服务中有什么作用&#xff1f; 3.网关的基本功能 4.Spring Cloud gateway的发展史 5.和网关类似的功能组件&#xff1a; 6.为什么微服务当中一定要有网关 7.微服务网关的优点 8.gateway的搭建过程…