37个Dubbo 连环炮,能扛住几个?最后几个还是有点难度

发布时间:2023-05-08 09:12:15

  今天,我给大家带来了Dubo的37连环炮。我们不耍流氓,只给面试题,不给参考答案。因此,老田也整理了Dubo的参考答案和核心知识点。

  本文结合自己对Dubbo的理解、网上资源和官网资料,整理了Dubbo连环炮。

  让黄忠做37个连环炮的概念是什么?

37个Dubbo 连环炮,能扛住几个?最后几个还是有点难度_分布式

  37个Dubo连环炮如下:

  1、什么是Dubo?

  2、为什么要用Dubo?

  3、Dubo能做什么?

  4、Dubbo 整体架构设计的分层是什么?

  5、默认使用什么通信框架,还有其他选择吗?

  6、一般使用什么注册中心?还有其他选择吗?

  7、默认使用什么序列化框架,你知道什么?

  8、说说Hessian 序列化

  9、说说Dubo 支持哪些协议,每个协议的应用场景和优缺点

  10、注册中心挂了,consumer 还能调用吗? provider?

  11、服务提供商能够实现无效踢出的原则是什么?

  12、为什么服务上线不影响旧版本?

  13、如何解决服务调用链过长的问题?

  14、核心配置是什么?

  15、Dubbo 推荐什么协议?

  16、Dubbo 负载均衡策略?

  17、Dubbo 容错策略有哪些?

  18、Dubbo 有哪些动态代理策略?

  19、服务提供商没有挂断电话,但在注册中心看不到。我该怎么办?

  20、哪些服务容器内置在Dubo?

  21、如果Dubbo开始时不能使用依赖的服务会发生什么?

  22、如何优雅地停止Dubo?

  23、说说 Dubbo 服务暴露的过程

  24、说说 Dubbo 引用服务的流程

  25、谈谈Dubbo的优先配置

  26、说说一次 Dubbo 服务请求流程?

  27、在同一服务多次注册的情况下,能否直接连接某一服务?

  28、Dubbo 如何将配置文件加载到Spring中?

  29、Dubbo 在使用过程中遇到了哪些问题,如何解决?

  30、Dubbo 和 Dubbox 两者的区别?

  31、绘制服务注册和发现的流程图?

  32、Dubbo SPI 和 Java SPI 区别?

  33、Dubbo 支持分布式事务吗?

  34、Dubbo 结果可以缓存吗?

  35、Dubbo 和 Spring Cloud 的区别?

  36、如何设计一个类似Dubo的RPCC? 框架?

  37、Dubbo 设计模式是什么?

  ...核心知识Dubbo

  以下是关于Dubo核心知识的思维导图:

