分层开发与响应式编程

简介: 分层开发与响应式编程

分层开发


1.MVC


应用程序的分层开发模式—MVC模式


MVC是Model(模型)、View(视图)、Controller(控制器)的简写


  • Model:是Java的实体Bean,代表存取数据的对象或者POJO,作用是在内存中暂时存储数据,并在数据发生变化的时候更新控制器(如果需要持久化,就把它写入数据库或者磁盘文件)
  • View:主要用来解析、处理、显示内容
  • Controller:主要用来处理视图中的响应,它决定了如何调用Model中的实体Bean,如何调用业务层的数据业务操作以及如何将结果返回视图


2. 三层架构


三层架构,就是将整个应用程序划分为表现层(UI)、业务逻辑层(Service)、数据访问层(DAO\Repository)


  • 表现层:用于展示界面,对用户的请求进行接受、处理,并且进行数据的返回
  • 业务逻辑层:负责业务逻辑处理,主要是调用DAO层对数据进行增删改查等操作
  • 数据访问层:与数据库交互的持久层,被Service调用


DAO层的工作是存取对象,而Repository层的工作是存取和管理对象


所以Repository=管理对象+DAO


3. 实现MVC模式


创建一个SpringBoot项目,添加web、thymeleaf、lombok依赖

实体类


package com.example.demo3.Bean;
import lombok.Data;
@Data
public class User {
    // 用户id
    private long id;
    // 用户姓名
    private String name;
    //用户年龄
    private int age;
}
复制代码


Controller


package com.example.demo3.Controller;
import com.example.demo3.Bean.User;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;
@RestController
public class MVCDemoController {
    @RequestMapping("/mvcdemo")
    public ModelAndView hello(){
        User user=new User();
        user.setName("test11");
        user.setAge(100);
        ModelAndView modelAndView=new ModelAndView("mvcdemo");
        modelAndView.addObject("user",user);
        return modelAndView;
    }
}
复制代码

页面

<!DOCTYPE html>
<!--thymeleaf模板支持-->
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<div>
    <!-- 显示由控制器传递过来的实体user的值-->
    <div th:text="|姓名:${user.name}|"></div>
    <div th:text="|年龄:${user.age}|">年龄</div>
</div>
</body>
</html>
复制代码


启动服务


image.png


响应式编程


WebFlux是响应式框架,这就意味着它可以在资源有限的情况下提高系统的吞吐量和伸缩性。


Spring MVC采用命令式编程的方式,代码是一句一句执行的;WebFlux则是基于异步响应式编程。


工作方式对比:


  1. MVC
    主线程接收请求—->准备数据—–>返回数据
  2. WebFlux
    主线程接收请求—->立刻返回数据与函数的组合—->开启一个新的work去实现任务(业务操作)—->work线程完成工作—–>返回用户真实数据

打一个很简单的例子,在MVC模式下就好比于餐厅没有了叫号机和前台服务员,当里面位置满了之后再来的顾客就只能换一家吃;而在WebFlux下,就是拥有了前台和叫号机,这样后面来的客户有了排队号,只用等待有空位置出来。虽然来再多的人都能立马排号,但是就餐这个业务依然还是堵塞的。所以对比之下,请求量就比传统的MVC高出很多,对于一些I/O密集的服务,就可以选择使用WebFlux实现。


Mono和Flux


MonoFlux是Reactor中的两个基本概念


  • Mono和Flux属于事件发布者,为消费者提供订阅接口。当有事件发生时,Mono或Flux会回调消费者的相应方法,然后通知消费者相应的事件
  • Mono和Flux用于处理异步数据流,不是直接返回String或者List,而是将异步数据流封装为Mono或者Flux对象


二者的区别


  1. Flux可以发送很多item,并且这些item可以经过若干operators后才被订阅,而Mono只能发送一个item
  2. Mono主要用于返回单个数据,而Flux用于返回多个数据
  3. Mono表示包含0或1个元素的异步序列,Flux包含0到N个异步序列。序列中可以包含三种消息通知:正常的包含元素的消息、序列结束的消息、序列出错的消息,分别对应OnNext()、OnComplete()、OnError()三种方法
  4. 二者之间可以进行相互转换,对Flux序列进行计数操作时得到一个Mono<Long>对象;多个Mono序列合并在一起,得到一个Flux对象。


WebFlux例子

创建时添加响应式依赖


image.png


这部分主要是使用函数式编程

Handler


