SpringBoot Mybatis 分布式 Dubbo Zookeeper

原理初探

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中文文档中的文档头

<?xml version="1.0" encoding="UTF-8" ?>

< 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。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

华华华华华12138

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值