请选择 进入手机版 | 继续访问电脑版

lc-框架

[复制链接]
丁翼 发表于 2021-1-1 18:34:18 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
1.spring的特性是什么?ioc和Aop的原理是什么?aop的注解有哪些?
spring是一个开源框架,是为了管理企业级应用开发的复杂性而创建的,从简单性、可测试性和松耦合性角度而言,绝大多数java应用都可以从spring中受益。
spring特性(思想)
1.IOC
Inversion of Control(控制反转),是指我们将创建对象和依赖注入的方式反转了,将对象的创建以及管理交由spring容器。
以前,我们创建对象都是我们自己new,自己管理,依赖也由我们自己注入,使用spring后这些都有spring容器处理处罚。
2.DI
Dependency Injection(依赖注入),是指由Spring容器来维护对象之间的依赖关系,而不需要我们自己来处理处罚。根据概念我们知道,Di为IOC提供了支持,没有DI就完不成IOC.
3.AOP
Aspect Oriented Programming(面向切面编程),是指致力于将横切关注点(散布于应用中多处的功能点且这个功能点与应用的业务逻辑是相分离的,例如事务、安全等)与业务逻辑相分离的一种编程思想。
 
ioc和aop的原理是什么?
ioc:控制反转也叫依赖注入。
使用了工厂模式将对象交给容器管理,你只需要在spring设置文件中设置对应的bean以及设置相关的属性,让spring容器来生成类的实例对象以及管理对象。
spring会将你在设置文件中设置的bean都初始化好,然后在你需要调用的时候,就把它已经初始化好的那些bean分配给你需要调用这些bean的类(假设这个类名是A),分配的方法就是调用A的setter方法来注入,而不需要你在A内里new这些bean了。
Aop:
是对oop的增补和完善,oop引入封装、继承和多态性等概念来创建一种对象层次布局,用以模仿公共行为的一个聚集。
当我们需要为分散的对象引入公共行为的时候,OOP则显得无能为力。
就是说,OOP允许你界说从上到下的关系,但并不适合界说从左到右的关系。
例如日志功能。日志代码往往水平地散布在所有对象层次中,而与它所散布到的对象的焦点功能毫无关系。
在OOP设计中,他导致了大量的代码重复,而倒霉于各个模块的重用。
实现AOP的技能,主要分为两大类:
一是采取动态署理技能,使用截取消息的方式,对该消息举行装饰,以取代原有对象行为的执行;
二是采取静态织入的方式,引入特定的语法创建“方面”,从而使得编译器可以在编译期间织入有关“方面”的代码
aop实现的原理其实是java动态署理,但是jdk动态署理必须实现接口,所以spring的Aop是用cglib这个库实现的,cglib使用了asm这个直接使用字节码的框架,所以可以做到不实现接口的情况下完成动态署理。
aop的注解有哪些?
@Aspect:
作用:把当前类声明为切面类
@Before
作用:把当前方法看成前置通知
属性:value:用于指定切入点表达式,还可以指定切入点表达式的引用
@After
作用:把当前方法看成是始终通知
属性:value:用于指定切入点表达式,还可以指定切入点表达式的引用。
@AfterThrowing
作用:把当前方法看成是异常通知。
属性:value:用于指定切入点表达式,还可以指定切入点表达式的引用。
@Around
作用:把当前方法看成是围绕通知。
属性:value:用于指定切入点表达式,还可以指定切入点表达式的引用
@Pointcut
作用:指定切入点表达式
属性:value:指定表达式的内容
 
2.springboot自动装配原理是什么?
https://blog.csdn.net/weixin_40980639/article/details/107087139
springboot设置文件中常用设置有哪些?
springboot自动装配原理是什么?
springboot主要是依赖一个父项目,主要是管理项目标资源过滤及插件
pom.xml

   
        org.springframework.boot
        spring-boot-starter-parent
        2.3.2.RELEASE
         
   
 
点进去,发现尚有一个父依赖
 
    org.springframework.boot
    spring-boot-dependencies
    2.3.2.RELEASE
 
 
启动器 spring-boot-starter

 
            org.springframework.boot
            spring-boot-starter-web
       
springboot-boot-start-xxx:
就是springboot的场景启动器
spring—boot-start-web:帮我们导入web模块正常运行所依赖的组件;
springboot将所有的功能场景都抽取出来,做成一个个的start(启动器),只需要在项目会合引入这些start即可,所有相关的依赖都会导入进来,我们要用什么功能就导入什么样的场景启动器即可,我们未来也可以自己界说starter;
主启动类
这个项目标默认主启动类
/**
 *  @SpringBootApplication 来标注一个主程序类,说明这是一个Spring Boot应用
 */
@SpringBootApplication
//@EnableTransactionManagement
public class DemoApplication extends SpringBootServletInitializer  {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(DemoApplication.class);
    }
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}
进入@SpringBootApplication后,内里尚有许多设置。

 


 


可以发现自动设置真正实现是从classpath中搜寻所有的Meta-inf/spring.factories设置文件,并将此中对应的org.springframework.boot.autoconfigure.包下的设置项,通过反射实例化为对相应标注了@configuration的javaConfig形式的IOC容器设置类,然后将这些都汇总成一个实例并加载到IOC容器中
结论:
1.springboot在启动的时候从类路径下的META-inf/spring.factories中获取EnableAutoConfiguraction指定的值
2.将这些值作为自动设置类导入容器,自动设置类就会生效,帮我们举行自动设置工作
3.整个J2EE的整体管理方案和自动设置都在springboot-autoconfigure的jar包中
4.他会给容器中导入非常多的自动设置类(xxxxAutoConfiguration),就是给容器中导入整个场景需要的所有组件,并设置好这些组件;
5.有了自动设置类,免去我们手动编写设置注入功能组件等的工作
 
