SpringCloudAlibaba技术栈-Dubbo

1、什么是Dubbo?

简单来说,dubbo就像是个看不见的手,负责专门从注册中心nacos调用注册到nacos上面的服务的,因为在微服务环境下不同的功能模块可能在不同的服务器上。dubbo调用服务就像是在调用本地的服务一样。

分布式调用与高并发处理 Dubbo分布式调用_分布式之间的调用-CSDN博客

2、Dubbo实现

(1)创建父项目

添加相关依赖

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.zj</groupId><artifactId>Dubbo_demo2</artifactId><version>1.0-SNAPSHOT</version><packaging>jar</packaging><name>Dubbo_demo2</name><url>http://maven.apache.org</url><properties><dubbo.version>3.2.4</dubbo.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>17</java.version><spring-boot.version>3.0.2</spring-boot.version><spring-cloud.version>2022.0.0</spring-cloud.version><spring-cloud-alibaba.version>2022.0.0.0</spring-cloud-alibaba.version><lombok.version>1.8.28</lombok.version></properties><dependencyManagement><dependencies><!-- SpringCloud 微服务 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency><!-- SpringCloud Alibaba 微服务 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring-cloud-alibaba.version}</version><type>pom</type><scope>import</scope></dependency><!-- SpringBoot 依赖配置 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency><!-- lombok 依赖配置 --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${lombok.version}}</version></dependency><!-- Dubbo --><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-bom</artifactId><version>${dubbo.version}</version><type>pom</type><scope>import</scope></dependency><!-- bootstrap 启动器 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope></dependency></dependencies></dependencyManagement></project>

(2)创建子模块interface

添加下面的依赖文件,为啥要添加mybatis依赖呢?因为有些时候需要指定实体类对应的表和实体类和表字段之间的对应关系等。lombok就是为了生成实体类的get\set等方法。

        <!-- Mybatis plus 依赖 --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.1.0</version></dependency><!--lombok依赖--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.28</version></dependency>

在test数据库创建User表

