首页 文章 精选 留言 我的

精选列表

搜索[环境],共10000篇文章
优秀的个人博客,低调大师

【TiDB实战】离线安装部署TiDB,单机模拟集群环境

什么是TiDB TiDB 是 PingCAP 公司自主设计、研发的开源分布式关系型数据库,是一款同时支持在线事务处理与在线分析处理 (Hybrid Transactional and Analytical Processing, HTAP)的融合型分布式数据库产品,具备水平扩容或者缩容、金融级高可用、实时 HTAP、云原生的分布式数据库、兼容 MySQL 5.7 协议和 MySQL 生态等重要特性。目标是为用户提供一站式 OLTP (Online Transactional Processing)、OLAP (Online Analytical Processing)、HTAP 解决方案。TiDB 适合高可用、强一致要求较高、数据规模较大等各种应用场景。 TiDB数据库在国产数据库3月份排行榜中,依旧是排行榜首: 五大核心特性 一键水平扩容或者缩容 得益于 TiDB 存储计算分离的架构的设计,可按需对计算、存储分别进行在线扩容或者缩容,扩容或者缩容过程中对应用运维人员透明。 金融级高可用 数据采用多副本存储,数据副本通过 Multi-Raft 协议同步事务日志,多数派写入成功事务才能提交,确保数据强一致性且少数副本发生故障时不影响数据的可用性。可按需配置副本地理位置、副本数量等策略满足不同容灾级别的要求。 实时 HTAP 提供行存储引擎 TiKV、列存储引擎 TiFlash 两款存储引擎,TiFlash 通过 Multi-Raft Learner 协议实时从 TiKV 复制数据,确保行存储引擎 TiKV 和列存储引擎 TiFlash 之间的数据强一致。TiKV、TiFlash 可按需部署在不同的机器,解决 HTAP 资源隔离的问题。 云原生的分布式数据库 专为云而设计的分布式数据库,通过 TiDB Operator 可在公有云、私有云、混合云中实现部署工具化、自动化。 兼容 MySQL 5.7 协议和 MySQL 生态 兼容 MySQL 5.7 协议、MySQL 常用的功能、MySQL 生态,应用无需或者修改少量代码即可从 MySQL 迁移到 TiDB。提供丰富的数据迁移工具帮助应用便捷完成数据迁移。 四大核心应用场景 对数据一致性及高可靠、系统高可用、可扩展性、容灾要求较高的金融行业属性的场景 众所周知,金融行业对数据一致性及高可靠、系统高可用、可扩展性、容灾要求较高。传统的解决方案是同城两个机房提供服务、异地一个机房提供数据容灾能力但不提供服务,此解决方案存在以下缺点:资源利用率低、维护成本高、RTO (Recovery Time Objective) 及 RPO (Recovery Point Objective) 无法真实达到企业所期望的值。TiDB 采用多副本 + Multi-Raft 协议的方式将数据调度到不同的机房、机架、机器,当部分机器出现故障时系统可自动进行切换,确保系统的 RTO <= 30s 及 RPO = 0。 对存储容量、可扩展性、并发要求较高的海量数据及高并发的 OLTP 场景 随着业务的高速发展,数据呈现爆炸性的增长,传统的单机数据库无法满足因数据爆炸性的增长对数据库的容量要求,可行方案是采用分库分表的中间件产品或者 NewSQL 数据库替代、采用高端的存储设备等,其中性价比最大的是 NewSQL 数据库,例如:TiDB。TiDB 采用计算、存储分离的架构,可对计算、存储分别进行扩容和缩容,计算最大支持 512 节点,每个节点最大支持 1000 并发,集群容量最大支持 PB 级别。 Real-time HTAP 场景 随着 5G、物联网、人工智能的高速发展,企业所生产的数据会越来越多,其规模可能达到数百 TB 甚至 PB 级别,传统的解决方案是通过 OLTP 型数据库处理在线联机交易业务,通过 ETL 工具将数据同步到 OLAP 型数据库进行数据分析,这种处理方案存在存储成本高、实时性差等多方面的问题。TiDB 在 4.0 版本中引入列存储引擎 TiFlash 结合行存储引擎 TiKV 构建真正的 HTAP 数据库,在增加少量存储成本的情况下,可以同一个系统中做联机交易处理、实时数据分析,极大地节省企业的成本。 数据汇聚、二次加工处理的场景 当前绝大部分企业的业务数据都分散在不同的系统中,没有一个统一的汇总,随着业务的发展,企业的决策层需要了解整个公司的业务状况以便及时做出决策,故需要将分散在各个系统的数据汇聚在同一个系统并进行二次加工处理生成 T+0 或 T+1 的报表。传统常见的解决方案是采用 ETL + Hadoop 来完成,但 Hadoop 体系太复杂,运维、存储成本太高无法满足用户的需求。与 Hadoop 相比,TiDB 就简单得多,业务通过 ETL 工具或者 TiDB 的同步工具将数据同步到 TiDB,在 TiDB 中可通过 SQL 直接生成报表。 1、下载离线安装包 下载地址 进入官方下载地址,选择社区版下载,以及选择对应的版本好,我这里选择的是最新版4.0.11下载。 https://pingcap.com/download-cn/community/ 2、安装准备 2.1创建普通用户 #创建用户 #adduser tidb #设置密码 #passwd tidb 2.2配置免密码登录 编辑/etc/sudoers文件 vim /etc/sudoers 在文件末尾添加 tidb ALL=(ALL) NOPASSWD:ALL 2.3创建tidb用户ssh key 切换用户 su - tidb 执行命令,一直按回车键就行 ssh-keygen -t rsa 3、安装部署 3.1 文件上传到服务器 切换到tidb用户,新建以下两个目录 mkdir tidb-deploy mkdir tidb-data 第一步下载的离线包,上传到这个用户的根目录解压: # tar -zxvf tidb-community-server-${version}-linux-amd64.tar.gz 执行instal文件 sh tidb-community-server-${version}-linux-amd64/local_install.sh 根据完成后提示中的第一点,执行如下命令,具体命令根据提示中的来: source /home/tidb/.bash_profile 至此,TiDB安装所需的TiUP组件已经安装完成,下面进行安装。 3.2配置初始化参数文件 集群初始化配置文件需要手动编写,在tidb用户根目录创建 YAML 格式配置文件,下面是我的配置文件 topology.yaml: global: user: "tidb" ssh_port: 22 deploy_dir: "/home/tidb/tidb-deploy" data_dir: "/home/tidb/tidb-data" monitored: node_exporter_port: 9100 blackbox_exporter_port: 9115 server_configs: tidb: log.slow-threshold: 300 tikv: readpool.storage.use-unified-pool: false readpool.coprocessor.use-unified-pool: true pd: replication.enable-placement-rules: true replication.location-labels: ["host"] tiflash: logger.level: "info" pd_servers: - host: 192.168.16.56 tidb_servers: - host: 192.168.16.56 tikv_servers: - host: 192.168.16.56 port: 20160 status_port: 20180 config: server.labels: { host: "logic-host-1" } - host: 192.168.16.56 port: 20161 status_port: 20181 config: server.labels: { host: "logic-host-2" } - host: 192.168.16.56 port: 20162 status_port: 20182 config: server.labels: { host: "logic-host-3" } tiflash_servers: - host: 192.168.16.56 monitoring_servers: - host: 192.168.16.56 grafana_servers: - host: 192.168.16.56 3.3部署集群 部署命令 tiup cluster deploy tidb-test v4.0.11 ./topology.yaml --user tidb -p 参数说明: 通过 TiUP cluster 部署的集群名称为 tidb-test 部署版本为 v4.0.0,其他版本可以执行 tiup list tidb 获取 初始化配置文件为 topology.yaml --user tidb:通过 tidb 用户登录到目标主机完成集群部署,该用户需要有 ssh 到目标机器的权限,并且在目标机器有 sudo 权限。也可以用其他有 ssh 和 sudo 权限的用户完成部署。 [-i] 及 [-p]:非必选项,如果已经配置免密登陆目标机,则不需填写。否则选择其一即可,[-i] 为可登录到部署机 root 用户(或 --user 指定的其他用户)的私钥,也可使用 [-p] 交互式输入该用户的密码 如无意外,会出现successfully的提示信息。 3.4启动集群 启动命令 tiup cluster start tidb-test 如无意外,会出现successfully的提示信息。 检查集群状态,命令:tiup cluster display tidb-test Starting component `cluster`: /home/ubuntu/.tiup/components/cluster/v1.3.2/tiup-cluster display tidb-test Cluster type: tidb Cluster name: tidb-test Cluster version: v4.0.11 SSH type: builtin Dashboard URL: http://192.168.16.56:2379/dashboard ID Role Host Ports OS/Arch Status Data Dir Deploy Dir -- ---- ---- ----- ------- ------ -------- ---------- 192.168.16.56:3000 grafana 192.168.16.56 3000 linux/x86_64 Up - /home/ubuntu/tidb/tidb-deploy/grafana-3000 192.168.16.56:2379 pd 192.168.16.56 2379/2380 linux/x86_64 Up|L|UI /home/ubuntu/tidb/tidb-data/pd-2379 /home/ubuntu/tidb/tidb-deploy/pd-2379 192.168.16.56:9090 prometheus 192.168.16.56 9090 linux/x86_64 Up /home/ubuntu/tidb/tidb-data/prometheus-9090 /home/ubuntu/tidb/tidb-deploy/prometheus-9090 192.168.16.56:4000 tidb 192.168.16.56 4000/10080 linux/x86_64 Up - /home/ubuntu/tidb/tidb-deploy/tidb-4000 192.168.16.56:9000 tiflash 192.168.16.56 9000/8123/3930/20170/20292/8234 linux/x86_64 Up /home/ubuntu/tidb/tidb-data/tiflash-9000 /home/ubuntu/tidb/tidb-deploy/tiflash-9000 192.168.16.56:20160 tikv 192.168.16.56 20160/20180 linux/x86_64 Up /home/ubuntu/tidb/tidb-data/tikv-20160 /home/ubuntu/tidb/tidb-deploy/tikv-20160 192.168.16.56:20161 tikv 192.168.16.56 20161/20181 linux/x86_64 Up /home/ubuntu/tidb/tidb-data/tikv-20161 /home/ubuntu/tidb/tidb-deploy/tikv-20161 192.168.16.56:20162 tikv 192.168.16.56 20162/20182 linux/x86_64 Up /home/ubuntu/tidb/tidb-data/tikv-20162 /home/ubuntu/tidb/tidb-deploy/tikv-20162 Total nodes: 8 以上输出的结果中,可以看到tidb的端口号是4000,pd运维端口是2379。我们通过Navicat这种工具连接数据库是使用4000端口,默认密码为空。 3.5 关键组件 几个关键组件信息: Pd:元数据及控制调度组件 Tikv:存储组件 Tidb:数据库实例组件 Tiflash:闪存组件 Tidb虽然和mysql类似,但是它厉害在分布式,如果要使用mysql,数据库变大后,要思考虑分库分表、使用mycat等数据路由工具,Tidb设计从底层一开始分布式,类似hdfs的存储架构,将分布式做成一种原生的架构。 3.6 tiup cluster 命令说明 部署集群 部署集群的命令为 tiup cluster deploy,一般用法为: tiup cluster deploy <cluster-name> <version> <topology.yaml> [flags] 查看集群列表 集群部署成功后,可以通过 tiup cluster list 命令在集群列表中查看该集群 3. 启动集群 集群部署成功后,可以执行以下命令启动该集群。如果忘记了部署的集群的名字,可以使用 tiup cluster list 命令查看 tiup cluster start prod-cluster 检查集群状态 如果想查看集群中每个组件的运行状态,逐一登录到各个机器上查看显然很低效。因此,TiUP 提供了 tiup cluster display 命令,用法如下: tiup cluster display prod-cluster 其他详细的命令与运维操作,可以在官网文档中查看 TiUP组件文档 4、连接测试 因为TiDB内核是MySQL,所以直接用Navicat工具选择连接MySQL就行: 使用Navicat登录进去后,可以看到目前最新版本的TiDB的MySQL内核是:5.7.25 5、访问控制面板 5.1主页: 5.2看集群每个节点的状态 5.3一段时间(指定)SQL语句分析 5.4慢查询 监控控制面板这个工具还是挺好用,其他的就不一一截图了,主要的功能包含有: 集群信息 SQL语句分析 慢查询 流量可视化 集群诊断 日志搜索 高级调试 实时性能分析 给运维人员和开发人员使用都非常的友好。 ------------------------------END-------------------------------------------- 欢迎大家关注个人公众号,日常技术分享,涉及Java、前端、分布式。

