首页 文章 精选 留言 我的

精选列表

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

Scala学习笔记(1)-环境搭建

Scala是一种多范式的编程语言,设计初衷是要集成面向对象编程和函数式编程的各种特性。scala可以和java程序无缝拼接,因为scala文件编译后也是成为.class文件,并且在JVM上运行,有下下一代Java之称,当然要有Java今天的阵势还有很长很长的一段路要走。 Scala的几个主要特性 1.面向风格:Scala中的每个值都是一个对象,包括基本数据类型(java中基本类型不是对象)在内,连函数也是对象。 2.函数式风格:高阶函数(Higher-Order Function)、局部套用(Currying)、嵌套函数(Nested Function)、序列解读(Sequence Comprehensions)等等。 3.Scala是静态类型的,这就允许它提供泛型类、内部类、甚至多态方法(Polymorphic Method) 4.Scala可以与Java互操作:它用scalac这个编译器把源文件编译成Java的class文件(即在JVM上运行的字节码)。你可以从Scala中调用所有的Java类库,也同样可以从Java应用程序中调用Scala的代码。它也可以访问现存的数之不尽的Java类库,这让(潜在地)迁移到Scala更加容易。 1.安装Scala,这个不用多说 Scala目前最新的版本为2.11.8,下载地址http://www.scala-lang.org/,我下载的.msi文件,直接安装完毕自动添加了path 2.安装IDE (1)直接下载ScalaIDE,安装完后就可以直接使用。 (2)已安装有Eclipse的,可以安装scala支持插件,支持的eclipse版本是3.8-4.3(Juno and Kepler) 插件地址 http://download.scala-ide.org/sdk/helium/e38/scala211/stable/site 其他版本:http://scala-ide.org/download/prev-stable.html 3.写一段代码测试一下 package com.demo object Demo {//注意这里是object 不是 class 喔,两者区别后面会讲到。 def main(args: Array[String]): Unit = { println("hello scala!") println("hello world!");//分号可选要不要 } } 本文来自云栖社区合作伙伴“开源中国” 本文作者:山海经 原文链接

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

Docker搭建nexus3私服

虚拟机地址(安装docker server的机器):192.168.31.109镜像版本:sonatype/nexus3:3.17.0 1、编辑docker-compose.yml [root@kafka1 nexus3]# cat docker-compose.yml version: '3.1' services: nexus3: image: sonatype/nexus3:3.17.0 container_name: nexus3 # network_mode: host ports: - 8081:8081 - 8088:8088 - 8087:8087 - 8086:8086 volumes: - /root/nexus3/nexus-data:/nexus-data restart: always cap_add: - ALL 2、关闭selinux和修改/root/nexus3/nexus-data (备注:我自己的nexus的目录,映射到容器做文件存储,修改为自己的) 关闭selinux不关闭selinux,无法启动,会报没有权限,类似jvm.log无法创建,或者.pid无法创建 将 SELINUX=enforcing 改为 SELINUX=disabled [root@kafka1 nexus3]# cat /etc/sysconfig/selinux # This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. #SELINUX=enforcing SELINUX=disabled # SELINUXTYPE= can take one of three two values: # targeted - Targeted processes are protected, # minimum - Modification of targeted policy. Only selected processes are protected. # mls - Multi Level Security protection. SELINUXTYPE=targeted 修改权限 chmod -R 777 ./nexus-data 3、启动nexus3 docker-compose -f ./docker-compose.yml up -d 4、访问nexus3 地址:http://ip:8081 如:http://192.168.31.109:8081点击右上角的sign in进行登录。账户admin,密码:默认密码在文件 /nexus-data/admin.password 中,登录进入 5、创建仓库 docker的仓库类型有三种 hosted : 本地存储,即同docker官方仓库一样提供本地私服功能 proxy : 提供代理其他仓库的类型,如docker中央仓库 group : 组类型,实质作用是组合多个仓库为一个地址 创建hosted仓库 创建proxy仓库,代理docker hub 创建group仓库,聚合hosted和proxy仓库,实现的效果就是先拉本地仓库,在拉远程仓库 6、设置docker从本地拉取镜像 vi /etc/docker/daemon.json [root@kafka1 nexus3]# cat /etc/docker/daemon.json { "insecure-registries": [ "192.168.31.109:8088", "192.168.31.109:8087", "192.168.31.109:8086" ] } 使用docker info查看 7、打tag进行镜像上传 注:只有hosted的仓库才能上传将本地从docker hub拉取的mysql镜像,重启打tag 格式ip:hosted port/xxx docker tag mysql:8.0.16 192.168.31.109:8088/mysql:8.0.16 docker login 192.168.31.109:8088 #输入账户、密码,如使用admin的账户,admin/admin123(第一次登陆后修改为了此密码) 8、上传镜像 docker push 192.168.31.109:8088/mysql:8.0.16 9、查看nexus3的镜像,如下图 10、删除本地镜像重新从私服拉取镜像 docker image rmi 192.168.31.109:8088/mysql:8.0.16 11、删除本地镜像 12、未解决的问题 由于本地仓库只有hosted的keypush镜像,端口为8088,聚合仓库可以先拉取本地仓库,在本地仓库没有的情况去远程仓库拉取,端口为8086所以在push/pull需要区分端口进行操作,略显麻烦,可以使用nginx进行反向代理进行统一,待完善

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

