spring boot(学习笔记第十一课)

news2025/1/17 14:06:19

spring boot(学习笔记第十一课)

  • Session共享,JPA实现自动RESTful

学习内容:

  1. Session共享
  2. JPA实现自动RESTful

1. Session共享

  1. Session共享面临问题

    • spring boot默认将session保存在web server的内存里面,会产生什么问题呢。在这里插入图片描述
      如上图所示,有nginx作为服务器前置负载均衡器的时候,第一次访问将session保存在web server 1中的内存中,但是第二次访问的时候,假如重新定向到web server 4的时候,将无法正确取得session

    • 使用redis解决问题
      在这里插入图片描述
      使用redis之后,使每次web serversession数据都保存到唯一的redis的,这样重定向到那个web server,最后都会从redis的内存取得,所以每次取得和保存的session数据都一致。

  2. Nginx负载均衡

    • 创建nginx server 最好使用sudo -i注意,这里使用VMware进行创建
      cd /data
      mkdir nginx
      wget https://nginx.org/download/nginx-1.27.0.tar.gz
      cd nginx-1.27.0
      yum -y install pcre-devel openssl openssl-devel gd-devel gcc gcc-c++
      ./configure
      make
      make install
      
    • 启动nginx server
      • 如果有process占用80端口,通过ss -tulnp | grep :80命令确认。
      • 如果有process占用80端口,通过ss -tulnp | grep :80命令确认。
      • 之后定位到$pid,使用kill -9 $pid结束进行。注意,这里$pid意味需要替换的变量
    • 尝试访问nginx server
      http://192.168.12.130/ 注意,这里采用http,不能采用https,如何配置httpsnginx中需要确认
      在这里插入图片描述
    • 修改nginx.conf配置文件
       upstream finlay.com{
            server 192.168.12.1:8080 weight=1;
            server 192.168.12.1:8081 weight=1;
          }
          #gzip  on;
          server {
              listen       80;
              server_name  localhost;
              #charset koi8-r;
              #access_log  logs/host.access.log  main;
      
              location / {
                  proxy_pass http://finlay.com;
                  proxy_redirect default;
              }
      
  3. spring boot应用加入session依赖
    加入了这个依赖,spring boot应用程序自动 session数据保存到redis的数据库中。

     <dependency>
                <groupId>org.springframework.session</groupId>
                <artifactId>spring-session-data-redis</artifactId>
    </dependency>
    
  4. 配置controller并且去掉https

    • 配置controller,在controller中向session保存信息之后从session读取信息。
          @Value("${server.port}")
          private String port;
      
          @PostMapping("/save")
          @ResponseBody
          public String saveName(String name, HttpSession session) {
              session.setAttribute("name", name);
              return port;
          }
      
          @GetMapping("get")
          @ResponseBody
          public String getName(HttpSession session) {
              return port + ":" + session.getAttribute("name").toString();
          }
      
    • https配置去掉,因为暂时nginx没有配置https
      #server.ssl.key-store=classpath:/key/httpskey.p12
      #server.ssl.key-alias=hellohttps
      #server.ssl.key-store-password=123456
      
    • 分别启动80808081两个端口,模拟两个server,进行负载均衡处理server
      java -jar demo-0.0.1-SNAPSHOT.jar --server.port=8080
      java -jar demo-0.0.1-SNAPSHOT.jar --server.port=8081
      
  5. 使用postmannginx服务器进行模拟发送post请求和get请求。

    • 发送post请求,对session上设置nameattribute。从结果是8080端口来看, 这里是通过8080端口的服务器进行session情报的保存。
      在这里插入图片描述

    • 发送get请求,对session上设置nameattribute`。
      在这里插入图片描述

      可以看到当nginx将请求postsave请求上对session进行设置后,8081端口的上get请求,能够马上去的到同样的值,保证服务器端的前置负载均衡器将请求重定向到另一个服务器,取得到的session情报一致。

2. JPA实现自动RESTful

  1. 这里使用postgresql进行实验,对数据源进行配置。

    spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
    spring.datasource.url=jdbc:postgresql://127.0.0.1:5432/springboot
    spring.datasource.username=finlay
    spring.datasource.password=123456
    spring.jpa.database=postgresql
    spring.jpa.properties.show-sql=true
    spring.jpa.properties.hibernate.hbm2ddl.auto=update
    spring.datasource.driver-class-name=org.postgresql.Driver
    spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
    
  2. 同样引入必要的依赖

     <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid-spring-boot-starter</artifactId>
                <version>1.2.9</version>
     </dependency>
     <dependency>
                <groupId>org.postgresql</groupId>
                <artifactId>postgresql</artifactId>
                <scope>runtime</scope>
    </dependency>
    <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-rest</artifactId>
    </dependency>
    

    注意这里加入了spring-boot-starter-data-rest,可以在后面看到,这里不需要 在定义自己的controller代码,spring-boot-starter-data-rest可以自动生成自己的RESTful方法

  3. JpaRepository提供的默认方法
    JpaRepository本身提供了好多方法。尝试查看下代码。

    @NoRepositoryBean
    public interface JpaRepository<T, ID> extends ListCrudRepository<T, ID>, ListPagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {
        void flush();
        <S extends T> S saveAndFlush(S entity);
        <S extends T> List<S> saveAllAndFlush(Iterable<S> entities);
        /** @deprecated */
        @Deprecated
        default void deleteInBatch(Iterable<T> entities) {
            this.deleteAllInBatch(entities);
        }
        void deleteAllInBatch(Iterable<T> entities);
        void deleteAllByIdInBatch(Iterable<ID> ids);
        void deleteAllInBatch();
    
  4. 定义Entity类和创建BookReposity

    • 定义EntityBook
      @Data
      @Entity(name = "book")
      public class Book{
          @Id
          @GeneratedValue(strategy = GenerationType.IDENTITY)
          private Integer id;
          private String name;
          private String author;
      }
      
    • 继承JpaRepository<T, ID>,生成自己的interface
      	public interface BookDao extends JpaRepository<Book,Integer> {
      	}
      

    其余的代码需不需要,spring boot会自动生成books (默认的,book表名加上s),作为默认的RESTful API的path

  5. 利用postman进行访问

    • 利用post books进行请求,保存bookEntity对象。
      在这里插入图片描述
    • 查看数据库的保存情况。在这里插入图片描述
    • 看到增加的Entityspring boot也给出了访问的url,进一步使用GET进行访问。
      在这里插入图片描述
    • books发出POST请求,findAll所有的记录。
      在这里插入图片描述
    • book特定id发出PUT请求,修改该记录。
      在这里插入图片描述
    • 对于上面的默认path(url)可以进行修改
    • 修改整个集合的path配置。
      • path
      • collectionResourceRel
      • itemResourceRel
      @RepositoryRestResource(path = "my_books",
              collectionResourceRel = "my_books",
              itemResourceRel = "my_book")
      public interface BookDao extends JpaRepository<Book, Integer> {
      }
      
      在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1881450.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

web全屏api,实现元素放大全屏,requestFullscreen,exitFullscreen

全屏api 主要方法 document.exitFullscreen(); 退出页面全屏状态&#xff0c;document是全局文档对象 dom.requestFullscreen(); 使dom进入全屏状态&#xff0c;异步&#xff0c;dom是一个dom元素 dom.onfullscreenchange&#xff08;&#xff09;; 全…

阿里云centos7.9 挂载数据盘到 www目录

一、让系统显示中文 参考&#xff1a;centos7 怎么让命令行显示中文&#xff08;英文-&#xff1e;中文&#xff09;_如何在命令行中显示中文-CSDN博客 1、输入命令&#xff1a;locale -a |grep "zh_CN" 可以看到已经存在了中文包 2、输入命令&#xff1a;sudo vi…

51单片机第21步_将TIM0用作两个8位定时器同时将TIM1用作波特率发生器

本章重点讲解将TIM0用作两个8位定时器&#xff0c;同时将TIM1用作波特率发生器。 当定时器T0在方式3时&#xff0c;T1不能产生中断&#xff0c;但可以正常工作在方式0、1、2下&#xff0c;大多数情况下&#xff0c;T1将用作串口的波特率发生器。 1、定时器0工作在模式3框图&a…

智能制造 v3.13.14 发布,ERP、MES 更新

智能制造一体化管理系统 [SpringBoot2 - 快速开发平台]&#xff0c;适用于制造业、建筑业、汽车行业、互联网、教育、政府机关等机构的管理。包含文件在线操作、工作日志、多班次考勤、CRM、ERP 进销存、项目管理、EHR、拖拽式生成问卷、日程、笔记、工作计划、行政办公、薪资模…

惧怕人工智能不如拥抱人工智能,聊聊如何使用Spring AI框架快速开发大模型项目

自ChatGPT出现以来&#xff0c;技术圈子里人人自危&#xff0c;导致大家心态越来越浮躁&#xff0c;生怕努力学习来的技术最后被人工智能轻易替代变得一文不值。其实换个角度来说大家也不用过于担心&#xff0c;社会的向前发展&#xff0c;生产力工具的优化更迭导致效率的提升是…

着色器预热?为什么 Flutter 需要?为什么原生 App 不需要?那 Compose 呢?Impeller 呢?

依旧是来自网友的问题&#xff0c;这个问题在一定程度上还是很意思的&#xff0c;因为大家可能会想&#xff0c;Flutter 使用 skia&#xff0c;原生 App 是用 skia &#xff0c;那为什么在 Flutter 上会有着色器预热&#xff08;Shader Warmup&#xff09;这样的说法&#xff1…

(一)Docker基本介绍

部署项目的发展 传统部署适合需要最大性能和可靠性的场景&#xff0c;但在资源利用和管理方面有显著劣势。虚拟化部署提供了良好的资源利用率和隔离性&#xff0c;适用于需要灵活扩展和多租户环境的场景&#xff0c;但存在性能开销。容器部署在轻量级、可移植性和资源利用率方面…

甄选范文“论单元测试方法及应用”,软考高级论文,系统架构设计师论文

论文真题 1、概要叙述你参与管理和开发的软件项目,以吸你所担的主要工作。 2、结给你参与管理和开发的软件项目,简要叙述单元测试中静态测试和动态测试方法的基本内容。 3、结给你惨与管理和研发的软件项目,体阐述在玩测试过程中,如何确定白盒测试的覆盖标准,及如何组织实施…

NetSuite Amount正负符号在Saved Search和DataSet中的不同含义

近期在一个项目中碰到Amount取值的Bug&#xff0c;原因是我们的代码中数据源从Saved Search转为了DataSet&#xff0c;由于这个转换导致了Amount的正负值混乱。今天记录一下。 正负号原则 • Saved Search&#xff0c; Amount的正负需要考虑科目类型。 Amount字段根据科目类型…

⭐Ollama的本地安装⚡

先来逛一下咱们的主角Ollama的官网地址&#xff1a; Ollama 大概长这个样子&#x1f914; 因为本地系统的原因&#xff0c;文章只提供Widows的安装方式&#xff0c;使用Linux和Mac的大佬&#xff0c;可以自行摸索&#x1f9d0; 下载完成后就是安装了&#x1f355;&#xff0c…

使用Petalinux设计linux系统

文章目录 1.通过 Vivado 创建硬件平台&#xff0c;得到 hdf 硬件描述文件2.设置 Petalinux 环境变量3.创建 Petalinux 工程4.配置Petalinux 工程5.配置Linux内核6.配置Linux根文件系统7.配置设备树文件8.编译 Petalinux 工程9.制作BOOT.BIN启动文件10.制作SD启动卡 1.通过 Viva…

Linux Swap机制关键点分析

1. page被swap出去之后,再次缺页是怎么找到找个换出的页面? 正常内存的页面是通过pte映射找到page的,swap出去的page有其特殊的方式:swap的页面page->private字段保存的是:swap_entry_t通过swap_entry_t就能找到该页面的扇区号sector_t,拿到扇区号就可以从块设备中读…

Golang | Leetcode Golang题解之第208题实现Trie前缀树

题目&#xff1a; 题解&#xff1a; type Trie struct {children [26]*TrieisEnd bool }func Constructor() Trie {return Trie{} }func (t *Trie) Insert(word string) {node : tfor _, ch : range word {ch - aif node.children[ch] nil {node.children[ch] &Trie{…

物体识别桌颠覆传统,创新科技重塑感知体验!

随着科技的疾驰进步&#xff0c;设想一下&#xff0c;站在一张桌面前&#xff0c;你只需优雅地挥动手掌&#xff0c;桌面的物品便如魔法般消失或重现。这不再是科幻电影的幻想&#xff0c;而是当下真实可触的奇迹——物体识别桌。这一革命性的技术不仅颠覆了观众对世界的感知&a…

Spark SQL----ANSI Compliance

Spark SQL----ANSI Compliance 一、算术运算二、Cast2.1 Rounding in cast 三、存储分配四、Type coercion4.1 类型提升和优先级4.2 最不常见类型解析 五、SQL函数5.1 函数调用5.2 具有不同行为的函数 六、SQL操作符七、ANSI模式的有用函数八、SQL关键字(可选&#xff0c;默认禁…

特征工程的力量

为什么你应该使用逻辑回归来建模非线性决策边界&#xff08;使用 Python 代码&#xff09; 作为一名大数据从业者&#xff0c;复杂的机器学习技术非常具有吸引力。使用一些深度神经网络 (DNN) 获得额外的 1% 准确率&#xff0c;并在此过程中启动 GPU 实例&#xff0c;这让人非常…

Markdown、Latex编辑小工具

Markdown、Latex编辑小工具 文章说明主要代码效果展示源码下载 文章说明 本文主要为了书写Latex的书写风格&#xff0c;以及了解自己实现一个markdown类型的编辑器的过程&#xff1b;目前实现了当前的效果&#xff1b;书写文章进行记录&#xff0c;方便后续查阅 目前还未添加好…

鸿蒙 HarmonyOs 动画效果 快速入门

一、理论 1.1 animation属性 名称参数类型必填描述durationnumber否设置动画时长&#xff0c;默认值&#xff1a;1000&#xff0c;单位&#xff1a;毫秒temponumber否动画播放速度。数值越大&#xff0c;速度越快&#xff0c;默认为1curvestring | Curve否 设置动画曲线。 默…

在node环境使用MySQL

什么是Sequelize? Sequelize是一个基于Promise的NodeJS ORM模块 什么是ORM? ORM(Object-Relational-Mapping)是对象关系映射 对象关系映射可以把JS中的类和对象&#xff0c;和数据库中的表和数据进行关系映射。映射之后我们就可以直接通过类和对象来操作数据表和数据了, 就…

昇思25天学习打卡营第13天|MindNLP ChatGLM-6B StreamChat

学AI还能赢奖品&#xff1f;每天30分钟&#xff0c;25天打通AI任督二脉 (qq.com) MindNLP ChatGLM-6B StreamChat 本案例基于MindNLP和ChatGLM-6B实现一个聊天应用。 1 环境配置 %%capture captured_output # 实验环境已经预装了mindspore2.2.14&#xff0c;如需更换mindspo…