springboot整合dubbox

article/2025/11/1 16:18:13

简介

今天咱们来看看怎么利用Spring Boot整合Dubbox来开发去中心化的微服务。

系统环境

本文基于Jdk1.8/Maven 3.3.9/Spring Boot 1.4.2.RELEASE/Dubbo 2.8.5.SNAPSHOT(Dubbox后续开源版本)/ZooKeeper3.4.8

Zookeeper环境搭建

下载并安装启动

下载

  wget http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.4.8/

解压

  tar -zxf zookeeper-3.4.8.tar.gz

修改配置文件

  cd zookeeper-3.4.8/confcp zoo_sample.cfg zoo.cfg # zookeeper 默认是用../conf/zoo.cfg 如果没有这个文件则报错vim zoo.cfg

好吧 我们不改了,我们使用默认的配置.哈!

启动

  cd zookeeper-3.4.8/bin./start.sh start #启动zookeeper 关闭: ./start.sh stop

Dubbox环境准备

zookeeper准备好了,先放着 一会再用.下面我们来准备下Dubbox.

dubbox是当当网基于dubbo开源的组件

为什么使用dubbox?

因为dubbox支持更新的spring版本…

Dubbox在maven中央仓库并没有对应的依赖,所以我们需要自己动手将其发布到我们的本地仓库来使用.

下载

  我们这次从码云下载git clone https://git.oschina.net/wuyu15255872976/dubbox.git

编译安装

  cd dubboxmvn clean install -Dmaven.test.skip

等待 … 等待…

之后我们在我们的maven本地仓库/com/alibaba/dubbo/2.8.5-SNAPSHOT中会发现这么一个东西:

dubbo-2.8.5-SNAPSHOT.jar

这个玩意就是我们需要的Dubbx的jar包…

Spring Boot Dubbo引导

dubbox的jar包准备好了,行,咱先放着.一会再用.

下面来介绍下spring-boot-starter-dubbo项目的准备.

我们可能以前在使用dubbo的时候都是用的xml配置.在整合Spring Boot的时候呢是用的@ImportResource注解来引入的dubbo的xml配置.

但是Spring Boot本身并不推荐xml配置.怎么解决这个矛盾,我们可以自己准备一个Spring Boot Starter dubbo的项目来引导Spring Boot对Dubbo的自动化配置.

下载

  git clone https://git.oschina.net/wuyu15255872976/spring-boot-starter-dubbo.git

感谢这位悲伤的大神的开源贡献!. 顶一个,赞两个.

修改pom.xml

  • 在环境准备的时候我们说过,我们的项目基于Spring Boot 1.4.2.RELEASE ,但是我们down下来spring-boot-starter-dubbo的时候发现它用的是1.3.6的版本.我们动手自己改下parent的依赖吧.
  • 我们发现在pom.xml中基本所有的依赖的option都是true,我懒所以我想在其他项目依赖这个项目的时候不要再写一遍,所以我把<option>true</option>都给干掉了…… 干不干掉这个倒是随意哈.
  • 刚上一个环节我们打包并安装到本地库的Dubbox在这个地方需要用上了. 我们修改dubbo的版本为2.8.5-SNAPSHOT
  • 修改java版本为1.8

完整pom.xml文件如下:

  <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><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.4.2.RELEASE</version></parent><artifactId>spring-boot-starter-dubbo</artifactId><version>1.4.2.RELEASE</version><name>Spring Boot Dubbo Rpc</name><description>Spring Boot Dubbo Rpc</description><url>http://projects.spring.io/spring-boot/</url><organization><name>Pivotal Software, Inc.</name><url>http://www.spring.io</url></organization><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-actuator</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>dubbo</artifactId><version>2.8.5-SNAPSHOT</version><exclusions><exclusion><artifactId>spring</artifactId><groupId>org.springframework</groupId></exclusion></exclusions></dependency><!-- zookeeper 客户端 --><dependency><groupId>com.github.sgroschupf</groupId><artifactId>zkclient</artifactId><version>0.1</version></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>1.4.2.RELEASE</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><artifactId>maven-source-plugin</artifactId><configuration><attach>true</attach></configuration><executions><execution><phase>compile</phase><goals><goal>jar</goal></goals></execution></executions></plugin></plugins></build></project>

编译打包

上面我们对于spring-boot-starter-dubbo的准备工作完成,我们现在打包编译

  mvn clean install -Dmaven.test.skip

