【技术分享】使用nginx完成动静分离➕集成SpringSession➕集成sentinel➕集成seata

🥳🥳Welcome 的Huihui's Code World ! !🥳🥳

接下来看看由辉辉所写的关于技术点的相关分享吧

目录

🥳🥳Welcome 的Huihui's Code World ! !🥳🥳

一、 使用nginx完成动静分离

1.下载nginx

2.进入conf目录,并修改nginx.conf配置文件

3.动静分离

4.将静态文件放置再nginx中

5.运行nginx根目录下的nginx.exe启动nginx

6.修改项目中静态资源的路径

二、 集成SpringSession

1.引入依赖

2.在需要使用到springsession的模块做以下配置

3.编写代码完成登录功能

4.前端显示

三、 集成sentinel

1.导入pom依赖

2.在application文件中进行配置

3.浏览器访问sentinel

四、集成seata

1.下载seata

2.修改配置文件及初始化

①seata-server-1.4.0.zip​​​​​​​

②修改file.conf

③创建数据库Seata并初始化数据表

3.启动seata服务

4.使用Seata实现事务控制

1.初始化数据表

2.添加配置

①DataSourceProxyConfig

②application.yml

③registry.conf

③bootstrap.yaml


一、 使用nginx完成动静分离

1.下载nginx

2.进入conf目录,并修改nginx.conf配置文件

其中也可以完成反向代理的功能


