SpringBoot整合Dubbo和Nacos

1.概述

dubbo是一个高性能、轻量级的开源分布式服务框架,早期由阿里巴巴进行开源。它提供了服务注册、发现、调用和负载均衡等分布式服务治理功能,为分布式开发提供了极大便利。dubbo核心概念包括:Provider(消费提供者)、Consumer(服务消费者)、Registry(注册中心)、Monitor(监控中心)等,注册中心是dubbo服务治理的核心组件,dubbo依赖注册中心的协调实现服务(地址)发现,自动化的服务发现是微服务实现动态扩缩容、负载均衡、流量治理的基础。dubbo的提供的注册中心有很多:Multicast注册中心、Zookeeper注册中心、Redis注册中心、Simple注册中心、Nacos注册中心等,本文主要介绍springboot服务整合dubbo,并实用nacos作为注册中心来进行服务注册。

2.dubbo核心概念

2.1 dubbo架构图

在这里插入图片描述

节点名称说 明
Provider暴露服务的服务提供方 ,向注册中心注册提供自己服务
Consumer调用远程服务的服务消费方,从提供者地址列表中,基于负载均衡算法,选择提供者进行调用
Monitor统计服务的调用次数和调用时间的监控中心
Registry服务注册与发现的注册中心,返回服务提供者地址列表给消费者
Container服务运行容器,负责启动、加载和运行服务提供者

图中的虚线表明服务消费者(Consumer)和服务提供者(Provider)通过异步的方式发送消息至Monitor。Consumer和Provider会将信息存放在本地磁盘,平均1min会发送一次信息。Monitor在这个架构中是可选的,并且是需要单独配置的,且Monitor的运行状态(正常或异常)不会影响服务的正常调用。

2.2 dubbo注册中心

dubbo提供的注册中心有:Multicast注册中心、Zookeeper注册中心、Redis注册中心、Simple注册中心、Nacos注册中心等。

注册中心说明
Multicast注册中心不需要任何中心节点,只要广播地址,就可以互相发现
Zookeeper注册中心是一个树形的目录服务,支持变更推送,可靠性较高,是dubbo早期使用最多的注册中心
Redis注册中心redis注册中心使用key/map结构存储数据结构,使用redis的publish/subscribe事件通知数据变更
Simple注册中心simple注册中心本身就是一个普通的dubbo服务,可以减少不必要依赖,使整体通讯方式一致
Nacos注册中心由Alibaba开源的实现动态服务发现、服务配置、服务元数据及流量管理,支持注册中心、配置中心分离和合并部署

3.案例代码

3.1 服务关系图

在这里插入图片描述

dubbo-api模块:该模块定义服务者和消费者之间的契约,描述了服务的能力和行为,UserProviderAPI是一个dubbo接口,定义了服务的insert和queryById方法;
dubbo-provider模块:服务提供者,实现了 UserProviderAPI接口。通过 dubbo中的@Service方法(dubbo
3.0以及以后是@DubboService),该服务会注册到注册中心(Nacos),供消费者发现并调用;
dubbo-consumer模块:服务消费者,通过 @Reference(dubbo 3.0以及以后是@DubboReference) 注解引用了 UserProviderAPI接口。dubbo会自动处理服务的发现、负载均衡等,使得消费者可以透明调用远程服务。
dubbo注册中心:使用 Nacos 作为 Dubbo 的注册中心。注册中心是微服务治理的关键组件之一,它负责服务的注册、发现和管理。服务提供者在启动时向注册中心注册自己的服务信息,而消费者通过注册中心获取服务提供者的信息,从而实现动态的服务调用。

代码目录结构如下:
在这里插入图片描述

3.2 核心代码

本文使用的dubbo版本为2.7.5,springboot的版本为2.3.7,springcloud的版本为2.2.3,具体代码如下:

3.2.1 dubbo-api模块

1.pom文件

 <parent><artifactId>dubbo</artifactId><groupId>com.eckey.lab</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>dubbo-api</artifactId><dependencies><dependency><groupId>com.eckey.lab</groupId><artifactId>nacos-common</artifactId><version>1.0-SNAPSHOT</version></dependency></dependencies>

