【零散知识点总结1】

大部分知识点来源于该博主——骆昊
知识点来源于网络,知道的可以在评论区贴上来源喔

《零散知识点总结1》
该文章涉及:Dubbo、HTTP和HTTPS、Mybatis、Hibernate、 Zookeeper、Kafka、Elasticsearch、Redis

《零散知识点总结2》
该文章涉及:MySQL、Java并发编程、Java IO 和 NIO、JUnit单元测试

《零散知识点总结3》
该文章涉及 :Java Web、sprig的全家桶(spring、SpringMVC、springboot、springcloud)、微服务

《零散知识点总结4》
该文章涉及:JVM和GC、Linux、Git、RabbitMQ

《零散知识点总结5》
该文章涉及:多线程、反射、对象拷贝、异常、容器

零散知识点总结1

Dubbo

Dobbo:阿里巴巴公司开源的一个高性能优秀的(分布式)服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 [1] Spring框架无缝集成。
三大核心能力:
面向接口的远程方法调用,(RPC:远程过程调用)
智能容错和负载均衡,
以及服务自动注册和发现。

Dubbo提供的注册中心有如下几种类型可供选择:
    Multicast注册中心
    Zookeeper注册中心(推荐)
    Redis注册中心(缓存推荐)
    Simple注册中心

Dubbo优缺点
优点:
1.透明化的远程方法调用- 像调用本地方法一样调用远程方法;只需简单配置,没有任何API侵入。
2.软负载均衡及容错机制-可在内网替代nginx lvs等硬件负载均衡器。
3.服务注册中心自动注册 & 配置管理-不需要写死服务提供者地址,注册中心基于接口名自动查询提供者ip。
使用类似zookeeper等分布式协调服务作为服务注册中心,可以将绝大部分项目配置移入zookeeper集群。
4.服务接口监控与治理-Dubbo-admin与Dubbo-monitor提供了完善的服务接口管理与监控功能,针对不同应用的不同接口,可以进行 多版本,多协议,多注册中心管理。

缺点:只支持JAVA语言

Zookeeper是一个分布式的服务框架,是树型的目录服务的数据存储,能做到集群管理数据 ,这里能很好的作为Dubbo服务的注册中心。
Dubbo能与Zookeeper做到集群部署,当提供者出现断电等异常停机时,Zookeeper注册中心能自动删除提供者信息,
当提供者重启时,能自动恢复注册数据,以及订阅请求。

Dubbo 的整体架构设计有哪些分层?

  • 接口服务层(Service):该层与业务逻辑相关,根据 provider (服务提供者)和 consumer (服务消费者)的业务设计对应的接口和实现

  • 配置层(Config):对外配置接口,以 ServiceConfig 和 ReferenceConfig 为中心

  • 服务代理层(Proxy):服务接口透明代理,生成服务的客户端 Stub 和 服务端的 Skeleton,以 ServiceProxy 为中心,扩展接口为ProxyFactory

  • 服务注册层(Registry):封装服务地址的注册和发现,以服务 URL 为中心,扩展接口为 RegistryFactory、Registry、RegistryService

  • 路由层(Cluster):封装多个提供者的路由和负载均衡,并桥接注册中心,以Invoker 为中心,扩展接口为 Cluster、Directory、Router 和 LoadBlancce

  • 监控层(Monitor):RPC 调用次数和调用时间监控,以 Statistics 为中心,扩展接口为 MonitorFactory、Monitor 和 MonitorService

  • 远程调用层(Protocal):封装 RPC 调用,以 Invocation 和 Result 为中心,扩展接口为 Protocal、Invoker 和 Exporter

  • 信息交换层(Exchange):封装请求响应模式,同步转异步。以 Request 和Response 为中心,扩展接口为 Exchanger、ExchangeChannel、ExchangeClient 和 ExchangeServer

  • 网络传输层(Transport):抽象 mina 和 netty 为统一接口,以 Message 为中心,扩展接口为 Channel、Transporter、Client、Server 和 Codec

  • 数据序列化层(Serialize):可复用的一些工具,扩展接口为 Serialization、ObjectInput、ObjectOutput 和 ThreadPool

