从远程调用框架认识Zookeeper_猴哥_IT小菜鸟的博客-CSDN博客


本站和网页 https://blog.csdn.net/chen_fly2011/article/details/54970711 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

从远程调用框架认识Zookeeper_猴哥_IT小菜鸟的博客-CSDN博客
从远程调用框架认识Zookeeper
猴哥_IT小菜鸟
于 2017-02-10 15:10:17 发布
173
收藏
分类专栏:
分布式系统
文章标签:
hadoop
zookeeper
框架
文件系统
数据存储
分布式系统
专栏收录该内容
54 篇文章
0 订阅
订阅专栏
编者按:作为Hadoop的子项目,Zookeeper多数情况下是配合Hadoop的工作,但Zookeeper还有更广泛的应用场景。Zookeeper是Google Chubby的开源实现,主要用来解决分布式集群中应用系统的一致性问题,它能提供基于类似于文件系统的目录节点树方式的数据存储,维护和监控数据的状态变化,做到基于数据的集群管理。本文转载自夏俊的博客,作者从远程调用服务的架构来认识Zookeeper,相信读完本文,对Zookeeper也会有新的认识。以下为文章内容:
远程调用是系统或进程间的通信机制,是分布式系统开发的核心技术。远程调用技术可以将一组计算机系统形成一个网络系统,对外提供整体服务,那么这一群的计算机系统就构成了一个更大型、性能更高的计算机系统。
远程调用服务的架构设计总述
首先我们要深入理解以下几个问题:为什么应用软件服务里需要一个远程调用服务?远程调用服务解决了软件设计中的什么问题?
笔者曾写过一篇关于分布式网站架构设计的文章, 在文章开头就把这个新的网站架构方案和传统的企业软件的B/S架构作了对比,笔者将一个网站里提供业务服务的组件抽象为独立的服务系统,接收用户信息的逻辑部分抽象为前端系统,服务系统和前端系统使用netty这样的通讯组件进行通讯。而到了讲解远程调用服务的框架设计时候,将netty通讯组件进一步抽象为一个通讯独立系统及远程调用服务,这就是为什么要设计远程调用服务的缘起了,远程调用服务会带来了网站架构的升级,如果传统的企业B/S架构为1.0版,前端和业务服务端分离为独立系统则是2.0版,那么引入了远程调用服务网站就是3.0版了,3.0版的架构带来的好处就是可以将N多的前端系统和N多的业务服务端系统融为一个整体,网站的规模会越来越大,提供的服务也会越来越多,这既避免重复造轮子的问题还使得网站规模越来越大。
3.0版网站架构总图
有了远程调用服务,我们可以做到业务级别的集群,例如:一个制造企业,一般都会有采购业务,生产业务、销售业务以及财务业务,按照传统的思路我们都会给每个业务独立开发一个系统,如果引用了远程调用服务,我们可以将这些业务都做成独立的服务,这些服务组成业务集群,而这些服务都是用统一的远程调用服务作为操作的入口,这样前端的调用者可以做到应用的统一。所谓的应用的统一淘宝网站是最典型的代表,我们在一个同一的网站里可以操作各种不同的应用,而不会发生因为应用的不同我们就得重新访问新的地址或者重新登录到另外一个系统里做其他业务的操作。而服务端这边,完全可以摆脱传统的客户端和服务端耦合的开发,增强了整个服务端的专业性和稳定性,这样更易于服务端的扩展性和可维护性。如果服务端之间也需要相互调用也可以通过远程调用服务实现,由于远程调用服务的统一性,这样就避免了服务调用之间报文和调用方式的不统一,规范了整个开发的流程。如果远程调用服务还有负载均衡功能,整个服务集群就变成了一个私有的云,所以说远程调用服务是云计算的重要组成部分,这个说法一点都不为过。
远程调用服务技术原理
远程调用框架
传统的服务调用都是服务提供者和服务调用者的直接调用,从架构图里我们看到这里多了一个远程调用管理组件,远程调用管理组件是一个独立的服务系统,为了保证该系统的稳定性,它也一定是一个分布式的系统,但是这个分布式系统和Web的分布式系统是完全不同的分布式系统。传统Web应用集群是基于HTTP协议的无状态的特点设计的,因为每个HTTP请求都是一个独立的事务,不同请求之间是没有任何关系的,所以我们可以将Web应用部署到不同服务器上,请求不管到了那台服务器,都能正常的给用户提供相应的服务,但是Web应用的session机制是有状态的,所以传统Web集群都是要有session同步的操作,大型网站往往会把session功能抽象为独立的缓存系统,但是这里的远程调用管理组件的集群原理或者说分布式原理是有别于Web应用集群分布式原理的。远程调用管理组件可以当做一个注册中心,它会记录下服务提供者和服务调用者的相关信息,并将这些信息推送给服务提供者或者服务调用者,为了保证系统的执行效率,这些注册信息都是记录在内存里。我们试想下,如果这些注册信息丢失,整个系统将会不可用,因此远程调用管理组件的集群是一种保证数据可靠性和服务提供健壮性的集群,而不是建立在HTTP无状态特性基础上的集群。
我们这里假想下远程调用服务的集群运行场景,我们假如有5台服务器作为远程调用服务运行的服务器,那么每台服务器都必须有注册信息的冗余备份,当服务运行时候其中一台服务器发生了故障,这台故障的服务器上的数据不会丢失,此外集群应该还要有一个检查故障的机制,当发现有台服务器不可用的时候,能及时剔除该服务器,而Zookeeper就是解决这种问题的技术框架。此外除了保证系统的稳定性和可用性外,集群的数据存储方式也是很重要的,前面我讲到集群的数据存储要有一个冗余机制,除了冗余机制还要有一个很适合快速访问和读写的数据模型,而Zookeeper正好包含这种数据模型,所以我设计的远程调用服务是一个很适合Zookeeper应用的场景。
远程调用管理组件还有一个心跳机制,心跳机制的作用是检测服务提供者的健康性及服务提供者是否可用,服务提供者启动时候会将自己的注册信息发送给远程调用管理组件,这个注册信息里包含服务端的IP地址和端口号,远程调用管理组件会启动一个线程,根据定时对这个IP地址和端口号去ping这个IP和端口号对应的应用是否可用,如果不可用远程调用管理组件会反复尝试几次,这个次数和多久检测心跳都是可以配置的,如果反复几次还是不通,那么就认定该服务不可用了。有网友在QQ上问我,为什么不检测服务调用者的心跳,这个完全没必要,调用者是主动方,提供者是被动方,这就好比你访问网站,如果你生病了不去访问了,系统没有必要检查你是否已经生病了。
Zookeeper技术详解
在远程调用服务里Zookeeper使用在远程调用管理组件里,而服务调用者则是Zookeeper的客户端,远程调用管理组件也是远程调用服务的核心所在,如果远程调用管理组件在运行时挂掉了,那么整个应用也将不可用,因此远程调用管理组件必须是否可靠,这种可靠性的要求甚至要高于服务提供者和服务调用者的可靠性的级别,因此远程调用管理组件的设计必须是分布式的,而且一定要是可靠的分布式。
远程调用管理组件是一个完全符合Zookeeper场景的应用或者说是一个标准的Zookeeper应用,为了便于后面的论述,这里我的更进一步的讲解下远程调用管理组件的功能。从前面的叙述,我们知道了远程调用管理组件核心作用是存储服务提供者和服务调用者通讯的配置信息,例如存储服务提供者的IP地址和端口,记录服务提供者的服务类别,它还记录服务调用者的IP地址和端口号(这个信息是在远程调用管理组件的Web管理系统里录入的)以及服务调用者和服务提供者的对照关系。对于服务提供者,远程调用管理组件还提供心跳机制检测服务提供者的健康状态,如果远程调用管理组件发现服务提供者一些服务器出问题了,它会及时更新服务提供者的配置信息,并将这些变化及时推送给服务调用者。由上所述,从配置信息存储的角度,远程调用管理组件其实就是一个远程存储配置信息的系统,而心跳机制和推送机制这是一种观察者模式,而上面这些功能都是在分布式环境下功能,需要很高的可靠性。Zookeeper最典型的一个应用就是可以做分布式应用的配置服务,具体点就是像我们平时写的配置文件,到了分布式系统里也是需要一个独立的系统来完成,并且是动态的配置服务。
既然Zookeeper可以做分布式的配置服务,那么我们可以通过分布式配置服务的特点反向的理解Zookeeper的作用。笔者在做Java Web开发的时候,会使用大量的配置文件,一般这些文件是用properties属性文件完成的,服务启动时候,属性文件里的信息会读到内存中,Web系统从内存中读取这些配置信息。这个配置信息有几个特点:属性文件一般不太大(这里指的是系统运行相关的配置文件),配置信息是持久化,使用时候是先加载在内存中的,从内存读取,Zookeeper也可以完成这样的事情,而且其特点和传统的配置文件使用几乎一样,Zookeeper有一个文件系统,这个文件系统是用来存储小文件的,我们读取配置信息时候是在内存里读的,效率很高,写信息的时候Zookeeper会将配置信息持久化。这就是为什么有的书里介绍Zookeeper的性能:
Zookeeper的基准吞吐量可以超过10000个操作,而对于读操作为主的工作负载,吞吐量更是高出好几倍。
这句话很有道理,小文件写速度很快,10000个操作木有啥问题,读是通过内存,高好几倍是理所当然的。
系统运行的配置信息可靠性要求是很高的,既然我们现在使用分布式系统完成配置信息的读写操作,那么确保信息读写的准确性是非常重要,特别是写,要求绝对是要么成功要么失败,这个场景就是线程安全。但是我们现在是分布式系统,不同服务器之间的操作不是线程的范畴而是进程的范畴,因此这里就需要新的保证操作安全的技术,换句话说就是进程安全的机制。除此之外,分布式的配置服务之所以使用分布式就是为了保证配置服务系统的稳定性和安全性,这样才能持续为用户提供高质量的服务。这两个难题看似毫不相关,但是却有一种方案同时解决这个问题,这个方案就是Zookeeper的Zab协议。为了说清楚Zab协议,我们举个例子,例如我们使用5台服务器作为Zookeeper服务器,我们向Zookeeper集群发送指令,这个指令就是读操作或者写操作,Zookeeper集群会完成下面两个操作:
操作一:领导者选举,当Zookeeper启动的时候,这5台服务器会选举出一个领导者机器,其他的机器则是追随者,如果有半数以上的追随者和这个领导者通讯完毕确认了状态,那么这个阶段也就完成了。如果领导者一直都很健康,那么领导选举的操作就不会再触发,如果领导者出问题了,那么Zookeeper就会再一次触发领导者选举的操作。(这里笔者有个问题我不太确定:Zookeeper的领导者检测追随者健康性时,会不会使用心跳机制?)
操作二:如果发出的指令是写请求,那么所有的写请求都会被转发到领导者,再由领导者将更新的广播发送给追随者,当半数以上的追随者将修改持久化后,领导者才会提交这个更新,然后客户端才能收到一个更新成功的响应。这个用来达成共识的方式被设计成原子性的,这个操作要不成功要不就失败。
由以上操作就保证了读写的原子性,不会发生脏数据,反复选举领导者也保证了服务的可靠性。当然这里还有个问题,要是领导者出现故障了?这时候Zookeeper集群又会重复上面的领导者选举操作。这也说明为什么Zookeeper集群要求是奇数台的服务器,5台服务器2台挂了,服务任然可以正常运行,如果是6台服务器,还是只能允许2台服务器出故障,因为如果3台挂了,剩下的服务器没有过半数,那么zookeeper自己都挂了,所以奇数服务器不会造成服务器资源浪费。
对于读操作,Zookeeper任意一台服务器都可以直接给服务,附带其他操作很少,所以高效;而写操作,只有当所有服务器都持久化了数据后,Zookeeper才会更新内存中对应的数据,所以会比读操作慢多了。
Zookeeper存储数据操作方式和Unix文件系统的路径操作一致,而内存数据存储的模型就是一个树状结构了,树状结构的节点叫做znode,znode就是用来存储和读取数据的地方,这个树的操作如下列表:
操作 描述 create 创建一个znode,必须要有父节点 delete 删除一个znode,不能有任何子节点 exists znode是否存在,并查询它的元数据 getACL,setACL 获取/设置一个znode的ACL getChildren 获取子节点的列表 getData,setData 获取/设置一个znode所保存的数据 sync 将客户端的znode视图与Zookeeper同步
我们存储的配置信息就是使用这些操作完成的,例如:当服务提供者启动时候将自己的配置信息推送到远程调用管理组件,组件就会做创建节点或者设置znode所保存数据的操作,当数据保存成功后,Zookeeper就会马上将信息推送到服务调用者,这个推送工作Zookeeper也可以完成,Zookeeper里的znode以某种形式发生了变化,每个znode上面都附带一个观察机制,这个观察者机制会给客户端通知,而这个客户端就是服务调用者。如果心跳机制检测到服务提供者某个服务器出故障了,Zookeeper也会修改相应的znode的信息,这时候也会促发观察机制,通知服务调用者发生了变化。
Zookeeper的功能很强大,不仅仅包含上面笔者谈到的运用,本文是笔者深入学习Zookeeper的开始,有了现在的基础,再深入学习Zookeeper将会容易很多。
猴哥_IT小菜鸟
关注
关注
点赞
收藏
评论
从远程调用框架认识Zookeeper
编者按:作为Hadoop的子项目,Zookeeper多数情况下是配合Hadoop的工作,但Zookeeper还有更广泛的应用场景。Zookeeper是Google Chubby的开源实现,主要用来解决分布式集群中应用系统的一致性问题,它能提供基于类似于文件系统的目录节点树方式的数据存储,维护和监控数据的状态变化,做到基于数据的集群管理。本文转载自夏俊的博客,作者从远程调用服务的架构来认识Zookee
复制链接
扫一扫
专栏目录
Dubbo无法访问远程Zookeeper已注册服务的问题解决方案
08-26
今天小编就为大家分享一篇关于Dubbo无法访问远程Zookeeper已注册服务的问题解决方案,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
ZooKeeper基础配置、演示远程调用
qq_34922830的博客
08-10
600
Zookeeper介绍
ZooKeeper 是一个集中式服务,用于维护配置信息、命名、提供分布式同步和提供组服务。 分布式应用程序以某种形式使用所有这些类型的服务。 每次实现它们时,都需要进行大量工作来修复不可避免的错误和竞争条件。 由于实现这些服务的难度,应用程序最初通常会吝啬它们,这使得它们在发生变化时变得脆弱且难以管理。 即使正确完成,在部署应用程序时,这些服务的不同实现也会导致管理复杂性。
https://zookeeper.apache.org/
入门:协调分布式应用程序 ZooK.
参与评论
您还未登录,请先
登录
后发表或查看评论
java远程连接zookeeper--ZookeeperAPI的使用
xzy的博客
04-07
1272
文章目录java远程连接zookeeper--ZookeeperAPI的使用导入依赖创建zookeeper远程连接对象使用zk的api方法用java远程连接zk的时候容易出现的几个异常a.ConnectionLossException异常b.NodeExistsException异常c.java远程连接云服务器中的zk时,必须要首先开启云服务器中的zk服务
java远程连接zookeeper–ZookeeperAPI的使用
导入依赖
使用java连接zk的时候,首先需要导入zookeeper的依赖坐标,如下
RCF--RPC(远程调用框架)
yinsizhilian的博客
11-19
2190
RPC(远程调用框架)
一、 RPC定义
RPC(Remote Procedure Call Protocol)——远程过程调用协议,是一种通过网络从远程计算机请求服务,就像调用本地方法一样,不需要了解底层网络技术的协议。RPC跨越了传输层和应用层,很容易开发分布式应用。
RPC框架通常包括五个部分:
User
User-stub
RPCRuntime
Server-stub
Server
这 5 个部分的关系如下图所示
User发起一个远程调用,它实际是通过本地调用调User-s
三种连接ZooKeeper的方式
热门推荐
yangsnow_rain_wind的专栏
06-20
14万+
1. 使用客户端命令连接Zookeeper
连接Server
使用命令./zkCli.sh -server 127.0.0.1:2181
连接成功后返回如下信息:
Connecting to 127.0.0.1:2181
2018-06-20 00:13:40,884 [myid:] - INFO [main:Environment@100] - Client environment...
Dubbo+Zookeeper远程调用服务
最新发布
H_porridge的博客
03-22
1391
1、什么是Dubbo
官网:https://dubbo.apache.org/zh/
Dubbo 是一款微服务开发框架,它提供了 RPC通信 与 微服务治理 两大关键能力。这意味着,使用 Dubbo 开发的微服务,将具备相互之间的远程发现与通信能力, 同时利用 Dubbo 提供的丰富服务治理能力,可以实现诸如服务发现、负载均衡、流量调度等服务治理诉求。
服务发现:
Dubbo 基于消费端的自动服务发现能力,其基本工作原理如下图:
在本片中笔者将用到zookeeper为注册中心实现远程调用,zookee
Dubbo学习笔记:注册到zookeeper并实现远程调用
宝华的小岛
11-27
8261
我们选择zookeeper作为注册中心。
一、首先要下载zookeeper,把程序解压,进入conf,把zoo_sample.cfg修改为zoo.cfg。进入bin文件夹,在这里打开命令行,输入zkserver.cmd,这样就启动了zookeeper。
可以看出,zookeeper注册中心监听的是2181端口。
二、创建服务提供者工程。
1. 创建一个springboot项目,在p
使用外网访问阿里云服务器ZooKeeper
Life is for sharing的博客
04-10
1万+
1.阿里云ECS安装ZooKeeper
2.阿里云ECS外网不能连接访问ZooKeeper解决
3.解决使用外网IP和主机名的映射ZooKeeper启动报错
1.阿里云ECS安装ZooKeeper
由于参加了阿里云推荐有礼活动,买了一台阿里云云服务器ECS。
JDK安装完成后首先安装的是ZooKeeper3.4.10,由于是一台机器,使用的是伪分布式安装,参见ZooKeeper...
使用zooKeeper客户端连接远程zk
weixin_30361641的博客
09-11
7999
1、mac版本安装zooKeeper
参考:https://blog.csdn.net/whereismatrix/article/details/50420099
2、连接远程zk
参考:https://www.cnblogs.com/dragon-L/p/8532801.html
转载于:https://www.cnblogs.com/qxynotebook/p/9628868.h...
多台阿里云服务器上搭建ZooKeeper集群
兴趣使然的草帽路飞
11-19
2306
0. 前言
为测试方便,电脑最好可以跑多台虚拟机,或者有2-3个云服务器(学生机9.9一月,可以买一个轻量级和ECS,或者借同学的用一下)
1. Dubbo 与 SpringCloud对比
dubbo: zookeeper + dubbo + springmvc + springboot
官方地址:http://dubbo.apache.org/#!/?lang=zh-cn
配套通信方式:rpc 性能高
注册中心:zookeper/redis
配置中心:diamond(企业很少用)
springcl
远程linux搭建zookeeper 并发布和调用服务
雨洛晴天依旧的博客
07-17
3184
远程linux搭建zookeeper并发布和调用服务
ssh软件puuty
文件管理软件 FileZilla Client
1、用FileZilla Client连接远程主机,把从https://mirrors.cnnic.cn/apache/zookeeper/这里下载的zoonkeeper安装包扔到主机的一个文件夹里面,可以用FileZilla Client来实现
2、...
Dubbo无法访问远程Zookeeper已注册服务的问题
徐刘根的博客
12-23
3万+
背景使用Dubbo的时候发现当Zookeeper、Dubbo-admin、生产者和消费者都在
内网中的时候,生产者的生产和消费是没有问题的,但是当它Zookeeper、生产者放到远程服务器上,然后消费者在访问消费就出现了无法找到找到服务的问题。内网环境使用情况上述的图是在同一个内网中,使用的代码如下:1、生产者配置<?xml version="1.0" encoding="UTF-8"?>
<be
zookeeper连接不上
junqilong的博客
10-10
1万+
在本地虚拟机上安装完zookeeper之后,java代码测试发布服务,总是报:Opening socket connection to server 192.168.89.129/192.168.89.129:2181. Will not attempt to authenticate using SASL (unknown error)2017-10-10 11:59:31,731 WARN ...
使用zkClient连接zookeeper服务
shidaping的博客
07-19
7120
直接上代码:
package com.sdp.zookeeper;
import java.util.List;
import org.I0Itec.zkclient.ZkClient;
import org.apache.zookeeper.CreateMode;
public class Main {
public static void main(String[] args) {
ZooKeeper之服务器地址列表。
孤芳不自赏
02-11
1万+
在使用ZooKeeper构造方法时,用户传入的ZooKeeper服务器地址列表,即connectString参数,通常是这样一个使用英文状态逗号分隔的多个IP地址和端口的字符串:
192.168.0.1:2181,192.168.0.1:2181,192.168.0.1:2181
从这个地址串中我们可以看出,ZooKeeper客户端允许我们将服务器的所有地址都配置...
JAVA远程操作Zookeeper示例
交换一个思想,能得到俩思想
03-04
4780
zookeeper可以单独安装,如果在hbase安装完成后,hbase-env.sh中没有设置export HBASE_MANAGES_ZK=true,会随hbase启动zookeeper。
本文使用http://blog.csdn.net/kkdelta/article/details/20058683中配置的hbase环境测试zookeeper的使用。
示例代码如下
package or
通过ZooKeeper的api访问ZooKeeper集群
会飞的猪的 博客
07-05
3969
zookeeper集群的的搭建:点击打开链接创建Maven项目pom.xml 添加依赖:<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.9<...
C++红黑树收关(五)--------红黑树其他方法补全
年少就是不服输
09-07
166
1、本篇补全红黑树的其他方法
find();
findMin();
findMax();
isEmpty();
makeEmpty();
2、上代码
#include <iostream>
using namespace std;
template < class T>
class RedBlackTree; //红黑树
template <class T>
class RedBlackTreeNode...
zookeeper 只能本地访问的问题解决方法
Dean Chen的专栏
09-23
2万+
当完成了zookeeper配置,发现只能在本地访问,不能在其他机器上指定通过hostname访问访问,原因是在/etc/hosts里面有这样的配置127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 10-149-11-146原因是zookeeper监听hostname10-149-11-146
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
©️2022 CSDN
皮肤主题:大白
设计师:CSDN官方博客
返回首页
猴哥_IT小菜鸟
CSDN认证博客专家
CSDN认证企业博客
码龄11年
暂无认证
原创
14万+
周排名
114万+
总排名
61万+
访问
等级
6807
积分
77
粉丝
54
获赞
14
评论
183
收藏
私信
关注
热门文章
华为员工标准岗位工资明细及分析
79272
APP的9种商业模式图解
14698
表的数据量特别大时是怎么处理的
13161
Protobuf与JSON互相转换
11907
Maven deploy部署失败原因及解决
9502
分类专栏
Spring Cloud
Java面试
38篇
C/C++ 精华文章
18篇
Linux 精华文章
112篇
Web 精华文章
34篇
Java 精华文章
163篇
重构的艺术
6篇
架构与设计
54篇
数据库技术
71篇
设计模式
9篇
项目管理
3篇
程序生活
5篇
个人建站
9篇
开源精华
24篇
华为技术
2篇
腾讯技术
6篇
阿里技术
9篇
计算机原理
48篇
源码分析
23篇
移动互联网
8篇
分布式系统
54篇
服务器集群
27篇
性能调优
17篇
JVM 虚拟机
47篇
多线程编程
12篇
并发编程
26篇
网络编程
89篇
Maven 项目配置
7篇
C/C++
1篇
最新评论
腾讯QQ是用什么语言开发的
最强VIP:
是C++ 面向对象的
腾讯QQ是用什么语言开发的
最强VIP:
底层是汇编,那就是C语言写的喽?
12个最好的免费和开源的NoSQL数据库
1999笃行:
MemcacheDB 是新浪开发人员放出来的?开玩笑吧,复制粘贴不带验证的吗
Disruptor(无锁并发框架)-发布
夜无痕星:
“然后,线程D开始提交。线程E用CAS操作将“cursor”设置为3(线程E持有的区块位置)当且仅当“cursor”位置是2.“cursor”当前是2,所以CAS操作成功和提交也成功了。”======应该是线程D
Google Adsense检测作弊欺骗点击广告的方法
luvvien:
[url=https://vien.tech/article/120]AdSense作弊与反作弊[/url]
您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐
提交
最新文章
Java三大主流框架概述
Java Web前端到后台常用框架介绍
关于 Java 中 finally 语句块的深度辨析
2017年911篇
目录
目录
分类专栏
Spring Cloud
Java面试
38篇
C/C++ 精华文章
18篇
Linux 精华文章
112篇
Web 精华文章
34篇
Java 精华文章
163篇
重构的艺术
6篇
架构与设计
54篇
数据库技术
71篇
设计模式
9篇
项目管理
3篇
程序生活
5篇
个人建站
9篇
开源精华
24篇
华为技术
2篇
腾讯技术
6篇
阿里技术
9篇
计算机原理
48篇
源码分析
23篇
移动互联网
8篇
分布式系统
54篇
服务器集群
27篇
性能调优
17篇
JVM 虚拟机
47篇
多线程编程
12篇
并发编程
26篇
网络编程
89篇
Maven 项目配置
7篇
C/C++
1篇
目录
评论
被折叠的 条评论
为什么被折叠?
到【灌水乐园】发言
查看更多评论
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。
余额充值