然后我们去maven本地仓库中找到它:

xxx/org/springframework/boot/spring-boot-starter-dubbo/1.4.2.RELEASE/spring-boot-starter-dubbo-1.4.2.RELEASE.jar

dubbo系统监控工具

这里我们使用韩都衣舍马老师提供的dubbo-monitor

下载

  git clone https://git.oschina.net/handu/dubbo-monitor.git

运行

根据项目README.MD我们先创建一个叫monitor的数据库,然后maven打包运行,我们也可以导入到IDE中直接运行,当然生产环境我们不能这么干.

我们的home页面:

我们的home页面

一会儿我们需要在这里验证我们的provider和consumer是否已经成功.

基本工作已经准备妥当,我们来看下我们怎么使用它.

目录结构

首先我们来看一下整个maven项目的目录结构:

目录结构

  business--consumer----pom.xml----src/main/java--provier----pom.xml----src/main/java--service----src/main/java--pom.xml

说明

  • business作为父项目
  • consumer是我们的服务消费者
  • provider是我们的服务提供者
  • service是提供domain和接口service的项目

    为什么要单独把servicemodule呢?

    因为我们写的service(java interface)domain(java bean)是需要在consumer和provider端共享的.

    单独打成jar包有利用我们的代码重用和序列化反序列化.

    基本结构介绍完成,下面我们分每一个模块来详细探讨.

business 父项目

既然business作为maven父项目,就做点它应该干的事.

pom.xml

  <?xml version="1.0" encoding="UTF-8"?><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>cn.veryjava</groupId><artifactId>business</artifactId><packaging>pom</packaging><version>1.0</version><name>business</name><description>business</description><organization><name>veryjava</name><url>http://blog.veryjava.cn</url></organization><developers><developer><name>sunshineasbefore</name><email>work_wjj@163.com</email></developer></developers><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version><spring-boot.version>1.4.2.RELEASE</spring-boot.version><spring-boot-dubbo.version>1.4.2.RELEASE</spring-boot-dubbo.version></properties><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.4.2.RELEASE</version><relativePath/></parent><modules><module>service</module><module>provider</module><module>consumer</module></modules><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>${spring-boot.version}</version><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-dubbo</artifactId><version>${spring-boot-dubbo.version}</version><optional>true</optional></dependency></dependencies></project>

在其中我们引入spring-boot-starter-parent spring-boot-starter-web spring-boot-starter-test spring-boot-starter-dubbo,其中除了spring-boot-starter-parent 我们定义其他依赖都可选.

没了…

service子项目

service子项目提供domain和service接口.

pom.xml

  <?xml version="1.0" encoding="UTF-8"?><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"><parent><artifactId>business</artifactId><groupId>cn.veryjava</groupId><version>1.0</version></parent><packaging>jar</packaging><modelVersion>4.0.0</modelVersion><artifactId>service</artifactId></project>

定义一下parentartifactId完事.

BusinessDomain.java

  package cn.veryjava.business.domain;import java.io.Serializable;public class BusinessDomain implements Serializable{private int id;private String name;public BusinessDomain(int id, String name) {this.id = id;this.name = name;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}}

定义我们需要在provider和consumer中使用的domain,实现java.io.Serializable来进行序列化.

dubbo支持的序列化方式很多,这个可以参考dubbo.io里关于协议和序列化的介绍,我们使用默认的协议dubbo.

BusinessService.java

  package cn.veryjava.business.service;import cn.veryjava.business.domain.BusinessDomain;public interface BusinessService {BusinessDomain findBusiness(int id, String name);}

定义我们需要在provider和consumer中使用的接口方法.

provider子项目

我们的服务提供者.

pom.xml

  <?xml version="1.0" encoding="UTF-8"?><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"><parent><artifactId>business</artifactId><groupId>cn.veryjava</groupId><version>1.0</version></parent><modelVersion>4.0.0</modelVersion><artifactId>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-dubbo</artifactId><version>${spring-boot-dubbo.version}</version></dependency><dependency><groupId>cn.veryjava</groupId><artifactId>service</artifactId><version>1.0</version></dependency></dependencies></project>

定义parentartifactId并引入spring-boot-starter-web spring-boot-starter-dubbo service依赖.