37个Dubbo 连环炮,能扛住几个?最后几个还是有点难度_编程语言_02

  然后,我们正式开始了Dubo的36连环炮:1、什么是Dubo?

  基于Java的高性能轻量级RPC分布式服务框架,Dubbo由阿里巴巴团队开发,现已成为 Apache 基金会孵化项目。2、为什么要用Dubo?

  Dubbo 的诞生和 SOA 分布式架构的流行有很大关系。SOA 服务架构(Service Oriented Architecture),也就是说,根据业务逻辑将项目分为两个项目:服务层和性能层。服务层包含业务逻辑,只需提供外部服务即可。业务逻辑是调用服务层的服务来实现表现层只需要处理与页面的交互。

  SOA架构有两个主要角色: 服务提供者 服务使用者

  如果要开发分布式程序,也可以直接基于 HTTP 但是为什么要使用接口进行通信呢? Dubbo呢?

  前一段可以作为面试的铺垫,但重点是下一段。 我认为我们可以主要去做 Dubbo 为什么要使用以下四个特征? Dubbo: 负载平衡-当同一服务部署在不同的机器上时,应调用该机器上的服务 随着系统的发展,服务越来越多,服务之间的依赖变得复杂,甚至无法区分哪个应用程序应该在哪个应用程序之前启动。架构师无法完全描述应用程序的架构关系。Dubbo 我们可以解决如何调用服务之间的问题。 服务访问压力及时统计、资源调度与治理—基于访问压力实时管理集群容量,提高集群利用率。 服务降级-服务挂断后调用备用服务 另外,Dubbo 除了可以应用于分布式系统外,它还可以应用于当前流行的微服务系统。然而,因为 Spring Cloud 它在微服务中的应用更广泛,所以我认为我们通常会提到它 Dubbo 大部分是分布式系统。 服务提供者(Provider) 服务使用者(Consumer) 3、Dubo能做什么?

  调用透明的远程方法,就像调用本地方法一样。

  配置简单,没有API入侵。

  软负载平衡和容错机制可以在内网取代F5等硬件负载平衡器,降低成本和单点。

  自动注册和发现服务不再需要写下服务提供商的地址,注册中心根据接口名查询服务提供商的IP地址,并可以顺利添加或删除服务提供商。4、Dubbo 整体架构设计的分层是什么?

  Dubbo的整体设计分数 10 层:

  第一层:service 层、接口层,为服务提供商和消费者实现(留给开发商);

  第二层:config 层、配置层主要是对的 Dubbo 各种配置,Dubbo 相关配置;

  第三层:proxy 层,服务代理,透明生成客户端 stub 和服务单的 skeleton,调用的是接

  口,没有实现类,所以要生成代理,然后在代理之间进行网络通信,负责平衡等;

  第四层:registry 层,服务注册层,负责服务注册和发现;

  第五层:cluster 层、集群层、包装多个服务提供商的路由和负载平衡,将多个实例组合成一个 个服务;

  第六层:monitor 层,监控层,对 rpc 监控接口的调用次数和调用时间;

  第七层:protocol 远程调用层、封装层、 rpc 调用;

  第八层:exchange 层、信息交换层、包装要求响应模式、同步转异步;

  第九层:transport 层、网络传输层、抽象层 mina 和 netty 统一接口;

  第十层:serialize 层,数据序列化层。

  这是一个非常坑爹的面试问题,但是很多面试官喜欢问,你真的想背吗?你能背还是不错的。我建议 别背了,想想吧 Dubbo 服务调用过程中应该涉及哪些技术?把这些技术串起来 OK 了。5、默认使用什么通信框架,还有其他选择吗?

  Dubbo 默认使用 Netty 框架也是推荐的选择。此外,内容还集成了Mina、Grizzly。6、一般使用什么注册中心?还有其他选择吗?

  官方推荐Dubbo使用 Zookeeper 还有,作为注册中心 Redis、Multicast、Simple 也可作为Dubbo的注册中心。7、默认使用什么序列化框架,你知道什么?

  默认使用 Hessian 序列化,还有 Duddo、FastJson、Java 自带序列化。hessian是一个服务框架,采用二进制格式传输,与传统soap相比 web service,更轻,更快。8、说说Hessian 序列化 基于http-post模式,hessian中client与server的交互。 hessian将辅助信息包装在http中 在header中,如“授权token”等,我们可以根据http-header包装“安全验证”、“meta数据”等。hessian提供了一个简单的“验证”机制。 对于hessian的核心交互数据,如“调用方法”和参数列表信息,将通过post要求的body体直接发送,格式为字节流。 对于hessian的server端响应数据,将在response中通过字节流直接输出。

  hessian的协议本身并不复杂,这里就不赘述了;所谓协议(protocol)是限制数据的格式。client根据协议将请求信息序列化为字节序列并发送到server端。server端根据协议将数据反序列化为“对象”,然后执行指定的方法,并按照协议序列将方法的返回值再次化为字节流,并对client做出响应。根据协议,client将字节流反序列化为“对象”。9、说说Dubo 支持哪些协议,每个协议的应用场景和优缺点

  dubbo:单长连接和 NIO 异步通信适用于大并发小数据的服务调用,消费者远远大于提供商。传输协议 TCP,异步,Hessian 序列化;

  rmi:采用 JDK 标准的 rmi 实现协议,需要实现传输参数和返回参数对象 Serializable 接口,使用 java 标准序列机制采用阻塞式短连接、传输数据包大小混合、消费者和提供者数量相似、可传输文件、传输协议 TCP。多个短连接,TCP 协议传输、同步传输适用于常规远程服务调用和 rmi 互操作。依赖低版本。 Common-Collections 包,java 序列化存在安全漏洞;

  webservice:基于 WebService 远程调用协议,集成 CXF 实现,提供和出身 WebService 互操作。多个短连接,基于 HTTP 适用于系统集成和跨语言调用的传输、同步传输;

  http:基于 Http 使用表单中提交的远程调用协议 Spring 的 HttpInvoke 实现。多个短连接,传输协议 HTTP,输入参数大小混合,提供者比消费者多,需要给应用程序和浏览器 JS 调用;

  hessian:集成 Hessian 服务,基于 HTTP 通讯,采用 Servlet 暴露服务,Dubbo 内嵌 Jetty 默认提供和提供作为服务器 Hession 互操作服务。多个短连接,同步 HTTP 传输,Hessian 序列化,传入参数大,提供者大于消费者,提供者压力大,可以传输文件;

  memcache:基于 memcached 实现的 RPC 协议 redis:基于 redis 实现的 RPC 协议10、注册中心挂了,consumer 还能调用吗? provider?

  是的。因为当初始化开始时,consumer 所有需要的提供者的地址和其他信息将被拉到当地缓慢 所以注册中心挂了可以继续通信。但是 provider 挂了,就不能调用了。

