一、 软件架构的演进过程

1、单体架构

在这里插入图片描述


架构说明:

所有的功能集中在1个项目内。

优点:

架构简单,前期开发成本低、开发周期短,适合小型项目。

缺点:

1、项目不利于扩展、难以维护
2、技术栈受限:只能使用1种开发语言
3、系统性能扩展只能通过扩展集群节点,成本高

2、垂直架构

在这里插入图片描述


架构说明:

按照业务进行切割,形成小的单体项目。

优点:

技术栈可扩展(不同的系统可以用不同的编程语言编写)

缺点:

1、项目不利于扩展、难以维护
2、技术栈受限:只能使用1种开发语言
3、系统性能扩展只能通过扩展集群节点,成本高
4、 项目之间功能冗余、数据冗余、耦合性强。

3、SOA架构(主流)

SOA全称为Service-Oriented Architecture,即面向服务的架构。它可以根据需求通过网络对松散耦合的粗粒度应用组件(服务)进行分布式部署、组合和使用。一个服务通常以独立的形式存在于操作系统进程中。

站在功能的角度,把业务逻辑抽象成可复用的服务,通过服务的编排实现业务的快速再生,目的: 把原先固有的业务功能转变为通用的业务服务,实现业务逻辑的快速复用。


在这里插入图片描述
架构说明:

将重复功能or模块抽取成组件的形式,对外提供服务,在项目与服务之间使用ESB(企业服务总线)的形式作为通信的桥梁。

优点:

1、重复功能或模块抽取为服务,提高开发效率。
2、可重用性高。
3、可维护性高。

缺点:

1、各系统之间业务不同,很难确认功能或模块是重复的。
2、抽取服务的粒度大。
3、系统和服务之间耦合度高。

4、微服务架构(流行)

在这里插入图片描述

架构说明:

1、将系统服务层完全独立出来,抽取为一个一个的微服务(每一个服务都独立运行在服务器上)。
2、抽取的粒度更细,遵循单一原则。(即,每1个功能是1个服务)
3、采用轻量级框架协议传输。

优点:

1、 服务拆分粒度更细,有利于提高开发效率。
2、 可以针对不同服务制定对应的优化方案。
3、适用于互联网时代,产品迭代周期更短。

缺点:

1、粒度太细导致服务太多,维护成本高。
2、分布式系统开发的技术成本高,对团队的挑战大。

二、Apache Dubbo

Apache Dubbo是一款高性能的Java RPC框架。其前身是阿里巴巴公司开源的一个高性能、轻量级的开源Java RPC框架,可以和Spring框架无缝集成。

什么是PRC?

RPC全称为remote procedure call,即远程过程调用

比如:服务器A和B分别部署了一个应用,A想调用B的方法,但是它们的部署的应用不在同一个内存空间,就不能直接调用,所以需要通过网络来表达调用的语义和传达的数据。

需要注意的是RPC并不是一个具体的技术,而是指整个网络远程调用过程

RPC是一个泛化的概念,严格来说一切远程过程调用手段都属于RPC范畴。各种开发语言都有自己的RPC框架。Java中的RPC框架比较多,广泛使用的有RMI、Hessian、Dubbo等。


三、Dubbo架构

1、概述

Dubbo官网地址:http://dubbo.apache.org

Dubbo提供了三大核心能力:面向接口的远程方法调用智能容错负载均衡,以及服务自动注册和发现

在这里插入图片描述
在这里插入图片描述
节点角色说明:

节点 角色名称
Provider 暴露服务的服务提供方(服务方)
Consumer 调用远程服务的服务消费方 (消费方)
Registry 服务注册与发现的注册中心 (注册中心)
Monitor 统计服务的调用次数和调用时间的监控中心 (监控中心)
Container 服务运行容器
  • 虚线都是异步访问实线都是同步访问
  • 蓝色虚线: 在启动时完成的功能
  • 红色虚线(实线): 都是程序运行过程中执行的功能

调用关系说明:

  1. 服务容器负责启动,加载,运行服务提供者。
  2. 服务提供者在启动时,向注册中心注册自己提供的服务。
  3. 服务消费者在启动时,向注册中心订阅自己所需的服务。
  4. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
  5. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
  6. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

2、服务注册中心Zookeeper

Zookeeper 是 Apache Hadoop 的子项目,是一个树型的目录服务,支持变更推送,适合作为 Dubbo 服务的注册中心,工业强度较高,可用于生产环境,并推荐使用 。


