原理初探
pom.xml
spring-boot-dependencies:核心依赖在父工程中
我们在写或者引入一些SpringBoot依赖的时候,不需要指定版本,就是因为有这些版本仓库
启动器
org.springframework.boot
spring-boot-starter
说白了就是springboot的启动场景;
比如 spring-boot-starter-web,他就会帮我们自动导入web环境所有的依赖
springboot会将所有的功能场景,变成一个个启动器
我们要使用什么功能,就只需要找到对应的启动器就可以了 starter
主程序
@SpringBootApplication//标注这个类是一个springboot的应用
public class Springboot01HelloworldApplication {
//将springboot应用启动
public static void main(String[] args) {
SpringApplication.run(Springboot01HelloworldApplication.class, args);
}
}
注解
@SpringBootConfiguration spring boot的配置
@Configuration spring配置类
@Component说明这也是一个spring的组件
@EnableAutoConfiguration自动配置
@AutoConfigurationPackage自动配置包
@Import(AutoConfigurationPackages.Registrar.class)自动配置‘包注册’
@Import(AutoConfigurationImportSelector.class)自动配置导入选择
//SpringApplication
这个类主要做了以下四件事情:
1,推断应用的类型是普通的类型还是web项目
2,查找并加载所有可用初始化器,设置到initializers属性中
3,找出所有的应用程序监听器,设置到listeners属性中
4,推断并设置main方法的定义类,找到运行的主类
SpringBoot配置文件及自动配置原理
配置文件:
语法结构: key: 空格 value
配置文件的作用:修改SpringBoot自动配置的默认值,因为SpringBoot在底层都给我们自动配置好了。
YAML
对空格要求十分严格!
#普通的key-value
name: qinjaing
#对象
student:
name: qinjiang
age: 3
#行内写法
student: {name: qinjiang,age: 3}
#数组
pets:
-cat
-dog
-pig
#数组的行内写法
pets: [cat,dog,pig]
在类上加上
@Component
@ConfigurationProperties(prefix = “person”)
Springboot主程序
@SpringBootApplication//标注这个类是一个springboot的应用
public class SpringbootApplication {
public static void main(String[] args) {
//将springboot应用启动
SpringApplication.run(SpringbootApplication.class, args);
}
}
注解
@SpringBootConfiguration
springboot的配置
@Configuration :spring配置类
@Conpoment :说明这也是一个spring的组件
@EnableAutoConfiguration:自动配置
@AutoConfigurationPackage自动配置包
@Import({AutoConfigurationPackages.Registrar.class})自动配置‘包注册’
@Import({AutoConfigurationImportSelector.class}):自动配置导入选择
JSR303数据校验
@Validated//数据校验,类上加这个
在属性上加@Email()等
多配置选择
在application.yaml里面用—隔开
配置文件到底能些什么?–联系–spring.factories
@Configuration(proxyBeanMethods = false)//表示这是一个配置类
@EnableConfigurationProperties(ServerProperties.class)//自动配置属性
//spring的底层注解,根据不同的条件,来判断当前配置或者类是否生效
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
@ConditionalOnClass(CharacterEncodingFilter.class)
@ConditionalOnProperty(prefix = “server.servlet.encoding”, value = “enabled”, matchIfMissing = true)
静态资源导入
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
super.addResourceHandlers(registry);
if (!this.resourceProperties.isAddMappings()) {
logger.debug("Default resource handling disabled");
return;
}
ServletContext servletContext = getServletContext();
addResourceHandler(registry, "/webjars/**", "classpath:/META-INF/resources/webjars/");
addResourceHandler(registry, this.mvcProperties.getStaticPathPattern(), (registration) -> {
registration.addResourceLocations(this.resourceProperties.getStaticLocations());
if (servletContext != null) {
registration.addResourceLocations(new ServletContextResource(servletContext, SERVLET_LOCATION));
}
});
}
在springboot中,我们可以使用以下方式处理静态资源
webjars不常用
public,static,/**,resources
优先级resources>static(默认)>public
首页和图标定制
private Resource getIndexHtml(String location) {
return getIndexHtml(this.resourceLoader.getResource(location));
}
private Resource getIndexHtml(Resource location) {
try {
Resource resource = location.createRelative("index.html");
if (resource.exists() && (resource.getURL() != null)) {
return resource;
}
}
catch (Exception ex) {
}
return null;
}//这里是从resources,static,public里面找index.html
可以放在templates里面,通过controller跳转,需要模板引擎thymeleaf
//在templates目录下所有的页面只能通过controller来跳转
//这个需要模板引擎的支持!thymeleaf
@Controller
public class IndexController {
@RequestMapping("/index")
public String index(){
return “index”;
}
}
Thymeleaf模板引擎
结论:只要需要使用thymeleaf,只需要导入对应的依赖就可以了!我们将html页面放在templates目录下即可!
public static final String DEFAULT_PREFIX = “classpath:/templates/”;
public static final String DEFAULT_SUFFIX = “.html”;
servlet
protected void doDispatch(HttpServletRequest request, HttpServletResponse response)
Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对 象。
request和response对象即然代表请求和响应,那我们要获取客户机提交过来的数据,只需要找request对象就行了。要向客户机输出数据,只需要找response对象就行了。
//如果你想自定义一些功能,只需要写这个组件,然后将它交给springboot,springboot就会帮我们自动装配
//扩展MVC dispatchservlet
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
//public interface ViewResolver 实现了视图解析器接口的类,我们就可以把它看做视图解析
@Bean
public MyViewResolver myViewResolver(){
return new MyViewResolver();
};
//自定义了一个自己的视图解析器
public static class MyViewResolver implements ViewResolver{
@Override
public View resolveViewName(String viewName, Locale locale) throws Exception {
return null;
}
}
}
修改springboot的默认配置
springboot在自动配置很多组件的时候,先看容器有没有用户自己配置的(如果用户自己配置@Bean),如果有就用用户配置的,如果没有就用自动配置的;如果有些组件可以存在多个,比如我们的视图解析器,就将用户配置的和自己默认的组合起来。
在springboot中有非常多的xxxxConfigration帮助我们进行拓展配置,只要看见了这个东西,我们就要注意了!
Mybatis
1,yaml文件配置:
数据库连接:
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/springboot?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8
username: root
password: 12345
driver-class-name: com.mysql.jdbc.Driver
mybaits配置yaml
mybatis:
type-aliases-package: com.hua.entity//对应的实体类包地址
mapper-locations: classpath:mybatis/mapper/*.xml//对应的xml地址
2,写Mapper类
1,在主程序上加注解,扫描出mapper
@SpringBootApplication
//@MapperScan(“com.hua.mapper”)
public class SpringbootApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootApplication.class, args);
}
}
2,在mapper类上加注解
//这个注解表示了这是一个mybatis的mapper类
@Mapper
public interfaceEmployeeMapper {
}
3,然后在mapper里面写接口
@Mapper//推荐使用
@Repository//注册进spring
补充:@Repository需要用@MapperScan扫描mapper才能注入@Bean
而@Mapper注解相当于@Repository注解+@MapperScan注解,通过xml文件下的namespace命名空间自动注入bean
public interface EmployeeMapper {
List queryEmployeeList();
Employee queryEmployeeById(int id);
int addEmployee(Employee employee);
int updateEmployee(Employee employee);
int deleteEmployee(int id);
}
4,然后在resources文件下新建mapper文件,放对应的xml文件
在xml文件中加入mybatis中文文档中的文档头
< mapper namespace=“org.mybatis.example.BlogMapper”>
< /mapper>
修改namespace,绑定到自己的对应的mapper地址
< mapper namespace=“com.hua.mapper.EmployeeMapper”>
然后在mapper标签中写sql语句
< mapper namespace=“com.hua.mapper.EmployeeMapper”>
< select id=“selectBlog” resultType=“Blog”>
select * from Blog where id = #{id}
< /select>
< /mapper>
例如:
< mapper namespace=“com.hua.mapper.EmployeeMapper”>
//id和mapper里面的接口名对应,parameterType是传过来的参数类型,resultType是返回的参数类型
< select id=“queryEmployeeList” resultType=“Employee”>
select * from employee
< /select>
< select id=“queryEmployeeById” resultType=“Employee”>
select * from employee where id = #{id}
< /select>
< insert id=“addEmployee” parameterType=“Employee”>
insert into employee(id,lastName,email,gender,birthday) values (#{id},#{lastName},
#{email},#{gender,#{birthday})
< /insert>
< update id=“updateEmployee” parameterType=“Employee”>
update employee set lastName=#{lastname},email=#{email} where id = #{id}
< /update>
< delete id=“deleteEmployee”>
delete from Employee where id = #{id}
</ delete>
< /mapper>
分布式 Dubbo Zookeeper
什么是分布式系统
在《分布式系统原理与范型》一书中有如下定义:“分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像单个相关系统”
分布式系统是由一组通过网络进行通信,为了完成共同的任务而协调工作的计算机节点组成的系统,分布式系统的出现是为了用廉价的,普通的机器完成单个计算机无法完成的计算,存储任务。其目的是利用更多的机器,处理更多的数据。
Dubbo文档
随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用框架已无法应对,分布式服务架构以及流动计算架构势在必行,急需一个治理系统确保架构有条不紊的演进
RPC
什么是RPC?
是指远程过程调用,是一种进程通信方式,他是一种技术的思想,而不是规范。它允许程序调用另一个地址空间的过程或函数,而不用程序员显示编码这个远程调用的细节。即程序员无论是调用本地的还是远程的函数,本质上编写的调用代码基本相同。
也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。
为什么要用RPC呢?就是无法在一个进程内,甚至一个计算机通过本地调用的方式完成的需求,比如不同的系统间的通讯,甚至不同的组织间的通讯,由于计算能力需要横向拓展,需要多台机器组成的集群上部署应用。RPC就是要像调用本地的函数一样去调用远程函数;
RPC的两个核心模块:通讯,序列化
序列化:数据传输需要转换
Dubbo
Apache Dubbo 是一款高性能,轻量级的开源Java RPC框架,他提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
服务提供者(Provider):暴露服务的服务提供方,服务提供者在启动时,向注册中心注册自己提供的服务。
服务消费之(Consumer):调用远程服务的服务消费方,服务消费者在启动时,向注册中心订阅自己所需的服务,服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
注册中心(Registry):注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者
监控中心(Monitor):服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心
zookeeper
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。相当于上面的注册中心。
dubbo
dubbo本身并不是一个服务软件,他其实就是一个jar包,能够帮你的java程序连接到zookeeper,并利用zookeeper消费,提供服务。
但是为了让用户更好的管理监控众多的dubbo服务,官方提供了一个可视化的监控程序dubbo-admin。