37个Dubbo 连环炮,能扛住几个?最后几个还是有点难度_面试_03

11、服务提供商能够实现无效踢出的原则是什么?

  基于Zookeeper的临时节点原理,服务失效踢出。

  Zookeeper中的节点有生命周期,具体的生命周期取决于节点的类型,节点主要分为持久节点(Persistent)和临时节点(Ephemeral) 。12、为什么服务上线不影响旧版本?

  可以通过Dubbo配置中的version版本进行控制,设置多个版本。

  比如老版本versinotalow=1.0.0,那么新版本可以改为versinotalow=1.0.1。13、如何解决服务调用链过长的问题?

  Dubbo 可以使用 Pinpoint和 Apache Skywalking(Incubator)实现分布式服务跟踪。也可以结合 zipkin 实现分布式服务跟踪。14、核心配置是什么? dubbo:service/ 服务配置 dubbo:reference/引用配置 dubbo:protocol/ 协议配置 dubbo:registry/配置注册中心 dubbo:application/应用配置 dubbo:provider/配置服务提供者 dubbo:consumer/为消费者配置服务 dubbo:method/方法配置 dubbo:argument参数配置

  最后两个不回答也没问题,但是要熟悉。如果面试官提示提问,可以联系方法和参数。15、Dubbo 推荐什么协议?

  Dubbo支持dubbo、rmi、hessian、http、webservice、thrift、redis等各种协议,但是dubbo官网推荐我们使用dubo协议。16、Dubbo 负载均衡策略? 随机(默认):随机来 轮训:一个一个来 活动:机器活动负载 一致性 hash:落在同一台机器上 17、Dubbo 容错策略有哪些? failover cluster 模式

  provider 停机重试后,请求将分配给其他人 provider 上面,默认情况下,可以手动设置重试次数。建议将写作操作重试次数设置为 0。failback 模式

  调用失败后,失败的自动恢复将回到为消费者服务的空结果。并通过定期任务重试失败调用,适用于信息通知等操作。failfast cluster 模式

  快速失败只调用一次,失败后立即抛出异常。适用于幂等操作和写作操作,类似 failover cluster 模式中的重试次数设置为 0 的情况。failsafe cluster 模式

  失败安全是指在调用过程中出现异常时,只打印异常,而不抛出异常。适用于写入审计日志等操作。forking cluster 模式

  并行调用多个服务器,只要一个成功就返回。通常用于实时阅读操作,但需要浪费更多的服务资源。可以通过 forks="2" 设置最大并行数。broadcacst cluster 模式

  广播调用所有提供商,逐一调用,任何报错都报错。通常用于通知所有提供商更新缓存或日志等本地资源信息。18、Dubbo 有哪些动态代理策略?

  默认使用 javassist 生成动态字节码,创建代理类,但可以通过 SPI 扩展机制配置自己的动态代理策略。19、服务提供商没有挂断电话,但在注册中心看不到。我该怎么办?

  首先,确认服务提供商是否连接到正确的注册中心,不仅要检查配置中的注册中心地址,还要检查实际的网络连接。

  其次,这取决于服务提供商是否非常忙碌,如压力测试,以至于没有CPU片段将心跳发送到注册中心。在这种情况下,压力会自动恢复。20、哪些服务容器内置在Dubo?

  有三种内置服务容器:Dubo: Spring Container Jetty Container Log4j Container

  Dubbo 只是一个简单的服务容器 Main 方法,加载一个简单的方法 Spring 用于暴露服务的容器。21、如果Dubbo开始时不能使用依赖的服务会发生什么?

  Dubbo 缺省会在启动时检查所依赖的服务是否可用,不可用时抛出异常,防止 Spring 默认完成初始化 check="true",可以通过 check="false" 关闭检查。22、如何优雅地停止Dubo?

  Dubbo 是通过 JDK 的 ShutdownHook 完成优雅停机,所以如果使用的话 kill -9 PID 只有通过强制关闭指令,才不会实施优雅的停机。 kill PID 只有这样,才能执行。23、说说 Dubbo 服务暴露的过程

  服务暴露会从Spring ioc容器刷新后开始暴露。在正式暴露之前,需要暴露的服务将组装成URL对象,存储服务的ip、端口号、全路径名、parameters参数(配置信息,如路由、分组、版本、超时时间、应用名等)等配置信息。

  通过proxyFactory.getInvoker并使用方法javassist动态代理,将服务暴露接口封装成invoker对象。然后开始正式暴露服务。

  首先会将该invoker对象封装成export对象放入到exportedMap中供后的远程调用搜索。

  然后启动注册中心,向提供者注册信息注册中心。

  最后对configurations订阅节点。

  以上是服务暴露的总体流程。24、说说 Dubbo 引用服务的流程

  引用服务的时间有两种,一种是饿汉式,即加载后引入,另一种是懒汉式,即只有当服务注入其他类别时才启动引入流程,默认为懒汉式。

  服务引用将首先根据需要引入的配置信息组装成url对象,并根据提供商的协议引入dubo协议XXXProtocol.refer。然后获得注册中心,如果注册中心没有初始注册中心。接下来,我们将向注册中心注册消费者信息,并订阅供应商、配置、路由等节点。

  最后,通过Cluster.join来包装invoker,默认是failoverCluster,最终通过proxyFactory.getProxy返回代理类,包括代理类NettyClient远程通信。25、谈谈Dubbo的优先配置

  优先级配置 1.以timeout例如,显示配置的搜索顺序,其他retries、loadbalance等。 方法级优先,接口级次之,整体配置次之 如果等级相同,消费者优先,提供方次之 其中,服务提供商配置通过URL通过注册中心传递给消费者

  2.建议服务提供商设置加班,因为服务提供商更清楚一种方法需要执行多长时间。 如果费用方同时引用多项服务,则不需要关心每项服务的加班设置。26、说说一次 Dubbo 服务请求流程?

  基本工作流程:

37个Dubbo 连环炮,能扛住几个?最后几个还是有点难度_redis_04

  上图中的角色描述:

37个Dubbo 连环炮,能扛住几个?最后几个还是有点难度_面试_05

27、在同一服务多次注册的情况下,能否直接连接某一服务?

  可以直接连接,修改配置,也可以通过 telnet 直接服务。28、Dubbo 如何将配置文件加载到Spring中?

  全Springgng使用Dubo 配置模式,透明接入应用程序,没有API应用程序 入侵,只需用Spring加载Dubo配置即可。

  Spring 当容器启动时,它将被读取 Spring 默认的一些 schema 以及 Dubbo 自定义的 schema,每个 schema 都会对应自己的 NamespaceHandler,NamespaceHandler 里面通过 BeanDefinitionParser 分析配置信息并将其转换为需要加载的信息 bean 对象29、Dubbo 在使用过程中遇到了哪些问题,如何解决?

  下面列出了七个问题,可以说三五个: 同时配置了 XML 和 properties 文件,则 properties配置无效

  只有 XML 没有配置,properties 才生效。 dubbo 缺省会在启动时检查依赖性是否可用,不可用时抛出异常,防止 Spring 初始化完成,check 属性默认为 true。

  在测试过程中,一些服务不关心或出现循环依赖 check 设置为 false 为了方便开发和测试,线下有一个可用于所有服务的注册中心。此时,如果开发中有服务提供商注册,可能会影响消费者的正常运行。

  解决方案:让服务提供商开发人员只订阅服务,而不注册正在开发的服务,并通过直接测试正在开发的服务。设置 dubbo:registry标签的 register 属性为 false。 spring 2.x 死锁问题的初始化。

  在 spring 解析到 dubbo:service 当时,服务已经向外界暴露,而且 spring 其他人还在初始化 bean,如果此时有请求,并且在服务实现类中有调用 applicationContext.getBean() 的用法。getBean 线程和 spring 初始化线程的锁定顺序不同,导致线程死锁,无法提供服务,无法启动。

  解决方案:不要在服务实现类别中使用 applicationContext.getBean()``; 如果你不想依赖配置顺序,你可以dubbo:provider `的 deplay 属性设置为 - 1,使 dubbo 服务暴露在容器初始化完成后。 不能注册服务

  检查 dubbo 的 jar 包有没有在 classpath 中间,有没有重复? jar 包

  检查暴露服务 Spring 配置是否加载

  测试和注册中心的网络是否通过服务提供者机器上的服务 出现 RpcException: No provider available for remote service 异常

  表示没有可用的服务提供商,

  a. 检查连接的注册中心是否正确

  b. 到注册中心检查相应的服务提供商是否存在

  c. 检查服务提供商是否正常运行 出现” 消息发送失败” 异常

  通常,接口方法的传入传出参数没有实现 Serializable 接口。30、Dubbo 和 Dubbox 两者的区别?

  Dubbox 以当当网为基础 dubbo 做了一些扩展,比如增加服务 restful 调用、更新开源组件等。31、绘制服务注册和发现的流程图?

  这个可以参考官网给出的图片:

37个Dubbo 连环炮,能扛住几个?最后几个还是有点难度_redis_06

32、Dubbo SPI 和 Java SPI 区别? JDK SPI

  JDK 标准的 SPI 所有的扩展实现都将一次加载。如果有些扩展很耗时,但它们是无用的,这是浪费资源。因此,仅仅加载某一实现是不现实的。DUBBO SPI

  1,对 Dubbo 扩展不需要改变 Dubbo 的源码

  2.延迟加载可以一次只加载你想加载的扩展。

  三、增加了扩展点 IOC 和 AOP 一个扩展点可以直接支持 setter 注入其它扩展点。

  4,Dubbo 扩展机制可以很好地支持第三方 IoC 默认支持容器 Spring Bean。33、Dubbo 支持分布式事务吗?

  目前暂时不支持,可以通过 tcc-transaction 框架实现

  介绍:tcc-transaction 是开源的 TCC 补偿分布式事务框架

  Git 地址:https://github.com/changmingxie/tcc-transaction

  TCC-Transaction 通过 Dubbo 隐藏传参的功能,避免自身对业务代码的入侵。34、Dubbo 结果可以缓存吗?

  为了提高数据访问速度

  Dubbo 为了减少用户加缓存的工作量,提供了声明缓存

  其实比普通配置文件多了一个标签 cache="true" 。35、Dubbo 和 Spring Cloud 的区别?

  根据微服务架构各方面的要素,看 Spring Cloud 和 Dubbo 提供了哪些支持? 。dubbo的优势 单一的应用架构,当网站流量非常小时时时,只需要一个应用程序就可以将所有功能部署在一起,以降低部署节点和成本。此时,用于简化工作量的增加、删除和更改 数据访问框架(ORM)是关键。 垂直应用架构,当访问量逐渐增加时,单个应用程序增加机器带来的加速度越来越小,将应用程序分为几个不相关的应用程序,以提高效率。此时,用于加速前端页面的开发 Web框架(MVC)是关键。 分布式服务架构,当垂直应用程序越来越多时,应用程序之间的互动是不可避免的。核心业务作为独立服务,逐步形成稳定的服务中心,使前端应用程序能够更快地响应可变的市场需求。此时,它被用来改善业务的再利用和集成 分布式服务框架(RPC)是关键。 当服务越来越多、容量评估、小服务资源浪费等问题逐渐出现时,需要根据访问压力增加调度中心实时管理集群容量,提高集群利用率。此时,它被用来提高机器的利用率 资源调度与治理中心(SOA)是关键。 SpringClouud优势 协议优于配置 开箱即用,快速启动 适用于各种环境 轻量级组件 组件支持丰富,功能齐全

  两者相比较1、由于Dubo是二进制传输,占用带宽会更少 2、Spring Cloud是http协议的传输,会有更多的带宽。同时,JSON报纸通常用于使用http协议,消耗 会更大 3、开发Dubbo比较困难,原因是dubo的jar包依赖问题很多大型项目解决不了 4、Spring Cloud的界面协议相对自由和松散,需要有强有力的行政措施来限制界面的无序升级 5、dubo注册中心可选择zk、redis等,springcloud注册中心只能使用eureka或自主研究35、如何设计一个类似Dubo的RPCC? 框架?

  遇到这样的问题,至少从你知道的类似框架的原理入手,自己说说参考 dubbo 请设计一下原理,举个例子,dubbo 不是有那么多分层吗?你知道每个分层是干什么的吗?然后按照这个想法大致说。至少你不能被逼。比那些上来就说不出话来的人好。

  举个栗子,我给大家讲一个最简单的答案: 你的服务必须在注册中心注册。你必须有一个注册中心来保留每个服务的信息吗?你可以用它 zookeeper 做,对吧? 然后你的消费者需要去注册中心获取相应的服务信息,对吧,每个服务可能存在于多台机器中。 然后你应该提出一个请求。如何启动?当然,它是基于动态代理。您可以通过接口获得动态代理。这个动态代理是接口在本地的代理,然后该代理将找到服务对应的机器地址。 然后找哪台机器发送请求?必须有负载均衡算法,比如最简单的可以随机轮询。 然后找到一台机器,你可以向它发送请求。如何发送第一个问题?你可以说 netty 了,nio 方法;第二个问题发送什么格式数据?你可以说 hessian 序列化协议,或者别的,对吧?然后请求过去了。 同样,服务器需要为您自己的服务生成动态代理,监控网络端口,然后代理您当地的服务代码。当您收到请求时,请拨打相应的服务代码,对吧。

  这是最基本的一个 rpc 框架的想法,更不用说你的技术技能了,即使你先给出这个最简单的想法,好吗?你到了吗?37、Dubbo 设计模式是什么?

  装饰模式:为什么生产者和消费者必须将其转换为Invoker而不是直接调用?我认为Invoker是Dubo设计的亮点:真实调用转换为Invoker,Dubo可以通过装饰模式增强Invoker功能。

  责任链模式:EchoFilter -> ClassLoaderFilter -> GenericFilter -> ContextFilter -> ,EchoFilter 其功能是判断是否是回声测试请求,是的,直接返回内容,这是责任链的体现。ClassLoaderFilter 只在主功能上添加功能,改变当前线程 ClassLoader,这是典型的装饰模式。

  观察者模式:Dubbo 的 Provider 启动时,需要与注册中心互动,先注册自己的服务,再订阅自己的服务。订阅时,采用观察者模式打开一个 listener。每个注册中心 5 秒定期检查是否有服务更新。如果有更新,将服务提供商发送给服务提供商 notify 消息,provider 接受到 notify 消息后,即操作 NotifyListener 的 notify 方法,执行监听器方法。

  动态代理模式:Dubbo 扩展 JDK SPI 的类 ExtensionLoader 的 Adaptive 实现是典型的动态代理实现。Dubbo 实现类需要灵活控制,即根据参数在调用阶段动态确定调用哪个实现类,因此采用先生代理类的方法可以实现灵活调用。代理代码的生成是 ExtensionLoader createadaptivetensionClascodede 方法。代理的主要逻辑是获取 URL 参数中指定的参数值作为获取实现类 key。

  适配器模式:为了让用户根据自己的需要选择日志组件,Dubbo定制了自己的标志接口,并为常见的日志组件(包括jcl, jdk, log4j, slf4j)提供相应的适配器。并采用简单的工厂模式提供LogerFactory,客户可以在不关心实际使用的情况下创建抽象的Dubbo自定义Loger。当LogerFactory初始化时,客户通过设置系统变量来选择他们使用的日志组件,这提供了很大的灵活性。总结

  其实我本来不打算搞Dubo连环炮,但是有朋友私下催我赶紧发。为什么不打算写?因为Dubo的文档是用中文写的,也是我们中国人写的,我觉得看文档就够了。

  但话说回来,很多朋友只用过Dubbo,可能还没有深入了解和学习,但是为了应付面试,他们觉得这个连环炮存在的意义在哪里。

上一篇 基于微服务架构的水果售卖系统的设计与实现
下一篇 【深度学习】Adam那么棒,为什么还对SGD念念不忘?一文看懂深度学习优化算法...

文章素材均来源于网络,如有侵权,请联系管理员删除。

标签: Java教程Java基础Java编程技巧面试题Java面试题