默认使用的是什么通信框架,还有别的选择吗?

默认推荐使用netty 框架,还有 mina

服务调用是阻塞的吗?

默认是阻塞的,可以异步调用,没有返回值的可以这么做。Dubbo 是基于 NIO 的非阻塞实现并行调用,客户端不需要启动多线程即可完成
并行调用多个远程服务,相对多线程开销较小,异步调用会返回一个 Future 对象。

一般使用什么注册中心?还有别的选择吗?

推荐使用 Zookeeper 作为注册中心,还有 Redis、Multicast、Simple 注册中心,但不推荐。

默认使用什么序列化框架,你知道的还有哪些?

推荐使用 Hessian 序列化,还有 Duddo、FastJson、Java 自带序列化。

服务提供者能实现失效踢出是什么原理?

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

服务上线怎么不影响旧版本?

采用多版本开发,不影响旧版本。

服务上线怎么兼容旧版本?

可以用版本号(version)过渡,多个不同版本的服务注册到注册中心,版本号不同的服务相互间不引用。这个和服务分组的概念有一点类似。

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

可以结合 zipkin 实现分布式服务追踪。

说说核心的配置有哪些?

配置 配置说明
dubbo:service 服务配置
dubbo:reference 引用配置
dubbo:protocol 协议配置
dubbo:application 应用配置
dubbo:module 模块配置
dubbo:registry 注册中心配置
dubbo:monitor 监控中心配置
dubbo:provider 提供方配置
dubbo:consumer 消费方 配置
dubbo:method 方法配置
dubbo:argument 参数配置

dubbo推荐用什么协议?

dubbo://(推荐)、 rmi://、 hessian://、 http://、 webservice://、 thrift://、 memcached://、 redis://、rest://

同一个服务多个注册的情况下可以直连某一个服务吗?

可以点对点直连,修改配置即可,也可以通过 telnet 直接某个服务。

服务注册与发现的流程图

在这里插入图片描述

dubbo容错方案

集群容错方案 说明
Failover Cluster 失败自动切换,自动重试其它服务器(默认)
Failfast Cluster 快速失败,立即报错,只发起一次调用
Failsafe Cluster 失败安全,出现异常时,直接忽略
Failback Cluster 失败自动恢复,记录失败请求,定时重发
Forking Cluster 并行调用多个服务器,只要一个成功即返回
Broadcast Cluster 广播逐个调用所有提供者,任意一个报错则报错

Dubbo 支持服务降级吗?失败重试怎么做?

可以通过 dubbo:reference 中设置 mock="return null"。mock 的值也可以修改为 true,然后再跟接口同一个路径下实现一个 Mock 类,命名规则是 “接口名称+Mock” 后缀。然后在 Mock 类里实现自己的降级逻辑

Dubbo 使用过程中都遇到了些什么问题?

在注册中心找不到对应的服务,检查 service 实现类是否添加了@service 注解无法连接到注册中心,检查配置文件中的对应的测试 ip 是否正确

Dubbo 配置文件是如何加载到 Spring 中的?

Spring 容器在启动的时候,会读取到 Spring 默认的一些 schema 以及 Dubbo 自定义的 schema,每个 schema 都会对应一个自己的 NamespaceHandler,NamespaceHandler 里面通过 BeanDefinitionParser 来解析配置信息并转化为需要加载的 bean 对象!

Dubbo 支持分布式事务吗?

目前暂时不支持,可与通过 tcc-transaction 框架实现,介绍:tcc-transaction 是开源的 TCC 补偿性分布式事务框架
Git 地址
TCC-Transaction 通过 Dubbo 隐式传参的功能,避免自己对业务代码的入侵。

Dubbo 可以对结果进行缓存吗?

可以(声明式缓存,提高数据访问速度,减少用户加缓存的工作量)<dubbo:reference cache="true" />

其实比普通的配置文件就多了一个标签 cache="true

Dubbo 必须依赖的包有哪些?

Dubbo 必须依赖 JDK,其他为可选。

Dubbo telnet 命令能做什么?

