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【翻译】

第一个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 验证 DateCalendar 对象是否在当前时间之前
@Future 验证 DateCalendar 对象是否在当前时间之后
@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/

教程网站:狂神说SpringBoot08:整合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模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值