类比:树形结构
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

流程说明:

  • 服务提供者(Provider)启动时:
    /dubbo/com.foo.BarService/providers 目录下写入自己的 URL 地址
  • 服务消费者(Consumer)启动时:
    订阅 /dubbo/com.foo.BarService/providers 目录下的提供者 URL 地址。并向 /dubbo/com.foo.BarService/consumers 目录下写入自己的 URL 地址
  • 监控中心(Monitor)启动时:
    订阅 /dubbo/com.foo.BarService 目录下的所有提供者和消费者 URL 地址

3、安装“注册中心”到服务器

在这里插入图片描述

4、启动、停止Zookeeper

  • 进入Zookeeper的bin目录,启动服务命令
    ./zkServer.sh start

  • 停止服务命令
    ./zkServer.sh stop

  • 查看服务状态:
    ./zkServer.sh status

四、入门案例

1)开发:服务提供方

在这里插入图片描述

1、创建Maven中Web骨架,导入相关依赖

 <properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><spring.version>5.0.5.RELEASE</spring.version></properties><!--spring相关--><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jms</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId><version>${spring.version}</version></dependency><!-- dubbo相关 --><dependency><groupId>com.alibaba</groupId><artifactId>dubbo</artifactId><version>2.6.0</version></dependency><dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><version>3.4.7</version></dependency><dependency><groupId>com.github.sgroschupf</groupId><artifactId>zkclient</artifactId><version>0.1</version></dependency><dependency><groupId>javassist</groupId><artifactId>javassist</artifactId><version>3.12.1.GA</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.47</version></dependency></dependencies><build><!--指定maven插件之指定jdk编译版本--><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>2.3.2</version><configuration><source>1.8</source><target>1.8</target></configuration></plugin><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><configuration><!-- 指定端口 --><port>8081</port><!-- 请求路径 --><path>/</path></configuration></plugin></plugins></build>

2、配置web.xml

<!DOCTYPE web-app PUBLIC"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN""http://java.sun.com/dtd/web-app_2_3.dtd" ><web-app><display-name>Archetype Created Web Application</display-name><!--全局初始化参数:指定spring相关配置文件--><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext*.xml</param-value></context-param><!--配置监听器:加载配置文件,创建spring容器--><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener></web-app>

3、创建service接口和实现类(提供服务)

接口:

public interface HelloService {public String sayHello(String name);
}

实现类:

import com.alibaba.dubbo.config.annotation.Service;
@Service //发布服务必须使用dubbo提供的注解
public class HelloServiceImpl implements HelloService {@Overridepublic String sayHello(String name) {return "Hello" +name;}
}

4、配置dubbo的spring配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"xmlns:context="http://www.springframework.org/schema/context"xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsdhttp://code.alibabatech.com/schema/dubbohttp://code.alibabatech.com/schema/dubbo/dubbo.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><!--每个dubbo应用(提供者和消费者)都必须指定1个唯一的名称--><!-- 当前应用名称,用于注册中心计算应用间依赖关系 --><dubbo:application name="dubbodemo_provider" /><!-- 连接服务注册中心zookeeper ip为zookeeper所在服务器的ip地址--><dubbo:registry address="zookeeper://118.178.16.132:2181"/><!-- 注册  协议和port   端口默认是20880 --><dubbo:protocol name="dubbo" port="20881"></dubbo:protocol><!-- 扫描指定包,加入@Service注解的类会被发布为服务  --><dubbo:annotation package="com.itheima.service.impl" />
</beans>

2)开发:服务消费方

注意: 消费方服务方是在不同服务器上的,而消费方(Controller)根据@Reference注解注册中心寻找对应接口的服务并远程调用服务方提供的服务(Serivce)

其实,以前使用MVC架构的时候,也是使用controller调用service,只是现在它们都分别在不同的服务器上,再进行远程调用。
好处是提高了service的复用性吧,理解

在这里插入图片描述

1、创建Maven中Web骨架,导入相关依赖

跟服务方一样,就是Tomcat插件端口不一样

2、配置web.xml

<!DOCTYPE web-app PUBLIC"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN""http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app><display-name>Archetype Created Web Application</display-name><!--配置前端控制器--><servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!-- 指定加载的配置文件 ,通过参数contextConfigLocation加载 --><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext-web.xml</param-value></init-param><load-on-startup>1</load-on-startup><!--项目一启动就加载配置文件--></servlet><servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>*.do</url-pattern></servlet-mapping>
</web-app>

