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.mzph.cn/pingmian/65226.shtml

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

相关文章

剪映学习01

1.剪映界面介绍 1.点击左上角的的登录账户可以登录剪映&#xff0c;它可以和抖音账号共用&#xff0c;所以我们剪辑完视频后可以直接从抖音发布。 左侧的导航栏有一些功能&#xff0c;我们点击模板&#xff0c;剪映它会显示当下比较火的模板&#xff0c;如果我们剪视频需要用到…

OpenLinkSaas使用手册-简介

OpenLinkSaas是针对软件研发人员/团队的效能工具。对个人而言是工具加成长导航路线&#xff0c;对团队而言是团队管理和项目管理。 OpenLinkSaas虽然功能众多&#xff0c;但可以按需配置所需功能&#xff0c;也可以制作自己的发行版。 OpenLinkSaas的由来 软件研发是一个比较…

QT调用Sqlite数据库

QT设计UI界面&#xff0c;后台访问数据库&#xff0c;实现数据库数据的增删改查。 零售商店系统 数据库表&#xff1a; 分别是顾客表&#xff0c;订单详情表&#xff0c;订单表&#xff0c;商品表 表内字段详情如下&#xff1a; 在QT的Pro文件中添加sql&#xff0c;然后添加头…

vue3使用vant日历组件(calendar),自定义日历下标的两种方法

在vue3中使用vant日历组件&#xff08;calendar&#xff09;自定义下标的两种方法&#xff0c;推荐使用第二种&#xff1a; 日期下方加小圆点&#xff1a; 一、使用伪元素样式实现(::after伪元素小圆点样式会被覆盖&#xff0c;只能添加一个小圆点) 代码如下&#xff08;示例…

STM32学习之 按键/光敏电阻 控制 LED/蜂鸣器

STM32学习之 按键/光敏电阻 控制 LED/蜂鸣器 1、按键控制 LED 按键:常见的输入设备&#xff0c;按下导通&#xff0c;松手断开 按键抖动:由子按键内部使用的是机械式弹簧片来进行通断的、所以在按下和松手的瞬间会伴随有一连串的抖动 按键控制LED接线图&#xff1a; 要有工程…

2024金融大模型实践方案的概览(附实践资料合集)

金融大模型实践方案的全面总结&#xff1a; 金融大模型应用评测&#xff1a; 在金融评测的五大能力维度中&#xff0c;各模型整体表现基本满足当下场景需求&#xff0c;其中金融安全与价值对齐表现优异&#xff0c;但金融专业认知和多模态处理能力仍存在较大提升空间。 金融大模…

设计模式之享元模式:看19路棋盘如何做到一子千面

~犬&#x1f4f0;余~ “我欲贱而贵&#xff0c;愚而智&#xff0c;贫而富&#xff0c;可乎&#xff1f; 曰&#xff1a;其唯学乎” 一、享元模式概述 \quad 在软件设计中&#xff0c;享元模式(Flyweight Pattern)的核心思想是通过共享来有效地支持大量细粒度对象的重用。这里的…

英语单词拼读小程序开发制作介绍

英语单词拼读小程序开发制作介绍本英语单词拼读小程序系统开发的主要功能有&#xff1a; 1、按年级分类展示每个年级阶段的英语单词信息。 2、点击选择的单词进入单词拼读页面&#xff0c;展示英语单词的拼读音标、中文意思、单词发音、拆分词汇发音、用户通过朗读发音对比。通…

华为管理变革之道:管理制度创新

目录 华为崛起两大因素&#xff1a;管理制度创新和组织文化。 管理是科学&#xff0c;150年来管理史上最伟大的创新是流程 为什么要变革&#xff1f; 向世界标杆学习&#xff0c;是变革第一方法论 体系之一&#xff1a;华为的DSTE战略管理体系&#xff08;解决&#xff1a…

基于Spring Boot的中国戏曲文化传播系统

一、系统背景与意义 中国戏曲作为中华民族的文化瑰宝&#xff0c;具有深厚的历史底蕴和艺术价值。然而&#xff0c;随着现代生活节奏的加快和娱乐方式的多样化&#xff0c;传统戏曲文化的传播和普及面临诸多挑战。因此&#xff0c;开发一个基于Spring Boot的中国戏曲文化传播系…

