springboot学习笔记
微服务开发
springboot
什么是springboot?
springboot是在spring的基础上构建的一个更加智能化的容器,它可以让我们更加轻松的去搭建我们的开发环境,把Java和web的开发融合成一个模式,都是通过main方法作为程序的入口,开发人员不需要进行样板化的配置,只需要导入相关的类,进行正确的接口配置,即可保证系统正常运行
微服务架构
所谓微服务架构,就是打破原来的all-in-one的架构方式,把原来的功能元素独立出来,进行动态组合,需要的功能元素才拿出来组合,可以用多个相同的功能元素,所有微服务架构是对功能元素进行复制,而没有对整个应用进行复制。
优点
- 节省了调用资源
- 每个功能元素的服务都是一个可替换的,可独立升级的软件代码
第一个springboot程序
官方:提供了一个快速生成的网站,idea集成了这个网站
- 在idea官网上集成,然后导入项目
- 直接在idea中创建一个springboot项目(一般开发都直接在idea中创建)
配置如何编写(yml)
server.port=8081
banner.txt(springboot banner在线生成工具)
自动装配原理(重点)
原理初探
pom.xml
- spring-boot-dependices:核心依赖在父工程中
- 我们在写或者引入一些springboot依赖的时候,不需要指定版本,就因为有这些版本库
启动器
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
启动器:说白了就是springboot的启动场景
比如spring-boot-starter-web,他会帮我们自动导入web环境的所有依赖
springboot会将所有的功能场景变成一个个的启动器
我们需要使用什么功能,只需要找到对应的启动器
主程序
//程序的主入口
//@SpringBootApplication:标注这个类是一个springboot的应用;启动类下所有资源导入
@SpringBootApplication
public class Demo1Application {
//将springboot启动
public static void main(String[] args) {
SpringApplication.run(Demo1Application.class, args);
}
}
-
注解
-
@SpringBootConfiguration springboot的配置 @configuration spring配置类 @component 说明这也是spring的组件 @EnableAutoConfiguration 自动配置 @EnableAutoConfiguration 自动配置包 @Import({Registrar.class}) 导入选择器,包注册 @Import({AutoConfigurationImportSelector.class}) 自动配置导入选择 //获取所有的配置 List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes); //获取候选的配置 protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) { List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader()); Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct."); return configurations; }
- spring boot所有的自动配置,都是在启动的时候扫描并加载,spring.factories(resource)所有的配置加载类都在这里面,但是不一定生效,要判断条件是否成立,只要导入了对应的start,就有了对应的启动器,有了启动器,自动装配就会生效,就会配置成功!
-
- springboot在启动的时候,从类路径/META-INF/spring.factories获取指定的值;
- 将这些自动配置的类导入容器,自动配置就会生效,帮我们自动配置
- 以前我们需要配置的东西,现在springboot帮我们配置了
- 整合javaEE,解决方案和自动配置的东西都在spring-boot-autoconfigure-2.6.4.jar这个包下
- 它会把所有需要导入的组件,以类名的方式返回,这些组件就会被添加到容器
- 容器中也会存在很多的XXXautoConfiguration的文件,就是这些类给容器中导入了场景所需要的所有组件,并自动配置
- 有了自动配置,免去了我们手动编写配置文件
-
启动类(SpringBootAplication)
- 判断应用的类型是普通的项目还是Web项目
- 查找并加载所有可用初始化器,,设置到initializers属性中
- 找出所有的应用程序监听器,设置到listeners属性中
- 推断并设置main方法的定义类,找到运行的主类
-
run方法
- 启动监听器,获取上下文
springboot配置
springboot.properties中可配置的东西(除了导出.properties,还可以导出为.yml)
- yml中对空格的要求很高
spring:
servlet:
multipart:
enabled: true
max-file-size: 50MB
max-request-size: 50MB
profiles:
active: dev
thymeleaf:
cache: false
encoding: UTF-8
mode: LEGACYHTML5
content-type: text/html
prefix: classpath:/templates/
suffix: .html
datasource:
url: jdbc:mysql://localhost:3306/tianrun?characterEncoding=utf8&useSSL=false
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
JSR303校验
JSR是Java Specification Requests的缩写,意思是Java 规范提案。是指向JCP(Java Community Process)提出新增一个标准化技术规范的正式请求。任何人都可以提交JSR,以向Java平台增添新的API和服务。JSR已成为Java界的一个重要标准。
松散绑定:yml中的last-name和lastName是一样的,这就是松散绑定
结论
- 配置yml和配置properties都可以取到值,强烈推荐yml
- 如果我们在某个业务中,只需要获取配置文件中的某个值,可以使用以下@value
- 如果说,我们专门编写一个JavaBean来和配置文件进行映射,就可以使用@configurationProperties,
@Validated//数据校验
@lombok(实体类注解,可省去get,set方法及构造函数的书写)
多环境配置及配置文件位置
spring.profiles.active=dev 是springboot的多环境配置,可以选择激活哪一个配置文件
yml文件中可以配置多环境,用---分开即可
自动配置原理再讲解
每一个这样的xxxAutoConfiguration类都是容器中的一个组件,最后加入到容器中;用他们来做自动配置;
可以通过debug=true来查看自动配置了哪些类
集成web开发,业务的核心
导入静态资源
public void addResourceHandlers(ResourceHandlerRegistry registry) {
if (!this.resourceProperties.isAddMappings()) {
logger.debug("Default resource handling disabled");
} else {
Duration cachePeriod = this.resourceProperties.getCache().getPeriod();
CacheControl cacheControl = this.resourceProperties.getCache().getCachecontrol().toHttpCacheControl();
if (!registry.hasMappingForPattern("/webjars/**")) {
this.customizeResourceHandlerRegistration(registry.addResourceHandler(new String[]{"/webjars/**"}).addResourceLocations(new String[]{"classpath:/META-INF/resources/webjars/"}).setCachePeriod(this.getSeconds(cachePeriod)).setCacheControl(cacheControl));
}
String staticPathPattern = this.mvcProperties.getStaticPathPattern();
if (!registry.hasMappingForPattern(staticPathPattern)) {
this.customizeResourceHandlerRegistration(registry.addResourceHandler(new String[]{staticPathPattern}).addResourceLocations(getResourceLocations(this.resourceProperties.getStaticLocations())).setCachePeriod(this.getSeconds(cachePeriod)).setCacheControl(cacheControl));
}
}
}
总结
- 在springboot,我们可以使用以下方式处理静态资源
- webjars localhost://8080
- public ,static,/**,resource localhost://8080
- 优先级:resource>static(默认)>public
首页图标定制
//关闭默认图标
spring:
mvc:
favicon:
enabled: false
图标定制可命名为favicon.ico,springboot可以自动寻找图片,并将该图片设置为图标,建议放在resources/public下;
首页也建议放到resources/template下;
thymeleaf模板引擎
- 导入thymeleaf依赖
- 页面引入
MVC装配原理
//如果你想diy一些定制化的功能,只要写这个组件,然后将他交给springboot
//扩展springmvc
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
//ViewResolver 实现了视图解析器接口的类,我们就可以把它看作视图解析器
/*@Override
public void addInterceptors(InterceptorRegistry registry) {
WebMvcConfigurer.super.addInterceptors(registry);
}*/
@Bean
public ViewResolver MyViewResolver(){
return new MyViewResolver();
}
//自定义了一个自己的视图解析器
public static class MyViewResolver implements ViewResolver{
@Override
public View resolveViewName(String s, Locale locale) throws Exception {
return null;
}
}
}
扩展springmvc
//如果我们要扩展spring mvc,官方建议这样去做
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
//ViewResolver 实现了视图解析器接口的类,我们就可以把它看作视图解析器
/*@Override
public void addInterceptors(InterceptorRegistry registry) {
WebMvcConfigurer.super.addInterceptors(registry);
}*/
@Bean
public ViewResolver MyViewResolver(){
return new MyViewResolver();
}
@EnableWebMvc//这个东西导入了一个类:DelegationgWebmvcConfiguration,从容器中获取所有的webmvcconfig;最好不要加这个注解,否则springboot将退出自动装配,所有自动装配全部崩盘!
在springboor,有很多的xxx Configuration帮助我们进行组件的扩展
首页和页面国际化
首页:导入thymeleaf包,所有静态资源都交给thymeleaf接管
server.servlet.context-path=/petshop--------首页地址栏
国际化:在resource下新建i18n,文件下分别建login.properties和login_zh_CN.properties,login_en_Us.properties;
可视化配置
spring.messages.basename=i18n.login
实现了国际化的接口,它就是一个国际化软件
public class MyLocaleResolver implements LocaleResolver {
//解析请求
@Override
public Locale resolveLocale(HttpServletRequest httpServletRequest) {
//获取请求中的语言参数
String language=httpServletRequest.getParameter("l");
Locale locale=Locale.getDefault();//没有就使用默认的
//如果语言参数不为空
if(!StringUtils.isNullOrEmpty(language)){
//zh_CN
String[] split=language.split("_");
//国家,地区
locale=new Locale(split[0],split[1]);
}
return locale;
}
首页国际化
- 我们需要配置i18n文件
- 我们如果在项目中进行按钮自动切换,我们需要定义一个组件LocaleResolver
- 记得将自己写的组件配置到spring容器中@Bean
-
{}
themleaf三元运算符:th:if="${!not #strings.isEmpty(msg)}"//如果不为空显示
登录拦截器
- 继承handlerInterceptor
页面展示
- 1.提取公共部分
- th:framwork
- th:instruct//th:reapace="~{ }"
- 可以传递参数,可以使用()传参,接收判断即可
集成数据库Druid(德鲁伊)
简介
阿里巴巴开源平台上一个数据库连接池实现
可以很好的监控DB连接池和SQL的执行情况,天生就是针对监控而生的DB连接池
spring boot2.0以上都使用hikari
Druid和Hikari是当前Java Web上最优秀的数据源
shiro
1.shiro简介
-
什么是shiro
-
apache shiro是Java的一个安全(权限)框架
-
shiro可以很容易的开发出好的引用,不仅可以用在JavaSE环境,还可以用在JavaEE环境
-
shiro可以完成,认证,授权,加密,会话管理,web集成,缓存等
-
下载地址:https://shiro.apache.org/
-
gethub下载:git clone https://github.com/apache/shiro.git
-
导入文件
-
配置依赖
-
hello shiro
javasource中写xml和ini文件
写Java文件
Subject currentUser = SecurityUtils.getSubject();
Session session = currentUser.getSession();
currentUser.isAuthenticated()
currentUser.getPrincipal()
currentUser.hasRole()
currentUser.isPermitted()
currentUser.logout();
spring boot中集成shiro
添加springboot项目
加入themleaf的依赖
<!--thymeleaf依赖-->
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring5</artifactId>
</dependency>
<dependency>
<groupId>org.thymeleaf.extras</groupId>
<artifactId>thymeleaf-extras-java8time</artifactId>
</dependency>
html文件中写themleaf,需要写:
<html lang="en" xmlns:th="http://www.thymeleaf.org">
模板中使用shiro
xmlns:th="http://www.thymeleaf.org"
xmlns:sec="http://www.thymeleaf.org/extras/spring-security"
xmlns:shiro="http://www.pollix.at/thymeleaf/shiro"
<html lang="en" xmlns:th="http://www.thymeleaf.org"
xmlns:sec="http://www.thymeleaf.org/extras/spring-security"
xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
springboot2.0之后favicon.ico写在html首页中,不再在resource目录下编写
<link rel="icon" th:href="@{/public/favicon.ico}" type="image/x-icon"/>
<link rel="bookmark" th:href="@{/public/favicon.ico}" type="image/x-icon"/>
<!--shiro整合spring的包-->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.8.0</version>
</dependency>
邮件任务
需要开启pop3/smtp服务:agrzqlbysavm****died
@Async异步任务注解
@Scheduled(cron=0 * * * * 0-7)定时任务注解
springboot整合redis
springboot的所有配置类,都会有一个自动配置类
自动配置类都会绑定一个propertise文件
1.池化优势
避免频繁的连接创建、释放的性能开销
通过复用方式提高响应速度
资源的分配、通过连接次更好的管理资源
2.什么是池化
池化技术 (Pool) 是一种很常见的编程技巧,在请求量大时能明显优化应用性能,降低系统频繁建连的资源开销。我们日常工作中常见的有数据库连接池、线程池、对象池等,它们的特点都是将 “昂贵的”、“费时的” 的资源维护在一个特定的 “池子” 中,规定其最小连接数、最大连接数、阻塞队列等配置,方便进行统一管理和复用,通常还会附带一些探活机制、强制回收、监控一类的配套功能。
分布式开发:Dubbo+zookeeper
zookeeper:注册中心
dubbo-admin:是一个监控管理后台,查看我们注册了哪些服务,哪些服务被消费了
dubbo:jar包~
步骤:
前提:zookeeper服务已开启
1.提供者提供服务
-
导入jar包
-
<!--dubbo--> <dependency> <groupId>io.dubbo.springboot</groupId> <artifactId>spring-boot-starter-dubbo</artifactId> <version>1.0.0</version> </dependency> <!--zkclient zookeeper--> <dependency> <groupId>com.github.sgroschupf</groupId> <artifactId>zkclient</artifactId> <version>0.1</version> </dependency> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>5.2.1</version> </dependency> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-recipes</artifactId> <version>5.2.1</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>2.0.0-alpha6</version> </dependency>
-
配置注册中心地址,以及服务发现名,和要扫描的包
-
在想要被注册的服务上面,添加一个注解@Service
2.消费者如何消费
- 导入依赖
- 配置注册中心的地址,以及自己的服务名
- 从远程注入服务@Reference
swagger:接口文档
任务调度
SpringSecurity:shiro
主要做认证,授权(vip1,vip2,vip3)
功能权限,访问权限,菜单权限
拦截器,过滤器,原生代码,冗余
springcloud
微服务
微服务架构问题
- 客户端该如何去访问
- 服务之间如何通信
- 如何治理
- 服务挂了怎么办???
解决方案:
springcloud:一套生态圈,基于springboot发展而来
微服务全套技术栈:
分布式架构:
-
分布式就是把服务作拆分,服务集群调用关系太复杂,依靠人很难完成,注册中心营运而生
-
微服务越多,配置管理复杂,需要依靠配置中心
-
服务网关请求路由
-
负载均衡
-
分布式缓存,缓存可以加快存储效率,分布式搜索,消息队列
-
异步通信加大并发,加快效率
-
分布式日志服务
-
系统监控和链路追踪
展望
将来的微服务集群需要自动化部署jenkins,docker(镜像),kubernetes,rancher
传统单体框架
微服务架构
eureka注册中心
ribbon负载均衡
nacos单体架构,将业务的所有业务功能集中在一个项目中开发,打成一个包部署
架构简单
部署成本低
缺点:耦合度高**大型项目 **
一定会做分布式架构
根据业务功能做拆分
优点:
耦合度低
有利于服务升级拓展
难度大,适合大型互联网项目服务治理
微服务治理一种经过良好架构设计的分布式架构方案
特点:单一职责,每一个服务对应唯一的业务能力,做到单一职责,避免重复业务开发
对外暴露接口
团队独立,技术独立,数据独立,部署独立
隔离性强,避免出现出现联级错误微服务落地技术
springcloud dubbo
服务拆分形成集群,,通过注册中心管理,配置中心进行配置springcloud并不是一项新技术,只是将各个公司的开源工具做了一个整合
dubbo 2012年开源 springcloud springcloudalibaba 注册中心 zookeeper,redis Eureka,Consul nacos,eureka 服务远程调用 dubbo协议 每一个 feign(http协议) dubbo/feign 配置中心 无 springcloudConfig springcloudconfig,nacos 服务网关 无 springcloudGateway/zuul springcloudgateaway/zuul 服务监控和保护 dubbo-admin,功能弱 hystrix sentinel springcloud+frign 使用springcloud技术栈,restfull接口风格,feign服务调用方式 springcloudalibaba+frign springcloudalibaba restfull feign springcloudalibaba+dubbo springcloudalibaba dubbo dubbo dubbo 原始模式 dubbo,dubbo,dubbo 目前,又提出了一种解决方案 服务网格:下一代微服务标准,Server Mesh 代表方案:istio
springcloud入门
restful
Eureka
Ribbon
Feign
Hystrix
zuul 路由网关
SpringCloud config:git
haoop
Hadoop 是什么???本质:本质上是一个开源代码框架(apache组织)。是一个开发和运行处理大规模数据的软件平台。允许使用简单的编程模型在大量计算机集群上对大型数据集进行分布式的处理。
语言:Hadoop是使用面向对象的语言 Java编写的,所以也具有易扩展的特性。
用途:将单机的工作任务进行分拆,变成协同工作的集群。用以解决日益增加的文件存储量和数据量瓶颈。
通俗应用解释:
比如计算一个100M的文本文件中的单词的个数,这个文本文件有若干行,每行有若干个单词,每行的单词与单词之间都是以空格键分开的。对于处理这种100M量级数据的计算任务,把这个100M的文件拷贝到自己的电脑上,然后写个计算程序就能完成计算。
下面计算一个1T(1024G)的文本文件中的单词的个数。再后来,又接到一个任务,计算一个1P(1024T)的文本文件中的单词的个数……
面对这样大规模的数据,自己那一台计算机已经存储不下了,也计算不了这样大的数据文件中到底有多少个单词了。于是乎Hadoop就出现了,其就是为了解决这种情况。
总结一句话:Hadoop就是存储海量数据和分析海量数据的工具。
关键技术
HDFS(Hadoop Distributed File System):
既可以是Hadoop 集群的一部分,也可以是一个独立的分布式文件系统,是开源免费的大数据处理文件存储系统。
HDFS是Master和Slave的主从结构(是一种概念模型,将设备分为主设备和从设备,主设备负责分配工作并整合结果,或作为指令的来源;从设备负责完成工作,一般只能和主设备通信)。主要由Name-Node、Secondary NameNode、DataNode构成。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!