3、创建服务方的HelloService接口

直接复制服务方的服务接口,包名类名一致即可

4、编写Controller

@Controller
@RequestMapping("/hello")
public class HelloController {@Reference  //到注册中心找对应接口的服务(service方法)private HelloService helloService;@RequestMapping("/sayHello")@ResponseBodypublic String sayHello (String name){return helloService.sayHello(name);}
}

5、配置dubbo的spring配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"xmlns:context="http://www.springframework.org/schema/context"xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsdhttp://code.alibabatech.com/schema/dubbohttp://code.alibabatech.com/schema/dubbo/dubbo.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><!--每个dubbo应用(提供者和消费者)都必须指定1个唯一的名称--><!-- 当前应用名称,用于注册中心计算应用间依赖关系,注意:消费者和提供者应用名不要一样 --><dubbo:application name="dubbodemo-consumer" /><!-- 连接服务注册中心zookeeper ip为zookeeper所在服务器的ip地址--><dubbo:registry address="zookeeper://192.168.134.129:2181"/><!-- 扫描的方式暴露接口:创建Bean  --><dubbo:annotation package="com.itheima.controller" />
</beans>

看看现在的结构:
在这里插入图片描述

6、测试

1、将服务提供方服务消费方开启Tomcat服务
2、输入浏览器地址:https://localhost:8082/hello/sayHello.do?name=lizhixi
3、页面显示:hello lizhixi

Caused by: java.lang.IllegalStateException: Failed to register dubbo://192.168.3.1:20881

意外错误回顾:

在这里插入图片描述
在这里插入图片描述

在启动的时候,Tomcat项目是启动成功的,但是当我访问远程服务的时候,报错了:Caused by: java.lang.IllegalStateException: Failed to register dubbo://192.168.3.1:20881(提示我注册dubbo失败)和controller中注入service失败,即,null

原因:(请配合文字联想dubbo架构图)

  • 1、提供者 先 向【注册中心】提供服务,消费者 再 向 【注册中心】订阅服务
    这个过程中,都是围绕着注册中心来进行协作,而消费者和提供者启动是有先后之分的,如果是启动顺序颠倒,那么消费者已经实例化了controller,而controller里面的远程service并没有注入。因为注册中心得先有远程service才有注入service的可能

    在第六节,第3小节有说明,这个不成立。这里只是个人猜测,当然如果配置不当,先后启动顺序颠倒还是会报错的,只是 不是报空指针异常
  • 2、安装注册中心的服务器,必须开放 消费者和服务者在spring配置文件中配置对应连接注册中心的端口。(上面是2181)
    因为注册中心得先有远程service才有注入service的可能,注册中心没有开放端口等于没有注册中心,既然没有注册中心那么消费方的service又怎么不会是null呢?

3)问题思考(优化消费方接口的问题)

思考一: 上面的Dubbo入门案例中我们是将HelloService接口从服务提供者工程(dubbodemo_provider)复制到服务消费者工程(dubbodemo_consumer)中,这种做法是否合适?还有没有更好的方式?

答: 这种做法显然是不好的,同一个接口被复制了两份,不利于后期维护。更好的方式是单独创建一个maven工程,将此接口创建在这个maven工程中。0(将接口抽取成单独的maven的模块,消费方使用的时候再导入pom) 需要依赖此接口的工程只需要在自己工程的pom.xml文件中引入maven坐标即可。

思考二: 在服务消费者工程(dubbodemo_consumer)中只是引用了HelloService接口,并没有提供实现类,Dubbo是如何做到远程调用的?

答: Dubbo底层是基于代理技术为HelloService接口创建代理对象,远程调用是通过此代理对象完成的。可以通过开发工具的debug功能查看此代理对象的内部结构。另外,Dubbo实现网络传输底层是基于Netty框架完成的。

思考三: 上面的Dubbo入门案例中我们使用Zookeeper作为服务注册中心,服务提供者需要将自己的服务信息注册到Zookeeper,服务消费者需要从Zookeeper订阅自己所需要的服务,此时Zookeeper服务就变得非常重要了,那如何防止Zookeeper单点故障呢?

答: Zookeeper其实是支持集群模式的,可以配置Zookeeper集群来达到Zookeeper服务的高可用,防止出现单点故障。

