栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Springboot的学习--微服务阶段

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Springboot的学习--微服务阶段

微服务阶段

文章目录
  • 微服务阶段
  • 第一个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【翻译】

第一个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配置:


 8081 

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, //拦截 Map 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依赖


   io.springfox
   springfox-swagger2
   2.9.2



   io.springfox
   springfox-swagger-ui
   2.9.2


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模式

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/425304.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号