优秀的个人博客,低调大师

编码风格:Mvc模式下SSM环境,代码分层管理

本文源码:GitHub·点这里 || GitEE·点这里 一、分层策略 MVC模式与代码分层策略,MVC全名是ModelViewController即模型-视图-控制器,作为一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑,这是一种开发模式,但并不是实际开发中代码的分层模式,通常SSM框架的后端代码分层如下: controller控制层:定义服务端接口,入参出参,和一些入参校验; service业务服务层:组装业务逻辑,业务校验,构建控制层需要的参数模型; dao数据交互层:提供服务层需要的数据查询方法,处理数据交互条件相关的逻辑; mapper持久层:基于mybatis框架需要的原生支持,目前很常用的持久层组件; 二、控制层 1、Rest接口风格 基于资源访问和处理的逻辑,使用不同风格的注解。例如资源新增,更新,查询,删除。 /** * 新增 */ @PostMapping("/insert") public Integer insert (@RequestBody BaseInfo baseInfo){ return baseInfoService.insert(baseInfo); } /** * 更新 */ @PutMapping("/update/{id}") public String update(@PathVariable(value = "id") Integer id, @RequestBody BaseInfo baseInfo) { if (id<1){ return "error"; } baseInfo.setId(id); return "update="+baseInfoService.update(baseInfo); } /** * 主键查询 */ @GetMapping("/detail/{id}") public InfoModel detail(@PathVariable(value = "id") Integer id) { return baseInfoService.detail(id) ; } /** * 主键删除 */ @DeleteMapping("/delete/{id}") public String delete(@PathVariable(value = "id") Integer id) { baseInfoService.delete(id) ; return "SUS" ; } 2、接口复用度 不建议接口高度复用,例如增删改查都各自对接接口即可,基本原则,不同的客户端端操作,对于独立的接口。 /** * 列表加载 */ @GetMapping("/list") public List<BaseInfo> list() { return baseInfoService.list(new BaseInfoExample()) ; } /** * 列表搜索 */ @PostMapping("/search") public List<BaseInfo> search (@RequestParam("userName") String userName, @RequestParam("phone") String phone) { return baseInfoService.search(userName,phone) ; } 例如常见的list接口,list通常都有会按条件加载的search机制,而且搜索的判断条件很复杂,建议分为两个接口,从实际考虑,大部分场景下都是只使用list接口,很少使用search搜索。 3、入参出参 校验客户端必须条件,例如某某条件必填必选等,如果有问题,快速阻断请求链路,做到程序入口控制层拦截返回。 @PutMapping("/update/{id}") public String update(@PathVariable(value = "id") Integer id, @RequestBody BaseInfo baseInfo) { if (id<1){ return "error"; } baseInfo.setId(id); return "update="+baseInfoService.update(baseInfo); } 参数在三个以下,可以直接陈列入参,参数在三个或三个以上可以使用实体类统一封装。 @PostMapping("/search") public List<BaseInfo> search (@RequestParam("userName") String userName, @RequestParam("phone") String phone) { return baseInfoService.search(userName,phone) ; } 4、参数处理 出参格式处理度基本原则,服务器作为公共资源,避免非必要操作,例如客户端可自行判断返回值是否为空,null等,或者一些常见格式处理,利用客户端适当分担服务器压力。 三、业务服务层 1、业务校验 例如传入订单号,经过数据库层查询,没有订单数据,这里称为业务性质的异常,代码本身没有问题,但是业务逻辑无法正常执行。 public InfoModel detail(Integer id){ BaseInfo baseInfo = baseInfoDao.selectByPrimaryKey(id) ; if (baseInfo != null){ DetailInfoEntity detailInfoEntity = detailInfoDao.getById(id); if (detailInfoEntity == null){ LOG.info("id="+id+"数据缺失 DetailInfo"); } return buildModel(baseInfo,detailInfoEntity) ; } LOG.info("id="+id+"数据完全缺失"); return null ; } 2、组装业务逻辑 通常情况下服务层作为逻辑做复杂的一块,用来拼接业务核心步骤,可以通过业务逻辑判定,一步一步执行程序,避免在程序入口做大量可能用到的对象创建和需求数据查询。 public int insert (BaseInfo record){ record.setCreateTime(new Date()); int insertFlag = baseInfoDao.insert(record); if (insertFlag > 0){ DetailInfoEntity detailInfoEntity = new DetailInfoEntity(); detailInfoEntity.setUserId(record.getId()); detailInfoEntity.setCreateTime(record.getCreateTime()); if(detailInfoDao.save(detailInfoEntity)){ return insertFlag ; } } return insertFlag; } 3、数据模型构建 通常情况业务层是偏复杂的,如果想关快速理解业务层,可以对复杂的业务方法,在提供一个返参构建的方法,用来处理服务层要向控制层回传的参数,这样可以让重度的服务层方法变的清晰。 private InfoModel buildModel (BaseInfo baseInfo,DetailInfoEntity detailInfo){ InfoModel infoModel = new InfoModel() ; infoModel.setBaseInfo(baseInfo); infoModel.setDetailInfoEntity(detailInfo); return infoModel ; } 四、数据交互层 1、逆向工程 这里以使用mybatis框架或者mybatis-plus框架作为参考。如果是mybatis框架,建议逆向工程的模板代码不做自定义的修改,如果需要自定义方法,在mapper和xml层面再自定义一个扩展文件,用来存放自定义的方法和SQL逻辑,这样避免表结构变动大引发的强烈不适。 当然现在大部分都会mybatis-plus作为持久层组件,可以避免上述问题。 2、数据交互 针对业务层的需要,提供相应的数据查询方法,只处理与数据库交互的逻辑,避免出现业务逻辑,尤其在分布式架构下,不同服务的数据查询和组装,不应该出现在该层。 public interface BaseInfoDao { int insert(BaseInfo record); List<BaseInfo> selectByExample(BaseInfoExample example); int updateByPrimaryKey(BaseInfo record); BaseInfo selectByPrimaryKey(Integer id); int deleteByPrimaryKey(Integer id); BaseInfo getById (Integer id) ; } 五、源代码地址 GitHub·地址 https://github.com/cicadasmile/data-manage-parent GitEE·地址 https://gitee.com/cicadasmile/data-manage-parent