package com.example.webfluxdemo;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.web.reactive.function.BodyInserters;
import org.springframework.web.reactive.function.server.ServerRequest;
import org.springframework.web.reactive.function.server.ServerResponse;
import reactor.core.publisher.Mono;
@Component
public class Handler {
    public Mono<ServerResponse> Hi(ServerRequest request) {
        return ServerResponse.ok().contentType(MediaType.TEXT_PLAIN).body(Mono.just("This is WebFlux demo"), String.class);
    }
}
复制代码

Router


package com.example.webfluxdemo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.web.reactive.function.server.RequestPredicates;
import org.springframework.web.reactive.function.server.RouterFunction;
import org.springframework.web.reactive.function.server.RouterFunctions;
import org.springframework.web.reactive.function.server.ServerResponse;
import static org.springframework.web.reactive.function.server.RequestPredicates.GET;
import static org.springframework.web.reactive.function.server.RouterFunctions.route;
@Configuration
public class Router {
    @Autowired
    private Handler handler;
    @Bean
    public RouterFunction<ServerResponse> routeHi(Handler hiHandler) {
        return RouterFunctions.route(RequestPredicates.GET("/hello"), handler::Hi);
    }
}
复制代码


启动服务,在/hello将看到

image.png

目录
相关文章
|
9月前
|
数据库 Android开发 开发者
构建高性能微服务架构:从理论到实践构建高效Android应用:探究Kotlin协程的优势
【2月更文挑战第16天】 在当今快速迭代和竞争激烈的软件市场中,微服务架构以其灵活性、可扩展性和独立部署能力而受到企业的青睐。本文将深入探讨如何构建一个高性能的微服务系统,涵盖从理论基础到具体实现的各个方面。我们将重点讨论服务拆分策略、通信机制、数据一致性以及性能优化等关键主题,为读者提供一个清晰、实用的指南,以便在复杂多变的业务环境中构建和维护健壮的微服务体系结构。 【2月更文挑战第16天】 在移动开发领域,性能优化和流畅的用户体验是至关重要的。随着技术的不断进步,Kotlin作为一种现代编程语言,在Android开发中被广泛采用,尤其是其协程特性为异步编程带来了革命性的改进。本文旨在深入
|
5月前
|
存储 前端开发 JavaScript
高效组件的设计与封装之道
本文结合了作者自身碰到的场景来说明如何做好组件设计和封装。
116 19
|
6月前
|
开发框架 开发者 数据库管理
模块化开发和传统开发的优缺点有哪些
【8月更文挑战第26天】模块化开发和传统开发的优缺点有哪些
240 2
|
6月前
|
监控 安全 API
构建高效微服务架构:后端开发的新范式
【7月更文挑战第38天】随着现代软件开发的复杂性增加,传统的单体应用架构已经难以满足快速迭代和灵活部署的需求。微服务架构以其模块化、独立性和可伸缩性成为解决这一问题的关键。本文将探讨微服务的核心概念、设计原则以及在实现过程中可能遇到的挑战,并提供相应的解决方案,以期为后端开发者提供一种新的开发范式,帮助他们构建出更加高效、稳定且易于维护的系统。
|
9月前
|
设计模式 监控 API
构建高效的微服务架构:后端开发的新范式
【5月更文挑战第11天】 在当今的软件开发领域,微服务架构已经成为一种流行的设计模式。它通过将应用程序分解为一组小型、松散耦合的服务来提供高度可扩展和灵活的解决方案。本文将探讨如何构建一个高效的微服务架构,包括选择合适的技术栈、设计原则以及应对常见挑战的策略。我们将深入讨论如何确保系统的可维护性、可靠性和性能,同时考虑到安全性和监控的需求。
|
程序员 C++ Windows
Windows C++ 启动子进程并绑定子进程,主进程结束关闭后自动结束关闭子进程
在Windows平台上主进程启动子进程,并使主进程结束关闭后自动结束关闭子进程
267 0
|
缓存 Windows
Windows程序设计——LoadImage参数及其用法
Windows程序设计——LoadImage参数及其用法
542 0
|
前端开发 C++
10分钟,带你掌握C++多线程同步!
本文介绍了C++11中如何开启新线程,并详细讲解了线程的基础同步原语。如何采用async, packaged_task和promise实现future同步机制?怎样处理spurious wakeup?本文以质数判定服务为例为大家分享C++多线程同步措施!
13054 0
|
8月前
|
Java
Wsl搬家、使用root、使用阿里源
Wsl搬家、使用root、使用阿里源
|
前端开发 JavaScript 开发者
前端技术-模块化概念说明 | 学习笔记
快速学习 前端技术-模块化概念说明
111 0

热门文章

最新文章