2.UserProviderAPI接口

import com.eckey.lab.common.Result;
import com.eckey.lab.interfaces.bean.UserDTO;public interface UserProviderAPI {Result insert(UserDTO user);Result<UserDTO> queryById(Integer id);
}

3.UserDTO实体类

import lombok.Data;import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.Date;@Data
public class UserDTO implements Serializable {@NotNull(message = "userName不能为空")private String userName;@NotNull(message = "age不能为空")private Integer age;private String nickName;@NotNull(message = "gender不能为空")private String gender;private Date createTime;private Date modifyTime;private static final long serialVersionUID = 1L;
}

3.2.2 dubbo-provider模块

1.pom文件

<parent><artifactId>dubbo</artifactId><groupId>com.eckey.lab</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>dubbo-provider</artifactId><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo</artifactId></dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.4</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.34</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.4</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId></dependency><!--java验证框架--><dependency><groupId>javax.validation</groupId><artifactId>validation-api</artifactId><version>1.1.0.Final</version></dependency><dependency><groupId>com.eckey.lab</groupId><artifactId>nacos-common</artifactId><version>1.0-SNAPSHOT</version></dependency><dependency><groupId>com.eckey.lab</groupId><artifactId>dubbo-api</artifactId><version>1.0-SNAPSHOT</version><scope>compile</scope></dependency></dependencies>

2.UserProviderServiceImpl类

import com.alibaba.fastjson.JSON;
import com.eckey.lab.common.Result;
import com.eckey.lab.dubbo.bean.User;
import com.eckey.lab.dubbo.dao.UserDao;
import com.eckey.lab.interfaces.UserProviderAPI;
import com.eckey.lab.interfaces.bean.UserDTO;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Component;import javax.annotation.Resource;
import java.util.Date;/*** @Author: ChengLiang* @CreateTime: 2023-11-13  10:11* @Description: TODO* @Version: 1.0*/
@Slf4j
@Service(version = "1.0.0", timeout = 6000)
@Component
public class UserProviderServiceImpl implements UserProviderAPI {@Resourceprivate UserDao userDao;@Overridepublic Result insert(UserDTO user) {log.info("添加user入库数据:{}", JSON.toJSONString(user));if (user == null) {log.error("user不为空");return Result.buildDataError("user不为空");}try {user.setCreateTime(new Date());user.setModifyTime(new Date());User userInsert = new User();userInsert.setUserName(user.getUserName());userInsert.setNickName(user.getNickName());userInsert.setGender(user.getGender());userInsert.setAge(user.getAge());userInsert.setCreateTime(user.getCreateTime());userInsert.setModifyTime(user.getModifyTime());userDao.insert(userInsert);log.info("数据添加成功:{}", JSON.toJSONString(user));} catch (Exception e) {log.error("添加数据异常:{}", e);return Result.buildDataError("添加数据异常");}return Result.buildResultSuccess();}@Overridepublic Result<UserDTO> queryById(Integer id) {if (id == null) {log.error("id不能为空");return Result.buildDataError("id不能为空");}final User user = userDao.selectByPrimaryKey(id);final UserDTO userDTO = new UserDTO();BeanUtils.copyProperties(user, userDTO);log.info("查询结果为:{}", JSON.toJSONString(userDTO));return Result.buildDataSuccess(userDTO);}
}

3.application.properties

