Loading . . .

服务端开发复习


多选

写在前面

十分十分建议去看一下《Spring 实战》这本书,这里指路第四版的网页端,写的非常清楚,适合初学者

https://potoyang.gitbook.io/spring-in-action-v4/

  1. spring不仅支持自己的开发框架,同时支持第三方开发框架

  2. AOP 横切关注点 包括 日志 安全 事务 缓存

  3. AOP 通知 advice 注解

    • @Before 在目标方法被调用之前调用通知功能
    • @After 在目标方法完成之后调用通知,此时不会关心方法的输出是什么
    • @AfterReturning 在目标方法成功执行之后调用通知
    • @AfterThrowing 在目标方法抛出异常后调用通知
    • @Around 通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为。
  4. AOP生效加什么注解

    • @EnableAspectJAutoProxy //开启AspectJ的自动代理机制
  5. 提到过一些注解,有些注解具备component的能力 controller repository service

  6. @Aspect

    • 作用是把当前类标识为一个切面供容器读取
    • 加注解的普通POJO
    • 定义可重用的切点
    • Around通知
    • 定义参数(CD),测试
  7. 在实现控制器的时候有个requestmapping 是否只能加在方法上? 否

    • 标注在类级别上
      • value 相当于一个命名空间
    • 标注在方法级别上
  8. 启动springmvc使用的注解

    • @EnableWebMvc
  9. 控制器方法实现的时候

    • 可以返回一个视图的名字
    • 可以返回一个rest的对应Java对象,对对象进行json转换
    • 能进行重定向(使用redirect:前缀)
  10. 数据源 定义数据源jdbc drivermanagerdatasource 没有做池化处理

  11. 没有把数据源写在代码中,希望在生产环境中切换的话使用@Profile注解,写在配置文件中

  12. 业务层和持久层用接口隔离,业务层看到数据访问层的接口,隔离的好处是?

    • 便于测试
    • 便于更换数据源
    • 调用方便
    • 解除耦合
  13. hybernate 基于hybernate开发访问数据库的代码,目标是获得session,拿到session接口才能访问

  14. hybernate使用需要定义数据对象与数据库表的映射关系

    • xml
    • 用注解定义表的关系
  15. hql查询语言,hybernate支持标准sql查询

    • HQL:hibernate query language,即hibernate提供的面向对象的查询语言
      • select/update/delete…… from …… where …… group by …… having …… order by …… asc/desc
    • QBC查询: query by criteria 完全面向对象的查询
    • 本地SQL查询
  16. jpa实现数据访问的时候,必须定义数据对象和数据表映射关系

    • @Entity、@Column
  17. 关于jpa,springdata提供jpa简化实现,关于springdatajpa 如何开发这个

    • 加什么注解
      • @EnableJpaRepositories 注解
    • 定义什么接口
      • JpaRepository
    • 实现一个自己查询逻辑的话,自己实现类的命名怎么命名
      • 定义查询方法,无需实现
        • 领域特定语言(domain-specific language,DSL),spring data的命名约定
        • 查询动词 + 主题 + 断言
        • 查询动词:get、read、find、count
      • 声明自定义查询
        • 不符合方法命名约定时,或者命名太长时
        • @Query(“select …”)
      • 使用EntityManager直接低层实现
        • 接口名+Impl的实现类
    • 要不要接口名把方法原型重写一遍
      • 不要
    • 继承了什么接口
      • JpaRepository
  18. cuid

  19. mongodb,需要使用一个注解 document

    • @Document注解是java对象定义的,来自于Java元注解
  20. mongodb存储数据,对数据做操作,java对象不需要序列化

  21. connection as

  22. 关系型数据库的对应关系

    • 以行和列的形式存储数据,行和列的形式被称为表,表是由一组相关实体组成的集合。一组表组成了数据库。
    • 表中的一行称为关系的一个元组,用来存储事物的一个实例;
    • 表中的一列称为关系的一个属性,用来描述实体的某一特征。
  23. mongodb shell 基于JavaScript的,可以写一些脚本

  24. redis 的特点,支持的数据类型

    • Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
    • Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
    • Redis支持数据的备份,即master-slave模式的数据备份。
  25. Ehcache和redis的区别

    • ehcache直接在jvm虚拟机中缓存,速度快,效率高;但是缓存共享麻烦,集群分布式应用不方便。
      redis是通过socket访问到缓存服务,效率比ecache低,比数据库要快很多,处理集群和分布式缓存方便,有成熟的方案。
    • redis属于独立的运行程序,Ehcache与java程序绑定在一起
  26. 为什么用Ehcache

    • 为了使程序用起来感觉很快,引入Ehcache可以减少对数据库的访问。
    • 简单、袖珍、轻量
  27. Ehcache支不支持数据持久化

    • 支持
  28. 使用缓存编程几个常用的注解

    • @EnableCaching 启用注解驱动的缓存
    • @Cacheable 表明 Spring 在调用方法之前,首先应该在缓存中查找方法的返回值。如果这个值能够找到,就会返回缓存的值。否则的话,这个方法就会被调用,返回值会放到缓存之中
    • @CachePut 表明 Spring 应该将方法的返回值放到缓存中。在方法的调用前并不会检查缓存,方法始终都会被调用
    • @CacheEvict 表明 Spring 应该在缓存中清除一个或多个条目
    • @Caching 这是一个分组的注解,能够同时应用多个其他的缓存注解
  29. 关于容器,容器和虚拟机的区别

    • 容器是与主机共享资源的独立进程。
    • 与虚拟机不同,容器不会虚拟化硬件,也不需要客户操作系统。
    • 在容器中,运行应用程序所需的必要组件都打包为单个映像,可重复使用。
    • 执行映像时,它在隔离环境中运行,不共享内存、CPU 或主机操作系统磁盘。这可以保证容器内的进程无法监视容器外的任何进程。
  30. docker run 常用命令参数 -P -d等

    • -d: 后台运行容器,并返回容器ID
    • -i: 以交互模式运行容器,通常与 -t 同时使用
    • -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用
    • -p: 指定(发布)端口映射,格式为:主机(宿主)端口:容器端口
    • -P: 随机端口映射,容器内部端口随机映射到主机的高端口
    • –name=”nginx-lb”: 为容器指定一个名称
    • -e username=”ritchie”: 设置环境变量
    • –env-file=c:/temp1/t.txt: 从指定文件读入环境变量
    • –expose=2000-2002: 开放(暴露)一个端口或一组端口;
    • –link my-mysql:taozs : 添加链接到另一个容器
    • -v c:/temp1:/data: 绑定一个卷(volume)
    • –rm 退出时自动删除容器
  31. docker 几个管理的命令,哪四个管理的命令

    • docker container –help
    • docker –version
    • docker version
    • docker info
    • docker image ls
    • docker pull
  32. spring boot和spring cloud 的关系是什么

    • Spring Boot提供了基于java的、面向REST的微服务框架

      Spring Cloud使实施和部署微服务到私有云或公有云变得更加简单

  33. 实现配置服务的时候,配置服务本身基于springboot开发,实现zuul服务

  34. springcloud解决的问题

    • 使得实施和部署微服务到私有云或者公有云变得更加简单
  35. 当一个服务需要去获取配置数据的时候,需要向配置服务要数据,配置服务如何知道要的是哪个文件的数据

    • 服务名和profile
  36. 实现配置服务的时候,在启动类上加什么注解 ,使用配置服务的服务端和客户端什么都不需要加

    • @SpringBootApplication
      @EnableConfigServer
  37. 服务网关处,可以实现什么样的能力

    • 验证和授权
    • 静态路由
    • 动态路由
    • 度量数据收集和日志记录

