01. Spring Boot

  • Spring Boot Devtools:开发期工具,runtime依赖,只在运行期起作用
    • 代码变更后自动重启应用
    • 面向浏览器资源发生变化时自动刷新浏览器(LiveReload端口)
    • 自动禁用模板缓存
    • 内置H2控制台:http://localhost:8080/h2-console
  • git/gitlab
    • 纳入版本控制:功能代码,测试代码,测试脚本,构建脚本,部署脚本
    • 工作区?展存区?本地仓库?远端仓库?

02. 依赖注入(控制反转)

  • 核心技术:DI和AOP
  • Spring是一个容器
  • @Component对类进行实例化
  • @ComponentScan
  • @Autowired自动装配,将上下文中已实例化的对象注入到当前对象中,可放在构造方法/属性Setter方法/属性上
  • Bean的作用域@Scope
    • 默认为Singleton单例
    • Prototype原型,每次注入或通过上下文获取时创建新实例
    • Session会话,为每个会话创建一个bean实例
    • Request请求,为每个请求创建一个bean实例

03. AOP

  • AOP术语
    • @Aspect没有@Component注解的效果,即spring不会扫描到当前类并实例化
      • @controller,@Service,@Repository注解含有@Component
    • 通知:切面做什么、何时做(代码、@Before、@AfterReturning等)
    • 切点:何处(切点表达式,类/方法/包路径)
    • 切面:通知 + 切点
    • 连接点:方法 / 字段修改 / 构造方法,spring只支持第一种
    • 引入:动态给对象增加新的行为和状态(相对于实现一个子类)
    • 织入:
  • 切点指示器
    • @Pointcut 获取参数,限定到包路径,限定bean名称
    • @Around(“@annotation(xxx)”) 限定注解

04. Web MVC

  • lombok:只在编译期起作用,简化代码
  • SpringMVC请求映射注解:注意@RequestMapping既可以加在类也可以加在方法上面
  • 程序入口@SpringBootApplication
  • SpringWeb开发框架分层:请求-控制器层-业务层-数据访问层-数据库
    • 路径参数@PathVariable
    • 请求参数@RequestParam
    • 表单参数(默认)对应model,可用@Valid校验
    • JSON请求体@RequestBody,将json转成java对象
    • 前后端不分离:model的属性带到页面渲染中,控制器返回视图名,第三方找到模板文件路径并渲染并返回html页面
    • 前后端分离:返回json格式的数据@ResponseBody,将java对象转成json格式@RestController

05. Dao层实现

  • JDBC Template
    • 引入依赖spring-boot-starter-jdbc
    • 解决样板式代码的问题,只需提供查询逻辑
    • 需要自己定义并实现持久化接口,并维护各表之间的包含关系
    • 需要提供schema.sql文件(表结构)
  • Spring Data JDBC
    • 引入依赖spring-boot-starter-data-jdbc
    • 只需要提供持久化接口定义,不需要自行实现
    • 在实体内需要使用@Table,@Id等,定义实体类和数据库表的映射关系
    • 需要提供schema.sql文件(表结构)
  • Spring Data JPA
    • 引入依赖spring-boot-starter-data-jpa
    • 只需要提供持久化接口定义,不需要自行实现
    • 在实体内需要使用@Entity,@Id等,定义实体类和数据库表的映射关系
    • 不需要提供schema.sql文件(表结构)
    • 可以根据规则(领域特定语言/@Query声明自定义查询)自定义查询方法,无需实现
    • JPA、Hibernate 和 Spring Data JPA 的关系
      • JPA 统一了 Java 应用程序访问 ORM 框架的规范,提供了 JPQL(面向对象的查询语言)等
      • Hibernate 是 JPA 的一种实现,是一个框架
      • Spring Data JPA 是一种 JPA 的抽象层,底层依赖 Hibernate