application.yml

  server:port: 8081spring:dubbo:application:name: business-providerregistry:protocol: zookeeperaddress: localhost:2181,192.168.2.23:2181protocol:name: dubboport: 20880host: localhostscan: cn.veryjava.business.provider

定义我们的dubbo配置.

服务注册发现使用zookeeper.协议使用dubbo,包扫描路径写cn.veryjava.business.provider

ProviderApplication.java

  package cn.veryjava.business.provider;import com.alibaba.boot.dubbo.EnableDubboAutoConfiguration;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication@EnableDubboAutoConfigurationpublic class ProviderApplication {public static void main(String[] args) {SpringApplication.run(ProviderApplication.class, args);}}

这是我们服务提供者的引导类.重点是@EnableDubboAutoConfiguration 这个注解将引导我们自动化配置dubbox

BusinessServiceImpl.java

  package cn.veryjava.business.provider;import cn.veryjava.business.domain.BusinessDomain;import cn.veryjava.business.service.BusinessService;import com.alibaba.dubbo.config.annotation.Service;@Service(version = "1.0.0")public class BusinessServiceImpl implements BusinessService {@Overridepublic BusinessDomain findBusiness(int id, String name) {return new BusinessDomain(id,name);}}

这个是我们需要提供的服务,重点是@Service这个注解,需要注意的是此@Service非彼@Service.

我们在这个地方使用的@Service是dubbo提供的,注意看import部分.然后,dubbo的springBoot自动化配置会自动发现这个类并将其注册到zookeeper.

当然我们使用spring提供的@Service也是可以的,不过这种方式比较麻烦.这个地方我们就不介绍了,有想了解的同学可以去dubbo.io去详细了解

编译运行

代码写好了,服务提供了,我们来验证下我们提供的服务是否能够成功注册并被发现.

启动后我们打开dubbo-monitorServices页面,如果看到如下情况,则证明我们的服务已经注册成功:

dubbo-monitor-services

注意观察其中cn.veryjava.business.service.BusinessService我们发现这个时候的BusinessService已经被提供但是还没有相应的消费者来使用.那么我们接下来看一下消费者怎么去使用.

consumer子项目

这个是我们的服务消费者

pom.xml

  <?xml version="1.0" encoding="UTF-8"?><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"><parent><artifactId>business</artifactId><groupId>cn.veryjava</groupId><version>1.0</version></parent><modelVersion>4.0.0</modelVersion><artifactId>consumer</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-dubbo</artifactId><version>${spring-boot-dubbo.version}</version></dependency><dependency><groupId>cn.veryjava</groupId><artifactId>service</artifactId><version>1.0</version></dependency></dependencies></project>

定义parent artifactId并引入spring-boot-starter-web spring-boot-starter-dubbo service依赖.

application.yml

  server:port: 8777spring:dubbo:application:name: business-consumerregistry:protocol: zookeeperaddress: localhost:2181,192.168.2.23:2181protocol:name: dubboport: 20880host: localhostscan: cn.veryjava.business.consumer.controller

实测 不写scan不行,可能是我刚开始理解有问题….我刚开始以为scan只是用来进行服务发现的,结果跟消费者进行消费也有关系…

ConsumerApplication.java

  package cn.veryjava.business.consumer;import com.alibaba.boot.dubbo.EnableDubboAutoConfiguration;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication@EnableDubboAutoConfigurationpublic class ConsumerApplication {public static void main(String[] args) {SpringApplication.run(ConsumerApplication.class, args);}}

服务消费者引导类,@EnableDubboAutoConfiguration注解也得写,原因同上.

BusinessConsumerController.java

  package cn.veryjava.business.consumer.controller;import cn.veryjava.business.domain.BusinessDomain;import cn.veryjava.business.service.BusinessService;import com.alibaba.dubbo.config.annotation.Reference;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;@Controllerpublic class BusinessConsumerController {@Reference(version = "1.0.0")public BusinessService businessService;@RequestMapping("/business")@ResponseBodypublic BusinessDomain getBusiness() {return businessService.findBusiness(1, "businessaaa");}}

我们的BusinessService服务是怎么被消费的,怎么被依赖的.其实就是使用了dubbo提供的@Reference注解… 告诉dubbo我要使用哪个版本服务,就是这么简单….

编译运行

我们来测一下dubbo-monitor能否监控到服务的消费者吧.

启动后我们打开dubbo-monitorServices页面,如果看到如下情况,则证明我们的服务已经注册成功并且消费者已经能够发现:

consumers

然后我们调用一下这个接口,看看到底是不是我们想要的数据.

  curl -L http://localhost:8777/business

输出如下:

  {"id":1,"name":"businessaaa"}

好吧,到这一步,我们的服务发现和服务消费都可以成功了.

总结

我们发现,dubbo的使用还是很简单的,几乎没有任何的侵入性,也非常符合Spring的IOC/DI的理论概念.可以说跟spring的结合非常完美!

我们的这个小项目,仅仅只是用来学习的小项目,不过我们可以在此基础上对zookeeper,对各个provider/consumer进行集群配置.这样我们就可以慢慢实现后台服务的去中心化,很大程度上提高了我们架构的可用性.

希望各位在Java的路上越走越好.!

代码

springboot整合dubbox的实例一枚

原文地址

springboot整合dubbox的实例一枚


http://chatgpt.dhexx.cn/article/vaiG9WMo.shtml

相关文章

Dubbo

协议&#xff1a; Dubbo是一种分布式服务框架也是一种协议&#xff0c;dubbo框架默认使用dubbo协议。dubbo协议是阿里巴巴自己实现的一种应用层协议&#xff0c;传输层还是TCP。所以Dubbo协议与HTTP、FTP&#xff0c;SMTP这些应用层协议是并列的概念。除了默认的Dubbo协议&…

Dubbox简单入门

dubbox是分布式框架&#xff0c;让我们一起来简单搭建一个小demo Dubbox简介 Dubbox 是一个分布式服务框架&#xff0c;其前身是阿里巴巴开源项目Dubbo &#xff0c;被国内电商及互联网项目中使用&#xff0c;后期阿里巴巴停止了该项目的维护&#xff0c;当当网便在Dubbo基础上…

Dubbox简介与入门实战

前言 什么是Dubbox?Dubbox是一个分布式服务框架&#xff0c;其前身是阿里巴巴开源项目Dubbo,被国内电商及互联网项目中使用&#xff0c;后期阿里巴巴停止了Dubbo项目的维护&#xff08;现Dubbo已捐献给Apache基金会&#xff09;&#xff0c;因为阿里巴巴内部的HSF框架比Dubbo…

Dubbox 环境搭建

第一章&#xff1a;Dubbox简介 Dubbox是一个开源的RPC(Remote ProcedureCall Protocol)远程调用框架&#xff0c;是由dangdang对阿里的Dubbo的升级&#xff0c;可以被视为Dubbo的增强版&#xff0c;基本架构没有变动&#xff0c;升级spring2.x到spring3.x,支持restful风格的调用…

Dubbox框架简介

Dubbox框架简介 Dubbox是一个分布式服务框架&#xff0c;其前身是阿里巴巴开源项目Dubbo&#xff0c;被国内电商及互联网项目中使用&#xff0c;后期阿里巴巴停止了该项目的维护&#xff0c;当当网便在Dubbo基础上进行优化&#xff0c;并继续维护&#xff0c;为了与原有的Dubb…

Dubbo的介绍以及Dubbox的区别

Dubbo官网: http://dubbo.io/ Dubbox官网: https://github.com/dangdangdotcom/dubbox Dubbo 是阿里巴巴公司开源的一个基于Java的高性能开源RPC框架&#xff0c;使得应用可通过高性能的 RPC 实现服务的输出和输入功能&#xff0c;可以和 Spring框架无缝集成。后来因为某些原…

Dubbox学习笔记

一、Dubbox简介 1、什么是SOA架构 SOA是Service-Oriented Architecture的首字母简称&#xff0c;它是一种支持面向服务的架构样式。从服务、基于服务开发和服务的结果来看&#xff0c;面向服务是一种思考方式。其实SOA架构更多应用于互联网项目开发。 为什么互联网项目会采用…

Dubbox是什么,如何整合SpringBoot,有什么优势?

目录 一、Dubbox 是什么 二、Dubbox 如何整合SpringBoot 三、Dubbox 有什么优势 一、Dubbox 是什么 Dubbox是一款基于Java语言的分布式服务框架&#xff0c;是阿里巴巴公司开源的一款服务化治理框架&#xff0c;其前身为Dubbo。Dubbox是针对Dubbo进行了改进和升级&#xff…

dubbox简介