springboot设置文件中常用设置有哪些?
修改端口和默认路径

server:
  port: 8889
  servlet:
    context-path: /chapter02
 
 
springboot设置文件常用设置整理
yml文件的一些设置:
 
#毗连数据库
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/eesy?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver
     #开启springboot应用时需要执行sql文件需要设置这个东西
    initialization-mode: always
    schema:
      - classpath:xxx.sql
      
      
#Druid数据源的一些设置    
    #更换数据源(Druid)
    type: com.alibaba.druid.pool.DruidDataSource
    #数据源的一些参数设置
    druid:
      # 毗连池设置
      # 设置初始化大小、最小、最大
      initial-size: 1
      min-idle: 1
      max-active: 20
      # 设置获取毗连等候超时的时间
      max-wait: 3000
      validation-query: SELECT 1 FROM DUAL
      test-on-borrow: false
      test-on-return: false
      test-while-idle: true
      pool-prepared-statements: true
      time-between-eviction-runs-millis: 60000
      min-evictable-idle-time-millis: 300000
      filters: stat,wall,slf4j
      # 设置web监控,默认设置也和下面相同(除用户名暗码,enabled默认false外),其他可以不配
      web-stat-filter:
        enabled: true
        url-pattern: /*
        exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"
      stat-view-servlet:
        enabled: true
        url-pattern: /druid/*
        login-username: admin
        login-password: root
        allow: 127.0.0.1
#MyBatis的一些设置
mybatis:
  config-location: classpath:mybatis/mybatis-config.xml  #mybatis全局设置文件
  mapper-locations: classpath:mybatis/mapper/*.xml   #xml包所在位置
  type-aliases-package: com.li.shirospringboot.pojo  #给pojo类起别名
  #开启驼峰定名法
  configuration:
    map-underscore-to-camel-case: true
    
#显示数据库查询语句
logging:
  level:
    com:
      atguigu:
        springboot:
          mapper: debug
#控制台打印出自动设置陈诉
debug: true
#JPA的一些设置
jpa:
    hibernate:
      ddl-auto: update       #每次运行程序,没有表格会新建表格,表内有数据不会清空,只会更新
      ddl-auto: create       #每次运行该程序,没有表格会新建表格,表内有数据会清空
      ddl-auto: create-drop  #每次程序结束的时候会清空表
      ddl-auto: validate     #运行程序会校验数据与数据库的字段范例是否相同,不同会报错
    show-sql: true   #控制台显示sql语句
    properties:
      hibernate:
        format_sql: true    #格式化SQL,如果不加,SQL输出不换行,不方便查察
 
3.springboot项目如何打包、摆设、运行?
1、首先把项目举行打包jar,这里使用idea开发工具。
clean->packeage

运行package后,就会告竣一个jar包,在本项目标target目次下

3、我们使用远程工具SecureCRT毗连Linux系统。使用sftp上传jar包到指定的文件夹下面。(上传文件到linux系统的方法,可参考https://blog.csdn.net/No_overtime_apes/article/details/91127383
4、进入Linux系统 ,找到jar所在的文件夹下,执行下令:
java -jar demo-0.0.1-SNAPSHOT.jar
这个下令,关闭窗口大概ctrl+c会结束程序运行。
可以使用:
nohup java -jar demo-0.0.1-SNAPSHOT.jar>server.log 2>&1&下令,背景运行
server.log是自界说的日志输出文件

5.项目启动成功后,输入远程的ip/端口后,即可访问。
 
 
4.spring是如何控制事务的?
spring的事务声明有两种方式,编程式和声明式。spring主要是通过“声明式事务”的方式对事务举行管理,即在设置文件中举行声明,通过AOP将事务切面切入程序,最大的利益是大大淘汰了代码量。
声明式事务:就是在aop的底子上,受aop管理的。其本质是对方法前后举行拦截,然后在目标方法开始之前创建大概参加一个事务,在执行完目标方法之后根据执行情况提交大概回滚事务。声明式事务最大的优点就是不需要通过编程的方式管理事务,这样就不需要在业务逻辑代码中掺杂事务管理的代码,只需在设置文件中做相关的事务规则声明(或通过基于@Transactional注解的方式),便可以将事务规则应用到业务逻辑中。

编程式事务:所谓编程式事务指的是通过编码方式实现事务,即雷同于JDBC编程实现事务管理。管理使用TransactionTemplate大概直接使用底层的PlatformTransactionManager。对于编程式事务管理,spring推荐使用TransactionTemplate。

 
 
5.springmvc常用的注解及其作用?
注解在SpringMVC的实现中是非常重要的,在做项目是使用最多的也是注解,首先使用注解需要在spring.xml文件中设置注解支持才可以使用注解功能
(1). @Controller
说明该类是控制类,controller主要负责处理处罚前端控制器(DispatcherServlet )发过来的请求,颠末业务逻辑层处理处罚之后封装层一个model,并将其返回给view举行展示。@controller注解通常用于类上,如果联合Thymeleaf模板使用的话,会返回一个页面。如果是前后端分离的项目,则使用@RestController,表明返回的是json格式数据。
(2). @RestController
该注解的源码如下,以次可以看出@RestController注解内里包罗了@Controller注解和@ResponseBody注解,@ResponseBody 注解是将返回的数据布局转换为 JSON 格式,所以说可以这么理解:
@RestController = @Controller + @ResponseBody
(3).@RequestMapping
@RequestMapping 是一个用来处理处罚请求地点映射的注解,它可以用于类上,也可以用于方法上。用于类上的注解会将一个特定请求大概请求模式映射到一个控制器之上,体现类中的所有响应请求的方法都是以该地点作为父路径;方法的级别上注解体现进一步指定到处理处罚方法的映射关系。
该注解有6个属性,一般在项目中比较常用的有三个属性:value、method 和 produces。 value

  • 属性:指定请求的实际地点,value 可以省略不写;
  • method 属性:指定请求的范例,主要有GET、PUT、POST、DELETE,默认为 GET。
  • produces 属性:指定返回内容范例,如 produces = “application/json; charset=UTF-8”。
  1. 1.@Controller
复制代码
  1.    作用: 告诉springmvc的dispatcherServlet这是一个Controller然后被dispatcherServlet的上下文所管理,
复制代码
  1.     而且完成它的依赖注入              2. @Service
复制代码
  1.    作用:这个注解常用于标注业务层组件             3. @Autowired
复制代码
  1.    作用:它可以对类成员变量、方法及构造函数举行标注,完成自动装配的工作
复制代码
   @Component
  1.    作用: @Component泛指组件,当组件欠好归类的时候,我们可以使用这个注解举行标注。
复制代码
  1. @Scope
复制代码
  1.    作用:  @scope 就是用来设置 spring bean 的作用域,它标识 bean 的作用域。
复制代码
  1.               @Scope 简单点说就是用来指定bean的作用域
复制代码
 scope用来声明IOC容器中的对象应该处的限定场景大概说该对象的存活空间,
     即在IOC容器在对象进入相应的scope之前,生成并装配这些对象,在该对象不
     再处于这些scope的限定之后,容器通常会销毁这些对象
 
6.springmvc的工作流程是什么?

SpringMVC流程

1、  用户发送请求至前端控制器DispatcherServlet。
2、  DispatcherServlet收到请求调用HandlerMapping处理处罚器映射器。
3、  处理处罚器映射器找到详细的处理处罚器(可以根据xml设置、注解举行查找),生成处理处罚器对象及处理处罚器拦截器(如果有则生成)一并返回给DispatcherServlet。
4、  DispatcherServlet调用HandlerAdapter处理处罚器适配器。
5、  HandlerAdapter颠末适配调用详细的处理处罚器(Controller,也叫后端控制器)。
6、  Controller执行完成返回ModelAndView。
7、  HandlerAdapter将controller执行效果ModelAndView返回给DispatcherServlet。
8、  DispatcherServlet将ModelAndView传给ViewReslover视图分析器。
9、  ViewReslover分析后返回详细View。
10、DispatcherServlet根据View举行渲染视图(即将模子数据填充至视图中)。
11、 DispatcherServlet响应用户。
 
7.mybatis的工作原理是什么?

(1)mybatis-config.xml是Mybatis的焦点设置文件,通过此中的设置可以生成SqlSessionFactory,也就是SqlSession工厂
(2)基于SqlSessionFactory可以生成SqlSession对象
(3)SqlSession是一个既可以发送SQL去执行,并返回效果,雷同于JDBC中的Connection对象,也是Mybatis中至关重要的一个对象。
(4)Executor是SqlSession底层的对象,用于执行SQL语句
(5)MapperStatement对象也是SqlSession底层的对象,用于吸收输入映射(SQL语句中的参数),以及做输出映射(即将SQL查询的效果映射成相应的效果)
加载mybatis全局设置文件(数据源、mapper映射文件等),分析设置文件,MyBatis基于XML设置文件生成Configuration,和一个个MappedStatement(包罗了参数映射设置、动态SQL语句、效果映射设置),其对应着标签项。

2、SqlSessionFactoryBuilder通过Configuration对象生成SqlSessionFactory,用来开启SqlSession。

3、SqlSession对象完成和数据库的交互:
a、用户程序调用mybatis接口层api(即Mapper接口中的方法)
b、SqlSession通过调用api的Statement ID找到对应的MappedStatement对象
c、通过Executor(负责动态SQL的生成和查询缓存的维护)将MappedStatement对象举行分析,sql参数转化、动态sql拼接,生成jdbc Statement对象
d、JDBC执行sql。
e、借助MappedStatement中的效果映射关系,将返回效果转化成HashMap、JavaBean等存储布局并返回。
mybatis的缓存的理解?
一级缓存

Session会话级别的缓存,位于体现一次数据库会话的SqlSession对象之中,又被称之为本地缓存
一级缓存是MyBatis内部实现的一个特性,用户不能设置,默认情况下自动支持的缓存,一般用户没有定制它的权利
二级缓存

Application应用级别的缓存,生命周期长,跟Application的生命周期一样,即作用范围为整个Application应用
 
8.mybatis中#{}和${}的区别?
#{}:是预编译处理处罚。
${}:是字符串替换。
Mybatis在处理处罚#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;mybatis在处理处罚${}时,就是将
${}替换成变量的值.
使用#{}可以有效的防止SQL注入,提高系统的安全性!
 
9.springboot的异常处理处罚?
springboot框架异常处理处罚有5中处理处罚方式,从范围来说包罗有 全局异常捕获处理处罚方式和局部异常捕获处理处罚方式
1.自界说异常错误页面
2.使用@ExceptionHandler注解处理处罚局部异常
3.使用@ControllerAdvice+@ExceptionHandler注解处理处罚全局异常
这种方式推荐使用,可以根据不同的异常对不同的异常举行处理处罚
4.设置simpleMappingExceptionResolver类处理处罚异常
全局范围的
注意:在类上加上 @Configuration 注解,在方法上加上 @Bean 注解,方法返回值必须是 SimpleMappingExceptionResolver 。
5.实现HandlerExceptionResolver接口处理处罚异常
注意:在类上加上 @Configuration 注解。
 
10.spring中如何设置拦截器、过滤器?
1.设置拦截器:
1.编写拦截器sqlMapInterceptor实现HandlerInterceptor接口
2.在对应模块config中举行设置,需要继承webMvcConfigurerAdapter
3.使用该拦截器
过滤器设置:
1.首先准备一个实现了filter的接口的类SessionFilter
SessionFilter implements Filter
2.实际开发中往往有很多请求要直接请求进来,不需要鉴权登岸的,所以代码中过滤掉这种请求的代码,装进list就好了。
11.spring管理的bean是否会存在并发?
spring默认的单例模式的bean,因为是单例的,所以会避免不断的创建新的实例从而导致并发量很大时,垃圾回收效率低的问题,也有缺点,就是状态欠好管理,也就是说bean内里的全局变量欠好管理,因为这样很容易会导致多线程问题。
Spring的bean默认scope属性为singleTon,即单例的,有线程安全问题
如果设置@Scope(“prototype”),则每次都会创建新对象,不存在线程安全问题
如何实现线程安全
1.同步代码块/同步方法
2.ThreadLocal,提供了线程的局部变量,实现线程的数据隔离
原型Bean
对于原型Bean,每次创建一个新对象,也就是线程之间并不存在Bean共享,自然是不会有线程安全的问题。
12.springsession的原理是什么?

而使用 Spring Session 来管理分布式session,则完全实现了与详细的容器无关。Spring Session 是Spring的项目之一
Spring Session 提供了一套创建和管理 Servlet HttpSession 的方案。Spring Session提供了集群 Session(Clustered Sessions)功能,默认采取外置的 Redis 来存储 Session 数据,以此来管理Session共享的问题。
使用Spring Session 可以非常浅易地把 Session 存储到第三方存储容器,框架提供了redis、jvm 的 map、mongo、gemfire、hazelcast、jdbc等多种存储 Session 的容器的方式。
原理扼要总结:
当请求进来的时候,SessionRepositoryFilter 会先拦截到请求,将 request 和 response 对象转换成 SessionRepositoryRequestWrapper 和 SessionRepositoryResponseWrapper 。后续当第一次调用 request 的getSession方法时,会调用到 SessionRepositoryRequestWrapper 的getSession方法。这个方法是被从写过的,逻辑是先从 request 的属性中查找,如果找不到;再查找一个key值是"SESSION"的 Cookie,通过这个 Cookie 拿到 SessionId 去 Redis 中查找,如果查不到,就直接创建一个RedisSession 对象,同步到 Redis 中。
说的简单点就是:拦截请求,将之前在服务器内存中举行 Session 创建销毁的动作,改成在 Redis 中创建。
就是当Web服务器吸收到http请求后,当请求进入对应的Filter举行过滤,将原本需要由web服务器创建会话的过程转交给Spring-Session举行创建,原来创建的会话生存在Web服务器内存中,通过Spring-Session创建的会话信息可以生存第三方的服务中,如:redis,mysql等。Web服务器之间通过毗连第三方服务来共享数据,实现Session共享!
 
13.spring的类加载器是什么?
类加载器
类加载器ClassLoader,它是一个抽象类,ClassLoader的详细实例负责把java字节码读取到JVM当中,ClassLoader还可以定制以满足不同字节码流的加载方式,比如从网络加载、从文件加载。ClassLoader的负责整个类装载流程中的“加载”阶段。
14.springClound的组件有哪些?
作用分别是什么?
1.Eureka:注册中心
2.Zuul:服务网关
3.Ribbon:负载平衡
4.Feign:服务调用
5.Hystix:熔断器
Eureka注册中心

简述:
       Eureka就比如是一个公司的背景,负责管理、记载服务提供者的信息。我们只要将我们的微服务注册到Eureka中去,我们的服务调用者在调用微服务的时候,就无需自己寻找服务,而是把自己的需求告诉Eureka,然后Eureka会把符合你需求的服务告诉你,从而完成微服务的调用。
负载平衡Ribbon

简述:
     Ribbon是我们SpringCould采取的一种负载平衡器,它的主要作用在于,当我们同一个功能的微服务开启了很多个时,当我们需要调用微服务时所遵循的一种微服务调用的规则,这样我们才气准确的调用响应的微服务。所以,只要我们为Ribbon设置了提供服务者的同一类微服务的地点列表后,我们的Ribbon就可以基于某种负载平衡的算法自动的资助服务事物消费者去请求服务。Ribbon默认的为我们提供了轮循,随机等负载平衡的算法,同时我们也可以自界说负载平衡的算法。
Hystrix熔断器

简述:
      熔断器Hystrix是容错管理工具,作用是通过隔离、控制服务从而对延迟和故障提供更强大的容错本领,避免整个系统被拖垮。复杂分布式架构通常都具有很多依赖,当一个应用高度耦合其他服务时非常危险且容易导致失败,这种失败很容易伤害服务的调用者,最后导致一一个接一个的连续错误,应用自己就处在被拖垮的风险中,最后失去控制,就像在一一个高流量的网站中,某个单一的后端一旦发生延迟,将会在数秒内导致所有应用资源被耗尽。如那边理处罚这些问题是有关系统性能和效率的关键性问题。 当在系统高峰时期,大量对微服务的调用大概会堵塞远程服务器的线程池,如果这个线程池没有和主应用服务器的线程池隔离,就大概导致整个服务器挂机。 Hystrix使用自己的线程池,这样和主应用服务器线程池隔离,如果调用耗费很长时间,会停止调用,不同的下令或下令组可以或许被设置使用它们各自的线程池,可以隔离不同的服务。
 Hystrix熔断器主要的作用就是当我们的服务繁忙时,如果服务出现异常,不是粗暴的直接报错,而是返回一个友好的提示,虽然拒绝了用户的访问,但是会返回一个效果。这就比如去买鱼,寻常超市买鱼会额外赠送杀鱼的服务。比及逢年过节,超时繁忙时,大概就不提供杀鱼服务了,这就是服务的降级。系统特别繁忙时,一些次要服务暂时中断,优先包管主要服务的流通,一切资源优先让给主要服务来使用,在双十一、618时,京东天猫都会采取这样的计谋。
Feign服务的远程调用

微服务架构中,微服务间调用的一个组件。
Zuul网关

简述:
       Zuul是Netfix开源的微服务网关,它可以和Eureka、Ribbon、Hystrix 等组件共同使用。Zuul的焦点是一-系列的过滤器,这些过滤器可以完成以下功能。
     ●身份认证与安全:识别每个资源的验证要求,并拒绝那些与要求不符的请求。
     ●审查与监控:在边沿位置追踪有意义的数据和统计效果,从而带来准确的生产视图。
     ●动态路由:动态地将请求路由到不同的后端集群。
     ●压力测试:逐渐增加指向集群的流量,以相识性能。
     ●负载分配:为每一~种负载范例分配对应容量,并弃用超出限定值的请求。
     ●静态响应处理处罚:在边沿位置直接创建部门响应,从而避免其转发到内部集群。
     ●多区域弹性:凌驾AWS Region举行请求路由,旨在实现ELB ( Elastic Load Balancing )使用的多样化,以及让系统的边沿更贴近系统的使用者。
 
15.dubbo和springcloud的区别和优缺点?
Dubbo只是一个远程调用(RPC)框架
默认基于长链接,
 
Dubbo和Spring Cloud的区别



  • 定位:Dubbo 专注 RPC 和服务治理;Spirng Cloud 是一个微服务架构生态
  • 性能:Dubbo 强于 SpringCloud(主要是通信协议的影响)
  • 功能范围:Dubbo 诞生于面向服务架构时代,是一个分布式、高性能、透明化的 RPC 服务框架,提供服务自动注册、自动发现等高效服务治理方案;Spring Cloud 诞生于微服务架构时代,基于 Spring、SpringBoot,关注微服务的方方面面,提供整套的组件支持
  • 通信协议:Dubbo 使用 Netty,基于 TCP 协议传输,用 Hessian序列化完成 RPC 通信;SpringCloud 是基于 Http 协议 + Rest 风格接口通信。Http 请求报文更大,占用带宽更多;Rest 比 RPC 灵活
  • 更新维护:Dubbo 曾停止更新,2017年重启维护,中文社区文档较为全面;一直保持高速更新,社区活泼
Dubbo 构建的微服务架构像组装电脑,组件选择自由度高、玩欠好容易出问题;Spring Cloud 的像品牌机,提供一整套稳定的组件。
 
从焦点要素来看

Spring Cloud 更胜一筹,在开发过程中只要整合Spring Cloud的子项目就可以顺利的完成各种组件的融合,而Dubbo缺需要通过实现各种Filter来做定制,开发成本以及技能难度略高。
Dubbo只是实现了服务治理,而Spring Cloud子项目分别覆盖了微服务架构下的众多部件,而服务治理只是此中的一个方面。Dubbo提供了各种Filter,对于上述中“无”的要素,可以通过扩展Filter来完善。
从协议上看

Dubbo缺省协议采取单一长毗连和NIO异步通讯,适合于小数据量大并发的服务调用,以及服务消费者呆板数远大于服务提供者呆板数的情况
Spring Cloud 使用HTTP协议的REST API
dubbo支持各种通信协议,而且消费方和服务方使用长链接方式交互,通信速度上略胜Spring Cloud,如果对于系统的响应时间有严格要求,长链接更合适。
从服务依赖方式看

Dubbo服务依赖略重,需要有完善的版本管理机制,但是程序入侵少。而Spring Cloud通过Json交互,省略了版本管理的问题,但是详细字段寄义需要统一管理,自身Rest API方式交互,为跨平台调用奠基了底子。
从组件运行流程看
Dubbo
每个组件都是需要摆设在单独的服务器上,gateway用来接受前端请求、聚合服务,并批量调用背景原子服务。每个service层和单独的DB交互。
Spring Cloud
所有请求都统一通过 API 网关(Zuul)来访问内部服务。网关吸收到请求后,从注册中心(Eureka)获取可用服务。由 Ribbon 举行平衡负载后,分发到后端的详细实例。微服务之间通过 Feign 举行通信处理处罚业务。
业务摆设方式相同,都需要前置一个网关来隔绝外部直接调用原子服务的风险。Dubbo需要自己开发一套API 网关,而Spring Cloud则可以通过Zuul设置即可完成网关定制。使用方式上Spring Cloud略胜一筹。
Dubbo
Dubbo只是一个远程调用(RPC)框架
默认基于长毗连,支持多种序列化格式
Spring Cloud
框架集
提供了一整套微服务管理方案(全家桶)
1、dubbo由于是二进制的传输,占用带宽会更少
2、springCloud是http协议传输,带宽会比较多,同时使用http协议一般会使用JSON报文,消耗会更大
3、dubbo的开发难度较大,原因是dubbo的jar包依赖问题很多大型工程无法管理
4、springcloud的接口协议约定比较自由且松散,需要有强有力的行政步伐来限制接口无序升级
5、dubbo的注册中心可以选择zk,redis等,springcloud的注册中心用eureka大概Consul
 
16.gateway的动态路由如何实现?
采取redis缓存机制实现背景管理将路由设置缓存到redis中,geteway监听redis的修改事件,设置路由
1.redis设置
首先先对redis举行设置,找到redis安装目次里的redis.conf文件(没有可以自己新建大概在启动redis服务时,选择其他设置文件),在设置文件中修改这个参数
notify-keyspace-events “Kg”
2.Gateway路由设置
1.RouteDefinitionRepository接口
通过实现该接口,实现从存储器(例如,内存/Redis/MySQL等)读取、生存、删除路由设置。
因为每次url匹配到路由都会调用getRouteDefinitions,为了提高效率,路由设置不直接从redis获取,
而是从map缓存中获取。
2.路由设置map
三、实现redis监听
1.监听容器
这里我们把容器直接设置在了application类中,也可以新建一个类
2.创建监听器RedisMessageListener
该监听器继承KeyspaceEventMessageListener类,该类可以监听所有的键空间通知。
鉴听到redis中路由的修改后,将路由存到路由map缓存中,并调用publishEvent(new RefreshRoutesEvent(this)),
触发RedisRouteDefinitionRepository的getRouteDefinitions方法
17.鉴权框架的相识和使用?
spring Security简介
Spring Security是一个可以或许为基于spring的企业应用系统提供声明式的安全访问控制管理方案的安全框架。
他提供了一组可以在spring应用上下文中设置的Bean,充实使用了SpringIoc,Di(控制反转,依赖注入)和Aop(面向切面编程)功能,为应用系统提供声明式的安全访问控制功能,淘汰了为企业系统安全控制编写大量重复代码的工作
1.引入依赖在spring依赖引入的底子上,引入springSecurity依赖,版本可以使用spring的版本

2.设置web.xml文件
1.添加加载Security设置的监听器
2.注册安全认证的过滤链,这些过滤器实际是在spring容器中管理,这里只是署理注册给web容器

3.添加位置文件Spring-security.xml


4.数据库动态校验用户
用户认证类

在SpringSecurity.xml中设置:
1)注册自界说认证类,并注入到认证管理器中
2)设置加密方式
BCrypt 加密算法
  用户表的暗码通常使用 MD5 等不可逆算法加密后存储,为防止彩虹表破解更会先使用
一个特定的字符串(如域名)加密,然后再使用一个随机的 salt(盐值)加密。 特定字符
串是程序代码中固定的,salt 是每个暗码单独随机,一般给用户表加一个字段单独存储,比
较贫苦。 BCrypt 算法将 salt 随机并混入最终加密后的暗码,验证时也无需单独提供之前的
salt,从而无需单独处理处罚 salt 问题。



用户注册时的加密

5.权限设置(注解方式)

在业务层方法上通过注解@PreAuthorize,设置调用方法需要的权限: 例如:@PreAuthorize(“hasAuthority(‘PRODUCT_LIST’)”)

 
18.mybatis同时使用同一条数据该怎么管理并发问题?
乐观锁机制在一定水平上管理了这个问题。
乐观锁,大多是基于数据版本(Version)记载机制实现。
作甚数据库版本?
即为数据添加一个版本标识,在基于数据库表的版本管理方案中,一般是通过为数据库表添加一个“version”字段
来实现。
读取数据时,将此版本号一同读出,之后更新时,对此版本号加1,
此时,将提交数据的版本数据与数据库表对应记载的当前版本信息举行比对,如果提交的数据版本号大于数据库表当前
版本号,则予以更新,否则认为是逾期数据。
 
19.mybatis中传递参数有哪些方式?
1.顺序传递参数
2.注解@Param传递参数
3.使用Map聚集传递参数
4.使用JavaBean实体类传递参数
1.第一种方式 匿名参数 顺序传递参数
controller
mapper
xml
2.第二种方式 使用@Param注解
controller
mapper
使用@Param注解显示的告诉mybatis参数的名字,这样在xml中就可以按照参数名去引用了
List selectByGenderAndAge( @Param("gender") Short gender,@Param("age") String age );
xml
3.使用Map传递参数
实际开发中使用map来传递参数是一种推荐的方式
controller
mapper
可以看到使用map来传递多个参数,可以直接使用参数名称举行引用

  select * from employee where gender = #{gender} and age = #{age}

4.用过javabean传递多个参数
也可以使用bean的方式来传递多个参数,使用时parameterTyPE指定为对应的bean范例即可
传参的方式的有点是比较方便,Controller层使用@RequesBody吸收到实体类参数后,直接传递给mapper层调用即可,
不需要在举行参数的转换
controller
mapper
xml
参数的引用直接使用bean的字段

  select
  *
  from employee where gender = #{gender} and age = #{age}

5.直接使用JSON传递参数
这也是推荐的一种传参方式,controller层吸收到JSON型数据后,直接传递给mapper层举行查询使用
简单方便
6.传递聚集范例参数List/set.Array
在一些复杂的查询中(如 sql中的 in使用),传统的参数传递已无法满足需求,这时候就要用到List、Set、Array范例的参数传递,详细使用如下:
7.参数范例为对象+聚集
该类参数与java Bean参数形式雷同,只不外更复杂一些,如下面的Department类,除了根本字段还包罗一个Employee的列表
 
20.spring中bean的生命周期?
Bean 的生命周期分为单例和多例时
当 单例bean对象
1 对象创建: 当应用加载, 创建spring容器时, 对象就被创建了
2 对象存活: 只要容器存在, 对象一直存活
3 对象销毁: 当应用卸载, 销毁容器时, 对象被销毁
当多例bean对象
1 对象创建: 当使用对象时, 创建新的对象实例
2 对象存活: 只要对象在使用中, 对象一直存活
3 对象销毁: 当对象长时间不消时, 被java的垃圾回收器回收

如上图所示,Bean 的生命周期还是比较复杂的,下面来对上图每一个步调做文字形貌:

  • Spring启动,查找并加载需要被Spring管理的bean,举行Bean的实例化
  • Bean实例化后对将Bean的引入和值注入到Bean的属性中
  • 如果Bean实现了BeanNameAware接口,Spring将Bean的Id传递给setBeanName()方法
  • 如果Bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory()方法,将BeanFactory容器实例传入
  • 如果Bean实现了ApplicationContextAware接口,Spring将调用Bean的setApplicationContext()方法,将应用上下文的引用传入到bean中
  • 如果Bean实现了BeanPostProcessor接口,Spring就将调用他们的postProcessBeforeInitialization()方法
  • 如果Bean 实现了InitializingBean接口,Spring将调用他们的afterPropertiesSet()方法。雷同的,如果bean使用init-method声明白初始化方法,该方法也会被调用
  • 如果Bean 实现了BeanPostProcessor接口,Spring就将调用他们的postProcessAfterInitialization()方法
  • 此时,Bean已经准备停当,可以被应用程序使用了。他们将一直驻留在应用上下文中,直到应用上下文被销毁。
  • 如果Bean实现了DisposableBean接口,Spring将调用它的destory()接口方法,同样,如果bean使用了destory-method 声明销毁方法,该方法也会被调用
作用域有哪些?

21.怎么实现mybatis批量插入?
  1. MyBatis批量插入数据到数据库有两种方式:xml文件,注解。
复制代码
  1. 方法一:xml设置。
复制代码
  1. 最底子的是用mapping.xml设置的方式,包罗以下两种详细方式:
复制代码
  1. mapping.xml中insert语句可以写成单条插入,在调用方循环1000次
复制代码
mapping.xml中insert语句写成一次性插入一个1000的list
mapping.xml
 
  1. 方法二:注解
复制代码
注讲授明:
MyBatis提供用于插入数据的注解有两个:@insert,@InsertProvider,雷同尚有:@DeleteProvider@UpdateProvider,和@SelectProvider,
作用:
用来在实体类的Mapper类里注解生存方法的SQL语句
区别:
@Insert是直接设置SQL语句,而@InsertProvider则是通过SQL工厂类及对应的方法生产SQL语句,这种方法的利益在于,我们可以根据不同的需求生产出不同的SQL,适用性更好。

22.junit如何使用?
java语言中测试框架的名字都不相同
xUnit是一套基于测试驱动开发的测试框架
此中的断言机制:将程序预期的效果与程序运行的最终效果举行比对,确保对效果的可预知性
对此举行总结:
1.测试方法上必须使用@Test
2.测试方法必须使用 public void举行修饰
3.新建一个源代码目次来存放测试代码
4.测试类的包应该和被测试类的包一样
5.测试单元中的每个方法一定要可以或许独立测试,其方法不能有任何依赖
.如何使用JUnit单元测试


  • java 工程的使用方法
    第一步:在你需要添加Junit的工程下,右键工程
    第二步:点击configure Build Path…
    第三步:点击Add Library
    第四步:选中JUnit,点击Next
    第五步:选中JUnit library version的版本,一般选中4
    第六步:点击Finish
  • 使用焦点思想
    导入JUnit的Library,并设置其版本。maven工程也是导入依赖后,也要pom.xml的properties设置JUnit的版本。
23.spring的工厂模式如何使用?
在工厂模式中,我们并不会直接使用new来创建一个对象,而是使用一个共同的接口类来指定其实现类,这就大大低沉了系统的耦合性——我们无需改变每个调用此接口的类,而直接改变实现此接口的类即可完成软件的更新迭代
注意,设置文件中设置的需是接口的实现类,因为在工厂创建Bean的时候我们是使用接口来吸收实现类的,这样才气够实现解耦合。
24.springboot是如何对线程举行封装的?
先在设置类上加上@EnableAsync注解,然后在需要多线程支持的方法上添加@Async注解,该方法就支持多线程了
 
设置多线程

ThreadPoolTaskExecutor

SpringBoot默认情况下帮我们自动设置了ThreadPoolTaskExecutor到IOC容器中,我们需要的时候直接注入使用即可。
SpringBoot对多线程执行异步任务有了更深入的封装,我们只需要关注任务的执行流程和逻辑,不消关心如何将任务提交给线程池以及任务如何调用,这就需要用到@Async注解
1:界说任务方法

创建包com.***.***.async,在该包下创建AsyncTask类,注意需要将该类放入容器中,然后在该类中界说一个方法,在方法上添加@Async注解表明需要异步执行,最后在设置类上开启异步任务
@Component
public class AsyncTask {
    @Async("mythreadpool")
    public void myAsync(){
        System.out.println("spring boot async task test " +
        Thread.currentThread().getName());
    }
}
 
2:在启动类上添加@EnableAsync注解

@SpringBootApplication
@EnableAsync
public class ScheduleApplication {
    public static void main(String[] args) {
        SpringApplication.run(ScheduleApplication.class, args);
    }
}
 
25.springboot中starter种类有哪些?
常用应用型Starter:应用型Starter、产物级别的Starter、技能型的Starter
应用型Starter:
spring-boot-starter:                                     焦点Starter包罗auto_configuration、日志和YAML
spring-boot-starter-aop:                             使用Spring AOP和AspectJ来实现AOP功能
spring-boot-starter-cache:                         启用Spring框架的缓存功能
spring-boot-starter-data-redis:                 使用Redis 和 Spring Data Redis, 以及Jedis客户端
spring-boot-starter-data-rest:                   通过Spring Data REST来出现Spring Data 仓库
spring-boot-starter-jdbc:                         使用Tomcat JDBC毗连池来使用JDBC
spring-boot-starter-test:                         使用Junit、Hamcrest和Mockito来举行应用的测试
spring-boot-starter-thymeleaf:               在MVC应用中使用Trymeleaf视图
spring-boot-starter-web:                       使用Spring MVC来构建RESTful Web应用,并使用Tomcat作为默认内嵌容器
spring-boot-starter-web-services:        使用Spring Web Services

产物级别的Starter:
spring-boot-starter-actuator:               使用Spring Boot Actuator来提供产物级别的功能,以便资助开发人员实现应用的监控和管理

技能型的Starter:
spring-boot-starter-jetty:                     使用Jetty作为内嵌容器,可以替换spring-boot-starter-tomcat
spring-boot-starter-json:                     用于处理处罚JSON
spring-boot-starter-log4j2:                  使用Log4j2来记载日志,可以替换spring-boot-starter-logging
spring-boot-starter-logging:                默认采取Logback来记载日志
spring-boot-starter-reactor-netty:       使用Reactor Netty来作为内嵌的响应式的HTTP服务器
spring-boot-starter-tomcat:                默认使用Tomcat作为默认内嵌容器
spring-boot-starter-undertow:            使用Undertow作为内嵌容器,可以替换spring-boot-starter-tomcat
 
如何写一个springboot的starter组件?
二、基于redission(毗连redis的客户端)手写一个starter
1.创建一个工程
我这里取名为redission-spring-boot-starter
2.导入jar包
          
            org.springframework.boot
            spring-boot-starter
            2.3.1.RELEASE
            true
       
       
            org.redisson
            redisson
            3.9.0
       
spring-boot-starter:我们需要依赖springboot的jar,true:体现包的依赖不向下传递
redisson:我们用redisson 来毗连redis
3.创建设置类RedissionAutoConfiguration
4.创建properties文件类
5.创建properties文件类
6.导入生成设置提示的jar包
三、测试
1.我这里创建了一个user-service的工程,导入我们写的starter组件
2.设置我们写的starter
3编写测试类
 
26.设计一个开放接口,如何包管接口安全性?
接口的安全性主要围绕Token、Timestamp和Sign三个机制展开设计,包管接口的数据不会被窜改和重复调用,
Token授权机制:用户使用用户名暗码登录后服务器给客户端返回一个Token(通常是UUID),并将Token-UserId以键值对的形式存放在缓存服务器中。服务端吸收到请求后举行Token验证,如果Token不存在,说明请求无效。
时间戳超时机制:用户每次请求都带上当前时间的时间戳timestamp,服务端吸收到timestamp后跟当前时间举行比对,如果时间差大于一定时间(比如5分钟),则认为该请求失效,这个时间要包管足够完成本次请求的同时只管短,可以淘汰缓存服务器的压力(见签名机制)。
签名机制:将Token和时间戳加上其他请求参数就行MD5或SHA-1算法(可根据情况加点盐)加密,加密后的数据为本次请求的签名sign,并将该签名存放到缓存服务器中,超时时间设定为跟时间戳的超时时间一致(这就是为什么要只管短,二者时间一致可以包管无论在timestamp规定时间内还是外本URL都只能访问一次)。服务端吸收到请求后以同样的算法得到签名,并跟当前的签名举行比对,如果不一样,说明参数被更改过,直接返回错误标识。同一个签名只能使用一次,如果发现缓存服务器中已经存在了本次签名,则拒绝服务。
 

来源:https://blog.csdn.net/abu1216/article/details/111904806
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

发布主题

专注素材教程免费分享
全国免费热线电话

18768367769

周一至周日9:00-23:00

反馈建议

27428564@qq.com 在线QQ咨询

扫描二维码关注我们

Powered by Discuz! X3.4© 2001-2013 Comsenz Inc.( 蜀ICP备2021001884号-1 )