06. Spring Security

  • 用户信息存储
    • 内存用户存储
    • JDBC用户存储
    • LDAP用户存储
  • 实现服务接口,让SpringSecurity框架调用,输入用户名,返回用户详细信息
  • 实现PasswordEncoder接口并实例化到spring上下文,决定加解密方式
  • Spring Security框架提供实现用户认证与授权
  • 针对不同url(Web请求)进行保护
    • HttpSecurity对象,对不同url实施控制配置,鉴权和控制实现由框架完成
  • 创建自定义登录页
    • 需要认证时转向登录页:.loginPage(“/login”)
    • 视图控制器定义对应视图:registry.addViewController(“/login”)
    • 登录的post请求由Spring Security自动处理,默认为username和password,可自行配置

07. 使用docker

  • docker run命令
    • 指定端口映射,-p:宿主机端口:容器端口
    • 退出时自动删除容器,–rm
    • 后台运行容器并返回容器ID,-d
    • 设定环境变量,-e ENV_NAME=”xxx”
  • 使用cat /etc/hosts命令查看容器IP地址
  • docker管理命令
    • 管理:卷volume,网络network,容器container,镜像image
  • 停止运行中的容器:docker stop(可重新启动)

08. 容器镜像构建与编排

  • dockerfile文件的指令

    • RUN:构建镜像时执行的命令
    • ADD:将本地文件添加到容器中,tar文件自动解压
    • COPY:与ADD类似但不会自动解压文件
    • CMD:构建容器后调用(只有在容器启动时才能调用)
    • ENTRYPOINT:配置容器使其可执行化,配合CMD可省去“application”只使用参数,用于docker run时根据不同参数执行不同功能
  • docker build

    • 编写dockerfile最佳实践
      • 使用.dockerignore文件(在创建镜像时排除不需要的文件)
      • 容器只运行单个应用(利于管理)
      • 将多个RUN指令合并为一个(减少镜像的分层)
      • 基础镜像的标签不要用latest
      • 每个RUN指令后删除多余文件
      • 选择合适的基础镜像(alpha版本最好)
      • 设置WORKDIR和CMD
  • 服务编排工具docker-compose

    • 服务service:一个应用对应的容器(可能多个)
    • 项目project:一组关联的应用容器组成的完整的业务单元,在docker-compose.yml中定义
  • YAML文件

    • 用缩进表示层级关系
    • 不允许使用tab键,只能使用空格
    • 使用“#”表示注释
    • 使用冒号结构表示对象 / 键值对:a:b,a:{b:c,d:e}
    • 使用一组连词线“-”开头的行构成一个数组
    • 使用行内表示法在一行中表示数组:a:[b,c,d,e]
  • docker-compose常用命令

    • docker-compose ps:只呈现当前目录下docker-compose.yml文件所部署的容器,不是所有的容器,docker-compose images同理

    • docker-compose logs -f [services…]:查看容器输出日志

09. 使用k8s

  • k8s中的资源
    • pod:k8s中调度的最小单元,支持多容器在pod中共享网络和文件系统
      • 共享:PID命名,network命名空间,IPC命名空间,UTS命名空间,volume
    • ingress
    • service
    • deployment
  • 访问部署在k8s中的服务
    • 将pod或service的端口映射到本机端口(用于调试)
      • kubectl port-forward pod/myspittr 8081:8080
      • kubectl port-forward service/demo 8081:80
    • 创建ingress,通过路由访问部署在k8s中的服务
    • 使用curl工具访问部署在k8s中的服务
      • kubectl run -i -t –rm=true mycurl –image=xxx -restart=Never –command –sh
  • 服务通过label来找到对应的pod
  • 自动伸缩(个数区间)
    • kubectl autoscale deployment spittr –min=10 –max=15 –cpu-percent=80
  • 理解k8s中的service与中nacos的service的异同点
    • 通过一个服务名来访问多个动态的服务实例/pod
    • nacos的服务注册与发现与k8s的service可以二选一
    • nacos维护每个服务的元数据,服务的部署启动等需要借助底层的k8s