server.port=9090
spring.application.name=dubbo-provider
spring.cloud.nacos.server-addr=http://123.213.45.103:8848
spring.datasource.username=
spring.datasource.password=
spring.datasource.url=jdbc:mysql://192.168.154.10:3306/test?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&autoReconnect=true&failOverReadOnly=false&maxReconnects=1000&initialTimeout=30
spring.datasource.driver-class-name=com.mysql.jdbc.Driverdubbo.application.name=dubbo-provider
dubbo.application.version=1.0.0
dubbo.registry.address=
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
dubbo.scan.base-packages=com.eckey.lab.dubbo.interfaces
mybatis.mapper-locations=classpath:/mybatis/*.xml

4.UserDao类

import com.eckey.lab.dubbo.bean.User;
import org.apache.ibatis.annotations.Mapper;@Mapper
public interface UserDao {int deleteByPrimaryKey(Integer id);int insert(User record);int insertSelective(User record);User selectByPrimaryKey(Integer id);int updateByPrimaryKeySelective(User record);int updateByPrimaryKey(User record);
}

5.UserDao.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.eckey.lab.dubbo.dao.UserDao"><resultMap id="BaseResultMap" type="com.eckey.lab.dubbo.bean.User"><id column="id" jdbcType="INTEGER" property="id" /><result column="user_name" jdbcType="VARCHAR" property="userName" /><result column="age" jdbcType="INTEGER" property="age" /><result column="nick_name" jdbcType="VARCHAR" property="nickName" /><result column="gender" jdbcType="VARCHAR" property="gender" /><result column="create_time" jdbcType="TIMESTAMP" property="createTime" /><result column="modify_time" jdbcType="TIMESTAMP" property="modifyTime" /></resultMap><sql id="Base_Column_List">id, user_name, age, nick_name, gender, create_time, modify_time</sql><select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="BaseResultMap">select <include refid="Base_Column_List" />from userwhere id = #{id,jdbcType=INTEGER}</select><delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">delete from userwhere id = #{id,jdbcType=INTEGER}</delete><insert id="insert" keyColumn="id" keyProperty="id" parameterType="com.eckey.lab.dubbo.bean.User" useGeneratedKeys="true">insert into user (user_name, age, nick_name,gender, create_time, modify_time)values (#{userName,jdbcType=VARCHAR}, #{age,jdbcType=INTEGER}, #{nickName,jdbcType=VARCHAR}, #{gender,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP}, #{modifyTime,jdbcType=TIMESTAMP})</insert><insert id="insertSelective" keyColumn="id" keyProperty="id" parameterType="com.eckey.lab.dubbo.bean.User" useGeneratedKeys="true">insert into user<trim prefix="(" suffix=")" suffixOverrides=","><if test="userName != null">user_name,</if><if test="age != null">age,</if><if test="nickName != null">nick_name,</if><if test="gender != null">gender,</if><if test="createTime != null">create_time,</if><if test="modifyTime != null">modify_time,</if></trim><trim prefix="values (" suffix=")" suffixOverrides=","><if test="userName != null">#{userName,jdbcType=VARCHAR},</if><if test="age != null">#{age,jdbcType=INTEGER},</if><if test="nickName != null">#{nickName,jdbcType=VARCHAR},</if><if test="gender != null">#{gender,jdbcType=VARCHAR},</if><if test="createTime != null">#{createTime,jdbcType=TIMESTAMP},</if><if test="modifyTime != null">#{modifyTime,jdbcType=TIMESTAMP},</if></trim></insert><update id="updateByPrimaryKeySelective" parameterType="com.eckey.lab.dubbo.bean.User">update user<set><if test="userName != null">user_name = #{userName,jdbcType=VARCHAR},</if><if test="age != null">age = #{age,jdbcType=INTEGER},</if><if test="nickName != null">nick_name = #{nickName,jdbcType=VARCHAR},</if><if test="gender != null">gender = #{gender,jdbcType=VARCHAR},</if><if test="createTime != null">create_time = #{createTime,jdbcType=TIMESTAMP},</if><if test="modifyTime != null">modify_time = #{modifyTime,jdbcType=TIMESTAMP},</if></set>where id = #{id,jdbcType=INTEGER}</update><update id="updateByPrimaryKey" parameterType="com.eckey.lab.dubbo.bean.User">update userset user_name = #{userName,jdbcType=VARCHAR},age = #{age,jdbcType=INTEGER},nick_name = #{nickName,jdbcType=VARCHAR},gender = #{gender,jdbcType=VARCHAR},create_time = #{createTime,jdbcType=TIMESTAMP},modify_time = #{modifyTime,jdbcType=TIMESTAMP}where id = #{id,jdbcType=INTEGER}</update>
</mapper>

3.2.3 dubbo-consumer模块

pom文件与dubbo-provider模块一致,核心模块为DubboConsumerServiceImpl类,具体如下:
1.DubboConsumerServiceImpl类

import com.alibaba.fastjson.JSON;
import com.eckey.lab.common.Result;
import com.eckey.lab.consumer.bean.UserVO;
import com.eckey.lab.consumer.service.DubboConsumerService;
import com.eckey.lab.interfaces.UserProviderAPI;
import com.eckey.lab.interfaces.bean.UserDTO;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.stereotype.Service;/*** @Author: ChengLiang* @CreateTime: 2023-11-13  10:56* @Description: TODO* @Version: 1.0*/
@Slf4j
@Service
public class DubboConsumerServiceImpl implements DubboConsumerService {@Reference(interfaceClass = UserProviderAPI.class, version = "1.0.0")private UserProviderAPI userProviderAPI;@Overridepublic Result insert(UserVO userVO) {UserDTO userDTO = new UserDTO();userDTO.setUserName(userVO.getUserName());userDTO.setNickName(userVO.getNickName());userDTO.setAge(userVO.getAge());userDTO.setGender(userVO.getGender());userDTO.setCreateTime(userVO.getCreateTime());userDTO.setModifyTime(userVO.getModifyTime());log.info("userDTO:{}", JSON.toJSONString(userDTO));return userProviderAPI.insert(userDTO);}@Overridepublic Result<UserDTO> selectByKeyId(Integer id) {Result<UserDTO> userDTOResult = userProviderAPI.queryById(id);log.info("查询结果为;{}", JSON.toJSONString(userDTOResult.getData()));return userDTOResult;}
}