五、Dubbo管理控制台

这个是dubbo官方提供并打成web包的web应用,它的作用是为了能够直观的知道有哪些消费者消费哪些服务。

下面说说如何部署:

在这里插入图片描述

其实,将war包放在Tomcat的webapps目录下,启动startup.bat即可。但是可能会报错,因为war包被解压后的项目中的WEB-INF有个dubbo.properties配置文件,里面配置了关于注册中心信息,你可能没有配对注册中心的ip地址
在这里插入图片描述


看看访问成功的页面:
在这里插入图片描述

  • 每一个提供方和消费方都是属于"应用",所以在“application(应用)”分类中可以找到。
  • 你会发现在详细信息中出现了1个新的ip,我们不需要关心它,知道它是个虚拟ip,每一个应用都有唯一的虚拟ip即可。

1)加入log4j.properties日志

为什么要加入日志?

能够清楚得知道服务方消费方详细的状态信息
注意:
为了利于开发,一般日志信息我们在开发阶段使用debug级别,项目上线以后就使用info级别,提示信息少一些。

怎么加?

很简单,将下面的日志配置文件,放到消费方和服务方的resourse下面即可。

### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.err
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n### direct messages to file mylog.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=c:\\mylog.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n### set log levels - for more verbose logging change 'info' to 'debug' ###log4j.rootLogger=debug, stdout

六、dubbo配置相关说明

1)包扫描

服务者:

  • 注解方式:(推荐)

配合@Service

<dubbo:annotation package="com.itheima.service" />

配置了dubbo才能知道哪个service类要注册

  • 配置方式:
<bean id="helloService" class="com.itheima.service.impl.HelloServiceImpl" />
<dubbo:service interface="com.itheima.api.HelloService" ref="helloService" />

消费者:

  • 注解方式:(推荐)

配合@Reference

<dubbo:annotation package="com.itheima.controller" />

配置了注解才能注入成功,并且调用远程service

  • 配置方式:
<!-- 生成远程服务代理,可以和本地bean一样使用helloService -->
<dubbo:reference id="helloService" interface="com.itheima.service.HelloService" />

2)协议

<dubbo:protocol name="dubbo" port="20880"/>

一般在服务提供者一方配置,可以指定使用的协议名称端口号,而上面的配置其实是默认的配置
即,不配置也是这样,但是我们一般推荐显式配置。


问:Dubbo就有1种协议么?

其中Dubbo支持的协议有:dubbormihessianhttpwebservicerestredis等。
但是,我们推荐使用的是dubbo协议。

问:为什么推荐使用Dubbo协议?

dubbo 协议采用单一长连接和 NIO 异步通讯,适合于小数据量大并发(并发量大但是请求数据小)的服务调用,以及服务消费者机器数> 服务提供者机器数的情况。不适合传送大数据量的服务,比如传文件,传视频等,除非请求量很低

问:在同1个项目工程中,可以使用多协议配置吗?怎么配置?

同一个工程中配置多个协议,不同服务可以使用不同的协议,例如:

<!-- 多协议配置 -->
<dubbo:protocol name="dubbo" port="20880" />
<dubbo:protocol name="rmi" port="1099" />
<!-- 使用dubbo协议暴露服务 -->
<dubbo:service interface="com.itheima.api.HelloService" ref="helloService" protocol="dubbo" />
<!-- 使用rmi协议暴露服务 -->
<dubbo:service interface="com.itheima.api.DemoService" ref="demoService" protocol="rmi" /> 

但是,上面已经说了,我们不推荐使用xml配置关于服务提供者的服务,因为当服务多了,配置的动作就变得繁多。下面就举个如何使用注解配置提供服务的协议的例子:

@Service(protocol = "dubbo")    //发布服务必须使用Dubbo提供的service
public class HelloServiceImpl implements HelloService {public String sayHello(String name) {return "hello " + name;}
}

3)启动时检查

启动时检查是什么意思?

意思就是说:以前面案例中的消费者和服务者代码为例,当我在启动它们时是先启动消费方,再启动服务方,然后,你会发现消费方已经报错了提示:没有在注册中心找到对应的服务。而这个情况,跟后来服务方启没启动没有关系,是跟在开始的时,消费方和服务方的启动先后顺序有关

  • 原理:
    在消费方启动之前,它会先去注册中心寻找有没有被@Reference上的服务,如果没有,它找不到就报错了,并且阻止spring初始化完成,这就是启动时检查。