kubernetes 搭建单节点mysql服务

参考链接:https://kubernetes.io/docs/tasks/run-application/run-single-instance-stateful-application/ 一、创建service apiVersion: v1 kind: Service metadata: name: mysql labels: app: mysql namespace: admin-d2069c spec: ports: - name: mysql port: 3306 clusterIP: None selector: app: mysql 二、创建StatefulSet apiVersion: apps/v1beta1 kind: StatefulSet metadata: name: mysql namespace: admin-d2069c spec: serviceName: mysql replicas: 1 selector: matchLabels: app: mysql template: metadata: labels: app: mysql namespace: admin-d2069c spec: containers: - name: mysql image: mysql:5.7 env: - name: MYSQL_ROOT_PASSWORD value: "123" ports: - name: mysql containerPort: 3306 volumeMounts: - name: lihaile mountPath: /var/lib/mysql subPath: mysql - name: conf mountPath: /etc/mysql/conf.d resources: requests: cpu: 300m memory: 200M livenessProbe: exec: command: ["mysqladmin", "-h", "127.0.0.1", "-uroot", "-p123", "ping"] initialDelaySeconds: 30 periodSeconds: 10 timeoutSeconds: 5 readinessProbe: exec: # Check we can execute queries over TCP (skip-networking is off). command: ["mysql", "-h", "127.0.0.1", "-uroot", "-p123", "-e", "SELECT 1"] initialDelaySeconds: 5 periodSeconds: 2 timeoutSeconds: 1 volumes: - name: conf emptyDir: {} - name: config-map configMap: name: mysql volumeClaimTemplates: - metadata: name: lihaile annotations: volume.beta.kubernetes.io/storage-class: "managed-nfs-storage" namespace: admin-d2069c spec: accessModes: ["ReadWriteOnce"] resources: requests: storage: 2Gi 三、创建访问Service apiVersion: v1 kind: Service metadata: name: mysql-access labels: app: mysql namespace: admin-d2069c spec: ports: - name: mysql port: 3306 selector: app: mysql 查看Mysql root@node4:~# kubectl -n admin-d2069c get pvc,pv,statefulset,pod,service |grep mysql pvc/storage-mysql-0 Bound pvc-a6c63604-c2ee-11e8-b599-0050568eef9f 512M RWX managed-nfs-storage 18s pv/pvc-a6c63604-c2ee-11e8-b599-0050568eef9f 512M RWX Delete Bound admin-d2069c/storage-mysql-0 managed-nfs-storage 18s statefulsets/mysql 1 1 18s po/mysql-0 1/1 Running 0 18s svc/mysql ClusterIP None <none> 3306/TCP 18s svc/mysql-access ClusterIP 10.68.31.80 <none> 3306/TCP 18s ing/mysql-access jekens.com 80 18s 五、测试 1、查看集群详情和状态 root@node4:~# mysql -h 10.68.31.80 -p123 mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 124 Server version: 5.7.23 MySQL Community Server (GPL) Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 4 rows in set (0.00 sec) mysql>

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