优秀的个人博客,低调大师

打造超级舒适的Go开发环境之VIM配置

最近博主已经从VIM迁移到了EMACS作为主要生产工具,目的是为了学习Lisp和体验EMACS操作系统之美,哈哈,不要被我弄的技术焦虑,没错,我就是换了个吃饭的盘子。写下这篇博客也是为了纪念我顺利的“从VIM毕业了”。 在阅读本文之前,你需要: 准备一个UNIX like的操作系统 一个可以跨过山和大海的代-理 话不多说,开始吧~ (1)下载必要的Go工具链 go get -v github.com/mdempsky/gocode go get -v github.com/ramya-rao-a/go-outline go get -v github.com/acroca/go-symbols go get -v github.com/uudashr/gopkgs go get -v golang.org/x/tools/cmd/guru go get -v golang.org/x/tools/cmd/gorename go get -v github.com/sqs/goreturns go get -v github.com/rogpeppe/godef go get -v golang.org/x/tools/cmd/godoc go get -v golang.org/x/lint/golint go get -v github.com/derekparker/delve/tree/master/cmd/dlv go get -v github.com/fatih/gomodifytags go get -v github.com/haya14busa/goplay go get -v github.com/josharian/impl go get -v github.com/tylerb/gotype-live go get -v github.com/cweill/gotests go get -v github.com/sourcegraph/go-langserver go get -v github.com/davidrjenni/reftools/tree/master/cmd/fillstruct (2)安装VIM macOS用户可能需要安装一下macvim: brew install macvim (3)主题配置 为了实现类似于Atom的Onedark和Onelight模式,我们可能需要安装两个主题: onedark.vim(只支持黑暗模式):https://github.com/joshdick/onedark.vim.git one.vim(同时支持):https://github.com/rakr/vim-one.git 在.vim目录下创建三个目录:autoload,bundle,colors,将两个仓库克隆到本地,然后将autoload目录的one.vim或者onedark.vim拷贝到autoload目录,将colors目录的one.vim或者onedark.vim拷贝到colors目录。 配置主题,修改~/.vimrc文件: colorscheme one set background=dark 当你想要将主题更改为Onelight的时候,只要将dark替换为light即可。 (4)插件配置 首先要安装插件管理器Vundle: git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim 然后配置~/.vimrc文件: set nocompatible " be iMproved, required filetype off " required " set the runtime path to include Vundle and initialize set rtp+=~/.vim/bundle/Vundle.vim call vundle#begin() " alternatively, pass a path where Vundle should install plugins "call vundle#begin('~/some/path/here') " let Vundle manage Vundle, required Plugin 'VundleVim/Vundle.vim' " The following are examples of different formats supported. " Keep Plugin commands between vundle#begin/end. " plugin on GitHub repo Plugin 'tpope/vim-fugitive' " plugin from http://vim-scripts.org/vim/scripts.html " Plugin 'L9' " Git plugin not hosted on GitHub Plugin 'git://git.wincent.com/command-t.git' " git repos on your local machine (i.e. when working on your own plugin) Plugin 'file:///home/gmarik/path/to/plugin' " The sparkup vim script is in a subdirectory of this repo called vim. " Pass the path to set the runtimepath properly. Plugin 'rstacruz/sparkup', {'rtp': 'vim/'} " Install L9 and avoid a Naming conflict if you've already installed a " different version somewhere else. " Plugin 'ascenator/L9', {'name': 'newL9'} " All of your Plugins must be added before the following line call vundle#end() " required filetype plugin indent on " required " To ignore plugin indent changes, instead use: "filetype plugin on " " Brief help " :PluginList - lists configured plugins " :PluginInstall - installs plugins; append `!` to update or just :PluginUpdate " :PluginSearch foo - searches for foo; append `!` to refresh local cache " :PluginClean - confirms removal of unused plugins; append `!` to auto-approve removal " " see :h vundle for more details or wiki for FAQ " Put your non-Plugin stuff after this line 为了支持多种编程语言,我们采用YouCompleteMe插件,macOS用户使用如下命令: brew install cmake python python3 mono go nodejs 如果你已经使用nvm作为Node.js版本管理器,或者已经通过PKG方式安装了Python3.x版本,那么只需要PATH可以识别到命令,另外nvm用户需要安装npm: brew install npm 接下来需要进行编译: cd ~/.vim/bundle/YouCompleteMe python3 install.py --all 由于YouCompleteMe插件使用Vundle安装可能导致失败,因此通过手动安装的方式实现,其他插件均可以通过Vundle安装: Plugin 'fatih/vim-go' Plugin 'Tagbar' Plugin 'scrooloose/nerdtree' Plugin 'Xuyuanp/nerdtree-git-plugin' Plugin 'vim-airline/vim-airline' Plugin 'vim-airline/vim-airline-themes' 写到.vimrc文件中,然后打开vim,进入命令模式,使用如下命令安装: :PluginInstall vim-go插件需要下载一些工具包,如果使用Vundle安装失败,可以进入vim使用如下命令: :GoInstallBinaries 配置完成后的整个.vimrc文件如下: set nocompatible " be iMproved, required filetype off " required syntax on colorscheme one let g:one_allow_italics = 1 set background=dark set nu let NERDTreeWinSize=50 let NERDTreeShowLineNumbers=1 let NERDTreeAutoCenter=1 let NERDTreeShowHidden=1 let g:go_gopls_enabled = 0 set laststatus=2 "始终显示状态栏 set tabstop=2 "一个制表符的长度 set softtabstop=2 "一个制表符的长度(可以大于tabstop) set shiftwidth=2 "一个缩进的长度 set expandtab "使用空格替代制表符 set smarttab "智能制表符 set autoindent "自动缩进 set smartindent "只能缩进 set ruler "显示位置指示器 set ignorecase "检索时忽略大小写 set hls "检索时高亮显示匹配项 set helplang=cn "帮助系统设置为中文 set foldmethod=syntax "代码折叠 set guifont=PowerlineSymbols\ for\ Powerline set nocompatible set t_Co=256 let g:Powerline_symbols = 'fancy' " let g:nerdtree_tabs_open_on_console_startup=1 "Use 24-bit (true-color) mode in Vim/Neovim when outside tmux. "If you're using tmux version 2.2 or later, you can remove the outermost $TMUX check and use tmux's 24-bit color support "(see < http://sunaku.github.io/tmux-24bit-color.html#usage > for more information.) if (empty($TMUX)) if (has("nvim")) "For Neovim 0.1.3 and 0.1.4 < https://github.com/neovim/neovim/pull/2198 > let $NVIM_TUI_ENABLE_TRUE_COLOR=1 endif "For Neovim > 0.1.5 and Vim > patch 7.4.1799 < https://github.com/vim/vim/commit/61be73bb0f965a895bfb064ea3e55476ac175162 > "Based on Vim patch 7.4.1770 (`guicolors` option) < https://github.com/vim/vim/commit/8a633e3427b47286869aa4b96f2bfc1fe65b25cd > " < https://github.com/neovim/neovim/wiki/Following-HEAD#20160511 > if (has("termguicolors")) set termguicolors endif endif " set the runtime path to include Vundle and initialize set rtp+=~/.vim/bundle/Vundle.vim call vundle#begin() " alternatively, pass a path where Vundle should install plugins "call vundle#begin('~/some/path/here') " let Vundle manage Vundle, required Plugin 'VundleVim/Vundle.vim' Plugin 'fatih/vim-go' Plugin 'Valloric/YouCompleteMe',{'do':'python3 install.py --all'} Plugin 'Tagbar' Plugin 'scrooloose/nerdtree' Plugin 'Xuyuanp/nerdtree-git-plugin' Plugin 'vim-airline/vim-airline' Plugin 'vim-airline/vim-airline-themes' " All of your Plugins must be added before the following line call vundle#end() " required filetype plugin indent on " required " To ignore plugin indent changes, instead use: "filetype plugin on " " Brief help " :PluginList - lists configured plugins " :PluginInstall - installs plugins; append `!` to update or just :PluginUpdate " :PluginSearch foo - searches for foo; append `!` to refresh local cache " :PluginClean - confirms removal of unused plugins; append `!` to auto-approve removal " " see :h vundle for more details or wiki for FAQ " Put your non-Plugin stuff after this line let g:go_highlight_types = 1 let g:go_highlight_fields = 1 let g:go_highlight_functions = 1 let g:go_highlight_function_calls = 1 let g:go_highlight_operators = 1 let g:go_highlight_extra_types = 1

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册