1.1 dubbox简介 随着互联网的发展&#xff0c;网站应用的规模不断扩大&#xff0c;常规的垂直应用架构已无法应对&#xff0c;分布式服务架构以及流动计算架构势在必行&#xff0c;亟需一个治理系统确保架构有条不紊的演进。 单一应用架构 当网站流量很小时&#xff0c;只需一…

Dubbo详细介绍与安装使用过程

1 Dubbo介绍 1.1 dubbox简介 随着互联网的发展&#xff0c;网站应用的规模不断扩大&#xff0c;常规的垂直应用架构已无法应对&#xff0c;分布式服务架构以及流动计算架构势在必行&#xff0c;亟需一个治理系统确保架构有条不紊的演进。 单一应用架构 当网站流量很小时&…

Dubbo和Zookeeper入门到实战,看这篇就够了

前沿&#xff1a;在当下流行的分布式架构中Dubbo是非常流行rpc框架&#xff0c;借着这几天有空学习学习&#xff0c;并在后面的项目中进行实战&#xff0c;为后面的分布式项目做铺垫。 Dubbox简介 Dubbox 是一个分布式rpc框架&#xff0c;是阿里巴巴的开源产品&#xff0c;后阿…

Dubbox的简单介绍

简介&#xff1a;Dubbox是一个分布式服务框架&#xff0c;其前身是阿里巴巴开源项目Dubbo,后期阿里巴巴停止维护后&#xff0c;当当网在其基础上进行了优化&#xff0c;并继续维护&#xff0c;改名Dubbox。 一、 Dubbox的基本概念 Dubbox是一种分布式服务架构&#xff0c;它除…

dubbox概论

1.dubbox 是个啥&#xff1f; 他是一个分布式服务架构风格&#xff0c;其前身是阿里巴巴开源项目Dubbo&#xff0c;被国内电商及互联网项目中使用&#xff0c;后期阿里巴巴停止了该项目的维护&#xff0c;当当网便在dubbo基础上进行优化&#xff0c;并继续维护&#xff0c;为了…

Java直接运行JavaScript代码或js文件

执行JavaScript用到的类有&#xff1a; javax.script.ScriptEngine;javax.script.ScriptEngineFactory;javax.script.ScriptEngineManager;javax.script.ScriptException;需求1&#xff1a;执行一个JavaScript字符串&#xff0c;将结果打印在控制台上。 ScriptEngineManager m …

node环境执行js文件

1、JavaScript代码的执行 目前知道的两种方式有两种&#xff1a; 将代码交给浏览器&#xff08;在浏览器环境运行&#xff09; html文件引入js代码&#xff0c;交给浏览器解析将代码载入node的环境中执行&#xff08;在node环境运行&#xff09; 通过在电脑安装的Node.js环境…

在JavaScript文件中引用另一个JavaScript文件

前言 写了一个全局main.js&#xff0c;其中又需要引用其他第三方js文件&#xff0c;但是不希望在每个页面引用main.js之前再引用一遍第三方js文件&#xff0c;那就把第三方js文件放到main.js中引用。 方法 1. document.write 目录结构 index.html <!DOCTYPE html> …

protobuf文件生成js文件详细流程

1,下载用来生成web js文件的工具 protoc-gen-grpc-web 下地地址&#xff1a;protoc-gen-grpc-web 选择&#xff1a;protoc-gen-grpc-web-1.3.1-windows-x86_64.exe 即可 下载完成后改名为protoc-gen-grpc-web.exe并移动到项目里&#xff0c;和proto文件存放在同一目录下 2,…

如何创建并调用js文件

创建 首先&#xff0c;新建一个txt文件更改后缀名为js 点击另存为 创建成功 调用 <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>JavaScript</title> </head> <body> <p id"registerN&…

动态加载JavaScript文件

目录 配置 无脑方法&#xff01; 逆袭之道&#xff01; 一块蛋糕&#xff01; 结论 源代码 JavaScript文件的动态加载是您必须拥有的非常有用的工具之一。它允许您通过将阻止脚本从加载过程中移出&#xff08;通常称为“延迟加载”&#xff09;来优化网页性能&#xff0c…

前端基础应用:js文件编写

jss文件在前端网页页面制作过程中作用主要是控制html文件中标签的逻辑问题&#xff0c;增强操作性实用性. 一、js的作用&#xff0c;写代码的位置 1)作用 1.修改双标签的标签内容 例如&#xff1a;改变他的文本 <p id"p1">我是段落1</p> <button…