但是,这里有个配置可以解决此异常,并且不在乎它们的启动顺序,只要都启动都可以正常使用:

<dubbo:consumer check="false"/>

上面这个配置需要配置在服务消费者一方,如果不配置默认check值为true。

那么我们一定要配置吗?

在开发时,是把启动检查关闭的:
因为当项目庞大的时候,项目有很多的服务方和消费方都互相交叉依赖。如果我们不关闭,为了测试1个服务方和消费方代码是否正常时,就要启动项目全部的服务方,因为他们是交叉依赖嘛,这样就很麻烦了。


在项目上线时,是把启动检查开着的(默认):
是因为以便上线时,能及早发现问题。

4)负载均衡

概念:

负载均衡(Load Balance):其实就是将请求分摊到多个操作单元上进行执行,从而共同完成工作任务。

Dubbo的负载均衡策略:

在集群负载均衡时,Dubbo 提供了多种均衡策略(包括随机、轮询、最少活跃调用数、一致性Hash)缺省(默认)为random随机调用。


配置负载均衡策略,既可以在服务提供者一方配置,也可以在服务消费者一方配置,如下:

【必须清楚】前提:部署有多个提供方服务器

消费者:

    @Controller@RequestMapping("/demo")public class HelloController {//在服务消费者一方配置负载均衡策略@Reference(check = false,loadbalance = "random")private HelloService helloService;@RequestMapping("/hello")@ResponseBodypublic String getName(String name){//远程调用String result = helloService.sayHello(name);System.out.println(result);return result;}}

服务者:

//在服务提供者一方配置负载均衡
@Service(loadbalance = "random")
public class HelloServiceImpl implements HelloService {public String sayHello(String name) {return "hello " + name;}
}

在【前提】的基础上,其实无论在哪一方配置了使用随机负载均衡策略,意思都是,多个服务方服务器都会将自己的服务(即使是大家相同的)注册到注册中心上,然后消费方会随机挑选相同的服务,但是不同服务器的服务。


下面在本地计算机来演示一下场景:(还是“入门案例”的代码)

注意: 因为我们是在一台机器上启动多个服务提供者,所以需要修改tomcat的端口号Dubbo服务的协议端口号来防止端口冲突。

在实际生产环境中,多个服务提供者是分别部署在不同的机器上(ip地址不同),所以不存在端口冲突问题


启动步骤:
在这里插入图片描述
我在下面,我就不放出所有代码了,因为【入门案例】中有,我只放我修改过的:

步骤2:修改service方法的输出:

@Service(loadbalance = "random")    //发布服务必须使用Dubbo提供
的service
public class HelloServiceImpl implements HelloService {public String sayHello(String name) {return "8082 hello " + name;}
}

步骤4:修改service方法的输出:

@Service(loadbalance = "random")    //发布服务必须使用Dubbo提供
的service
public class HelloServiceImpl implements HelloService {public String sayHello(String name) {return "8083 hello " + name;}
}

步骤3:修改端口

applicationContext-service.xml

步骤2的协议端口是20881

    <!-- 注册  协议和port   端口默认是20880 --><dubbo:protocol name="dubbo" port="20882"></dubbo:protocol>

pom.xml中Tomcat端口:

步骤2的是8081

<port>8083</port>

5)解决无法Dubbo无法发布被事务管理的服务

----------(注意: 本小节的代码是根据在入门案例的服务提供者dubbodemo_provider工程基础上进行讲解)

前面我们已经完成了Dubbo的入门案例,通过入门案例我们可以看到通过Dubbo提供的标签配置就可以进行包扫描,扫描到 @Service注解的类 就可以被发布为服务
但是,如果直接给服务增加事务管理,即,加@Transactional注解,那么被注上注解的服务类就不会被发布到注册中心。

下面直接将解决方案,如果想知道为什么就往下看:

(1)修改服务类applicationContext-service.xml配置文件,开启事务控制注解支持时指定proxy-target-class属性,值为true。其作用是使用cglib代理方式为Service类创建代理对象

<!--开启事务控制的注解支持-->
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>

(2)修改HelloServiceImpl类,在Service注解中加入interfaceClass属性,值为HelloService.class,作用是指定服务的接口类型

@Service(interfaceClass = HelloService.class)
@Transactional
public class HelloServiceImpl implements HelloService {public String sayHello(String name) {return "hello " + name;}
}