2.application.properties

server.port=9091
spring.application.name=dubbo-consumer
spring.cloud.nacos.server-addr=http://123.213.45.103:8848
dubbo.application.name=dubbo-consumer
dubbo.application.version=1.0.0
dubbo.registry.address=nacos://http://123.213.45.103:8848/?username=nacos&password=nacos
dubbo.protocol.name=dubbo
dubbo.protocol.port=20881

详细代码可参考文章附录部分,在上述代码中,有一些注意事项,具体如下:

1.在dubbo-provider和dubbo-consumer的启动类上,需要添加@EnableDubbo,@EnableDubbo整合了三个注解@EnableDubboConfig、@DubboComponentScan、@EnableDubboLifecycle。@EnableDubbo的功能都是由这三个注解完成的。
@EnableDubboConfig引入类DubboConfigConfigurationRegistrar,将用于解析配置相关的类注册到spring容器;
@DubboComponentScan引入类DubboComponentScanRegistrar,用于指定@Service扫描路径;
@EnableDubboLifecycle引入类DubboLifecycleComponentRegistrar,注册了两个监听器到spring容器。
一般需要配置@DubboComponentScan来定义@Service的扫描路径。如果不配置@DubboComponentScan,默认使用@EnableDubbo注解的类的包路径。
2.UserProviderServiceImpl中的注解@Service引入的是org.apache.dubbo.config.annotation.Service;
3.配置文件中,需要指定nacos的登录账户和密码,否则会报错。

3.3 测试结果

nacos注册页面上的服务列表如下:
在这里插入图片描述
调用服务消费者的接口如下:
在这里插入图片描述
服务消费者和提供者的日志如下:
在这里插入图片描述
在这里插入图片描述

4.小结

1.dubbo的注册中心有很多,本文基于nacos来进行演示,nacos的安装可查看我的博文:SpringCloud源码探析(二)-Nacos注册中心;
2.在dubbo框架中,需要先定义接口模块(定义提供者输出能力,消费者需要能力),服务提供者实现能力并注册到注册中心,供消费者进行消费;
3.dubbo和spring cloud alibaba之间有版本之间的对应关系,具体可查询dubbo官网或spring cloud官网进行对比。

5.参考文献

  1. https://zhuanlan.zhihu.com/p/638826433
  2. https://blog.csdn.net/java_cpp_/article/details/128051413
  3. https://cn.dubbo.apache.org/zh-cn/overview/mannual/java-sdk/quick-start/api/
  4. https://juejin.cn/post/7159776981771354119
  5. https://developer.aliyun.com/article/808571

6.附录

https://gitee.com/Marinc/nacos/tree/master/dubbo

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

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

相关文章