dubbo 服务发布之后,我们可以利用 telnet 命令进行调试、管理。Dubbo2.0.5 以上版本服务提供端口支持 telnet 命令

连接服务:telnet localhost 20880 //键入回车进入 Dubbo 命令模式。

查看服务列表

dubbo>ls
com.test.TestService
dubbo>ls com.test.TestService
create
delete
query
ls (list services and methods)
ls : 显示服务列表。
ls -l : 显示服务详细信息列表。
ls XxxService:显示服务的方法列表。
ls -l XxxService:显示服务的方法详细信息列表

Dubbo 如何优雅停机?

Dubbo 是通过 JDK 的 ShutdownHook 来完成优雅停机的,所以如果使用kill -9 PID 等强制关闭指令,是不会执行优雅停机的,只有通过 kill PID 时,才会执行。

Dubbo 和 Dubbox 之间的区别?

Dubbox 是继 Dubbo 停止维护后,当当网基于 Dubbo 做的一个扩展项目,如加了服务可 Restful 调用,更新了开源组件等。

两者之间本质上没什么区别,因为dubbox是dubbo扩展出来的,扩展以下的功能:

支持REST风格远程调用(HTTP + JSON/XML);
支持基于Kryo和FST的Java高效序列化实现;
支持基于Jackson的JSON序列化;
支持基于嵌入式Tomcat的HTTP remoting体系;
升级Spring至3.x;
升级ZooKeeper客户端;
支持完全基于Java代码的Dubbo配置;

Dubbo 和 Spring Cloud 的区别?

根据微服务架构在各方面的要素,看看 Spring Cloud 和 Dubbo 都提供了哪些支持。

Dubbo Spring Cloud
服务注册中心 Zookeeper Spring Cloud Netflix Eureka
服务调用方式 RPC REST API
服务网关 Spring Cloud Netflix Zuul
断路器 不完善 Spring Cloud Netflix Hystrix
分布式配置 Spring Cloud Config
服务跟踪 Spring Cloud Sleuth
消息总线 Spring Cloud Bus
数据流 Spring Cloud Stream
批量任务 Spring Cloud Task
…… …… ……

使用 Dubbo 构建的微服务架构就像组装电脑,各环节我们的选择自由度很高,但是最终结果很有可能因为一条内存质量不行就点不亮了,总是让人不怎么放心,但是如果你是一名高手,那这些都不是问题;

而 Spring Cloud 就像品牌机,在Spring Source 的整合下,做了大量的兼容性测试,保证了机器拥有更高的稳定性,但是如果要在使用非原装组件外的东西,就需要对其基础有足够的了解

你还了解别的分布式框架吗?
别的还有 spring 的 spring cloud,facebook 的 thrift,twitter 的 finagle 等

Double、decimal和float的区别?

Double、decimal和float都可以表示小数,float是单精度,double是双精度,decimal是数字型,它们所占的内存空间不一样,表示的位数也不一样。

在精度上,double比float精确,但是依然会存在精度损失的问题,且不会报任何错误和异常;在占内存和处理速度上,float要快得多,因此如果涉及到小数计算的话,我们会建议用decimal型

总而言之,自己看情况来使用吧

HTTP和HTTPS

跨域:协议、域名(子/主)端口号任意一个不同,相互请求资源都可以称为跨域。
域名地址组成----例如: http://www.abc.com:8080/scripts/jquery.js

http://(协议);
www(子域名);
abc.com(主域名);
8080(端口号);
scripts/jquery.js(请求资源地址);
  • HTTP:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少。(最广泛、明文传输安全性较差、端口80)

  • HTTPS:是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。(要到ca申请证书,一般免费证书较少,因而需要一定费用、是由http+SSL加密传输的,身份认证的网络协议,安全性较高、端口443)

HTTPS协议的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性。

TCP和 UDP的区别,TCP为什么是三次握手?

TCPUDP的区别:TCP是双工协议,比UDP更可靠,效率也更高;

tcp(传输控制协议) 和 udp (用户数据报协议)是 OSI(开放式系统互联参考模型) 模型中的运输层中的协议。tcp 提供可靠的通信传输,而 udp 则常被用于让广播和细节控制交给应用的通信传输。