此处也是必须要修改的,否则会导致发布的服务接口为SpringProxy(spring代理对象的接口),而不是HelloService接口(真正对应的服务接口)


“无法Dubbo无法发布被事务管理的服务” 是什么意思?

意思是说,当我们在定义服务类时,加上@Transactional(事务控制)是不会发布sping产生事务控制的service代理对象的服务的。


场景显示:

注意: 在入门案例的服务提供者dubbodemo_provider工程基础上进行展示

在这里插入图片描述
pom.xml:

<!--mysql驱动--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version></dependency><!--连接池--><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.6</version></dependency><!--spring整合mybatis--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>1.3.2</version></dependency>

applicationContext-service.xml:

    <!--数据源--><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close"><property name="username" value="root" /><property name="password" value="root" /><property name="driverClassName" value="com.mysql.jdbc.Driver" /><property name="url" value="jdbc:mysql://localhost:3306/test" /></bean><!-- 事务管理器  --><bean id="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/></bean><!--开启事务控制的注解支持:默认使用JDK自动生成的动态代理对象--><tx:annotation-driven transaction-manager="transactionManager"/>

HelloServiceIpml:

package com.itheima.service.impl;
@Service(protocol = "dubbo") //发布服务必须使用Dubbo提供的Service注解
@Transactional
public class HelloServiceImpl implements HelloService {public String sayHello(String name) {return "8084 hello " + name;}
}

为什么 “无法Dubbo无法发布被事务管理的服务” ?

先看下面代码:

applicationContext-service.xml:

    <!-- 扫描指定包,加入@Service注解的类会被发布为服务  --><dubbo:annotation package="com.itheima.service.impl"/>

service:

package com.itheima.service.impl;
@Service(protocol = "dubbo") //发布服务必须使用Dubbo提供的Service注解
@Transactional
public class HelloServiceImpl implements HelloService {public String sayHello(String name) {return "8084 hello " + name;}
}

applicationContext-service.xml配置会扫描指定包的@Service,并将该service发布到注册中心。请注意在此处是:com.itheima.service.impl包下。但是,事务控制的底层原理是为服务提供者类创建代理对象,而默认情况下Spring是基于JDK动态代理方式创建代理对象,而此代理对象的完整类名为com.sun.proxy.$Proxy42(最后两位数字不是固定的),毕竟是spring提供的代理对象嘛(也就是本来是该服务类的全类名是com.itheima.service.impl.xxxServiceImpl,但是被spring代理对象后,实际上出面干事情的是com.sun.proxy.\$Proxy4)。也就是说: Dubbo是根据配置去扫描指定包下的com.itheima.service.impl包下的类,而不是com.sun.proxy.\$Proxy42,导致Dubbo在发布服务前进行包匹配时无法完成匹配,进而没有进行服务的发布(也就是被事务管理的服务没有被发布``到注册中心)。

查看dubbo管理控制台可知,没有服务者:
在这里插入图片描述
可以通过断点调试的方式查看Dubbo执行过程,Dubbo通过AnnotationBean的postProcessAfterInitialization方法进行处理
在这里插入图片描述

总结:

  • 如果声明式事务管理是基于JDK动态代理对象的话,那么被代理的对象和对象的全类名是不一致的
  • 如果声明式事务管理是基于cglib动态代理对象的话,那么被代理的对象和对象的全类名是一致的,但是被代理对象和代理对象对应的接口就不一致了,所以你要在@Service指定该服务的接口
