微服务阶段
文章目录- 微服务阶段
- 第一个SpringBoot-HelloWorld
- SpringBoot自动装配原理
- SpringApplication
- 面试题:关于SpringBoot,谈一谈你的理解;
- yaml语法讲解
- JSR303数据校验
- SpringBoot Web开发
- 静态资源可以访问的路径
- 首页和图标定制
- Thymeleaf:模板引擎
- 扩展SpringMVC
- 员工管理系统:准备工作
- 上周回顾
- 这周:
- SpringSecurity(安全)
- shiro安全框架
- 1.1、什么是Shiro?
- 1.2 SpringBoot整合Shiro环境搭建
- **Swagger**
- SpringBoot集成Swagger
- 异步、定时、邮件任务
- SpringBoot整合
软实力:聊天+举止+谈吐+见解
你主导面试官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【翻译】
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,谈一谈你的理解;
1、自动装配
2、run()方法
run方法答:
1、首先推断应用的类型是普通的项目还是Web项目(如果是web项目的话,他就一直启动;)
2、推断并设置main方法的定义类,找到运行的主类(因为不知道主类的话,是没办法加载的;)
3、run方法内有一些监听器,它是全局存在的,它会获取上下文,处理一些bean
SpringBoot使用一个全局的配置文件 , 配置文件名称是固定的
application.properties 语法结构 : key=value application.yml 语法结构 :key:空格 value
这种语言以数据做为中心,而不是以标记语言为重点!
以前的配置文件,大多数都是使用xml来配置;比如一个简单的端口配置,我们来对比下yaml和xml
传统xml配置:
8081
yaml配置:
server: prot: 8080
结论:
配置yml和配置properties都可以获取到值 , 强烈推荐 yml;
如果我们在某个业务中,只需要获取配置文件中的某个值,可以使用一下 @value;
如果说,我们专门编写了一个JavaBean来和配置文件进行一一映射,就直接@configurationProperties,不要犹豫!
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,
//拦截
Map war包会越来越少,什么是war包,就是我们原来开发的那种,单体的,框架集成下打包的 学习目标: ·了解Swagger的作用和概念 ·了解前后端分离 ·在SpringBoot中集成Swagger Swagger简介 前后端分离 前端 -> 前端控制层、视图层【前端团队】 后端 -> 后端控制层、服务层、数据访问层【前端团队】 前后端通过API进行交互 前后端相对独立且松耦合 前端后如何交互?===>API 前后端相对独立,松耦合; 前后端甚至可以部署在不同的服务器上; 产生一个问题: ·前后端集成联调,前端人员和后端人员无法做到“即使协商,尽早解决”,最终导致问题集中爆发; 解决方案: ·首先指定schema[计划的提纲],实时更新最新APl,降低集成的风险; ·早些年:指定word计划文档; .前后端分离: Swagger ·号称世界上最流行的Api框架; ·RestFul Api文档在线自动生成工具=>Api文档与API定义同步更新 ·直接运行,可以在线测试API接口; ·支持多种语言:Java,Php……) 官网:https://swagger.io/ 在项目使用Swagger需要springbox; ·swagger2 ·ui 使用Swagger 要求:jdk 1.8 + 否则swagger2无法运行 步骤: 1、新建一个SpringBoot-web项目 2、添加Maven依赖 3、编写HelloController,测试确保运行成功! 4、要使用Swagger,我们需要编写一个配置类-SwaggerConfig来配置 Swagger 5、访问测试 :http://localhost:8080/swagger-ui.html ,可以看到swagger的界面; 在我们的工作中,常常会用到异步处理任务,比如我们在网站上发送邮件,后台会去发送邮件,此时前台会造成响应不动,直到邮件发送完毕,响应才会成功,所以我们一般会采用多线程的方式去处理这些任务。还有一些定时任务,比如需要在每天凌晨的时候,分析一次前一天的日志信息。还有就是邮件的发送,微信的前身也是邮件服务呢?这些东西都是怎么实现的呢?其实SpringBoot都给我们提供了对应的支持,我们上手使用十分的简单,只需要开启一些注解支持,配置一些配置文件即可!那我们来看看吧~ SpringBoot 操作数据:spring-data jpa jdbc mongodb redis! SpringData 也是和SpringBoot齐名的项目! 说明:在SpringBoot2.x之后,原来使用的jedis 被替换为了lettuce? jedis:采用的直连,多个线程操作的话,是不安全的,如果想要避免不安全的,使用jedis pool连接池!更像BIO模式 lettuce:采用netty,实例可以再多个线程中进行共享,不存在线程不安全的情况!可以减少线程数据了,更像NIO模式
UserRealm.javapackage 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对象
}
}
前端测试后端接口:postman
后端提供接口,需要实时更新最新的消息及改动!
@Configuration //配置类
@EnableSwagger2// 开启Swagger2的自动配置
public class SwaggerConfig {
}
SpringBoot整合