#user  nobody;
worker_processes  1;#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;#pid        logs/nginx.pid;events {worker_connections  1024;
}http {include       mime.types;default_type  application/octet-stream;#log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '#                  '$status $body_bytes_sent "$http_referer" '#                  '"$http_user_agent" "$http_x_forwarded_for"';#access_log  logs/access.log  main;sendfile        on;#tcp_nopush     on;#keepalive_timeout  0;keepalive_timeout  65;#gzip  on;server{listen 80;server_name product.zmall.com;proxy_redirect off;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;location / {proxy_pass http://127.0.0.1:8000/product-serv/;}}server{listen 80;server_name user.zmall.com;proxy_redirect off;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;client_max_body_size 0; chunked_transfer_encoding on;location / {proxy_pass http://127.0.0.1:8000/user-serv/;}}}

3.动静分离

server{listen 80;server_name images.zmall.com;location / {root  html;index index.html;}}

4.将静态文件放置再nginx中

5.运行nginx根目录下的nginx.exe启动nginx

6.修改项目中静态资源的路径

我使用了一个公共的文件,再里面使用了一个base标签,这样其他页面引用这个文件就可以用到其中的静态资源了。

<#assign ctx>
${springMacroRequestContext.contextPath}/
</#assign>
<base href="http:images.zmall.com/"/>

这里的域名也需要做一个域名映射

C:\Windows\System32\drivers\etc\hosts

二、 集成SpringSession

使用其来完成登录成功之后,在首页显示当前用户信息【跨服务】

1.引入依赖

<!--redis-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--spring session-->
<dependency><groupId>org.springframework.session</groupId><artifactId>spring-session-data-redis</artifactId>
</dependency>
<!--commons-pool2-->
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId>
</dependency>

2.在需要使用到springsession的模块做以下配置

spring:session:redis:flush-mode: on_savenamespace: session.zmallcleanup-cron: 0 * * * * *store-type: redistimeout: 1800redis:host: localhostport: 6379password: 123456jedis:pool:max-active: 100max-wait: 10max-idle: 10min-idle: 10database: 0

3.编写代码完成登录功能

package com.wh.user.service.impl;import com.alibaba.nacos.common.utils.MD5Utils;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.wh.user.pojo.User;
import com.wh.user.mapper.UserMapper;
import com.wh.user.service.IUserService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.wh.user.utils.JsonResponseBody;
import com.wh.user.utils.JsonResponseStatus;
import com.wh.user.vo.UserVo;
import dto.UserDto;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.UUID;/*** <p>*  服务实现类* </p>** @author baomidou* @since 2024-02-21*/
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {/*** 登录* @param userVo* @return*/@Overridepublic JsonResponseBody<?> userLogin(UserVo userVo) {//通过传递过来的用户名去数据库中查询对应的对象User user = this.getOne(new QueryWrapper<User>().eq("loginName", userVo.getLoginName()));//做密码判断【数据库的密码是经过加密的】//将用户传递过来的密码加密String userpwd = DigestUtils.md5DigestAsHex(userVo.getPassword().getBytes());//加密之后与数据库中的用户密码进行对比if(!userpwd.equals(user.getPassword())){//如果密码不匹配,则提示相关错误信息return JsonResponseBody.other(JsonResponseStatus.LOGIN_NO_EQUALS);}//如果登录成功,就进行属性复制UserDto userDto = new UserDto();//属性复制BeanUtils.copyProperties(user,userDto);return JsonResponseBody.success();}}
package com.wh.user.controller;import com.wh.user.service.IUserService;
import com.wh.user.utils.JsonResponseBody;
import com.wh.user.vo.UserVo;
import dto.UserDto;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/*** <p>*  前端控制器* </p>** @author baomidou* @since 2024-02-21*/
@RestController
public class UserController {@Autowiredprivate IUserService userService;@Autowiredprivate HttpServletRequest request;/*** 用户登陆功能实现* @return*/@RequestMapping("/userLogin")public JsonResponseBody<?> userLogin(UserVo userVo){//设置当前用户的登录信息request.getSession().setAttribute("user",userVo);//调用登录的方法JsonResponseBody<?> user = userService.userLogin(userVo);return user;}
}

在跳首页的controller方法中获取当前登录用户的session信息

@Autowiredprivate IProductService productService;@Autowiredprivate HttpServletRequest request;/*** 首页跳转* @param model* @return*/@RequestMapping("/index.html")public String index(Model model){//获取当前用户的登录信息UserDto user = (UserDto)request.getSession().getAttribute("user");//按照商品的销量降序排序获取销量排名Top5的商品List<Product> products = productService.list(new QueryWrapper<Product>().orderByDesc("hot").last("limit 4"));model.addAttribute("top4",products);model.addAttribute("user",user);return "Index";}

4.前端显示

<div class="soubg"><div class="sou"><span class="fr"><span class="fl">你好,<#if user??>${user.loginName}<#else><a href="Login.html">请登录</a></#if>&nbsp; <a href="Regist.html" style="color:#ff4e00;">免费注册</a>&nbsp; </span><span class="fl">|&nbsp;关注我们:</span><span class="s_sh"><a href="#" class="sh1">新浪</a><a href="#" class="sh2">微信</a></span><span class="fr">|&nbsp;<a href="#">手机版&nbsp;<img src="images/s_tel.png" align="absmiddle" /></a></span></span></div>
</div>

三、 集成sentinel

1.导入pom依赖

到网关中

<!-- sentinel --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency>

2.在application文件中进行配置

sentinel:transport:port: 9998 #跟控制台交流的端口,随意指定一个未使用的端口即可dashboard: localhost:9999 # 指定控制台服务的地址eager: true #当服务启动时是否与sentinel建立连接web-context-unify: false # 关闭URL PATH聚合

3.浏览器访问sentinel

在此之前需要启动sentinel的那个jar包

# 直接使用jar命令启动项目(控制台本身是一个SpringBoot项目)
java -Dserver.port=9999 -Dcsp.sentinel.dashboard.server=localhost:9999 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.4.jar

四、集成seata

1.下载seata

下载地址icon-default.png?t=N7T8http://Release v1.3.0 · apache/incubator-seata · GitHubRelease v1.3.0 · apache/incubator-seata · GitHub

2.修改配置文件及初始化

①seata-server-1.4.0.zip

将下载得到的seata-server-1.4.0.zip(非源码包)压缩包进行解压

  • 配置seata-1.4.0.zip(源码包)

修改seata-1.4.0中script/config-center目录中的config.txt配置:

store.mode=db    #修改存储方式为db
...
store.db.url=jdbc:mysql://127.0.0.1:3306/seata?useUnicode=true   #修改数据库名
store.db.user=root      #修改数据库账号
store.db.password=1234  #修改数据库密码
  • 初始化Seata配置到Nacos中

在seata-1.4.0\script\config-center\nacos目录中右键选择git bash here,运行git命令窗口。并输入以下命令:

sh nacos-config.sh -h localhost -p 8848 -g SEATA_GROUP -u nacos -w nacos
参数说明
-hnacos注册中心IP地址,默认是localhost
-pnacos注册中心端口,默认是8848
-gnacos配置中心分组,默认是SEATA_GROUP
-tnacos配置中心namespace命名空间名称,默认是'',即public默认命名空间
-unacos注册中心账号
-wnacos注册中心密码

执行成功后可以打开Nacos的控制台,在配置列表中,可以看到初始化了很多Group为SEATA_GROUP 的配置。

②修改file.conf

将mode=“type”修改成mode="db" 2.设置数据库名、用户账号及密码

③创建数据库Seata并初始化数据表

解压seata-1.4.0源码包,并进入到seata-1.4.0\script\server\db目录,复制运行mysql.sql脚本完成seata服务端数据库初始化工作。【记得先创建一个数据库:seata】

④修改registry.conf

registry {type = "nacos"                     #这里使用nacos为注册中心,将type修改成nacosnacos {application = "seata-server"   #注册的服务名serverAddr = "127.0.0.1:8848"  #nacos注册中心地址及端口group = "SEATA_GROUP" #服务注册分组namespace = ""        #namespace是服务注册时的命名空间,可不填,不填默认publiccluster = "default"   #默认即可username = "nacos"    #nacos的登录账号password = "nacos"    #nacos的登录密码}
}
config {type = "nacos"nacos {serverAddr = "127.0.0.1:8848"namespace = ""group = "SEATA_GROUP"username = "nacos"password = "nacos"}
}

registry:指定注册中心,将seata-server注册到指定位置 config: 指定配置中心

3.启动seata服务

直接进入seata服务的seata\bin目录下,双击运行seata-server.bat文件即可。或者使用以下命令方式运行:

cd bin
seata-server.bat -p 9000 -m file
seata-server.bat -h ip地址 -p 9000 -m file

-p 9000:指定监听端口,默认为8091

-m file: 模式

启动后在 Nacos 的服务列表下面可以看到一个seata的服务。

4.使用Seata实现事务控制

1.初始化数据表

进入源码包seata-1.4.0\script\client\at\db目录,复制并运行数据库脚本完成undo_log表创建,这是Seata记录事务日志要用到的表。

CREATE TABLE `undo_log`
(
`id` BIGINT(20) NOT NULL AUTO_INCREMENT,
`branch_id` BIGINT(20) NOT NULL,
`xid` VARCHAR(100) NOT NULL,
`context` VARCHAR(128) NOT NULL,
`rollback_info` LONGBLOB NOT NULL,
`log_status` INT(11) NOT NULL,
`log_created` DATETIME NOT NULL,
`log_modified` DATETIME NOT NULL,
`ext` VARCHAR(100) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `ux_undo_log` (`xid`, `branch_id`)
) ENGINE = INNODB
AUTO_INCREMENT = 1
DEFAULT CHARSET = utf8;

2.添加配置

①DataSourceProxyConfig
package com.zking.zmall.config;import com.alibaba.druid.pool.DruidDataSource;
import io.seata.rm.datasource.DataSourceProxy;
import io.seata.rm.datasource.xa.DataSourceProxyXA;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;import javax.sql.DataSource;@Configuration
public class DataSourceProxyConfig {@Bean@ConfigurationProperties(prefix = "spring.datasource")public DruidDataSource druidDataSource() {return new DruidDataSource();}@Primary@Bean("dataSourceProxy")public DataSource dataSource(DruidDataSource druidDataSource) {//AT模式return new DataSourceProxy(druidDataSource);//XA模式//return new DataSourceProxyXA(druidDataSource);}
}

在启动类(使用到SeaTa)上排除DataSource数据源自动配置类

@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
②application.yml

在需要进行分布式事务的各个微服务中的application.yml数据源更新成阿里巴巴的DruidDataSource

#type连接池类型 DBCP,C3P0,Hikari,Druid,默认为Hikaritype: com.alibaba.druid.pool.DruidDataSource
③registry.conf

在微服务模块中的resources目录下添加seata的配置文件 registry.conf,该配置文件来自于seata-server/conf目录下的配置文件。

registry {type = "nacos"nacos {serverAddr = "localhost"namespace = "public"cluster = "default"}
}
config {type = "nacos"nacos {serverAddr = "localhost"namespace = "public"cluster = "default"}
}
③bootstrap.yaml

请注意spring.cloud.alibaba.seata.tx-service-group=my_test_txgroup配置。这里的my_test_tx_group名称必须与seata源码包中的config.txt配置文件中的名字一致。重要,重要,重要!!!

请打开seata源码包目录seata-1.4.0\script\config-center\下的config.txt去进行配置。

spring:application:name: service-productcloud:nacos:config:server-addr: localhost:8848 # nacos的服务端地址namespace: publicgroup: SEATA_GROUPalibaba:seata:tx-service-group: my_test_tx_group

注意:一定要加一个配置

<!--bootstrap文件的配置--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId></dependency>

好啦,今天的分享就到这了,希望能够帮到你呢!😊😊 

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

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

相关文章

JAVA毕业设计129—基于Java+Springboot+thymeleaf的物业管理系统(源代码+数据库)

毕设所有选题&#xff1a; https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootthymeleaf的物业管理系统(源代码数据库)129 一、系统介绍 本项目前后端分离&#xff0c;本系统分为管理员、小区管理员、用户三种角色 1、用户&#xff1a; 登…

一种简易的多进程文件读写器

目录 1. 前言2. 初步实现3. ParallelFileProcessor 1. 前言 在数据清洗场景下&#xff0c;我们可能需要对一个 .jsonl 文件清洗以得到另一个 .jsonl 文件。一种直观的做法就是逐行读取&#xff0c;逐行清洗&#xff0c;然后逐行写入&#xff0c;这一流程的示意图如下&#xff…

【wails】(6):使用wails做桌面应用开发,使用gin+go-chatglm.cpp进行本地模型运行,在windows上运行成功

1&#xff0c;整体架构说明 主要使用&#xff0c;参考的开源项目是&#xff1a; https://github.com/wailsapp/wails 前端项目&#xff1a; https://github.com/Chanzhaoyu/chatgpt-web 运行模型&#xff1a; https://github.com/Weaxs/go-chatglm.cpp 参考代码&#xff1a; h…

深度神经网络中的计算和内存带宽

深度神经网络中的计算和内存带宽 文章目录 深度神经网络中的计算和内存带宽来源原理介绍分析1&#xff1a;线性层分析2&#xff1a;卷积层分析3&#xff1a;循环层总结 来源 相关知识来源于这里。 原理介绍 Memory bandwidth and data re-use in deep neural network computat…

五.AV Foundation 视频播放 - 标题和字幕

引言 本篇博客主要介绍使用AV Foundation加载视频资源的时候&#xff0c;如何获取视频标题&#xff0c;获取字幕并让其显示到播放界面。 设置标题 资源标题的元数据内容&#xff0c;我们需要从资源的commonMetadata中获取&#xff0c;在加载AVPlayerItem的时候我们已经指定了…

Sentinel微服务流量治理组件实战上

目录 分布式系统遇到的问题 解决方案 Sentinel 是什么&#xff1f; Sentinel 工作原理 Sentinel 功能和设计理念 流量控制 熔断降级 Sentinel工作主流程 Sentinel快速开始 Sentinel资源保护的方式 基于API实现 SentinelResource注解实现 Spring Cloud Alibaba整合…

介绍 PIL+IPython.display+mtcnn for 音视频读取、标注

1. nn.NLLLoss是如何计算误差的? nn.NLLLoss是负对数似然损失函数&#xff0c;用于多分类问题中。它的计算方式如下&#xff1a;首先&#xff0c;对于每个样本&#xff0c;我们需要将其预测结果通过softmax函数转换为概率分布。softmax函数可以将一个向量映射为一个概率分布&…

第四节:Vben Admin登录对接后端getUserInfo接口

系列文章目录 第一节&#xff1a;Vben Admin介绍和初次运行 第二节&#xff1a;Vben Admin 登录逻辑梳理和对接后端准备 第三节&#xff1a;Vben Admin登录对接后端login接口 第四节&#xff1a;Vben Admin登录对接后端getUserInfo接口 文章目录 系列文章目录前言一、回顾Vben…

RK3568平台 阻塞IO和非阻塞IO

一.IO 模型的分类 IO 模型根据实现的功能可以划分为为阻塞 IO、非阻塞 IO、信号驱动IO&#xff0c;IO多路复用和异步 IO。根据等待 IO 的执行结果进行划分&#xff0c;前四个 IO 模型又被称为同步IO. 同步IO与异步IO&#xff1a; 以现实生活去餐馆吃饭为例&#xff0c;根据菜…

Linux——缓冲区封装系统文件操作

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、FILE二、封装系统接口实现文件操作1、text.c2、mystdio.c3、mystdio.h 一、FILE 因为IO相…

Typora结合PicGo + 使用Github搭建个人免费图床

文章目录 一、国内图床比较二、使用Github搭建图床三、PicGo整合Github图床1、下载并安装PicGo2、设置图床3、整合jsDelivr具体配置介绍 4、测试5、附录 四、Typora整合PicGo实现自动上传 每次写博客时&#xff0c;我都会习惯在Typora写好&#xff0c;然后再复制粘贴到对应的网…

基于springboot+vue的校园社团信息管理系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

自定义搭建管理系统

最近使用自己搭建的脚手架写了一个简易管理系统&#xff0c;使用webpackreactantd&#xff0c;搭建脚手架参考&#xff1a; 使用Webpack5搭建项目&#xff08;react篇&#xff09;_babel-preset-react-app-CSDN博客 搭建的思路&#xff1a; 1. 基建布局&#xff0c;使用antd的…

代码随想录算法训练营第二十五天 | 216.组合总和III,17.电话号码的字母组合 [回溯篇]

代码随想录算法训练营第二十五天 LeetCode 216.组合总和III题目描述思路参考代码总结 LeetCode 17.电话号码的字母组合题目描述思路参考代码 LeetCode 216.组合总和III 题目链接&#xff1a;216.组合总和III 文章讲解&#xff1a;代码随想录#216.组合总和III 视频讲解&#xff…

Java零基础 - 字符串连接运算符

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一个人虽可以走的更快&#xff0c;但一群人可以走的更远。 我是一名后…

acwing算法学习笔记 ------ 双链表

1、定义 这里可以做一个投机取巧&#xff0c;我们不再像单链表去用head去存头和尾&#xff0c;直接让r[0] 1,l[1] 0; idx 2.进行初始化&#xff0c; 解释一下l[N] 和 r[N] l[N]:是表示指向左面下一个节点下标&#xff0c; r[N]:表示指向下一个节点的下标。大家不用担心i…

皓学IT:WEB03_MySQL

今日内容介绍 Mysql数据库 SQL语句 一、数据库 1.1. 数据库概述 什么是数据库 数据库就是存储数据的仓库&#xff0c;其本质是一个文件系统&#xff0c;数据按照特定的格式将数据存储起来&#xff0c;用户可以对数据库中的数据进行增加&#xff0c;修改&#xff0c;删除及…

南京观海微电子---AXI总线技术简介——ZYNQ PS和PL的互联技术

1.AXI总线介绍 AXI全称Advanced Extensible Interface&#xff0c;是Xilinx从6系列的FPGA开始引入的一个接口协议&#xff0c;主要描述了主设备和从设备之间的数据传输方式。AXI协议在Xilinx的ZYNQ系列芯片中继续使用&#xff0c;协议版本是AXI4。 ZYNQ为Xilinx推出的首款将高…

解决vulhub漏洞环境下载慢卡死问题即解决docker-valhub漏洞环境下载慢的问题

解决vulhub环境下载慢/卡 当前环境为&#xff1a;ubuntu20 1.在 cd /etc/docker/目录下创建或修改daemon.json文件 sudo touch daemon.json编辑daemon.json文件 sudo vim daemon.json2.填写阿里云镜像地址&#xff1a; { "registry-mirrors":["https://6kx…

11-pytorch-使用自己的数据集测试

b站小土堆pytorch教程学习笔记 import torch import torchvision from PIL import Image from torch import nnimg_path ../imgs/dog.png imageImage.open(img_path) print(image) # imageimage.convert(RGB)transformtorchvision.transforms.Compose([torchvision.transforms.…