查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. JMeter监控服务器资源步骤(界面化)

    JMeter元件执行顺序: 1、配置元件例如:HTTP请求默认值例如:HTTP请求头管理例如:用户定义变量 2、前置处理器例如:用户参数 3、定时器例如:固定时间 4、提取器(sampler)例如:公共接口请求 5、后置处理器例如:正则提取器 6、断言例如:3种断言:size断言、响应断言、响应…...

    2024/4/23 15:21:40
  2. BP神经网络

    大白话讲解BP算法最近在看深度学习的东西,一开始看的吴恩达的UFLDL教程,有中文版就直接看了,后来发现有些地方总是不是很明确,又去看英文版,然后又找了些资料看,才发现,中文版的译者在翻译的时候会对省略的公式推导过程进行补充,但是补充的又是错的,难怪觉得有问题。反…...

    2024/4/23 15:21:37
  3. 出现这种错误 Failed to bind properties under ” to com.zaxxer.hikari.HikariDataSource:

    在做springBoot与mybatis整合的时候 在测试的时候出现一下错误java.lang.IllegalStateException: Failed to load ApplicationContextat org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate…...

    2024/4/23 15:21:35
  4. DNN语音增强实现

    获取干净语音及噪声语音数据,可以使用soundfile中的read函数;获取语音有些困难,因为语音数据庞大,因此需要调整获取语音数据的方式; 已知:(1)语音数据:包括speech,noise(训练数据、验证数据及测试数据未分类);(2)训练数据文本文档、验证数据文本文档、测试数据文…...

    2024/4/23 15:21:34
  5. 顺序表增删查改,翻转,合并

    顺序表的增,删,查,改,翻转,合并此文章用于记录顺序表的知识 此文章用于记录顺序表的知识 今天下午突发其想想知道自己还会不会顺序表,于是花了大概一个小时写了下面这段程序。欢迎交流讨论。 // 代码部分 // // gradation_link.c // test // // Created by echo on 20…...

    2024/5/7 14:05:54
  6. hdu4003 Find Metal Mineral(树形dp+分组背包思想)

    题目n(n<=1e4)个点的树,每条边有一个边权w(w<=1e4),通过其的代价为其权值你有k(k<=10)个机器人,所有机器人从给定的源点s(1<=s<=n)出发,你可以控制机器人的移动求机器人访问所有点时,其最小的边权代价总和,输出代价总和1<=N<=10000, 1<=S<=N,…...

    2024/4/17 3:18:07
  7. 关于二叉树和图

    1、树 关于树的基本介绍 二叉树 完全二叉树:优先左子树,且除最后一层以外的其他每一层都被完全填充 左子树位置=父节点*2+1 右子树位置=父节点*2+2 满二叉树:每一层都被完全填充完满二叉树:除叶子节点之外的每个结点都有两个孩子二叉搜索树,又叫二叉排序树 平衡二叉树:AV…...

    2024/4/16 14:10:34
  8. getchar()使用清缓冲区

    void Input() {char answer;do{printf("是否继续录入英雄的信息?(y/n)");answer = getchar();rewind(stdin);//加上清缓冲区} while (answer==y|| answer==Y); }...

    2024/4/17 3:17:37
  9. springboot配置Swagger2生成API接口文档

    一、Swagger2介绍前后端分离开发模式中,api文档是最好的沟通方式。Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。及时性 (接口变更后,能够及时准确地通知相关前后端开发人员)规范性 (并且保证接口的规范性,如接口的地址,请求方…...

    2024/4/15 8:03:26
  10. 算法复杂性_复杂网络与复杂系统学习笔记01

    算法复杂性是19964-1966年由索洛莫诺夫、科尔莫戈罗夫和柴廷分别独立提出的,粗略的说,算法复杂性就是产生特定的图形花纹(或符号序列)的最短程序的长度与图形花纹(或符号序列)本身的大小之比的极限。这里‘长度’和‘大小’均按二进制位数计,而‘程序’则是在普适的理论…...

    2024/4/20 10:02:05
  11. Java中StringBuffer和StringBuilder类的区别学习

    StringBuffer和StringBuilder类的区别 StringBuffer与StringBuilder都可以实现字符串内容的修改处理操作 StringBuffer属于线程同步的处理过程,多个线程进行修改的时候可以自动实现同步机制,保证数据修改的正确性 StringBuilder属于非线性安全的处理,没有进行同步的操作,多…...

    2024/4/17 3:18:07
  12. 交换机与路由器的工作原理总结

    ...

    2024/4/17 3:17:49
  13. 微信小程序之WXML:标签与属性

    WXML(WeiXin Markup Language)(页面结构文件)是框架设计的一套标签(标记)语言。用于渲染界面,它结合基础组件和时件系统,可以构建出页面结构。 标签与属性 语法规则: 1、所有元素都必须闭合标签且小写: <text(小写)> Hello World </text>2、所有元素都…...

    2024/4/28 5:51:27
  14. Windows内核漏洞学习-UAF

    0x00:前言 本章所提到的漏洞为UAF(释放后利用),这也是目前我所接触到的第一个复杂一点的内核漏洞。参考文章:传送门0x01:漏洞原理 NTSTATUS FreeUaFObject() {NTSTATUS Status = STATUS_UNSUCCESSFUL;PAGED_CODE();__try {if (g_UseAfterFreeObject) {DbgPrint("[+] F…...

    2024/4/23 15:21:32
  15. 【ncnn android】算法移植(一)——studio libncnn导入及常规操作

    1. c++文件中无法导入<android/bitmap.h> 新建一个cpp文件,在文件中无法导入android的头文件解决: 这是因为没有在cmakelist.txt中编译,先编译一下就可以导入了。执行以下make project。前提是cmake中要添加文件2. ncnn项目给的一些例子https://github.com/nihui/ncnn…...

    2024/5/5 5:02:27
  16. Mysql linux数据库主从复制服务器搭建

    ** Mysql主从复制服务器搭建步骤 Mysql服务器主主复制容易出现的问题就是: ①数据混乱; ②主键可能重复; 从而为了提高MySQL服务器稳定性 ,就出现了MySQL服务器主从复制。MySQL服务器主从复制(下问就以主从代替)让mysql服务器稳定性提升,避免单台mysql服务器宕机后影响整…...

    2024/4/23 15:21:37
  17. 琢磨琢磨,while (true) 和 for (;;) 哪个更快?!

    在JDK8u的jdk项目下做个很粗略的搜索:mymbp:/Users/me/workspace/jdk8u/jdk/src $ egrep -nr "for \\(\\s?;\\s?;" . | wc -l369 mymbp:/Users/me/workspace/jdk8u/jdk/src $ egrep -nr "while \\(true" . | wc -l323并没有差多少。其次,for (;;) 在Ja…...

    2024/4/29 17:45:44
  18. Ajax封装

    1.## 原生js封装简单的Ajax函数 function ajax (options) {// 默认值var defaults = {type: get,url: ,async: true,data: {},header: {Content-Type: application/x-www-form-urlencoded},success: function () {},error: function () {}}// 使用用户传递的参数替换默认值参数…...

    2024/4/23 15:21:28
  19. time 模块

    https://www.cnblogs.com/jfl-xx/p/8024596.htmlimport time# 将时间转成整形, 方便与时间戳进行对比 tss1 = 2020-10-10 0:00:00 timeArray = time.strptime(tss1, "%Y-%m-%d %H:%M:%S") timeStamp = int(time.mktime(timeArray)) print(timeStamp) # 1602259200 p…...

    2024/4/23 15:21:28
  20. 简单分析Spring AOP源码

    简单分析Spring AOP源码Spring AOP和IOC是Spring源码的核心,也是面试高频点。本文首先讲述AOP的概念,之后从源码角度分析Spring AOP的原理AOP概念 AOP, Aspect Oriented Programming,面向切面编程。面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种…...

    2024/4/23 15:21:27

最新文章

  1. docker-compose 运行jenkins 并一键发布springboot项目

    文档时间&#xff1a; 2024-05-07 jenkins一键发布原理个人理解&#xff1a; 本质就是通过jenkins 配置git地址&#xff0c;然后通过地址拉取代码到服务器上&#xff0c; 然后jenkins 再通过maven把拉取下来的进行打包。 再通过jenkins 配置的shell命令&#xff0c;在服务…...

    2024/5/7 16:25:34
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/5/7 10:36:02
  3. 游戏引擎架构01__引擎架构图

    根据游戏引擎架构预设的引擎架构来构建运行时引擎架构 ​...

    2024/5/6 18:32:42
  4. 第六章:使用 kubectl 创建 Deployment

    使用 kubectl 创建 Deployment 目标 学习应用的部署。使用 kubectl 在 Kubernetes 上部署第一个应用。Kubernetes 部署 一旦运行了 Kubernetes 集群, 就可以在其上部署容器化应用。为此,你需要创建 Kubernetes Deployment。 Deployment 指挥 Kubernetes 如何创建和更新应用…...

    2024/5/7 12:23:53
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/5/7 5:50:09
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/5/7 9:45:25
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/5/4 23:54:56
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/5/7 14:25:14
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/5/4 23:54:56
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/5/4 23:55:05
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/5/4 23:54:56
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/5/7 11:36:39
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/5/4 23:54:56
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/5/6 1:40:42
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/5/4 23:54:56
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/5/4 23:55:17
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/5/7 9:26:26
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/5/4 23:54:56
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/5/4 23:55:06
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/5/5 8:13:33
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/5/4 23:55:16
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/5/4 23:54:58
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/5/6 21:42:42
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/5/4 23:54:56
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57