代驾预约小程序系统源码 :提起预约,避免排队 带完整搭建教程

大家好啊&#xff0c;又到罗峰来给大家分享好用的源码系统的时间了。今天要给大家分享的第一款代驾预约小程序源码系统。传统的代驾服务中&#xff0c;用户往往需要在酒后代驾、长途驾驶等场景下&#xff0c;面对排队等待代驾司机空闲时间的繁琐过程。这不仅浪费了用户的时间和…

Centos7安装mysql8.0.35(亲测)

今天在centos7上安装了mysql8&#xff0c;特此记录以作备忘。 说明&#xff1a; - 我安装的mysql版本&#xff1a;8.0.35 - centos版本&#xff1a;7 - 我的虚拟机没安装过mysql,如果之前安装过mysql记得卸载干净 - 卸载步骤&#xff1a; - rpm -qa|grep mysql (搜索mysql)比如…

uniapp——项目day04

购物车页面——商品列表区域 渲染购物车商品列表的标题区域 1. 定义如下的 UI 结构&#xff1a; 2.美化样式 渲染商品列表区域的基本结构 1. 通过 mapState 辅助函数&#xff0c;将 Store 中的 cart 数组映射到当前页面中使用&#xff1a; import badgeMix from /mixins/tab…

sqli-labs关卡16(基于post提交的双引号加括号闭合的布尔盲注)通关思路

文章目录 前言一、回顾上一关知识点二、靶场第十六关通关思路1、判断注入点2、猜数据库长度3、猜数据库名字4、猜表名长度5、猜表名名字6、猜列名长度7、猜列名名字8、猜数据长度9、猜数据名字 总结 前言 此文章只用于学习和反思巩固sql注入知识&#xff0c;禁止用于做非法攻击…

多机器人群体的任务状态与机器人状态同步设计思路

背景技术 近年来&#xff0c;随着科学技术的发展需要&#xff0c;机器人技术不断进步。面临任务的日益复杂化&#xff0c;单机器人在很多环境下已经无法满足生产要求&#xff0c;于是国内外科研工作者对多机器人技术投入了大量关注&#xff0c;提出了利用多机器人协作来代替单机…

【LLMs】从大语言模型到表征再到知识图谱

从大语言模型到表征再到知识图谱 InstructGLMLLM如何学习拓扑&#xff1f;构建InstructGLM泛化InstructGLM补充参考资料 2023年8月14日&#xff0c;张永峰等人的论文《Natural Language is All a Graph Needs》登上arXiv街头&#xff0c;轰动一时&#xff01;本论文概述了一个名…

线性代数本质系列(二)矩阵乘法与复合线性变换,行列式,三维空间线性变换

本系列文章将从下面不同角度解析线性代数的本质&#xff0c;本文是本系列第二篇 向量究竟是什么&#xff1f; 向量的线性组合&#xff0c;基与线性相关 矩阵与线性相关 矩阵乘法与复合线性变换 三维空间中的线性变换 行列式 逆矩阵&#xff0c;列空间&#xff0c;秩与零空间 克…

BEVFormer 论文阅读

论文链接 BEVFormer BEVFormer&#xff0c;这是一个将Transformer和时间结构应用于自动驾驶的范式&#xff0c;用于从多相机输入中生成鸟瞰&#xff08;BEV&#xff09;特征利用查询来查找空间/时间&#xff0c;并相应地聚合时空信息&#xff0c;从而为感知任务提供更强的表示…

AI 绘画 | Stable Diffusion精确控制ControlNet扩展插件

ControlNet ControlNet是一个用于控制AI图像生成的插件&#xff0c;通过使用Conditional Generative Adversarial Networks&#xff08;条件生成对抗网络&#xff09;的技术来生成图像。它允许用户对生成的图像进行更精细的控制&#xff0c;从而在许多应用场景中非常有用&#…

工业数据的“最后一公里”怎么走?

随着工业互联网的迅猛发展&#xff0c;工业数据已经成为推动制造业转型升级的重要动力。然而&#xff0c;面对海量的工业数据&#xff0c;如何高效、准确地走过数据的“最后一公里”&#xff0c;成为制约企业发展的关键问题。本文将探讨工业数据“最后一公里”所面临的挑战&…