GitLab安装及使用

目录 一、安装 1.创建一个目录用来放rpm包 2.检查防火墙状态 3.安装下载好的rpm包 4.修改配置文件 5.重新加载配置 6.查看版本 7.查看服务器状态 8.重启服务器 9.输网址 二、GitLab的使用 1.创建空白项目 2.配置ssh 首先生成公钥&#xff1a; 查看公钥 把上面的…

14-zookeeper环境搭建

0、环境 java&#xff1a;1.8zookeeper&#xff1a;3.5.6 1、下载 zookeeper下载点击这里。 2、安装 下载完成后解压&#xff0c;放到你想放的目录里。先看一下zookeeper的目录结构&#xff0c;如下图&#xff1a; 进入conf目录&#xff0c;复制zoo_sample.cfg&#xff0…

C++---------动态内存管理

以下是对 C 中相关概念的详细说明及代码示例&#xff1a; 一、动态分配和堆 new 操作符&#xff1a; new 操作符用于在堆上动态分配内存。它会调用对象的构造函数&#xff08;如果是类对象&#xff09;并返回指向分配内存的指针。示例&#xff1a; #include <iostream&g…

R语言数据分析案例46-不同区域教育情况回归分析和探索

一、研究背景 教育是社会发展的基石&#xff0c;对国家和地区的经济、文化以及社会进步起着至关重要的作用。在全球一体化进程加速的今天&#xff0c;不同区域的教育发展水平呈现出多样化的态势。这种差异不仅体现在教育资源的分配上&#xff0c;还表现在教育成果、教育投入与…

单机和微服务的区别,微服务有什么问题?数据一致性问题怎么解决?幂等问题怎么解决?

单机和微服务的区别&#xff0c;微服务有什么问题&#xff1f;数据一致性问题怎么解决&#xff1f;幂等问题怎么解决&#xff1f; 单机架构和微服务架构在设计理念、部署和扩展性上有显著区别。 单机架构 vs 微服务架构 单机架构 定义&#xff1a;所有组件&#xff08;前端…

基于springboot+vue实现的卷烟营销统计分析系统 (源码+L文+ppt)4-129

摘 要 卷烟行业的快速发展使得卷烟营销统计分析系统成为了一个必不可少的工具。基于Java的卷烟营销统计分析系统旨在提供高效、准确和便捷的适用卷烟营销服务。本文讲述了基于java语言开发&#xff0c;后台数据库选择MySQL进行数据的存储。该软件的主要功能是进行卷烟营销统计…

mac启ssh服务用于快速文件传输

x.1 在mac上启SSH服务 方法一&#xff1a;图形交互界面启ssh&#xff08;推荐&#xff09; 通过sharing - advanced - remote login来启动ssh&#xff1b;&#xff08;中文版mac应该是 “系统设置 → 通用 → 共享”里打开“远程登录”来启动&#xff09; 查看自己的用户名和…

青蛇人工智能学家

青蛇人工智能学家 青蛇&#xff0c;是蓝星上&#xff0c;最出名的人工智能学家。 在蓝星上&#xff0c;大家都知道&#xff0c;青蛇人工智能学家&#xff0c;最大的爱好&#xff0c;是美食。 青蛇人工智能学家&#xff0c;对自己的食物&#xff0c;非常在意&#xff0c;对自己的…

[c++进阶(三)]单例模式及特殊类的设计

1.前言 在实际场景中,总会遇见一些特殊情况,比如设计一个类,只能在堆上开辟空间, 或者是设计一个类只能实例化一个对象。那么我们应该如何编写代码呢&#xff1f;本篇将会详细的介绍 本章重点&#xff1a; 本篇文章着重讲解如何设计一些特殊 的类,包括不能被拷贝,只能在栈/堆上…

【LLM论文日更】| 训练大型语言模型在连续潜在空间中进行推理

论文&#xff1a;https://arxiv.org/pdf/2412.06769代码&#xff1a;暂未开源机构 &#xff1a;Meta领域&#xff1a;思维链发表&#xff1a;arxiv 研究背景 研究问题&#xff1a;这篇文章要解决的问题是如何在大语言模型&#xff08;LLMs&#xff09;中实现一种新的推理范式&…