两者的区别大致如下:

  • tcp 面向连接,udp 面向非连接即发送数据前不需要建立链接;
  • tcp 提供可靠的服务(数据传输),udp 无法保证;
  • tcp 面向字节流,udp 面向报文;
  • tcp 数据传输慢,udp 数据传输快;

TCP为什么是三次握手:为了保证服务端能收接受到客户端的信息并能做出正确的应答而进行前两次握手,为了保证客户端能够接收到服务端的信息并能做出正确的应答而进行后两次握手。详细的三次握手

TCP为什么不可以两次握手?
如果采用两次握手,那么只要服务器发出确认数据包就会建立连接,但由于客户端此时并未响应服务器端的请求,那此时服务器端就会一直在等待客户端,这样服务器端就白白浪费了一定的资源。若采用三次握手,服务器端没有收到来自客户端的再此确认,则就会知道客户端并没有要求建立请求,就不会浪费服务器的资源。

说一下 tcp 粘包是怎么产生的?
tcp 粘包可能发生在发送端或者接收端,分别来看两端各种产生粘包的原因:

  • 发送端粘包:发送端需要等缓冲区满才发送出去,造成粘包;
  • 接收方粘包:接收方不及时接收缓冲区的包,造成多个包接收。

OSI 的七层模型都有哪些?

  • 物理层:利用传输介质为数据链路层提供物理连接,实现比特流的透明传输。
  • 数据链路层:负责建立和管理节点间的链路。
  • 网络层:通过路由选择算法,为报文或分组通过通信子网选择最适当的路径。
  • 传输层:向用户提供可靠的端到端的差错和流量控制,保证报文的正确传输。
  • 会话层:向两个实体的表示层提供建立和使用连接的方法。
  • 表示层:处理用户信息的表示问题,如编码、数据格式转换和加密解密等。
  • 应用层:直接向用户提供服务,完成用户希望在网络上完成的各种工作。
    在这里插入图片描述
    在这里插入图片描述

http 和RPC 的区别

什么是RPC?

RPC两大核心:通讯,序列化
什么是RPC,推荐阅读 https://www.jianshu.com/p/2accc2840a1b
在这里插入图片描述
在这里插入图片描述
http 和RPC 都是很常见的服务远程调用的方式,那么它们之间有什么区别呢?
https://www.cnblogs.com/helloworldmybokeyuan/p/11626833.html

  • RPC:Remote Produce Call远程过程调用,类似的还有RMI(Remote Methods Invoke 远程方法调用,是JAVA中的概念,是JAVA十三大技术之一)。自定义数据格式,基于原生TCP通信,速度快,效率高。早期的webservice,现在热门的dubbo,都是RPC的典型
    RPC的框架:webservie(cxf)、dubbo
    RMI的框架:hessian

  • Http:(前面也有提到)http其实是一种网络传输协议,基于TCP,规定了数据传输的格式。现在客户端浏览器与服务端通信基本都是采用Http协议。也可以用来进行远程服务调用。缺点是消息封装臃肿。
    现在热门的Rest风格,就可以通过http协议来实现。
    http的实现技术:HttpClient

相同点:底层通讯都是基于socket,都可以实现远程调用,都可以实现服务调用服务

不同点:

  • RPC:框架有:dubbo、cxf、(RMI远程方法调用)Hessian
    当使用RPC框架实现服务间调用的时候,要求服务提供方和服务消费方都必须使用统一的RPC框架,要么都dubbo,要么都cxf
    跨操作系统在同一编程语言内使用
    优势:调用快、处理快

  • http:框架有:httpClient
    当使用http进行服务间调用的时候,无需关注服务提供方使用的编程语言,也无需关注服务消费方使用的编程语言,服务提供方只需要提供restful风格的接口,服务消费方,按照restful的原则,请求服务,即可
    跨系统跨编程语言的远程调用框架
    优势:通用性强

总结:对比RPC和http的区别