nginx四层tcp负载均衡及主备、四层udp负载均衡及主备、7层http负载均衡及主备配置(wndows系统主备、负载均衡)

准备工作 服务器上安装、配置网络负载平衡管理器 windows服务器热备、负载均衡配置-CSDN博客 在windows服务器上安装vmware17 在windows上利用vmware17 搭建centos7 mini版本服务器 设置好静态ip地址&#xff08;因为windows 服务器上的网络负载平衡管理器不支持dhcp的服务器…

Docker的本地镜像发布到阿里云或者私有库步骤

学习笔记来源Docker 本地镜像发布到阿里云 1、生成镜像&#xff08;使用commit命令&#xff09; 创建阿里云仓库镜像 阿里云开发者平台 https://promotion.aliyun.com/ntms/act/kubernetes.html 创建仓库镜像 选择控制台&#xff0c;进入容器镜像服务 选择个人实例 命名空…

adb常用命令

系统参数获取指令 获取手机系统的命令&#xff1a; adb shell getprop ro.build.version.release 获取系统api版本----比如系统对应的系统的API版本为&#xff1a;29&#xff0c;11系统对应的安卓系统API版本为&#xff1a;30 adb shell getprop ro.build.version.sdk 获取手机…

雅虎、美客多、Temu、Allegro、亚马逊跨境平台选品技巧方法,测评养号攻略。

&#xff08;1) Best Sellers选品法 这个方法顾名思义&#xff0c;就是大家熟悉的热销榜单选品法。 不做过多解释&#xff0c;在自己熟悉的品类&#xff0c;隔几天就会观察一下前100名里有没有冒出什么新品。 它和现有的产品相同还是不同&#xff0c;自己做哪些搭配或者迭代…

asp.net core mvc之模型绑定、特性约束模型绑定、模型验证(服务器/客户端/远程)

一、不用模型绑定 数据类型都是string 1、UserController.cs public class UserController : Controller {public IActionResult Register(){return View();}[HttpPost]public IActionResult DoRegister(){//不用模型绑定 以前的方法取表单数据或Url的参数//数据类型都是s…

linux系统下文件操作常用的命令

一、是什么 Linux 是一个开源的操作系统&#xff08;OS&#xff09;&#xff0c;是一系列Linux内核基础上开发的操作系统的总称&#xff08;常见的有Ubuntu、centos&#xff09; 系统通常会包含以下4个主要部分 内核shell文件系统应用程序 文件系统是一个目录树的结构&…

双编码器构建机器人零力拖动/导纳控制思路

前言 这篇博客主要记录昨日与实验室大佬针对UR5机器人拖动示教功能实现的思路。由于本人并非主攻力控方面。直到昨天在做实验的时候&#xff0c;与力控组的大佬讨论过后才了解UR机器人实现导纳控制的思路。 关于导纳控制/零力拖动 导纳控制与阻抗控制单从字面去理解很容易记…

如何编写一个Perl爬虫程序

要编写一个Perl爬虫程序&#xff0c;首先需要安装LWP::UserAgent模块。你可以使用cpan命令来安装该模块&#xff1a; cpan LWP::UserAgent 安装完成后&#xff0c;可以使用以下代码来编写爬虫程序&#xff1a; use LWP::UserAgent; use HTML::TreeBuilder; my $proxy_host …

分发饼干(贪心算法+图解)

455. 分发饼干 - 力扣&#xff08;LeetCode&#xff09; 题目描述 假设你是一位很棒的家长&#xff0c;想要给你的孩子们一些小饼干。但是&#xff0c;每个孩子最多只能给一块饼干。 对每个孩子 i&#xff0c;都有一个胃口值 g[i]&#xff0c;这是能让孩子们满足胃口的饼干的最…

centos利用find提权反弹shell

需要说明的是利用find命令进行提权的方式已经不存在了&#xff0c;因为Linux默认不会为find命令授予suid权限&#xff0c;这里只是刻意的制造出了一种存在提权的环境 首先我们先介绍一下find命令&#xff0c;find命令主要用来在Linux中查找文件使用&#xff0c;它可以进行最基础…