create database test;
CREATE TABLE user(id 
BIGINT(20) NOT NULL COMMENT '主键ID',name VARCHAR(30) NULL DEFAULT NULL COMMENT 
'姓名',age INT(11) NULL DEFAULT NULL COMMENT '年
龄',PRIMARY KEY (id));

在interface下创建User实体类

@TableName("user")
@Data
public class User {private Long id;private String name;private Integer age;
}

创建结果集

package com.zj.common;import java.io.Serializable;/*结果集*/
/*实现序列化因为dubbo传输的是二进制数据*/
public class CommonResult<T> implements Serializable {private Integer code;
private String msg;
private T data;}

创建IUserService接口

package com.zj.service;import com.zj.common.CommonResult;
import com.zj.pojo.User;/*用户接口*/
public interface IUserService {CommonResult<User> createUser(User user);CommonResult<User> findAllUser(User user);CommonResult<User> updateUser(User user);CommonResult<User> deleteUser(Long id);}

(3)创建子模块user-service

这个模块就是对用户业务的具体实现,这里面的业务是需要注册到nacos上面的。

添加依赖文件

    <dependencies><!--springboot依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--dubbo整合spring boot的依赖包--><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId></dependency><!--dubbo注册到nacos上的依赖包--><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-registry-nacos</artifactId></dependency><!-- Mybatis plus 依赖 --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.7</version></dependency><!--MySQL 数据库依赖 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.49</version></dependency><!--接口的依赖--><dependency><groupId>com.zj</groupId><artifactId>1interface</artifactId><version>1.0-SNAPSHOT</version></dependency></dependencies>

创建mapper层获取数据库的数据。

package com.zj.mapepr;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zj.pojo.User;public interface UserMapper extends BaseMapper<User> {}

别忘了在启动类上添加上这三个注解。

@EnableDubbo
@MapperScan("com.zj.mapper")
@SpringBootApplication
public class userService
{public static void main( String[] args ){SpringApplication.run(userService.class, args);}
}

 @EnableDubbo注解是使用Dubbo进行服务化开发的关键注解,它使得Spring Boot应用能够方便地集成和使用Dubbo框架提供的分布式服务能力。

当你将这个注解添加到你的Spring Boot应用的配置类上时,它会做以下几件事情:

  1. 开启Dubbo自动配置:它会触发Spring Boot的自动配置机制,自动配置Dubbo相关的Bean。

  2. 服务暴露:在Spring容器中,标注了@Service(注意这里不是Spring的@Service,而是Dubbo的@Service注解)的类会被识别为Dubbo服务,并且会被注册到注册中心(比如Zookeeper),从而可以被其他服务发现和调用。

  3. 服务引用:它允许你的应用通过Dubbo去引用其他服务。通常是通过@Reference注解来注入其他Dubbo服务。

  4. 配置加载:它会加载Dubbo相关的配置,这些配置可以是写在application.propertiesapplication.yml文件中,也可以是通过其他方式定义的Dubbo配置类。

  5. 依赖注入:它支持将Dubbo的Reference(服务引用)注入到Spring管理的Bean中,使得远程服务调用就像调用本地方法一样简单。

  6. 服务监控@EnableDubbo还负责集成Dubbo的监控功能,比如可以通过配置将服务的调用次数、调用时间等信息发送到监控中心。

创建service层实现IUserService接口,并将该业务注册到nacos上。

package com.zj.service;import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.zj.common.CommonResult;
import com.zj.mapper.UserMapper;
import com.zj.pojo.User;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.beans.factory.annotation.Autowired;import java.util.List;/*用户的业务层*/
@DubboService   //将该业务发布到注册中心nacos
public class UserServiceImpl implements IUserService{@Autowiredprivate UserMapper userMapper;/*添加用户*/@Overridepublic CommonResult<User> createUser(User user) {CommonResult<User> userCommonResult = new CommonResult<>();int insert = userMapper.insert(user);if(insert > 0){userCommonResult.setCode(200);  //结果的编码userCommonResult.setMsg("success");  //结果的描述}else {userCommonResult.setCode(500);userCommonResult.setMsg("fail");}return userCommonResult;}/*查询用户,这个地方不能加泛型*/@Overridepublic CommonResult findAllUser(User user) {CommonResult userCommonResult = new CommonResult<>();//查询条件构造器LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();//id不为空的话使用id查询lqw.eq(user.getId() != null,User::getId,user.getId());//name不为空的话使用id查询lqw.eq(user.getName() != null,User::getName,user.getName());//age不为空的话使用id查询lqw.eq(user.getAge() != null,User::getAge,user.getAge());//查询用户List<User> users = userMapper.selectList(lqw);userCommonResult.setCode(200);userCommonResult.setMsg("success");userCommonResult.setData(users);return userCommonResult;}//更新用户@Overridepublic CommonResult updateUser(User user) {CommonResult userCommonResult = new CommonResult<>();if(user.getId() == null){userCommonResult.setCode(500);userCommonResult.setMsg("id = null");return userCommonResult;}/*条件构造器*/LambdaUpdateWrapper<User> lqw = new LambdaUpdateWrapper<>();lqw.set(user.getName() != null, User::getName, user.getName()).set(user.getAge() != null, User::getAge, user.getAge()).eq(User::getId, user.getId());//更新int update = userMapper.update(null, lqw);if(update > 0){userCommonResult.setCode(200);userCommonResult.setMsg("success");}else {userCommonResult.setCode(500);userCommonResult.setMsg("fail");}return userCommonResult;}//删除@Overridepublic CommonResult<User> deleteUser(Long idr) {CommonResult<User> userCommonResult = new CommonResult<>();if(idr == null){userCommonResult.setCode(500);userCommonResult.setMsg("id = null");return userCommonResult;}int i = userMapper.deleteById(idr);if(i > 0){userCommonResult.setCode(200);userCommonResult.setMsg("success");}else {userCommonResult.setCode(500);userCommonResult.setMsg("fail");}return userCommonResult;}}

需要注意的是查询全部的用户的时候不能写泛型,因为查询出来的不是User而是个List。 

创建user-service模块的配置文件application.yml文件

dubbo:application:
#    项目名称name: user-service
#    通讯协议protocol:name: dubbo
#    端口号 设置端口为 -1 表示 dubbo 自动扫描并使用可用端口(从20880开始递增),避免了端口冲突的问题。port: -1registry:
#    服务的注册地址address: nacos://192.168.66.100:8848server:port: 8001#配置数据源
spring:datasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://192.168.66.100:3306/test?serverTimezone=UTCusername: rootpassword: 123456

 (4)服务接口测试

启动user-service模块

创建测试项目,使apifox测试,选择Dubbo类型的项目。

 导入接口数据,注意导入的是nacos的数据。

(5)创建消费者模块

导入消费者模块的依赖

 <dependencies><!--thymeleaf--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><!--springboot依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--dubbo整合spring boot的依赖包--><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId></dependency><!--dubbo注册到nacos上的依赖包--><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-registry-nacos</artifactId></dependency><!--这个不能忘记,因为在消费者模块中也就是consume中需要使用userService模块的服务--><dependency><groupId>com.zj</groupId><artifactId>1interface</artifactId><version>1.0-SNAPSHOT</version></dependency></dependencies>

添加配置文件。

消费者也是需要调用nacos中的服务的因此也需要将服务注册到nacos上。因此需要添加下面的配置,除此之外还需要添加Thymeleaf的配置。

spring-boot很多配置都有默认配置,比如默认页面映射路径为:classpath:/templates/*.html

同样静态文件路径为:classpath:/static/
 

thymeleaf是前端的页面因此这里创建子模块是consume是专门消费服务的,也就是前台发请求显示页面的模块。

在consume 模块的resource目录下创建template文件夹和static文件夹。

dubbo:application:name: consume-serviceprotocol:name: dubboregistry:address: nacos://192.168.66.100:8848
server:port: 8002spring:thymeleaf:cache: falsemode: HTML5encoding: utf-8content-type: text/html

在templates下面创建视图页面。

首页

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>首页</title>
</head>
<body><a href="/addUser">添加用户</a>
<a href="/user/showUser">查询用户</a></body>
</html>

添加用户

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>添加用户</title>
</head>
<body><form action="/user/addUser" method="post"><input type="hidden" name="id" value="0">用户名字:<input type="text" name="name" placeholder="请输入名字">用户年龄:<input type="text" name="age" placeholder="请输入年龄"><input type="submit" value="添加用户">
</form></body>
</html>>

OK页面

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<link rel="shortcut icon" href="../resources/favicon.ico" th:href="@{/static/favicon.ico}"/>
<head><meta charset="UTF-8"><title>成功页面</title>
</head>
<body>
操作成功请<a href="/index">返回</a>
</body>
</html>

error页面

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
执行失败<a href="/index">返回</a>
</body>
</html>

显示用户信息

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>查询用户</title>
</head>
<body><table><tr><td>序号</td><td>名字</td><td>用户年龄</td><td>操作</td></tr><tr th:each="u : ${users}"><td th:text="${u.id}"></td><td th:text="${u.name}"></td><td th:text="${u.age}"></td><td><a th:href="@{/user/delete(id=${u.id})}">删除</a><a th:href="@{/user/toUpdate(id=${u.id})}">更新</a></td></tr>
</table></body>
</html>

更新用户页面。

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>更新用户</title>
</head>
<body><form action="/user/update" method="post"><input type="hidden" name="id" th:value="${user.id}">用户名字:<input type="text" name="name" placeholder="请输入名字" th:value="${user.name}">用户年龄:<input type="text" name="age" placeholder="请输入年龄" th:value="${user.age}"><input type="submit" value="更新用户">
</form>
</body>
</html>

然后创建两个controller,一个负责页面跳转的。

package com.zj.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.ResponseBody;/*视图层控制器*/
@Controller
public class IndexController {/*页面跳转*/@GetMapping("/{page}")public String index(@PathVariable String page) {return page;}/*忽略favicon*/@GetMapping("favicon.ico")@ResponseBodyvoid noFavicon() {}}

 一个负责处理具体的业务请求的。

package com.zj.controller;import com.zj.common.CommonResult;
import com.zj.pojo.User;
import com.zj.service.IUserService;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;import java.util.List;@Controller
@RequestMapping("/user")
public class UserController {//远程调用添加用户的操作,添加用户的服务是user-service模块提供的,需要注意的是要引入interface模块依赖@DubboReferenceprivate IUserService userService;/*添加用户*/@PostMapping("/addUser")public String addUser(User user){CommonResult<User> result = userService.createUser(user);//判断是不是添加成功if (result.getCode() == 200){return "redirect:/ok";}else {return "redirect:/error";}}/*查询用户*/@GetMapping("/showUser")public ModelAndView selectUser(){//既要返回视图还需要返回结果ModelAndView modelAndView = new ModelAndView();User user1 = new User();CommonResult<User> allUser = userService.findAllUser(user1);//视图添加数据modelAndView.addObject("users",allUser.getData());//返回视图modelAndView.setViewName("showUser");return modelAndView;}/*根据id查询数据跳转到更新数据的页面*/@GetMapping("/toUpdate")public ModelAndView toUpdateUser(Long id){ModelAndView modelAndView = new ModelAndView();User user = new User();user.setId(id);CommonResult allUser = userService.findAllUser(user);List<User> data = (List<User>)allUser.getData();if (data.size() > 0){modelAndView.addObject("user",data.get(0));  //取出第一个数据modelAndView.setViewName("update");}return modelAndView;}/*更新用户*/@PostMapping("/update")public String updateUser(User user){System.out.println("user:"+user);CommonResult<User> userCommonResult = userService.updateUser(user);if (userCommonResult.getCode() == 200){return "redirect:/ok";}else{return "redirect:/error";}}/*删除用户*/@GetMapping("/delete")public String deleteUser(Long id){CommonResult<User> userCommonResult = userService.deleteUser(id);if (userCommonResult.getCode() == 200){return "redirect:/ok";}else {return "redirect:/error";}}
}

需要注意的就是这个@DubboReference注解,就是获取nacos的服务实例,注入到userService变量中。

另外根据id查询用户的时候需要注意的是查询结果是个List所以取出第一个来。

最后启动类加注解。

/*告诉 Spring Boot 不要自动配置数据源。使用我配置的数据源。*/
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
@EnableDubbo
public class userConsume
{public static void main( String[] args ){SpringApplication.run(userConsume.class, args);}
}

 @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})第一次碰到这个注解,不叫的话会出错。

最后是配置文件。

dubbo:application:name: consume-serviceprotocol:name: dubboregistry:address: nacos://192.168.66.100:8848
server:port: 8002#配置视图
spring:thymeleaf:cache: falsemode: HTML5encoding: utf-8content-type: text/html

最后启动user-service模块和user-consum模块,在浏览器输入locahost:8082/index就行啦。

详细的项目代码已经上传。

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

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

相关文章

智慧城市超声波气象站

智慧城市超声波气象站是一种现代化的气象监测设备&#xff0c;它利用超声波技术能够实时、精确地监测和记录多种关键气象要素。以下是智慧城市超声波气象站的主要功能&#xff1a; 一、高精度气象监测 风速风向测量&#xff1a;超声波气象站的核心部件是超声波风速风向仪&…

时间关系推理:利用大型语言模型检测股票投资组合崩溃

“Temporal Relational Reasoning of Large Language Models for Detecting Stock Portfolio Crashes” 论文地址&#xff1a;https://arxiv.org/pdf/2410.17266 摘要 当股票投资组合遭遇如2007年金融危机或2020年因COVID-19导致的股市暴跌这样的罕见事件时&#xff0c;传统的…

IndexOf Apache Web For Liunx索引服务器部署及应用

Apache HTTP Server 是一款广泛使用的开源网页服务器软件,它支持多种协议,包括 HTTP、HTTPS、FTP 等 IndexOf 功能通常指的是在一个目录中自动生成一个索引页面的能力,这个页面会列出该目录下所有的文件和子目录。比如网上经常看到的下图展现的效果,那么接下来我们就讲一下…

【C++】BC89 包含数字9的数

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目描述题目名称&#xff1a;BC89 包含数字9的数 &#x1f4af;代码实现与分析代码结构详解 &#x1f4af;代码执行逻辑示例&#x1f4af;优化与改进改进版代码改进点详解…

解决Windows无法同时使用有线网和无线网WIFI的问题

参考资料 电脑无线网wifi和有线网同时使用&#xff08;内网外网同时使用&#xff09;用route命令解决Wifi和网卡不能同时上内外网问题 解决方法 对于Windows系统同时连接有线网和无线网Wifi时&#xff0c;只会有一个网关生效&#xff0c;因此我们需要手动通过route命令设置网…

2025常见的软件测试面试题

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 “ 今天我给大家介绍一些python自动化测试中常见的面试题&#xff0c;涵盖了Python基础、测试框架、测试工具、测试方法等方面的内容&#xff0c;希望能够帮助…

uni.getLocation+百度地图,报错getLocation:fail translate coordinate system faild

问题描述&#xff1a; 经测验&#xff0c;在type传入gcj02时才会报错&#xff0c;要使用gcj02就要配置地图key&#xff0c;没配置&#xff0c;uni.getLocation就会忽略type参数。 当key配置的是百度地图时type传入gcj02会报错。 还有就是不能在谷歌浏览器使用&#xff0c;不然调…

SickOs1.1

下载安装 名称&#xff1a;SickOs&#xff1a;1.1 发布日期&#xff1a;2015 年 12 月 11 日作者: D4rk系列&#xff1a;SickOs sick0s1.1.7z&#xff08;大小&#xff1a;623 MB&#xff09;下载&#xff08;镜像&#xff09;&#xff1a; https: //download.vulnhub.com/sick…

基于卷积神经网络的甲状腺结节识别系统,resnet50,mobilenet模型【pytorch框架+python源码】

更多目标检测、图像分类识别、目标追踪等项目可看我主页其他文章 功能演示&#xff1a; 甲状腺结节识别系统&#xff0c;卷积神经网络&#xff0c;resnet50&#xff0c;mobilenet【pytorch框架&#xff0c;python源码】_哔哩哔哩_bilibili &#xff08;一&#xff09;简介 …

自动化文档处理:Azure AI Document Intelligence

Azure AI Document Intelligence支持多种文件格式&#xff0c;包括PDF、JPEG、PNG等。其核心功能是将这些文档按页进行内容提取&#xff0c;并转化为LangChain文档。其默认输出格式是Markdown&#xff0c;这使得文档可以通过MarkdownHeaderTextSplitter进行语义分片。您也可以使…

在 Ubuntu 24.04.1 LTS | Python 3.12 环境下部署 Crypto 库

测试一些密码学方案需要用到 Crypto 库&#xff0c;网上教程大多针对 Windows 和 Python 3.10 或以下的环境&#xff0c;所以写下了这篇博文。 部署与使用 首先执行 su 输入密码进入超级用户&#xff0c;部署完 Python 3.12 环境后&#xff0c;执行以下命令进行安装&#xff…

初学stm32 --- FSMC驱动LCD屏

目录 FSMC简介 FSMC框图介绍 FSMC通信引脚介绍 FSMC_NWE 的作用 FSMC_NWE 的时序关系 FSMC_NOE 的含义 FSMC_NOE 的典型用途 FSMC_NOE 的时序关系 使用FSMC驱动LCD FSMC时序介绍 时序特性中的 OE ILI9341重点时序&#xff1a; FSMC地址映射 HADDR与FSMC_A关系 LCD的…

Oracle 数据库 dmp文件从高版本导入低版本的问题处理

当前有个需求是将oracle 19c上的数据备份恢复到oracle 11g上使用。我们通过exp命令远程进行备份&#xff0c;然后通过imp进行恢复时出现IMP-00010: not a valid export file, header failed verification报错。 这是数据库版本问题&#xff0c;在使用exp命令导出的时候使用的客…

VScode怎么重启

原文链接&#xff1a;【vscode】vscode重新启动 键盘按下 Ctrl Shift p 打开命令行&#xff0c;如下图&#xff1a; 输入Reload Window&#xff0c;如下图&#xff1a;

NLP自然语言处理——使用飞桨实现基于LSTM的情感分析

任务说明&#xff1a; 通过对电影评论历史数据分析&#xff0c;构建深度学习分类模型&#xff0c;最终完成对新的数据样本的识别分类。 任务要求&#xff1a; 运用神经网络算法&#xff0c;创建、训练、评估模型&#xff0c;完成对电影评论的情感分类任务。 数据集说明&#xf…

百度热力图数据处理流程Arcgis PRO篇,Arcgis,QGIS见链接其他文章

目录 0、Arcgis&#xff0c;Arcgis Pro&#xff0c;QGis软件选择1、Arcgis&#xff0c;QGIS软件数据处理教程&#xff08;最近太忙后续更新&#xff09;1.1、Arcgis篇操作1.2、QGIS篇操作 2、Arcgis PRO 百度热力图数据处理流程&#xff01;&#xff01;&#xff01;&#xff0…

从底层源码剖析AQS的来龙去脉!

文章目录 一、AQS概述二、AQS底层结构2.1 AQS底层基本变量2.2 Node节点结构2.3 FIFO队列 三、源码分析3.1 lock3.1.1 lock3.1.2 acquire3.1.2.1 tryAcquire3.1.2.2 addWaiter3.1.2.3 acquireQueued3.1.2.4 selfInterrupt 3.2 unlock 四、写在最后 一、AQS概述 谈到并发&#x…

运动健康小程序SpringBoot+论文源码调试讲解

第4章 系统设计 一个成功设计的系统在内容上必定是丰富的&#xff0c;在系统外观或系统功能上必定是对用户友好的。所以为了提升系统的价值&#xff0c;吸引更多的访问者访问系统&#xff0c;以及让来访用户可以花费更多时间停留在系统上&#xff0c;则表明该系统设计得比较专…

【Linux网络编程】第十七弹---深入理解以太网与ARP协议:从帧格式到数据报解析

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】【Linux网络编程】 目录 1、认识以太网 1.1、以太网帧格式 1.2、认识 MAC 地址 1.3、对比理解 MAC 地址和 IP 地址 1.4、认识 MT…

Java - 日志体系_Simple Logging Facade for Java (SLF4J)日志门面_SLF4J集成logback 及 原理分析

文章目录 Pre官网集成步骤POM依赖使用第一步&#xff1a;编写 Logback 的配置文件第二步&#xff1a;在代码中使用 SLF4J 原理分析1. 获取对应的 ILoggerFactory2. 根据 ILoggerFactory 获取 Logger 实例3. 日志记录过程 小结 Pre Java - 日志体系_Apache Commons Logging&…