如何搭建高可用redis架构?

1 题记 Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。 如今,互联网业务的数据正以更快的速度在增长,数据类型越来越丰富,这对数据处理的速度和能力提出了更高要求。Redis 是一种开源的内存非关系型数据库,给开发人员带来的体验是颠覆性的。在自始至终的设计过程中,都充分考虑高性能,这使得 Redis 成为当今速度最快的 NoSQL 数据库。 考虑高性能的同时,高可用也是很重要的考虑因素。互联网 7x24 无间断服务,在故障期间以最快的速度 Failover,能给企业带来最小的损失。 那么,在实际应用中,都有哪些高可用架构呢?架构之间有何优劣?我们应该怎么取舍?有哪些最佳实践? 二、Sentinel (哨兵)原理 在讲解 Redis 高可用方案之前,我们先来看看 Redis Sentinel 原理(https://redis.io/topics/sentinel)是怎么样的。 Sentinel 集群通过给定的配置文件发现 master,启动时会监控 master。通过向 master 发送 info 信息获得该服务器下面的所有从服务器。 Sentinel 集群通过命令连接向被监视的主从服务器发送 hello 信息 (每秒一次),该信息包括 Sentinel 本身的 IP、端口、id 等内容,以此来向其他 Sentinel 宣告自己的存在。 Sentinel 集群通过订阅连接接收其他 Sentinel 发送的 hello 信息,以此来发现监视同一个主服务器的其他 Sentinel;集群之间会互相创建命令连接用于通信,因为已经有主从服务器作为发送和接收 hello 信息的中介,Sentinel 之间不会创建订阅连接。 Sentinel 集群使用 ping 命令来检测实例的状态,如果在指定的时间内(down-after-milliseconds)没有回复或则返回错误的回复,那么该实例被判为下线。 当 failover 主备切换被触发后,failover 并不会马上进行,还需要 Sentinel 中的大多数 Sentinel 授权后才可以进行 failover,即进行 failover 的 Sentinel 会去获得指定 quorum 个的 Sentinel 的授权,成功后进入 ODOWN 状态。如在 5 个 Sentinel 中配置了 2 个 quorum,等到 2 个 Sentinel 认为 master 死了就执行 failover。 Sentinel 向选为 master 的 slave 发送 SLAVEOF NO ONE 命令,选择 slave 的条件是 Sentinel 首先会根据 slaves 的优先级来进行排序,优先级越小排名越靠前。如果优先级相同,则查看复制的下标,哪个从 master 接收的复制数据多,哪个就靠前。如果优先级和下标都相同,就选择进程 ID 较小的。 Sentinel 被授权后,它将会获得宕掉的 master 的一份最新配置版本号 (config-epoch),当 failover 执行结束以后,这个版本号将会被用于最新的配置,通过广播形式通知其它 Sentinel,其它的 Sentinel 则更新对应 master 的配置。 1 到 3 是自动发现机制: 以 10 秒一次的频率,向被监视的 master 发送 info 命令,根据回复获取 master 当前信息。 以 1 秒一次的频率,向所有 redis 服务器、包含 Sentinel 在内发送 PING 命令,通过回复判断服务器是否在线。 以 2 秒一次的频率,通过向所有被监视的 master,slave 服务器发送当前 Sentinel master 信息的消息。 4 是检测机制,5 和 6 是 failover 机制,7 是更新配置机制。[1] 三、Redis 高可用架构 讲解完 Redis Sentinel 原理之后,接下来讲解常用的 Redis高可用架构。 Redis Sentinel 集群 + 内网 DNS + 自定义脚本 Redis Sentinel 集群 + VIP + 自定义脚本 封装客户端直连 Redis Sentinel 端口 JedisSentinelPool,适合 Java PHP 基于 phpredis 自行封装 Redis Sentinel 集群 + Keepalived/Haproxy Redis M/S + Keepalived Redis Cluster Twemproxy Codis 接下来配合图文逐个讲解。 1、Redis Sentinel 集群 + 内网 DNS + 自定义脚本 Redis Sentinel 集群 + 内网 DNS + 自定义脚本 上图是已经在线上环境应用的方案。底层是 Redis Sentinel 集群,代理着 Redis 主从,Web 端连接内网 DNS 提供服务。内网 DNS 按照一定的规则分配,比如 xxxx.redis.cache/queue.port.xxx.xxx,第一个段表示业务简写,第二个段表示这是 Redis 内网域名,第三个段表示 Redis 类型,cache 表示缓存,queue 表示队列,第四个段表示 Redis 端口,第五、第六个段表示内网主域名。 当主节点发生故障,比如机器故障、Redis 节点故障或者网络不可达,Sentinel 集群会调用 client-reconfig-script 配置的脚本,修改对应端口的内网域名。对应端口的内网域名指向新的 Redis 主节点。 优点: 秒级切换,在 10s 内完成整个切换操作 脚本自定义,架构可控 对应用透明,前端不用担心后端发生什么变化 缺点: 维护成本略高,Redis Sentinel 集群建议投入 3 台机器以上 依赖 DNS,存在解析延时 Sentinel 模式存在短时间的服务不可用 服务通过外网访问不可采用此方案 2、Redis Sentinel 集群 + VIP + 自定义脚本 Redis Sentinel 集群 + VIP + 自定义脚本 此方案和上一个方案相比,略有不同。第一个方案使用了内网 DNS,第二个方案把内网 DNS 换成了虚拟 IP。底层是 Redis Sentinel 集群,代理着 Redis 主从,Web 端通过 VIP 提供服务。在部署 Redis 主从的时候,需要将虚拟 IP 绑定到当前的 Redis 主节点。当主节点发生故障,比如机器故障、Redis 节点故障或者网络不可达,Sentinel 集群会调用 client-reconfig-script 配置的脚本,将 VIP 漂移到新的主节点上。 优点: 秒级切换,在 5s 内完成整个切换操作 脚本自定义,架构可控 对应用透明,前端不用担心后端发生什么变化 缺点: 维护成本略高,Redis Sentinel 集群建议投入 3 台机器以上 使用 VIP 增加维护成本,存在 IP 混乱风险 Sentinel 模式存在短时间的服务不可用 3.3 封装客户端直连 Redis Sentinel 端口 3、封装客户端直连 Redis Sentinel 端口 部分业务只能通过外网访问 Redis,上述两种方案均不可用,于是衍生出了这种方案。Web 使用客户端连接其中一台 Redis Sentinel 集群中的一台机器的某个端口,然后通过这个端口获取到当前的主节点,然后再连接到真实的 Redis 主节点进行相应的业务员操作。需要注意的是,Redis Sentinel 端口和 Redis 主节点均需要开放访问权限。如果前端业务使用 Java,有 JedisSentinelPool 可以复用;如果前端业务使用 PHP,可以在 phpredis 的基础上做二次封装。 优点: 服务探测故障及时 DBA 维护成本低 缺点: 依赖客户端支持 Sentinel Sentinel 服务器和 Redis 节点需要开放访问权限 对应用有侵入性 4、Redis Sentinel 集群 + Keepalived/Haproxy Redis Sentinel 集群 + Keepalived/Haproxy 底层是 Redis Sentinel 集群,代理着 Redis 主从,Web 端通过 VIP 提供服务。当主节点发生故障,比如机器故障、Redis 节点故障或者网络不可达,Redis 之间的切换通过 Redis Sentinel 内部机制保障,VIP 切换通过 Keepalived 保障。 优点: 秒级切换 对应用透明 缺点: 维护成本高 存在脑裂 Sentinel 模式存在短时间的服务不可用 5、Redis M/S + Keepalived Redis M/S + Keepalived 此方案没有使用到 Redis Sentinel。此方案使用了原生的主从和 Keepalived,VIP 切换通过 Keepalived 保障,Redis 主从之间的切换需要自定义脚本实现。 优点: 秒级切换 对应用透明 部署简单,维护成本低 缺点: 需要脚本实现切换功能 存在脑裂 6、Redis Cluster Redis Cluster From: http://intro2libsys.com/focused-redis-topics/day-one/intro-redis-cluster Redis 3.0.0 在 2015 年 4 月 2 日正式发布,距今已有两年多的时间。Redis 集群采用 P2P 模式,无中心化。把 key 分成 16384 个 slot,每个实例负责一部分 slot。客户端请求对应的数据,若该实例 slot 没有对应的数据,该实例会转发给对应的实例。另外,Redis 集群通过 Gossip 协议同步节点信息。 优点: 组件 all-in-box,部署简单,节约机器资源 性能比 proxy 模式好 自动故障转移、Slot 迁移中数据可用 官方原生集群方案,更新与支持有保障 缺点: 架构比较新,最佳实践较少 多键操作支持有限(驱动可以曲线救国) 为了性能提升,客户端需要缓存路由表信息 节点发现、reshard 操作不够自动化 7、Twemproxy Twemproxy From: http://engineering.bloomreach.com/the-evolution-of-fault-tolerant-redis-cluster 多个同构 Twemproxy(配置相同)同时工作,接受客户端的请求,根据 hash 算法,转发给对应的 Redis。 Twemproxy 方案比较成熟了,之前我们团队长期使用此方案,但是效果并不是很理想。一方面是定位问题比较困难,另一方面是它对自动剔除节点的支持不是很友好。 优点: 开发简单,对应用几乎透明 历史悠久,方案成熟 缺点: 代理影响性能 LVS 和 Twemproxy 会有节点性能瓶颈 Redis 扩容非常麻烦 Twitter 内部已放弃使用该方案,新使用的架构未开源 8、Codis Codis From: https://github.com/CodisLabs/codis Codis 是由豌豆荚开源的产品,涉及组件众多,其中 ZooKeeper 存放路由表和代理节点元数据、分发 Codis-Config 的命令;Codis-Config 是集成管理工具,有 Web 界面供使用;Codis-Proxy 是一个兼容 Redis 协议的无状态代理;Codis-Redis 基于 Redis 2.8 版本二次开发,加入 slot 支持,方便迁移数据。 优点: 开发简单,对应用几乎透明 性能比 Twemproxy 好 有图形化界面,扩容容易,运维方便 缺点: 代理依旧影响性能 组件过多,需要很多机器资源 修改了 Redis 代码,导致和官方无法同步,新特性跟进缓慢 开发团队准备主推基于 Redis 改造的 reborndb 四、最佳实践 所谓的最佳实践,都是最适合具体场景的实践。 主推以下方案: Redis Sentinel 集群 + 内网 DNS + 自定义脚本 Redis Sentinel 集群 + VIP + 自定义脚本 以下是实战过程中总结出的最佳实践: Redis Sentinel 集群建议使用 >= 5 台机器 不同的大业务可以使用一套 Redis Sentinel 集群,代理该业务下的所有端口 根据不同的业务划分好 Redis 端口范围 自定义脚本建议采用 Python 实现,扩展便利 自定义脚本需要注意判断当前的 Sentinel 角色 自定义脚本传入参数: 自定义脚本需要远程 ssh 操作机器,建议使用 paramiko 库,避免重复建立 SSH 连接,消耗时间 加速 SSH 连接,建议关闭以下两个参数 UseDNS no GSSAPIAuthentication no 微信或者邮件告警,建议 fork 一个进程,避免主进程阻塞 自动切换和故障切换,所有操作建议在 15s 以内完成 欢迎工作一到五年的Java工程师朋友们加入Java架构开发:860113481 群内提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!

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

go-ethereum源码搭建环境

阅读源码对深入理解以太坊和区块链的原理是非常有用的,通过阅读源码可以知道交易、区块等核心数据结构的组成,可以对区块链的底层实现原理和运行过程有一个更清晰的认识,很多不明确的问题都可以从源码中找到答案。 网上以太坊的技术资料很多,但多数是关于智能合约和应用开发的,真正涉及底层实现和源码的很少。本文介绍以太坊go-ethereum源码的阅读环境配置,之后会陆续介绍一些源码阅读心得体会。以太坊有8种语言的实现,选择go-ethereum是因为它是以太坊的官方实现版本,包含了以太坊的所有特性,比较权威和全面,它是用go语言编写的,go语言学习起来比较容易,而且可读性也比较好。 阅读源码有一个代码编辑器就够了,但是为了更好的体验和更高的效率,还需要做一些配置,比如代码高亮、代码跳转等。 安装go语言 为了能支持代码跳转,需要安装go语言,安装教程参考这篇文章,其中最重要的是要保证正确设置了GOPATH,这样才能进行代码跳转。如果想学习go语言,可以看一下在线教程A Tour of Go,或者去看《The Go Programming Language》这本书。 配置编辑器 看代码可以选择你喜欢的代码编辑器,我用的是Visual Studio Code,为了支持go语言代码高亮,需要安装一个插件。在vscode的插件面板中搜索lukehoban,安装即可。 接下来安装一些go语言工具(有些需要翻墙),在命令行中执行以下命令安装: go get -u -v github.com/nsf/gocode go get -u -v github.com/rogpeppe/godef go get -u -v github.com/zmb3/gogetdoc go get -u -v github.com/golang/lint/golint go get -u -v github.com/lukehoban/go-outline go get -u -v sourcegraph.com/sqs/goreturns go get -u -v golang.org/x/tools/cmd/gorename go get -u -v github.com/tpng/gopkgs go get -u -v github.com/acroca/go-symbols go get -u -v golang.org/x/tools/cmd/guru go get -u -v github.com/cweill/gotests/... go get -u -v golang.org/x/tools/cmd/godoc go get -u -v github.com/fatih/gomodifytags 下载源码 以太坊代码都托管在github上,它的代码经常更新,每次更新会加入一些新的东西,也可能改变代码的组织架构,所以最好选择一个稳定版阅读,这里以1.5.9版本为例。 首先在GOPATH/src下创建github.com/ethereum目录: $ mkdir -p $GOPATH/src/github.com/ethereum 然后进入上面创建的目录,下载go-ethereum项目源码: $ cd $GOPATH/src/github.com/ethereum $ git clone https://github.com/ethereum/go-ethereum.git $ cd go-ethereum $ git checkout v1.5.9 上面通过git clone下载源码,然后通过git checkout检出指定版本的代码,如果想使用其他版本,在git checkout中指定相应的版本号即可。 下载完成后目录结构应该是这样的: GOPATH/src ├── github.com └── ethereum └── go-ethereum 路径和目录名一定要与上面的一致,不能放到其他地方或者改成其他名字,因为go语言是按照路径搜索包的。 其实上面最重要的就是要正确设置了GOPATH,并且要把源码放到GOPATH/src中正确的路径中。接下来就可以开始阅读代码了。 如果对以太坊开发有兴趣,推荐两个教程: 1.适合区块链新手的以太坊DApp开发: http://xc.hubwiz.com/course/5a952991adb3847553d205d1 2.用区块链、星际文件系统(IPFS)、Node.js和MongoDB来构建以太坊DApp电商平台: http://xc.hubwiz.com/course/5abbb7acc02e6b6a59171dd6 如果想加入以太坊技术开发群可以加微信拉你入群。

资源下载

更多资源
优质分享App

优质分享App

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

Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Apache Tomcat

Apache Tomcat

Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。

Eclipse

Eclipse

Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。