1 RPC要求服务提供方和服务调用方都需要使用相同的技术,要么都hessian,要么dubbo而http无需关注语言的实现,只需要遵循rest规范
2 RPC的开发要求较多,像Hessian框架还需要服务器提供完整的接口代码(包名.类名.方法名必须完全一致),否则客户端无法运行
3 Hessian只支持POST请求
4 Hessian只支持JAVA语言

vue.js跟thymeleaf 的区别

首先说,这两种技术在本质上属于不同类型的产品。Vue.js属于前端框架,thymeleaf属于模板引擎。
虽然它们可以实现相同的功能(如列表),但它们的工作流程是不同的:vue.Js通过异步请求数据,后端向前端返回json,
前端通过列表呈现vue指令循环。Thymeleaf是在后端实现页面的渲染,将页面直接呈现给浏览器显示。
一般来说,后台管理我们会使用前端框架,而网站前台的部分有些页面会用thymeleaf。
有两个原因:
   (1) 因为使用vuejs进行异步请求,打开页面看到的信息显示会出现延迟,而使用thymeleaf,页面的信息就会很快看到。
   (2)异步加载数据不会被搜索引擎抓取。所以当我们希望数据被搜索引擎收录,就需要使用thymeleaf这样的模板引擎。

Mybatis

Mybatis学习:
	认识mybatis:持久化
	第一个mybatis程序
	CRUD
	mybatis 配置文件XML介绍
	ResultMap:结果集映射【重点】:
		一对多
		多对一
	log4j
	分页
	注解开发
	动态SQL
	缓存【重点】:
		一级缓存(本地缓存——默认开启)一次会话有效
		二级缓存 (全局缓存)首先请求的是二级,没有二级缓存才会请求一级缓存,还没有就去数据库
		缓存失效有四种情况:
			1.请求的内容不同
			2.进行了新增、修改和删除 操作
			3.查询不同的Mapper.xml
			4. 手动清理缓存 sqlSession.clearCache();

生命周期和作用域:
在这里插入图片描述
生命周期,和作用域,是至关重要的,因为错误的使用会导致非常严重的并发问题。在这里插入图片描述

为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里?

Hibernate属于全自动ORM映射工具,使用Hibernate查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,所以它是全自动的。而Mybatis在查询关联对象或关联集合对象时,需要手动编写sql来完成,所以,称之为半自动ORM映射工具

什么是 Mybatis?

  1. Mybatis 是一个半 ORM(Object relational mapping对象关系映射)框架,它内部封装了 JDBC,开发时只需要关注 SQL 语句本身,不需要花费精力去处理加载驱动、创建连接、创建statement (声明)等繁杂的过程。程序员直接编写原生态 sql,可以严格控制 sql 执行性能,灵活度高。
  2. MyBatis 可以使用 XML 或注解来配置和映射原生信息,将 POJO 映射成数据库中的记录,避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
  3. 通过 xml 文件或注解的方式将要执行的各种 statement 配置起来,并通过java 对象和 statement 中 sql 的动态参数进行映射生成最终执行的 sql 语句,最后由 mybatis 框架执行 sql 并将结果映射为 java 对象并返回。(从执行 sql 到返回 result 的过程)。

Mybaits 的优点:

详细回答:

  1. 基于 SQL 语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL 写在 XML 里,解除 sql 与程序代码的耦合,便于统一管理;提供 XML标签,支持编写动态 SQL 语句,并可重用
  2. 与 JDBC 相比,减少了 50%以上的代码量,消除了 JDBC 大量冗余的代码,不需要手动开关连接
  3. 很好的与各种数据库兼容(因为 MyBatis 使用 JDBC 来连接数据库,所以只要JDBC 支持的数据库 MyBatis 都支持)
  4. 能够与 Spring 很好的集成;
  5. 提供映射标签,支持对象与数据库的 ORM 字段关系映射;提供对象关系映射标签,支持对象关系组件维护。