简答

  • WEB MVC 分层

    • 模型(Model)代表数据控制器。数据的读取,插入,更新都是由模型来负责。
    • 视图(View)是展示给用户的最终页面。视图负责将数据以用户友好的形式展现出来。
    • 控制器(Controller)是模型,视图以及其他任何处理 HTTP 请求所必须的资源之前的中介

    处理流程

    • 控制器最先被调用,并被赋予外部输入
    • 控制器根据外部输入向模型请求数据
    • 模型从数据库获取数据并发送数据到控制器
    • 控制器处理该数据并发送封装好的数据到视图
    • 视图根据接到的数据最终展示页面给用户浏览
  • 处理请求的过程

    1. 在请求离开浏览器时,会带有用户所请求内容的信息,至少会包含请求的 URL。但是还可能带有其他的信息,例如用户提交的表单信息。
    2. 请求到达DispatcherServlet,DispatcherServlet 会查询一个或多个处理器映射(handler mapping)来确定请求的下一站在哪里,处理器映射(handler mapping)会根据请求所携带的 URL 信息来进行决策。
    3. 根据mapping选择合适的控制器,DispatcherServlet 会将请求发送给选中的控制器。到了控制器,请求会卸下其负载(用户提交的信息)并耐心等待控制器处理这些信息。
    4. 控制器在完成逻辑处理后,通常会产生一些信息,这些信息需要返回给用户并在浏览器上显示。这些信息被称为模型(model)。控制器所做的最后一件事就是将模型数据打包,并且标示出用于渲染输出的视图名。它接下来会将请求连同模型和视图名发送回 DispatcherServlet 。
    5. DispatcherServlet 将会使用视图解析器(view resolver) 来将逻辑视图名匹配为一个特定的视图实现,它可能是也可能不是 JSP。
    6. 请求的最后一站是视图的实现(可能是 JSP),在这里它交付模型数据。请求的任务就完成了。
    7. 视图将使用模型数据渲染输出,这个输出会通过响应对象传递给客户端。
  • 微服务相比于传统的单体业务有什么优势,为何关注微服务,有什么典型特征,单体有什么不足

    优势

    • 易于开发与维护
    • 独立部署
    • 伸缩性强
    • 与组织结构相匹配

    为何关注微服务

    • 多人开发一个模块/项目,提交代码频繁出现大量冲突。
    • 模块间严重耦合,互相依赖,每次变动需要牵扯多个团队,单次上线需求太多,风险大。
    • 主要业务和次要业务耦合,横向扩展流程复杂。

    微服务典型特征

    • 容易被替换和升级。
    • 职责独立完整。
    • 可选择最适合自己的技术方案。
    • 架构由层次化转向扁平化。

    单体架构的不足

    • 数据库的表对所有模块可见
    • 一个人的修改整个应用都要重新构建、测试、部署
    • 整体复制分布式部署,不能拆分按需部署
  • 服务注册与发现的好处,zuul 等在微服务中的作用与关系

    好处

    • 快速水平伸缩,而不是垂直伸缩。不影响客户端
    • 提高应用程序的弹性

    Eureka作用

    • 服务端用于服务信息的注册
    • 客户端用服务名字从server那获得示例的端口号、IP等信息
    • 客户端拿到之后可以进行访问服务端的资源

    关系

    • Eureka,用于服务发现
    • Ribbon,主要提供客户侧的软件负载均衡算法
    • Zuul使用了一系列不同类型的过滤器,使我们能够快速灵活地将功能应用到服务中。
    • Feign和Ribbon 是 Spring Cloud 的 Netflix 中提供的两个实现软负载均衡的组件,Ribbon 和 Feign 都是用于调用其他服务的,方式不同。Feign 则是在 Ribbon 的基础上进行了一次改进,采用接口的方式,将需要调用的其他服务的方法定义成抽象方法即可,不需要自己构建 http 请求。
  • 4种客户端弹性模式

  • 客户端负载均衡(client load banlance)模式

    • Ribbon提供的负载均衡器,帮助发现问题,并删除实例
  • 断路器模式(Circuit Breaker Patten)

    • 监视调用失败的次数,快速失败
  • 后备(fallback)模式

    • 远程服务调用失败,执行替代代码路径
  • 舱壁隔离模式(Bulkhead Isolation Pattern)

    • 线程池充当服务的舱壁

文章作者: Lhtian
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Lhtian !
  目录