课堂笔记-主要是给自己复习的
第一节课
课程结构:
架构定义:用一致认可方式从多个角度对系统的组成部分及各部分之间的协作关系所做的描述。
软件架构的定义(软件体系结构Software Architecture):用开发团一致认可的方式从多个角度(业务、开发、运维等)对软件的组成部分及各部分之间的协作关系所做的描述。
例如:UML规范,功能、逻辑、代码、部署、运行,分层结构、功能模块、代码模块、数据,层间接口、API、业务流程、模块依赖关系。
本质:将系统分解成相应的组成部分(组件、连接件等),并将这些部分重新组装成整个系统
孵化基地。
常见软件架构模式:
- 单体应用架构(服务器、数据库运行在一台机器上)
- 面向服务架构(软件拆分+通过“服务”联系起来)
- 微服务架构(“微”=> 拆分成小的服务单元)
- 事件驱动架构(“事件“驱动 行为)
- 分层架构(分不同的层次-> 可以包含其它架构<如 事件驱动架构>)
- 客户/服务器架构(局域网中:数据库<网络中>+客户计算机<在本地计算机上需要安装一个软件”客户“>)
- MVC架构
- 云计算架构(直接在云端运行服务器)
- 前后端分离架构(开发Web应用)
- 单页应用架构(SPA)
- 渐进式Web应用架构(PWA) <先上线=>后续添加功能>
- 主从架构
代码模块快捷键 :
ctrl+shift+k
/`
第二周课
软件架构
三层结构
表示层(向用户显示信息并收集信息)——应用层(业务逻辑层或中间层,可增删改查数据层中的数据)——数据层(数据库的访问和数据库)
MVC
Model(应用程序核心,负责处理业务逻辑和数据)——View(显示数据,即用户界面)——Controller(处理输入,与用户交互)
组件化开发——不用考虑组件内部的实现逻辑
第三节课
前端框架
angular、Vue框架和Svelte
尝试使用svelte,每个组件可以对应一个功能块or一个页面
嵌套 + 定义布局(BootstrapBootstrap 入门 · Bootstrap v5 中文文档 v5.3 | Bootstrap 中文网 (bootcss.com)) Web前端作业可以使用这个来 美化
SiteNav.svelte => 导航栏组件
User.svelte => 用户组件
...
使用 jsDelivr 的话可以跳过下载文件的操作,直接在你的项目中使用 Bootstrap 编译过的 CSS 和 JS 文件。放在app.html的首行
<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous">
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js" int
前端路由
单页应用(svelte适合)or 多页应用
传统路由:每个页面都有唯一的URL,刷新整个页面的全部信息
前端路由:用户输入特定的URL,前端路由技术URL映射到SPA中的一个特定部分,有JavaScript动态添加和显示内容,不需要重新加载整个页面。(浏览器中的url可能只是访问前端的JavaScript程序,由程序访问指定后端URL获取数据信息,而不是访问页面)
第六周
写svelte前端实验
第七周
Jakart EE
理解其基本的概念?
是一个成熟的基于 Java 的框架,可帮助开发人员转向使用现代技术,同时仍然利用现有的 Jakarta EE 代码。 它主要用于创建支持不同应用程序之间通信的 API。
容器Container:
是支持Jakarta EE应用程序组件运行的软件环境
Jakarta EE应用程序组件不直接与其他组件交互,它们使用容器协议和方法实现交互,以及与平台服务交互
三种容器:应用程序客户机容器、Web组件容器、企业Bean容器
容器~=计算机主版
Jakarta配置文件
Profile:针对特定类型应用程序的Jakarta EE平台配置
两种:Web Profile,Core Profile
需要兼容Jakarta EE规范的服务器(提供Jakarta EE容器)
Jakarta EE组件
用于实现特定功能的软件单元。
组件类型:运行客户端的客户程序和Applet、Web组件(Jakarta Servlet、Jakarta Faces、Jakarta Server Pages)、业务组件(Enterprise beans)
标准系统服务<==>展示逻辑、业务逻辑
分层模型
Jakarta EE应用部署与运行
Open Liberty
Eclipse GlassFish
Tomcat:实现了部分Jakarta规范的产品
第八周
Maven管理Java应用:
Apache开源的管理及自动构建工具(基于对象模型管理)
核心功能:描述项目中的依赖关系(统一管理),通过pom.xml文件的配置获取jar包
<!--导包形式(导依赖)-->
<dependency>
<groupId>jakarta.platform</groupId>
<artifactId>jakarta.jakartaee-api</artifactId>
<version>10.0.0</version>
<scope>provided</scope>
</dependency>
Open Liberty
也是一个应用服务器,支持的范围更大。
Open Liberty是实现了Jakarta EE所有的规范(大容器),Tomcat只实现了部分Jakarta EE的部分规范(小容器)
SpringBoot和Open Liberty的关系:
SpringBoot是一个框架,用于快速开发基于Spring的java应用程序。
Open Liberty是一个Java应用服务器,用于部署Java应用程序。它实现了Jakarta EE和Eclipse MicroProfile标准-。
一般可以将Spring Boot应用程序部署到Open Liberty服务器上
SpringBoot内置服务器可以换成Open Liberty,需要导依赖。
管理Open Liberty服务器的文件,server.xml
<?xml version="1.0" encoding="UTF-8"?>
<server description="new server">
<!-- Enable features -->
<featureManager>
指定JakartaEE规范
<feature>jakartaee-10.0</feature>
<feature>microProfile-6.0</feature>
</featureManager>
<!-- This template enables security. To get the full use of all the capabilities, a keystore and user registry are required. -->
<!-- For the keystore, default keys are generated and stored in a keystore. To provide the keystore password, generate an
encoded password using bin/securityUtility encode and add it below in the password attribute of the keyStore element.
Then uncomment the keyStore element. -->
<!--
<keyStore password=""/>
-->
<!--For a user registry configuration, configure your user registry. For example, configure a basic user registry using the
basicRegistry element. Specify your own user name below in the name attribute of the user element. For the password,
generate an encoded password using bin/securityUtility encode and add it in the password attribute of the user element.
Then uncomment the user element. -->
<basicRegistry id="basic" realm="BasicRealm">
账号密码:用户的账号密码也可以写在这里面(但不推荐,而是写在数据库中)
<user name="yourUserName" password="{xor}pj08bm1s" />加密 密文
</basicRegistry>
<!-- To access this server from a remote client add a host attribute to the following element, e.g. host="*" -->
类似于tomcat启动端口
<httpEndpoint id="defaultHttpEndpoint"
httpPort="9080"
httpsPort="9443" />
<!-- Automatically expand WAR files and EAR files -->
<applicationManager autoExpand="true"/>
<!-- Configures the application on a specified context root -->
<webApplication contextRoot="/app-name" location="app-name.war" />
<!-- Default SSL configuration enables trust for default certificates from the Java runtime -->
<ssl id="defaultSSLConfig" trustDefaultCerts="true" />
</server>
Web应用程序的类型
面向展示:Jakarta Faces、Jakarta Servlet(SpringBoot框架也是对Servlet进行了封装)
面向服务:Jakarta XML Web Service(程序与程序打交道)、RESTful Web Service(通过http打交道)
Servlet:基于“请求-响应”(中间的处理:通过调用Bean组件来完成逻辑之类的处理)
init(ServletConfig ) 初始化仅一次
doXXX(request,response)处理请求
destroy()清空
Context:定义了Servlet与Servlet容器通信时使用的一组方法,每个Web应用都有一个Context(运行环境)
打包-> war文件
RESTful Web Services
-
REST是一种软件架构风格,适用于客户机创建API
-
松耦合
-
每个资源都有唯一的URL作为访问地址
-
客户端可以创建、删除、读取、更新这些资源
Http GET 读取(get获取的数据可以缓存在中间件中)
HTTP POST 新建(不可缓存)
HTTP PUT 更新
HTTP DELETE 删除
第十周
Enterprise Beans
EJB到底是什么?(通俗易懂) - 知乎 (zhihu.com)
EJB到底是什么?(通俗易懂白话文)_ejb是什么-CSDN博客
EJB和Spring的区别|极客教程 (geek-docs.com)
容器:管理Enterprise Bean的生命周期及实例数量
业务人员只需要写好业务代码,其余的并发、安全等问题都交给容器来管理。
适用场景:
- 需要封装业务功能
- 需要扩展以适应大量用户
- 需要管理复杂的数据,并且需要事务支持
- 存在着不同类型的客户端
会话Bean
@Stateless
@Singleton
单例Session Bean在应用程序中只实例化一次,多个客户端可以同时访问,
消息驱动Bean
访问Session Bean的方法
本地访问:(远程使用、可扩展的)
@Stateless
public class MyBean{
}
依赖注入:
@EJB
ExampleBean exampleBean;
EJB和Spring之间的区别:
属性 | EJB | Spring |
---|---|---|
规格 | EJB是Java EE的一个规格。 | Spring是一个框架。 |
依赖注入 | EJB可以在容器中注入任何东西,包括EJB数据源、JMS资源和JPA资源。 | Spring可以注入任何东西,包括列表、属性、地图和JNDI资源。 |
事务管理 | EJB只支持JTA事务管理器。 | Spring支持多种事务管理器,如JTA、JDBC和Hibernate。 |
持久性 | EJB与JPA紧密集成。 | Spring支持各种持久性技术,如JDBC、Hibernate、JPA和iBatis。 |
消息传递 | EJB通过消息驱动Bean提供开箱即用的消息传递功能。 | 需要为每个消息添加监听器配置。 |
调度 | EJB通过EJB时间服务提供简单的调度功能。 | 需要添加和配置Quartz来进行调度。 |
安全 | EJB通过JAAS支持声明性和程序性安全。 | Spring通过Spring配置文件提供声明式安全。 |
AOP | EJB通过拦截器提供有限的支持。 | Spring通过AspectJ提供强大的支持。 |
Jakarta Persistence
Java用来访问数据库的标准接口
对象/关系映射元数据(java对象->数据库二维表)
实体Entity
轻量级持久化领域对象,通常代表关系数据库中的一张表,每个实体对象代表数据表中的一条数据。
尽量一对一的关系(一对一、一对多、多对一、多对多)
EJB+OpenLiberty 再去了解下
第十二周
关系型数据库:User表、Group表、User_Group表
现在:单表操作、在程序中进行关系的关联。
(学习实战中的数据练习,关系型数据库+[非关联的])
在代码中定义实体—>有软件自动生成数据库表结构
Jakarta Security
安全性:权限验证、Token,Authorization
需要保护的层
web层和业务层
业务层(Controller层的)、会话层(Entry Bean,Session Bean[无状态Bean])
两种安全机制
- 声明式安全:通过描述文件(web.xml)或在类文件中使用标注来描述应用组件的安全需求。
- 编程式安全:通过Java EE安全相关API以编程式方式实现安全模型
Realms服务器上的安全策略域:
-
存放合法用户和用户组的数据库
-
认证和授权机制
-
受保护的资源定义
用户解析
- User:
个人或应用程序的身份标识
- Group:
按特性分类的一组用户,如:顾客、推销员
- Role:
角色,代表一种访问控制权限,是一类权限的集合,类似于钥匙;
Jakarta EE Security API规定组名默认对应到同名角色名(导致组合角色混为一谈的原因)
买家组:购买权限(role)。 卖家组:售卖权限(role)、购买权限(role)。
Principal:已通过认证的用户。
Security attributes:与每个principal关联属性
Credential:认证凭据、证书、授权码
另一种解释:用户-角色-权限(√)
RBAC(Role-Based Access Control)
基于角色的访问控制:
- 为用户分配角色
- 为角色分配权限
- 用户通过成为某种角色来获得相应的访问权限
优点:简化了用户和权限的关系;
- 通过将权限赋予角色,然后哦将角色赋予用户或组,降低了管理用户和权限的复杂性
- 简化了IT管理工作:如,可以根据人力资源属性自动为新员工分配访问权限。
- 易扩展、易维护:需求发生变化时,可以通过调整角色和权限的配置来实现系统的扩展或维护
缺点:
- 需要充分了解组织结构,才能定义好角色和权限
- 实施时遇到各种权限分配特例,处理不够灵活
- 团队为了实现灵活的权限分配,可能会定义越来越细粒度的角色、或创建零时角色来解决,导致“角色爆炸”
Jakarta EE身份认证机制
(一下使用Java语言来实现)
- 基本认证(访问受保护资源->要求凭据->发送凭据->发送资源)路由器认证,内容放在HTTP头中的 Authoriza: Basic Base64编码的用户名+密码
缺点:Base64无法加密、安全性不够、只能通过关闭浏览器来注销
-
表单认证(访问任何受保护资源->重定向返回登录界面->提交登录表单->验证返回受保护资源)通过Html表单来提交用户名和密码
-
摘要认证
-
客户端认证
-
相互认证
-
自定义表单
-
Open ID Connect
身份存储机制(Identify store)
- 用于存储管理用户身份认证和授权的组件
- 提供一个集中的位置,以存储和管理用户名、密码、角色等信息
- Jakarta Security内置两种身份存储机制:Database、LDAP
使用表单认证来保护访问点
定义包点认证
定义身份存储机制
实现授权和访问机制
代码验证
进行基础配置后,直接加注解进行权限验证
@DeclareRoles({"Admin","Manager"}) //这里权限验证
@ApplicationPath("/api")
public class ...{}
授权
@DeclareRoles("manager") //角色
public class MyService{
@RoleAllowed({"manager"})//给方法添加权限
public void ...{}
}
SpringBoot原理、Spring原理、Security原理 再去了解下
第十四周
SpringSecurity相关的。
第十五周
前后端分离与微服务架构。
-
前端开发Servlet阶段:将HTML代码嵌入到程序代码中。
-
后端渲染阶段:模板引擎提供特定格式的模板,后端填入数据后,将模板输出到浏览器
- 优点:提高页面加载速度、有利于搜索引擎优化(SEO)。
- 缺点:后端开发人员需要了解HTML页面的结构。前后端开发人员紧密耦合。
- 常见模板引擎JSP:HTML代码中嵌入程序代码
- 常见引擎模板Thymeleaf(本质上与JSP没有不同的,多了些特性):Spring默认支持的模板引擎。需要提高搜索的需要使用模板引擎
-
不同模板引擎在SpringMVC中比较
-
-
前后端分离架构
-
前后端分别独立开发、测试、部署。
前后端通过API耦合。界面生成和数据填充工作在前端完成(前端渲染)
前后端分离的框架为微服务的实现提供了可能
-
前后端分离框架的实现方式
- 前端开发
- 基于JavaScript、CSS、HTML
- 使用React、Angular、Vue、Svelte等框架
- 后端开发
- 基于Java、Python、Node.js等技术
- 使用Jakarta EE 或SpringBoot、Django、Flask等框架
- 前端与后端通过RESTFUL API、GraphQL、WebSocket或RPC等方式交互
- 前端与后端通过JSON交互数据
- 挑战:
- 数据一致性
- 前端显示的数据与后端实际存储的数据不一致
- 解决方案:使用分布式事务或者补偿事务
- 接口安全性
- 解决方案:使用OAuth或者JWT进行认证和授权
- 接口管理和版本控制
- 解决方案:使用OpenAPI(Swagger)进行接口文档化和版本管理
- 跨域问题
- 解决放案:CORS(跨资源共享)
- 数据一致性
- 前端开发
-
经典软件架构
- 单体架构:
- 整个软件项目是一个完整的应用程序
- 通常采用分层架构
- 使用统一的数据库
- 使用统一的技术栈
- 整个应用通常部署在一台服务器上(数据库除外)
- 问题:
- 软件变的庞大、复杂、每次修改代码需要重新发布整个应用。
-
微服务:
-
是一种软件架构风格
-
复杂应用被拆分成独立的、职责单一的小型功能模块(微服务)
-
服务之间使用与语言无关的API相互通信;
-
服务由各个小型独立团队负责开发
-
-
微服务优势:
- 易于理解、每个服务都比较简单、只关注于一个业务功能。
- 可由独立的团队开发,带来更短的开发周期、更敏捷的部署和更新。
- 高扩展性,可跨多个服务器和基础架构部署。
- 出色的弹性,单个服务故障不会导致整个应用下线。
- 模块化、小乔的服务易于部署。
- 松耦合、可以提供更高的灵活性。
- 更开放、开发人员可以自由选择合适的技术、语言。
-
问题+挑战:
- 运维开销及成本增加,需要自动化运维、监控
- 开发人员必须由DevOps开发运维一体化技能
- 更高的发布风险:发布时需要集成、协调更多的接口
- 代码重复:为了避免耦合,可能需要向不同服务添加重复的底层公用代码
- 分布式系统的复杂性:网络延迟、容错性、异步操作、事务、可靠性...
- 服务间的依赖关系带来构建的复杂性
- 可测性的挑战:集成测试和端到端测试更加困难
-
微服务架构的取舍:
- 在核实的项目、合适的团队,采用微服务架构的收益会大于成本
- 采用微服务架构前,需要人情它所带来的挑战
- 需要避免为了“微服务”而“微服务”
- 对传统企业而言,可以先考虑设计易于拆分的单体架构,随着业务发展和需要,逐步过渡到微服务。
-
案例:
-
京东的商品和评论分开,采用微服务。
-
-
技术及工具:
服务注册与发现:ZooKeeper/Consul
服务熔断、降级:Hystrix + Turbine
客户端负载均衡:Ribbon
内部服务调用:Feign
网关:Kong/Spring Cloud Gateway / Zuul
授权认证:OAuth2 + JWT
微服务监控:Hystrix dashboard/ Eureka admin dashboard / Spring Boot admin dashboard
消息队列:ActiveMQ/RabbitMQ
分布式配置中心:Spring Cloud Config
分布式调用链监控:Spring Cloud Sleuth + zipkin
部署:Docker / Kubernetes
缓存:Redis / Hazelcast / Infinispan
服务注册与发现:Eureka / Consul / Nacos
服务熔断、降级:Hystrix / Resilience4j
客户端负载均衡:Ribbon / Feign
- 单体架构:
-
Jakarta EE与微服务
Microprofile —— 企业级Java微服务的开源社区规范:
Spring 与 微服务
Spring Cloud
- 基于Spring Boot的微服务平台
- 提供了一系列的工具和组件来帮助开发人员构建和管理微服务应用
- 功能包块:
- 服务注册与发现
- 负载均衡
- 断路器
- 配置中心
- ...
第十七周
单项选项:25(四选一、一题一分)
程序填空:30()
简答题、问答题:
4-安全.pdf
安全概念
声明式安全、编程式安全 概念了解
安全策略
Realms、Users、Groups(人的组) 、and Roles(权限的组) 安全策略必考
principal已认证的用户、credential凭据
角色访问控制机制
RBAC(Role-Based Access Control):基于角色的访问控制机制。
基本原理:为用户分配角色、为角色分配权限、...
Jakarta EE:身份认证机制。
基本认证(所有浏览器都支持,但是安全性较低):明文密码Base64格式。
表单认证:HTML登录表单。SpringSecurity中的登录表单j_security_check、j_username、j_password。
身份存储机制
用户名密码既可以存储在数据库,也可以存储在目录服务器 。
Spring
看pdf文档
Spring基于Jakarta EE10,
登录注册:WebService(接口)、业务层(判断合法性)、数据层(登录注册)、安全机制。
MicroProfile:微服务规范(消息驱动是用来解耦的,)
标签:架构设计,服务,EE,Jakarta,笔记,企业级,EJB,Spring,架构 From: https://www.cnblogs.com/Hygge1024/p/18058078