粗略回答:

  1. 与JDBC相比,减少了50%以上的代码量;
  2. MyBatis是最简单的持久化框架,小巧并且简单易学;
  3. MyBatis相当灵活,不会对应用程序或者数据库的现有设计强加任何影响,SQL写在XML里,从程序代码中彻底分离,降低耦合度,便于统一管理和优化,并可重用;
  4. 提供XML标签,支持编写动态SQL语句;
  5. 提供映射标签,支持对象与数据库的ORM字段关系映射。

MyBatis 框架的缺点:

  1. SQL 语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写SQL 语句的功底有一定要求。
  2. SQL 语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。

mybatis-config.xml和 mapper.xml

mybatis核心配置文件: mybatis-config.xml

注意!!!!在 configuration 里面的标签有顺序的限制 排序如下:

properties、settings、typeAliases、typeHandlers、objectFactory、objectWrapperFactory、
reflectorFactory、plugins、environments、databaseIdProvider、mappers
  • properties:属性(引入外部配置文件)
    写法1:<properties resource="db.properties"/>
    写法2:
<properties resource="db.properties">
	<!--这里面的等同于 db.properties里面的 username=root  pwd=123456 优先级1-->
    <property name="username" value="root"/>
    <property name="pwd" value="123456"/>  优先级1
</properties>
  • settings:全局配置参数(日志格式、动驼峰命名规则、开启二级缓存)
 <settings>
     <!-- 配置日志格式 (标准日志格式:STDOUT_LOGGING) -->
     <setting name="logImpl" value="STDOUT_LOGGING"/>
     <!--是否开启自动驼峰命名规则 camel case 映射   -->
     <setting name="mapUnderscoreToCamelCase" value="true"/>
     <!-- 二级缓存第一步:   显示的开启全局缓存-->
     <setting name="cacheEnabled" value="true"/>
 </settings>
  • typeAliases:给实体类起别名,一般默认别名为类名的小写:也就是 user
<typeAliases>
    <typeAlias type="com.hh.pojo.User" alias="User"/> <!-- 实体类比较少的时候,使用。 (可以DIY别名)-->
   <!-- <package name="com.hh.pojo"/>-->  <!--直接扫描整个实体类包,实体类十分多的时候使用,如果想要DIY别名可以在实体上增加注解 @Alias("hello")-->
</typeAliases>
  • typeHandlers:类型处理器:作用就是承担jdbcType和javaType之间的相互转换
 <!--普通注册方式 -->
<typeHandlers>
 	<typeHandler javaType="String" jdbcType="NVARCHAR" handler="priv.dengjl.ns.handler.MyStringHandler" />
 </typeHandlers>
 
 <!--包方式   包方式需要显示在java类注类型:@MappedJdbcTypes(JdbcType.NVARCHAR)  @MappedTypes(String.class)-->
 <typeHandlers>
   <package name="org.mybatis.example"/>
 </typeHandlers>
  • objectFactory:对象工厂
  • objectWrapperFactory:对象加工工厂
  • reflectorFactory:反射工厂

plugins:插件

<plugins>
 	<plugin interceptor="org.mybatis.example.ExamplePlugin">
     <property name="someProperty" value="100"/>
   </plugin>
 </plugins>
  • environments:环境集合属性对象
    ( MyBatis 可以配置成适应多种环境,不过要记住:尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境。 default=“development” 可以决定使用哪一个环境)
<environments default="development"><!--development:开发环境 -->
  <!--environment:环境子属性对象 -->
   <environment id="development">
       <!--事务管理器:transactionManager -->
       <transactionManager type="JDBC"/>
       <!-- 数据源:dataSource -->
       <dataSource type="POOLED">
           <property name="driver" value="${driver}"/>
           <property name="url" value="${url}"/>
           <property name="username" value="${username}"/>
           <property name="password" value="${password}"/>  <!-- ${pwd}-->
       </dataSource>
   </environment>

   <environment id="test"><!--test:测试环境 -->
       <transactionManager type="JDBC"/>
       <dataSource type="POOLED">
           <property name="driver" value="com.mysql.jdbc.Driver"/>
           <property name="url"
                     value="jdbc:mysql://localhost:3306/hhmybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>
           <property name="username" value="root"/>
           <property name="password" value="123456"/>
       </dataSource
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值