10. REST服务、微服务开发与部署

  • 微服务架构模式的特征
    • 应用程序分解为具有明确定义了职责范围的细粒度组件
    • 完全独立部署,独立测试,并可复用
    • 使用轻量级通信协议,HTTP和JSON,松耦合
    • 服务实现可使用多种编程语言和技术
    • 将大型团队划分成多个小型开发团队,每个团队只负责他们各自的服务
  • 状态码
    • 1xx:表示服务器已接收了客户端的请求,客户端可以继续发送请求
    • 2xx:表示服务器已成功接收到请求并进行处理
    • 3xx:表示服务器要求客户端重定向
    • 4xx:表示客户端的请求有非法内容
    • 5xx:标识服务器未能正常处理客户端的请求而出现意外错误
  • 健康检查:添加actuator依赖
    • localhost:8080/actuator/health
  • 运维实践
    • 除配置数据外,都在源代码库中
    • 指定JAR依赖的版本号
    • 配置与源代码分开,放在nacos中
    • 已构建的服务是不可变的,不能再被修改
    • 微服务应该是无状态的
    • 并发,通过启动更多的微服务实例横向扩展,多线程是纵向扩展

11. 基于nacos的数据配置

  • 基于nacos的配置管理来进行微服务开发
    • 添加依赖spring-cloud-starter-alibaba-nacos-config
    • 在bootstrap.yml中定义nacos的访问地址、文件后缀名、服务名(用来组合dataId)
    • 在ServiceConfig代码中获取某个属性的值@Value,及时获取最新配置数据@RefreshScope
  • dataId的完整格式
    • ${prefix}-$(spring.profiles.active).${file-extension}
    • prefix默认为spring.application.name的值,也可以通过配置项spring.cloud.nacos.config.prefix来配置,spring.profiles.active即为当前环境对应的profile
    • file-exetension为配置内容的数据格式,可以通过配置项spring.cloud.nacosconfig.file- extension来配置,目前只支持properties和yaml类型

12. 基于nacos的服务注册与发现

  • 服务发现的好处
    • 快速水平伸缩,而不是垂直伸缩,不影响客户端
    • 提高应用程序的弹性
  • spring cloud alibaba家族(spring cloud子项目)
    • nacos
    • sentinel
  • 使用到的starter依赖
    • 服务配置: com.alibaba.cloud, spring-cloud-starter alibaba-nacos-config
    • 服务注册: com.alibaba.cloud, spring-cloud-starter alibaba-nacos-discovery
    • 客户端负载均衡: org.springframework.cloud, spring-cloud-starter-loadbalancer
    • 简化客户端调用: org.springframework.cloud, spring-cloud-starter-openfeign
  • 调用服务的三种方式
    • Spring DiscoveryClient
    • 使用支持LoadBalanced的RestTemplate(可自动实现负载均衡)
    • 使用OpenFeign (@FeignClient)(可自动实现负载均衡)
      • OpenFeign是一 款造明式、模板化的HTTP客户端, Feign可以帮助我们更快捷、 优雅地调用HTTP API
  • 健康检查的机制
    • 临时实例的客户端主动上报机制,临时实例每隔5s发送一个心跳包给Nacos服务器端
    • 永久实例的服务端反向探测机制,永久实例支持3种探测协议, TCP、HTTP 和MySQL,默认探测协议为TCP,也就是通过不断ping的方式来判断实例是否健康
  • 服务部署
    • A向nacos获得B的IP地址和端口号,直接调用B
  • 实现基于nacos的服务注册与发现
    • 添加依赖com.alibaba.cloud, spring-cloud-starter alibaba-nacos-discovery;com.alibaba.cloud, spring-cloud-starter alibaba-nacos-config;org.springframework.cloud, spring-cloud-starter-openfeign;org.springframework.cloud, spring-cloud-starter-loadbalancer
    • 在bootstrap.yml中定义nacos的访问地址
    • 在启动类中添加注解@EnableFeignClients,@EnableDiscoveryClient
    • 定义接口并添加注解@FeignClient(“<服务名>”)
    • 将定义的接口注入并调用

13. 基于sentinel的流控与熔断

  • 定义资源
    • 代码直接定义
    • 使用注释定义
    • 自动定义
    • 外置的文件只能定义规则不能定义资源
  • 规则的种类
    • 流量控制
    • 熔断降级
    • 系统保护
    • 来源访问控制
    • 热点参数
  • 熔断异常
    • blockException
  • 熔断处理
    • 针对耗时长 / 业务本身的异常
  • sentinel的组成
    • 控制台
    • 服务核心库(java客户端)