微服务阶段
文章目录
软实力:聊天+举止+谈吐+见解
你主导面试官13k:聊天
面试官主导你8k
微服务阶段
javase:OOP
mysql:持久化
html+css+jstjquery+框架:视图,框架不熟练,css不好;
javaweb:独立开发MVC三层架构的网站了:
原始ssm:框架:简化了我们的开发流程,配置也开始较为复杂;
war:tomcat运行
spring再简化:SpringBootjar:内嵌tomcat;微服务架构!
服务越来越多:SpringCloud
SpringBoot的核心思想:约定大于配置
Spring Boot 以约定大于配
置的核心思想,默认帮我们进行了很多设置,多数 Spring Boot 应用只需要很少的 Spring 配置。同时它
集成了大量常用的第三方库配置(例如 Redis、MongoDB、Jpa、RabbitMQ、Quartz 等等),Spring
Boot 应用中这些第三方库几乎可以零配置的开箱即用。
程序=数据结构+算法(集合框架);程序猿
程序=面向对象+框架;码农
Spring Boot的主要优点:
- 为所有Spring开发者更快的入门
- 开箱即用,提供各种默认配置来简化项目配置
- 内嵌式容器简化Web项目
- 没有冗余代码生成和XML配置的要求
微服务:架构风格(服务微化)
一个应用应该是一组小型服务;可以通过HTTP的方式进行互通;
单体应用:ALL IN ONE
微服务:每个功能元素最终都是一个可独立替换和独立升级的软件单元;
必读论文:
微服务(Microservices)——Martin Flower【翻译】
第一个SpringBoot-HelloWorld
1、新建一个springboot项目;
jar包:直接通过内置tomcat运行,不需要额外安装tomcat。如需修改内置tomcat的配置,只需要在spring boot的配置文件中配置。内置tomcat没有自己的日志输出,全靠jar包应用输出日志。但是比较方便,快速,比较简单。
war包:传统的应用交付方式,需要安装tomcat,然后放到waeapps目录下运行war包,可以灵活选择tomcat版本,可以直接修改tomcat的配置,有自己的tomcat日志输出,可以灵活配置安全策略。相对打成jar包来说没那么快速方便。
jar包方式的pom
2、controller层上代码 HelloController.java
package com.mayun.springboothelloword.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
//@RestController这个注解表示,会直接返回字符串,而不是转发;
@RestController
public class HelloController {
//因为内嵌了tomcat,所以直接访问即可 http://localhost:8080/hello
@RequestMapping("/hello")
public String hello(){
return "hello,world";
}
}
3、启动项目 springboot的Application; 在浏览器端输入 http://localhost:8080/hello
4、打jar包
5、更改项目的端口号
SpringBoot自动装配原理
SpringApplication
分析该方法主要分两部分,一部分是SpringApplication的实例化,二是run方法的执行;
这个类主要做了以下四件事情:
1、推断应用的类型是普通的项目还是Web项目
2、查找并加载所有可用初始化器 , 设置到initializers属性中
3、找出所有的应用程序监听器,设置到listeners属性中
4、推断并设置main方法的定义类,找到运行的主类
面试题:关于SpringBoot,谈一谈你的理解;
面试题:关于SpringBoot,谈一谈你的理解;
1、自动装配
2、run()方法
run方法答:
1、首先推断应用的类型是普通的项目还是Web项目(如果是web项目的话,他就一直启动;)
2、推断并设置main方法的定义类,找到运行的主类(因为不知道主类的话,是没办法加载的;)
3、run方法内有一些监听器,它是全局存在的,它会获取上下文,处理一些bean
yaml语法讲解
SpringBoot使用一个全局的配置文件 , 配置文件名称是固定的
application.properties
语法结构 : key=value
application.yml
语法结构 :key:空格 value
这种语言以数据做为中心,而不是以标记语言为重点!
以前的配置文件,大多数都是使用xml来配置;比如一个简单的端口配置,我们来对比下yaml和xml
传统xml配置:
<server>
<port>8081<port>
</server>
yaml配置:
server: prot: 8080
结论:
配置yml和配置properties都可以获取到值 , 强烈推荐 yml;
如果我们在某个业务中,只需要获取配置文件中的某个值,可以使用一下 @value;
如果说,我们专门编写了一个JavaBean来和配置文件进行一一映射,就直接@configurationProperties,不要犹豫!
JSR303数据校验
Springboot中可以用@validated来校验数据,如果数据异常则会统一抛出异常,方便异常中心统一处
理。我们这里来写个注解让我们的name只能支持Email格式;
@Component //注册bean
@ConfigurationProperties(prefix = "person")
@Validated //数据校验
public class Person {
@Email(message="邮箱格式错误") //name必须是邮箱格式
private String name;
}
使用数据校验,可以保证数据的正确性; 下面列出一些常见的使用
@NotNull(message="名字不能为空")
private String userName;
@Max(value=120,message="年龄最大不能查过120")
private int age;
@Email(message="邮箱格式错误")
private String email;
@Null 验证对象是否为null
@NotNull 验证对象是否不为null, 无法查检长度为0的字符串
@NotBlank 检查约束字符串是不是Null还有被Trim的长度是否大于0,只对字符串,且会去掉前后空
格.
@NotEmpty 检查约束元素是否为NULL或者是EMPTY.
Booelan检查
@AssertTrue 验证 Boolean 对象是否为 true
@AssertFalse 验证 Boolean 对象是否为 false
长度检查
@Size(min=, max=) 验证对象(Array,Collection,Map,String)长度是否在给定的范围之内
@Length(min=, max=) string is between min and max included.
日期检查
@Past 验证 Date 和 Calendar 对象是否在当前时间之前
@Future 验证 Date 和 Calendar 对象是否在当前时间之后
@Pattern 验证 String 对象是否符合正则表达式的规则
.......等等
除此以外,我们还可以自定义一些数据校验规则
空检查
SpringBoot Web开发
自动装配:
springboot到底帮我配置了什么?我们能不能修改?能修改哪些东西?能不能扩展?
xxxxAutoConfiguraion… 向容器中自动配置组件
xxxxProperties: 自动配置类,装配配置文件中自定义的一些内容!
要解决的问题:
- 导入静态资源……
- 首页
- jsp,模板引擎Thymeleaf
- 装配扩展SpringMVC
- 增删改查
- 拦截器
- 国际化
静态资源可以访问的路径
**
**
1.在springboot,我们可以使用以下方式处理静态资源
webjars : 访问方式localhost:8080/webjars/
public,static,/**,resources : 访问方式 localhost:8080/
优先级:
resources > static > public
public目录下:放一些公共的资源,大家都会去访问的js;
static目录下:放一些静态资源,图片
resources目录下:放一些upload上传的文件;
首页和图标定制
//在templates目录下的所有页面,只能通过controller来跳转
Thymeleaf:模板引擎
通过 spring-boot-starter-thymeleaf 导入pom.xml
结论:只要需要使用thymeleaf,只需要导入对应的依赖就可以了!我们将html放在我们的templates目录下即可
所有的html元素都可以被thymeLeaf替换接:th:元素名
扩展SpringMVC
ViewResolver 实现了视图解析器接口的类,我们就可以把它看做视图解析器
Spring MVC 自动配置
包括ContentNegotiatingViewResolver和BeanNameViewResolver beans。
支持提供静态资源,包括对 WebJars 的支持( 本文档稍后介绍))。
自动注册Converter,GenericConverter和Formatter beans类。
支持HttpMessageConverters( 在本文档后面介绍)。
的自动注册MessageCodesResolver( 在本文档后面介绍)。
静态index.html支持。
自定义Favicon支持(本文档稍后介绍)。
ConfigurableWebBindingInitializer bean 的自动使用( 本文档稍后介绍)。
这里走/kuang就会走到test页面
《如果我们要扩展springmvc,官方建议我们这样去做!
在springboot中,有非常多的xxxx Configuration 帮助我们进行扩展配置,只要看见了这个东西,我们就要注意了!因为他改变了spring原有的东西,或者扩展了!
记录一个异常:
This application has no explicit mapping for /error, so you are seeing this as a fallback
重新修改一下mayun这个目录。即删除这个包,再创建一个,就对了!!!
员工管理系统:准备工作
1、去bootstrap下载静态资源页面;
2、不建议使用controller去写一个访问控制
而是去写一个配置类,作为视图跳转
1:首页配置:注意点,所有页面的静态资源都需要使用thymeleaf接管;@{ }
2、页面国际化:
#1.前端定:页面长什么样子:数据
#2.设计数据库(数据库设计难点!)
#3.前端让他能够自动运行,独立化工程
#4.数据接口如何对接:json,对象 all in one!
白#5.前后端联调测试!
1.有一套自己熟悉的后台模板:工作必要!x-admin
2.前端界面:至少自己能够通过前端框架,组合出来一个网站页面
-index
-about
-blog
-post
-user
3.让这个网站能够独立运行!
一个月!
上周回顾
·SpringBoot是什么?
·微服务
·HelloWorld
·探究源码自动装配原理
·配置 yaml·多文档环境切换
·静态资源映射
·Thymeleaf th:xxx
·SpringBoot 如何扩展MVC javaconfig-
·如何修改SpringBoot的默认配置~
·CRUD
·国际化·拦截器
·定制首页,错误页~
这周:
·JDBC
·Mybatis:重点
·Druid:重点
·Shiro:安全:重点
·Spring Security:安全:重点
·异步任务~,邮件发送,定时任务
·Swagger (前后端交接的一个文档技术)
·Dubbo+Zookeeper
1、jdbc 整合Druid
Java程序很大一部分要操作数据库,为了提高性能操作数据库的时候,又不得不使用数据库连接池。
Druid 是阿里巴巴开源平台上一个数据库连接池实现,结合了 C3P0、DBCP 等 DB 池的优点,同时加入了日志监控。
Druid 可以很好的监控 DB 池连接和 SQL 的执行情况,天生就是针对监控而生的 DB 连接池。
Druid已经在阿里巴巴部署了超过600个应用,经过一年多生产环境大规模部署的严苛考验。
Spring Boot 2.0 以上默认使用 Hikari 数据源,可以说 Hikari 与 Driud 都是当前 Java Web 上最优秀的数据源,我们来重点介绍 Spring Boot 如何集成 Druid 数据源,如何实现数据库监控。
Github地址:https://github.com/alibaba/druid/
配置数据源
1、添加上 Druid 数据源依赖。
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.21</version>
</dependency>
Model: 数据和业务
Controller:交接
View: HTML
1.导入包
2.配置文件
3.mybatis配置
4.编写sql
5.业务层调用dao层
6.controller 调用service层
SpringSecurity(安全)
有自己的登录页面!!!
在web开发中,安全第一位!过滤器,拦截器~
功能性需求:否
做网站:安全应该在什么时候考虑?设计之初!
·漏洞,隐私泄露~
·架构一旦确定~
shiro、SpringSecurity:很像-除了类不一样,名字不一样;
认证,授权(vip1,vip2,vip3)I
·功能权限
·访问权限
·菜单权限
·.之前的项目就是拦截器,过滤器:大量的原生代码~冗余
简介:
Spring Security 是针对Spring项目的安全框架,也是Spring Boot底层安全模块默认的技术选型,他可以实现强大的Web安全控制,对于安全控制,我们仅需要引入spring-boot-starter-security模块,进行少量的配置,即可实现强大的安全管理!
记住几个类:
- WebSecurityConfigurerAdapter:自定义Security策略
- AuthenticationManagerBuilder:自定义认证策略
- @EnableWebSecurity:开启WebSecurity模式,@Enablexxxx开启某个功能
Spring Security的两个主要目标是“认证”和“授权”(访问控制)。
“认证"(Authentication)
“授权”(Authorization)
这个概念是通用的,而不是只在Spring Security中存在。
http.csrf().disable();//关闭csrf功能:跨站请求伪造,默认只能通过post方式提交logout请求,springboot是默认开启的
记住我功能就是一个cookie的实现
登录注销大部分代码都由springsecurity搞定了,掌握springsecurity的话,一般网站的安全框架就可以用上去了。比自己写拦截器那些,要快很多很多。
shiro安全框架
面试问的比较多!!!
1.1、什么是Shiro?
- Apache Shiro 是一个Java 的安全(权限)框架。
- Shiro 可以非常容易的开发出足够好的应用,其不仅可以用在JavaSE环境,也可以用在JavaEE环
境。 - Shiro可以完成,认证,授权,加密,会话管理,Web集成,缓存等。
shiro核心三大对象!(面试问)
Subject 用户
SecurityManager 管理所有用户
Realm 连接数据
1.2 SpringBoot整合Shiro环境搭建
1、在pom.xml中导入shiro的依赖
<!--shiro整合spring的包-->
<!--shiro-->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.4.1</version>
</dependency>
2、编写shiro的两个核心配置
ShiroConfig 和 UserRealm(用户认证授权登录)。很明显比springsecurity多了很多代码
ShiroConfig.java
package com.huang.config;
import at.pollux.thymeleaf.shiro.dialect.ShiroDialect;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.LinkedHashMap;
import java.util.Map;
@Configuration
public class ShiroConfig {
//ShiroFilterBean
@Bean
public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("getDefaultWebSecurityManager") DefaultWebSecurityManager defaultWebSecurityManager){
ShiroFilterFactoryBean bean=new ShiroFilterFactoryBean();
//设置安全管理器
bean.setSecurityManager(defaultWebSecurityManager);
//添加shiro的内置过滤器
/*
anon:无需认证就能访问
authc:必须认证才能访问
user:必须拥有记住我功能才能访问
perms:拥有某个资源的权限才能访问
role:拥有某个角色权限才能访问
*/
//拦截
Map<String,String> filterMap =new LinkedHashMap<>();
//授权
filterMap.put("/user/add","perms[user:add]");
filterMap.put("/user/update","perms[user:update]");
//filterMap.put("/user/add","authc");
//filterMap.put("/user/update","authc");
//设置登陆的请求
bean.setLoginUrl("/toLogin");
//设置未授权的请求
bean.setUnauthorizedUrl("/noauth");
bean.setFilterChainDefinitionMap(filterMap);
return bean;
}
//DefaultWebSecurityManager
@Bean
public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){
DefaultWebSecurityManager securityManager=new DefaultWebSecurityManager();
//关联UserRealm
securityManager.setRealm(userRealm);
return securityManager;
}
//创建realm对象
@Bean
public UserRealm userRealm(){
return new UserRealm();
}
//整合shiroDialect:用来整合shiro thymeleaf
@Bean
public ShiroDialect getShiroDialect(){
return new ShiroDialect();
}
}
UserRealm.java
package com.huang.config;
import com.huang.pojo.User;
import com.huang.service.UserService;
import org.apache.catalina.security.SecurityUtil;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
public class UserRealm extends AuthorizingRealm {
@Autowired
UserService userService;
//授权
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
System.out.println("执行了授权");
SimpleAuthorizationInfo info=new SimpleAuthorizationInfo();
//info.addStringPermission("user:add");
//拿到当前用户登陆对象
Subject subject= SecurityUtils.getSubject();
User currentUser= (User) subject.getPrincipal();//拿到User对象
info.addStringPermission(currentUser.getPerms());//设置当前用户对象
return info;
}
//认证
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
System.out.println("执行了认证");
//用户名,密码,数据库中获取
UsernamePasswordToken userToken=(UsernamePasswordToken) authenticationToken;
User user=userService.queryUserByName(userToken.getUsername());//获取用户名
String name=user.getName();
String password=user.getPwd();
if(user==null){//说明查无此人
return null;
}
//密码认证,shiro做
return new SimpleAuthenticationInfo(user,password,"");//放入User对象
}
}
war包会越来越少,什么是war包,就是我们原来开发的那种,单体的,框架集成下打包的
Swagger
学习目标:
·了解Swagger的作用和概念
·了解前后端分离
·在SpringBoot中集成Swagger
Swagger简介
前后端分离
-
前端 -> 前端控制层、视图层【前端团队】
-
- 伪造后端数据,json。已经存在了,不需要后端,前端工程依旧能够跑起来
-
后端 -> 后端控制层、服务层、数据访问层【前端团队】
-
前后端通过API进行交互
-
前后端相对独立且松耦合
前端后如何交互?===>API
前后端相对独立,松耦合;
前后端甚至可以部署在不同的服务器上;
产生一个问题:
·前后端集成联调,前端人员和后端人员无法做到“即使协商,尽早解决”,最终导致问题集中爆发;
解决方案:
·首先指定schema[计划的提纲],实时更新最新APl,降低集成的风险;
·早些年:指定word计划文档;
.前后端分离:
前端测试后端接口:postman
后端提供接口,需要实时更新最新的消息及改动!
Swagger
·号称世界上最流行的Api框架;
·RestFul Api文档在线自动生成工具=>Api文档与API定义同步更新
·直接运行,可以在线测试API接口;
·支持多种语言:Java,Php……)
官网:https://swagger.io/
在项目使用Swagger需要springbox;
·swagger2
·ui
SpringBoot集成Swagger
使用Swagger
要求:jdk 1.8 + 否则swagger2无法运行
步骤:
1、新建一个SpringBoot-web项目
2、添加Maven依赖
<!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
3、编写HelloController,测试确保运行成功!
4、要使用Swagger,我们需要编写一个配置类-SwaggerConfig来配置 Swagger
@Configuration //配置类
@EnableSwagger2// 开启Swagger2的自动配置
public class SwaggerConfig {
}
5、访问测试 :http://localhost:8080/swagger-ui.html ,可以看到swagger的界面;
异步、定时、邮件任务
在我们的工作中,常常会用到异步处理任务,比如我们在网站上发送邮件,后台会去发送邮件,此时前台会造成响应不动,直到邮件发送完毕,响应才会成功,所以我们一般会采用多线程的方式去处理这些任务。还有一些定时任务,比如需要在每天凌晨的时候,分析一次前一天的日志信息。还有就是邮件的发送,微信的前身也是邮件服务呢?这些东西都是怎么实现的呢?其实SpringBoot都给我们提供了对应的支持,我们上手使用十分的简单,只需要开启一些注解支持,配置一些配置文件即可!那我们来看看吧~
SpringBoot整合
SpringBoot 操作数据:spring-data jpa jdbc mongodb redis!
SpringData 也是和SpringBoot齐名的项目!
说明:在SpringBoot2.x之后,原来使用的jedis 被替换为了lettuce?
jedis:采用的直连,多个线程操作的话,是不安全的,如果想要避免不安全的,使用jedis pool连接池!更像BIO模式
lettuce:采用netty,实例可以再多个线程中进行共享,不存在线程不安全的情况!可以减少线程数据了,更像NIO模式