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只支持第一种
- 引入:动态给对象增加新的行为和状态(相对于实现一个子类)
- 织入:
- @Aspect没有@Component注解的效果,即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
- 编写dockerfile最佳实践
服务编排工具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
- pod:k8s中调度的最小单元,支持多容器在pod中共享网络和文件系统
- 访问部署在k8s中的服务
- 将pod或service的端口映射到本机端口(用于调试)
- kubectl port-forward pod/myspittr 8081:8080
- kubectl port-forward service/demo 8081:80
- 创建ingress,通过路由访问部署在k8s中的服务
- kubectl create ingress myspittr –class=nginx –rule=www.demo.com/*=myspittr:8080
- 使用curl工具访问部署在k8s中的服务
- kubectl run -i -t –rm=true mycurl –image=xxx -restart=Never –command –sh
- 将pod或service的端口映射到本机端口(用于调试)
- 服务通过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客户端)