首页 文章 精选 留言 我的

精选列表

搜索[腾讯极客挑战赛],共10001篇文章
优秀的个人博客,低调大师

Docker 三剑客之 Docker Compose

Docker Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排,开源地址:https://github.com/docker/compose Docker Compose 中的两个重要概念: 服务 (service):一个应用容器,实际上可以运行多个相同镜像的实例。 项目 (project):由一组关联的应用容器组成的一个完整业务单元。 一个项目可以由多个服务关联(容器)而成,并使用docker-compose.yml进行管理。 安装命令: $ curl -L https://github.com/docker/compose/releases/download/1.17.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose $ chmod +x /usr/local/bin/docker-compose 这种方式安装巨慢无比,我们可以使用 PIP 安装,如果没有 PIP 环境,需要手动安装下: $ apt-get update $ apt-get -y install python-pip 或 $ curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py" $ python get-pip.py $ pip --help $ pip -V PIP 安装命令: $ sudo pip install -U docker-compose PIP 安装之后,执行 Docker Compose 命令的时候,会出现下面错误: $ docker-compose up Cannot open self /usr/local/bin/docker-compose or archive /usr/local/bin/docker-compose.pkg 解决方式,从官方源中手动下载安装包,然后移动到制定目录赋予权限,命令如下: $ cp -i docker-compose-Linux-x86_64 /usr/local/bin $ mv docker-compose-Linux-x86_64 docker-compose $ chmod +x /usr/local/bin/docker-compose 安装好之后,我们就可以使用 Docker Compose 进行容器编排了,我们就拿之前做的HelloDocker.Sample项目做为示例。 我们在HelloDocker.Sample.Web项目目录下,创建docker-compose.yml配置文件,示例: consul: command: agent -bind=10.9.10.89 -client=0.0.0.0 -node=vagrant-ubuntu-xishuai -retry-join=10.9.2.236 image: consul:latest ports: - 8300:8300 - 8400:8400 - 8500:8500 - 8600:53/udp net: host fabio: image: magiconair/fabio:latest ports: - 9999:9999 - 9998:9998 net: host volumes: - /etc/fabio/fabio.properties:/etc/fabio/fabio.properties environment: - SERVICE_9998_TAGS=urlprefix-/fabio hello-docker: ports: - 54917:54917 build: . net: host 其实看配置就明了了,一个项目中包含三个服务(consul,fabio和hell-docker容器),Docker Compose 对这三个服务进行编排部署,我们执行docker-compose up命令,启动项目: $ docker-compose up -d Creating hellodockerweb_fabio_1 ... Creating hellodockerweb_hello-docker_1 ... Creating hellodockerweb_consul_1 ... Creating hellodockerweb_fabio_1 Creating hellodockerweb_hello-docker_1 Creating hellodockerweb_consul_1 ... done 我们可以执行docker-compose ps, 查看运行的服务(容器): $ docker-compose ps Name Command State Ports ------------------------------------------------------------------------------ hellodockerweb_consul_1 docker-entrypoint.sh agent ... Up hellodockerweb_fabio_1 /fabio -cfg /etc/fabio/fab ... Up hellodockerweb_hello-docker_1 dotnet HelloDocker.Web.dll Up 或者执行docker-compose logs,查看日志: docker-compose logs Attaching to hellodockerweb_consul_1, hellodockerweb_hello-docker_1, hellodockerweb_fabio_1 consul_1 | ==> Starting Consul agent... consul_1 | ==> Consul agent running! consul_1 | Version: 'v1.0.0' consul_1 | Node ID: '521358bc-efc0-1a69-4a58-a9bfc8a9b09c' consul_1 | Node name: 'vagrant-ubuntu-xishuai' consul_1 | Datacenter: 'dc1' (Segment: '') consul_1 | Server: false (Bootstrap: false) consul_1 | Client Addr: [0.0.0.0] (HTTP: 8500, HTTPS: -1, DNS: 8600) consul_1 | Cluster Addr: 10.9.10.89 (LAN: 8301, WAN: 8302) consul_1 | Encrypt: Gossip: false, TLS-Outgoing: false, TLS-Incoming: false consul_1 | consul_1 | ==> Log data will now stream in as it occurs: consul_1 | consul_1 | 2017/11/21 04:41:25 [INFO] serf: EventMemberJoin: vagrant-ubuntu-xishuai 10.9.10.89 consul_1 | 2017/11/21 04:41:25 [INFO] agent: Started DNS server 0.0.0.0:8600 (tcp) consul_1 | 2017/11/21 04:41:25 [INFO] agent: Started DNS server 0.0.0.0:8600 (udp) consul_1 | 2017/11/21 04:41:25 [INFO] agent: Started HTTP server on [::]:8500 (tcp) consul_1 | 2017/11/21 04:41:25 [INFO] agent: Retry join LAN is supported for: aws azure gce softlayer consul_1 | 2017/11/21 04:41:25 [INFO] agent: Joining LAN cluster... consul_1 | 2017/11/21 04:41:25 [INFO] agent: (LAN) joining: [10.9.2.236] consul_1 | 2017/11/21 04:41:25 [WARN] manager: No servers available consul_1 | 2017/11/21 04:41:25 [ERR] agent: failed to sync remote state: No known Consul servers consul_1 | 2017/11/21 04:41:25 [INFO] serf: EventMemberJoin: agent_1 10.9.2.236 consul_1 | 2017/11/21 04:41:25 [INFO] serf: EventMemberJoin: windows64-xishuai 10.9.10.187 consul_1 | 2017/11/21 04:41:25 [INFO] agent: (LAN) joined: 1 Err: <nil> consul_1 | 2017/11/21 04:41:25 [INFO] agent: Join LAN completed. Synced with 1 initial agents consul_1 | 2017/11/21 04:41:25 [INFO] consul: adding server agent_1 (Addr: tcp/10.9.2.236:8300) (DC: dc1) consul_1 | 2017/11/21 04:41:34 [INFO] agent: Synced service 'fabio-vagrant-ubuntu-trusty-9998' hello-docker_1 | warn: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[35] hello-docker_1 | No XML encryptor configured. Key {3d8c2a18-ed43-4df9-980f-8573175ebecf} may be persisted to storage in unencrypted form. hello-docker_1 | Hosting environment: Production hello-docker_1 | Content root path: /app hello-docker_1 | Now listening on: http://[::]:54917 hello-docker_1 | Application started. Press Ctrl+C to shut down. fabio_1 | 2017/11/21 04:41:25 [INFO] Setting log level to INFO fabio_1 | 2017/11/21 04:41:25 [INFO] Runtime config fabio_1 | { fabio_1 | "Proxy": { fabio_1 | "Strategy": "rnd", fabio_1 | "Matcher": "prefix", fabio_1 | "NoRouteStatus": 404, fabio_1 | "MaxConn": 10000, fabio_1 | "ShutdownWait": 0, fabio_1 | "DialTimeout": 30000000000, fabio_1 | "ResponseHeaderTimeout": 0, fabio_1 | "KeepAliveTimeout": 0, fabio_1 | "FlushInterval": 1000000000, fabio_1 | "LocalIP": "10.0.2.15", fabio_1 | "ClientIPHeader": "", fabio_1 | "TLSHeader": "", fabio_1 | "TLSHeaderValue": "", fabio_1 | "GZIPContentTypes": null, fabio_1 | "RequestID": "" fabio_1 | }, fabio_1 | "Registry": { fabio_1 | "Backend": "consul", fabio_1 | "Static": { fabio_1 | "Routes": "" fabio_1 | }, fabio_1 | "File": { fabio_1 | "Path": "" fabio_1 | }, consul_1 | 2017/11/21 04:41:34 [WARN] agent: check 'service:8a600176-4c58-4edc-95af-71fc27345954' has deregister interval below minimum of 1m0s consul_1 | 2017/11/21 04:41:34 [INFO] agent: Synced service '8a600176-4c58-4edc-95af-71fc27345954' consul_1 | 2017/11/21 04:41:34 [INFO] agent: Synced service 'fabio-vagrant-ubuntu-trusty-9998' consul_1 | 2017/11/21 04:41:35 [INFO] agent: Synced check 'service:fabio-vagrant-ubuntu-trusty-9998' consul_1 | 2017/11/21 04:41:40 [INFO] agent: Synced check 'service:8a600176-4c58-4edc-95af-71fc27345954' consul_1 | ==> Newer Consul version available: 1.0.1 (currently running: 1.0.0) consul_1 | 2017/11/21 04:41:57 [WARN] memberlist: Refuting a suspect message (from: agent_1) fabio_1 | "Consul": { fabio_1 | "Addr": "10.9.10.89:8500", fabio_1 | "Scheme": "http", fabio_1 | "Token": "", fabio_1 | "KVPath": "/fabio/config", fabio_1 | "TagPrefix": "urlprefix-", fabio_1 | "Register": true, fabio_1 | "ServiceAddr": "10.9.10.89:9998", fabio_1 | "ServiceName": "fabio", fabio_1 | "ServiceTags": null, fabio_1 | "ServiceStatus": [ fabio_1 | "passing" fabio_1 | ], fabio_1 | "CheckInterval": 1000000000, fabio_1 | "CheckTimeout": 3000000000, fabio_1 | "CheckScheme": "http", fabio_1 | "CheckTLSSkipVerify": false fabio_1 | }, fabio_1 | "Timeout": 10000000000, fabio_1 | "Retry": 500000000 fabio_1 | }, fabio_1 | "Listen": [ fabio_1 | { fabio_1 | "Addr": ":9999", fabio_1 | "Proto": "http", fabio_1 | "ReadTimeout": 0, fabio_1 | "WriteTimeout": 0, fabio_1 | "CertSource": { fabio_1 | "Name": "", fabio_1 | "Type": "", fabio_1 | "CertPath": "", fabio_1 | "KeyPath": "", fabio_1 | "ClientCAPath": "", fabio_1 | "CAUpgradeCN": "", fabio_1 | "Refresh": 0, fabio_1 | "Header": null fabio_1 | }, fabio_1 | "StrictMatch": false, fabio_1 | "TLSMinVersion": 0, fabio_1 | "TLSMaxVersion": 0, fabio_1 | "TLSCiphers": null fabio_1 | } fabio_1 | ], fabio_1 | "Log": { fabio_1 | "AccessFormat": "common", fabio_1 | "AccessTarget": "", fabio_1 | "RoutesFormat": "delta", fabio_1 | "Level": "INFO" fabio_1 | }, fabio_1 | "Metrics": { fabio_1 | "Target": "", fabio_1 | "Prefix": "{{clean .Hostname}}.{{clean .Exec}}", fabio_1 | "Names": "{{clean .Service}}.{{clean .Host}}.{{clean .Path}}.{{clean .TargetURL.Host}}", fabio_1 | "Interval": 30000000000, fabio_1 | "Timeout": 10000000000, fabio_1 | "Retry": 500000000, fabio_1 | "GraphiteAddr": "", fabio_1 | "StatsDAddr": "", fabio_1 | "Circonus": { fabio_1 | "APIKey": "", fabio_1 | "APIApp": "fabio", fabio_1 | "APIURL": "", fabio_1 | "CheckID": "", fabio_1 | "BrokerID": "" fabio_1 | } fabio_1 | }, fabio_1 | "UI": { fabio_1 | "Listen": { fabio_1 | "Addr": ":9998", fabio_1 | "Proto": "http", fabio_1 | "ReadTimeout": 0, fabio_1 | "WriteTimeout": 0, fabio_1 | "CertSource": { fabio_1 | "Name": "", fabio_1 | "Type": "", fabio_1 | "CertPath": "", fabio_1 | "KeyPath": "", fabio_1 | "ClientCAPath": "", fabio_1 | "CAUpgradeCN": "", fabio_1 | "Refresh": 0, fabio_1 | "Header": null fabio_1 | }, fabio_1 | "StrictMatch": false, fabio_1 | "TLSMinVersion": 0, fabio_1 | "TLSMaxVersion": 0, fabio_1 | "TLSCiphers": null fabio_1 | }, fabio_1 | "Color": "light-green", fabio_1 | "Title": "", fabio_1 | "Access": "rw" fabio_1 | }, fabio_1 | "Runtime": { fabio_1 | "GOGC": 800, fabio_1 | "GOMAXPROCS": 1 fabio_1 | }, fabio_1 | "ProfileMode": "", fabio_1 | "ProfilePath": "/tmp" fabio_1 | } fabio_1 | 2017/11/21 04:41:25 [INFO] Version 1.5.3 starting fabio_1 | 2017/11/21 04:41:25 [INFO] Go runtime is go1.9.2 fabio_1 | 2017/11/21 04:41:25 [INFO] Metrics disabled fabio_1 | 2017/11/21 04:41:25 [INFO] Setting GOGC=800 fabio_1 | 2017/11/21 04:41:25 [INFO] Setting GOMAXPROCS=1 fabio_1 | 2017/11/21 04:41:25 [WARN] Error initializing backend. Get http://10.9.10.89:8500/v1/agent/self: dial tcp 10.9.10.89:8500: getsockopt: connection refused fabio_1 | 2017/11/21 04:41:25 [INFO] consul: Connecting to "10.9.10.89:8500" in datacenter "dc1" fabio_1 | 2017/11/21 04:41:25 [INFO] Admin server access mode "rw" fabio_1 | 2017/11/21 04:41:25 [INFO] Admin server listening on ":9998" fabio_1 | 2017/11/21 04:41:25 [INFO] Waiting for first routing table fabio_1 | 2017/11/21 04:41:25 [INFO] consul: Using dynamic routes fabio_1 | 2017/11/21 04:41:25 [INFO] consul: Using tag prefix "urlprefix-" fabio_1 | 2017/11/21 04:41:25 [INFO] consul: Watching KV path "/fabio/config" fabio_1 | 2017/11/21 04:41:34 [INFO] consul: Manual config changed to #3821244 fabio_1 | 2017/11/21 04:41:34 [INFO] HTTP proxy listening on :9999 fabio_1 | 2017/11/21 04:41:34 [INFO] Access logging disabled fabio_1 | 2017/11/21 04:41:34 [INFO] Using routing strategy "rnd" fabio_1 | 2017/11/21 04:41:34 [INFO] Using route matching "prefix" fabio_1 | 2017/11/21 04:41:34 [INFO] consul: Health changed to #3821756 fabio_1 | 2017/11/21 04:41:34 [INFO] consul: Registered fabio with id "fabio-vagrant-ubuntu-trusty-9998" fabio_1 | 2017/11/21 04:41:34 [INFO] consul: Registered fabio with address "10.9.10.89" fabio_1 | 2017/11/21 04:41:34 [INFO] consul: Registered fabio with tags "" fabio_1 | 2017/11/21 04:41:34 [INFO] consul: Registered fabio with health check to "http://[10.9.10.89]:9998/health" fabio_1 | 2017/11/21 04:41:35 [INFO] Config updates fabio_1 | + route add test /test http://10.9.2.236:23421/ fabio_1 | 2017/11/21 04:41:35 [INFO] consul: Health changed to #3821762 fabio_1 | 2017/11/21 04:41:40 [INFO] consul: Health changed to #3821765 fabio_1 | 2017/11/21 04:41:42 [INFO] Config updates fabio_1 | + hello-docker /hello-docker http://10.9.10.89:54917/ fabio_1 | + route add 我们可以查看 Consul UI 中的服务是否运行正常: 或者查看 Fabio UI 中的服务是否存在(通过健康检查后会出现): YAML 配置命令 配置 说明 build 指定 Dockerfile 所在的目录地址,用于构建镜像,并使用此镜像创建容器,比如上面配置的build: . command 容器的执行命令 dns 自定义 dns 服务器 expose 暴露端口配置,但不映射到宿主机,只被连接的服务访问 extends 对docker-compose.yml的扩展,配置在服务中 image 使用的镜像名称或镜像 ID links 链接到其它服务中的容器(一般桥接网络模式使用) net 设置容器的网络模式(四种:bridge,none,container:[name or id]和host) ports 暴露端口信息,主机和容器的端口映射 volumes 数据卷所挂载路径设置 Docker Compose 常用命令 命令 说明 docker-compose build 构建项目中的镜像,--force-rm:删除构建过程中的临时容器;--no-cache:不使用缓存构建;--pull:获取最新版本的镜像 docker-compose up -d 构建镜像、创建服务和启动项目,-d表示后台运行 docker-compose run ubuntu ls -d 指定服务上运行一个命令,-d表示后台运行 docker-compose logs 查看服务容器输出日志 docker-compose ps 列出项目中所有的容器 docker-compose pause [service_name] 暂停一个服务容器 docker-compose unpause [service_name] 恢复已暂停的一个服务容器 docker-compose restart 重启项目中的所有服务容器(也可以指定具体的服务) docker-compose stop 停止运行项目中的所有服务容器(也可以指定具体的服务) docker-compose start 启动已经停止项目中的所有服务容器(也可以指定具体的服务) docker-compose rm 删除项目中的所有服务容器(也可以指定具体的服务),-f:强制删除(包含运行的) 本文转自田园里的蟋蟀博客园博客,原文链接:http://www.cnblogs.com/xishuai/p/docker-compose.html,如需转载请自行联系原作者

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

2022 FinClip 小程序编程挑战赛来袭,码力集结,等你来战!

一、大赛介绍 小程序无疑是近几年发展最快速的技术之一!短短数年间,从无人问津到各大互联网巨头纷纷入局,成为继手机支付后,中国的移动互联网领先世界的第二个代表技术!中国的技术标准、开发者生态,已然得到大规模的普及应用! 2022 年我们为了连接更广泛的小程序生态,实现更丰富的应用场景。 FinClip 正式启动首届 Hackathon 大赛!本届 Hackathon 我们一共包含三大主题赛道 (插件组、小程序组、应用组),尽可能的让你们可以找到大显身手的机会,参赛者不论是APP开发者、小程序开发者、产品经理或者UI交互,都可以找到适合的领域,围绕 FinClip 探索无限可能。 二、赛事福利 1、十万元大赛奖金池 本次大赛为了更好的激励参赛者贡献创意,主办方打破单一的评价体系,准备了多维度的赛事奖项,价值十万元的大赛奖金池!值得一提的是针对个人开发者、学生团队更有扶持奖项。 2、参赛团队专属礼包 只要您报名参赛,即可获得由 FinClip 送出的程序员大礼包,绝对是开发者心仪的实用好物! 3、惊喜盲盒礼品 除了赛事奖金之外,主办方还为吃瓜群众们准备了盲盒抽奖活动。🎁 只要你参与赛事海报分享、为支持的战队打call、体验FinClip 平台均可参与盲盒抽奖。Mac pro、人体工学椅、苹果音响等海量礼品等你抱回家! 4、专家大咖在线指导 大赛期间更有移动开发领域知名专家、社区技术大咖、社区技术大咖等超强阵容担当评委,对项目进行全方位点评指导,扫除知识盲点,为赛事体验保驾护航。 5、优秀作品深度曝光 此次黑客马拉松获奖的作品,FinClip将在各类开发者社区、自媒体渠道、知名媒体进行全渠道曝光。 三、参赛方式 Step1: 报名组队 只要你对coding 感兴趣都可以报名参与,1~5人成团,没有队员人选也没有关系,欢迎在线求助FinClip 小助手(微信ID:fino220) 点击立即报名指引 Step2:提交RFC(Request For Comments) 报名成功即可启动组队,找到你喜欢的队友组成战队,选拔队长、拟定队名,提交团队RFC。 Step3:赛前学习 担心对FinClip 了解不够深入?不要慌,这里有F inclip 研发老司机们帮你准备的一份赛前学习秘籍。涵盖各类技术文档、操作指引,同时官方也安排FinClip 技术导师进行答疑、作品指导等。 Step4:作品提交 按指引提交作品内容至官方仓库,同时参赛队伍还需提交参赛作品的介绍视频用于作品答辩。(操作详情见赛事页面) Step5:作品评选 参赛作品最终由 FinClip 大赛组委会评审进行打分。同时,本次活动还设有积分挑战奖与最佳人气奖,此类奖项随活动截止日公示。 四、大赛日程 3月1日—4月22日 组队报名 3月1日—4月22日 确认参赛选题及作品提交 4月25日—5月4日 作品评选及大众投票 5月6日— 公布获奖参赛作品及对获奖作品进行全平台推广 五、参赛须知 1、我想参赛,可是没有合适的组队小伙伴怎么办? A:先找找身边的同学好友组队,如果没有合适的伙伴,FinClip官方会建立选手群让大家自由配对也会促进大家完成组队。 2、一个人也可以成队报名吗? A:当然可以,我们非常欢迎技能值满点的优秀个人参赛者。 3、报名时间好长,我还没想好做什么项目,可以观望一下最后“踩点报名”吗? A:不建议“踩点报名”。可以先报名,然后从学习资料中挑选适合自己基础的模块开始学习,提前准备总没有坏处~说不定在备赛群里和大家交流讨论之后,就能获得选题启发。临近报名截止日期可能不好组队,而且前期准备不充分,到时候参赛作品容易出错哟。 4、代码必须开源吗? 是的,我们鼓励协力合作,为社会贡献,让创意和代码更充分地发挥社会价值。如参赛作品仅能支持部分源代码开放,可以将部分不想开放的代码构建混淆之后,推送到私有的 npm 或者 npm 私有项目,然后通过 npm 包的形式引入 5、参赛作品提交规范? 需要遵守Apache-2.0 许可协议,同时在项目Readme中有针对作品的详细介绍、操作文档等探索和突破是人类永恒的追求,期待在代码的世界与你相遇!别犹豫啦,即刻报名吧! 六、赛事咨询 报名参与、赛事疑问、寻找队友、咨询官方赛事规则等,可添加FinClip官方小助手微信 -FinClip 小助手(微信ID:fino220) 点击了解活动详情

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

OOX 0.0.2 版本发布, 极简 NodeJS 接口开发框架

OOX 是什么 一个天生支持微服务/单体应用无缝切换的服务框架, 超级适合初创公司, 节省初期上线成本, 又能满足爆发式发展需求 一个天生支持分布式链路跟踪的分布式系统, 超级适合多人团队并行开发, 函数级日志联调优化, 节省bug调试与优化成本 一个天生支持 边缘计算, ABI友好 的嵌入式系统, 模块化的设计和类P2P服务发现方式, 配合 WebSocket 长连接, 无论什么应用场景, 都能做到得心应手 更新了什么 本次更新优化了SocketIO连接拦截方式, 具体为使用抛异常替换传统的方法调用 const { Service } = require ( 'oox' ) module.exports = class extends Service { static SocketIO = class extends Service.SocketIO { onSocketConnection ( socket ) { const { headers } = socket.handshake const isValid = headers [ 'x-caller' ] === 'client' // 当前优化后的使用方式 if ( !isValid ) throw new Error ( '连接失败' ) // 优化前的使用方式 if ( !isValid ) return socket.send ( '连接失败' ).disconnect ( true ) super.onSocketConnection ( socket ) } } } 有什么特性 HTTP 及 socket.io 服务双加持 0 配置启动服务 0 配置服务节点无限动态扩展 0侵入式编码, 极致简洁体验 0 侵入实现分布式链路跟踪 最符合直觉的路由模式 最符合直觉的服务调用方式 任何地方都能设置拦截器, 极致权限控制 自动服务发现 (P2P) 自动负载均衡 (可自定义算法) `分布式 / 独立应用`无缝切换! "Jawa"级性能, 吊打一切! 其它牛逼特性, 正在探索中

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

走进JavaWeb技术世界16:极简配置的SpringBoot

本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下Star哈 文章首发于我的个人博客: www.how2playlife.com 本文是微信公众号【Java技术江湖】的《走进JavaWeb技术世界》其中一篇,本文部分内容来源于网络,为了把本文主题讲得清晰透彻,也整合了很多我认为不错的技术博客内容,引用其中了一些比较好的博客文章,如有侵权,请联系作者。 该系列博文会告诉你如何从入门到进阶,从servlet到框架,从ssm再到SpringBoot,一步步地学习JavaWeb基础知识,并上手进行实战,接着了解JavaWeb项目中经常要使用的技术和组件,包括日志组件、Maven、Junit,等等内容,以便让你更完整地了解整个JavaWeb技术体系,形成自己的知识框架。为了更好地总结和检验你的学习成果,本系列文章也会提供每个知识点对应的面试题以及参考答案。 如果对本系列文章有什么建议,或者是有什么疑问的话,也可以关注公众号【Java技术江湖】联系作者,欢迎你参与本系列博文的创作和修订。 文末赠送8000G的Java架构师学习资料,需要的朋友可以到文末了解领取方式,资料包括Java基础、进阶、项目和架构师等免费学习资料,更有数据库、分布式、微服务等热门技术学习视频,内容丰富,兼顾原理和实践,另外也将赠送作者原创的Java学习指南、Java程序员面试指南等干货资源) Spring Boot 概述 Build Anything with Spring Boot:Spring Boot is the starting point for building all Spring-based applications. Spring Boot is designed to get you up and running as quickly as possible, with minimal upfront configuration of Spring. 上面是引自官网的一段话,大概是说: Spring Boot 是所有基于 Spring 开发的项目的起点。Spring Boot 的设计是为了让你尽可能快的跑起来 Spring 应用程序并且尽可能减少你的配置文件。 什么是 Spring Boot 它使用 “习惯优于配置” (项目中存在大量的配置,此外还内置一个习惯性的配置,让你无须)的理念让你的项目快速运行起来。 它并不是什么新的框架,而是默认配置了很多框架的使用方式,就像 Maven 整合了所有的 jar 包一样,Spring Boot 整合了所有框架(引自:springboot(一):入门篇——纯洁的微笑-%E5%85%A5%E9%97%A8%E7%AF%87.html)) 使用 Spring Boot 有什么好处 回顾我们之前的 SSM 项目,搭建过程还是比较繁琐的,需要: 1)配置 web.xml,加载 spring 和 spring mvc 2)配置数据库连接、配置日志文件 3)配置家在配置文件的读取,开启注解 4)配置mapper文件 ..... 而使用 Spring Boot 来开发项目则只需要非常少的几个配置就可以搭建起来一个 Web 项目,并且利用 IDEA 可以自动生成生成,这简直是太爽了... 划重点:简单、快速、方便地搭建项目;对主流开发框架的无配置集成;极大提高了开发、部署效率。 * Spring Boot 快速搭建 第一步:新建项目 选择 Spring Initializr ,然后选择默认的 url 点击【Next】: 然后修改一下项目的信息: 勾选上 Web 模板: 选择好项目的位置,点击【Finish】: 如果是第一次配置 Spring Boot 的话可能需要等待一会儿 IDEA 下载相应的 依赖包,默认创建好的项目结构如下: 项目结构还是看上去挺清爽的,少了很多配置文件,我们来了解一下默认生成的有什么: SpringbootApplication: 一个带有 main() 方法的类,用于启动应用程序 SpringbootApplicationTests:一个空的 Junit 测试了,它加载了一个使用 Spring Boot 字典配置功能的 Spring 应用程序上下文 application.properties:一个空的 properties 文件,可以根据需要添加配置属性 pom.xml: Maven 构建说明文件 第二步:HelloController 在【cn.wmyskxz.springboot】包下新建一个【HelloController】: package cn.wmyskxz.springboot; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * 测试控制器 * * @author: @我没有三颗心脏 * @create: 2018-05-08-下午 16:46 */ @RestController public class HelloController { @RequestMapping("/hello") public String hello() { return "Hello Spring Boot!"; } } @RestController 注解:该注解是 @Controller 和 @ResponseBody 注解的合体版 第三步:利用 IDEA 启动 Spring Boot 我们回到 SpringbootApplication 这个类中,然后右键点击运行: 注意:我们之所以在上面的项目中没有手动的去配置 Tomcat 服务器,是因为 Spring Boot 内置了 Tomcat 等待一会儿就会看到下方的成功运行的提示信息: 可以看到我们的 Tomcat 运行在 8080 端口,我们来访问 “/hello” 地址试一下: 可以看到页面成功显示出我们返回的信息。 * 解析 Spring Boot 项目 这一部分参考自:Spring Boot干货系列(一)优雅的入门篇 ——嘟嘟独立博客 解析 pom.xml 文件 让我们来看看默认生成的 pom.xml 文件中到底有一些什么特别: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>cn.wmyskxz</groupId> springboot <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>springboot</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> spring-boot-starter-parent <version>2.0.1.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> spring-boot-starter-web </dependency> <dependency> <groupId>org.springframework.boot</groupId> spring-boot-starter-test <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> spring-boot-maven-plugin </plugin> </plugins> </build> </project> 我们可以看到一个比较陌生一些的标签<parent>,这个标签是在配置 Spring Boot 的父级依赖: <parent> <groupId>org.springframework.boot</groupId> spring-boot-starter-parent <version>2.0.1.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> 有了这个,当前的项目才是 Spring Boot 项目,spring-boot-starter-parent 是一个特殊的 starter ,它用来提供相关的 Maven 默认依赖,使用它之后,常用的包依赖就可以省去 version 标签。 关于具体 Spring Boot 提供了哪些 jar 包的依赖,我们可以查看本地 Maven 仓库下:repositoryorgspringframeworkbootspring-boot-dependencies2.0.1.RELEASEspring-boot-dependencies-2.0.1.RELEASE.pom 文件来查看,挺长的... 应用入口类 Spring Boot 项目通常有一个名为 *Application 的入口类,入口类里有一个 main 方法,这个 main 方法其实就是一个标准的 Javay 应用的入口方法。 @SpringBootApplication是 Spring Boot 的核心注解,它是一个组合注解,该注解组合了:@Configuration、@EnableAutoConfiguration、@ComponentScan;若不是用 @SpringBootApplication 注解也可以使用这三个注解代替。 其中,@EnableAutoConfiguration 让 Spring Boot 根据类路径中的 jar 包依赖为当前项目进行自动配置,例如,添加了 spring-boot-starter-web 依赖,会自动添加 Tomcat 和 Spring MVC 的依赖,那么 Spring Boot 会对 Tomcat 和 Spring MVC 进行自动配置。 Spring Boot 还会自动扫描 @SpringBootApplication 所在类的同级包以及下级包里的 Bean,所以入口类建议就配置在 grounpID + arctifactID 组合的包名下(这里为 cn.wmyskxz.springboot 包) Spring Boot 的配置文件 Spring Boot 使用一个全局的配置文件 application.properties 或 application.yml,放置在【src/main/resources】目录或者类路径的 /config 下。 Spring Boot 不仅支持常规的 properties 配置文件,还支持 yaml 语言的配置文件。yaml 是以数据为中心的语言,在配置数据的时候具有面向对象的特征。 Spring Boot 的全局配置文件的作用是对一些默认配置的配置值进行修改。 简单实例一下 我们同样的将 Tomcat 默认端口设置为 8080 ,并将默认的访问路径从 “/” 修改为 “/hello” 时,使用 properties 文件和 yml 文件的区别如上图。 注意: yml 需要在 “:” 后加一个空格,幸好 IDEA 很好地支持了 yml 文件的格式有良好的代码提示; 我们可以自己配置多个属性 我们直接把 .properties 后缀的文件删掉,使用 .yml 文件来进行简单的配置,然后使用 @Value 来获取配置属性: 重启 Spring Boot ,输入地址:localhost:8080/hello 能看到正确的结果: 注意:我们并没有在 yml 文件中注明属性的类型,而是在使用的时候定义的。 你也可以在配置文件中使用当前配置: 仍然可以得到正确的结果: 问题:这样写配置文件繁琐而且可能会造成类的臃肿,因为有许许多多的 @Value 注解。 封装配置信息 我们可以把配置信息封装成一个类,首先在我们的 name 和 age 前加一个 student 前缀,然后新建一个 StudentProperties 的类用来封装这些信息,并用上两个注解: @Component:表明当前类是一个 Java Bean @ConfigurationProperties(prefix = "student"):表示获取前缀为 sutdent 的配置信息 这样我们就可以在控制器中使用,重启得到正确信息: Spring Boot 热部署 在目前的 Spring Boot 项目中,当发生了任何修改之后我们都需要重新启动才能够正确的得到效果,这样会略显麻烦,Spring Boot 提供了热部署的方式,当发现任何类发生了改变,就会通过 JVM 类加载的方式,加载最新的类到虚拟机中,这样就不需要重新启动也能看到修改后的效果了。 做法也很简单,修改 pom.xml 即可! 我们往 pom.xml 中添加一个依赖就可以了: <dependency> <groupId>org.springframework.boot</groupId> spring-boot-devtools <optional>true</optional> <!-- 这个需要为 true 热部署才有效 --> </dependency> 重新启动 Spring Boot ,然后修改任意代码,就能观察到控制台的自动重启现象: 关于如何在 IDEA 中配置热部署:传送门 * Spring Boot 使用 上面已经完成了 Spring Boot 项目的简单搭建,我们仅仅需要进行一些简单的设置,写一个 HelloController 就能够直接运行了,不要太简单...接下来我们再深入了解一下 Spring Boot 的使用。 Spring Boot 支持 JSP Spring Boot 的默认视图支持是 Thymeleaf 模板引擎,但是这个我们不熟悉啊,我们还是想要使用 JSP 怎么办呢? 第一步:修改 pom.xml 增加对 JSP 文件的支持 <!-- servlet依赖. --> <dependency> <groupId>javax.servlet</groupId> javax.servlet-api <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> jstl </dependency> <!-- tomcat的支持.--> <dependency> <groupId>org.apache.tomcat.embed</groupId> tomcat-embed-jasper <scope>provided</scope> </dependency> 第二步:配置试图重定向 JSP 文件的位置 修改 application.yml 文件,将我们的 JSP 文件重定向到 /WEB-INF/views/ 目录下: 第三步:修改 HelloController 修改 @RestController 注解为 @Controller ,然后将 hello 方法修改为: 第四步:新建 hello.jsp 文件 在【src/main】目录下依次创建 webapp、WEB-INF、views 目录,并创建一个 hello.jsp 文件: 第五步:刷新网页 因为我们部署了热部署功能,所以只需要等待控制台重启信息完成之后再刷新网页就可以看到正确效果了: 关于 404,使用 spring-boot:run 运行项目可以解决: 集成 MyBatis 第一步:修改 pom.xml 增加对 MySql和 MyBatis 的支持 <!-- mybatis --> <dependency> <groupId>org.mybatis.spring.boot</groupId> mybatis-spring-boot-starter <version>1.1.1</version> </dependency> <!-- mysql --> <dependency> <groupId>mysql</groupId> mysql-connector-java <version>5.1.21</version> </dependency> 第二步:新增数据库链接参数 这里我们就直接使用之前创建好的 student 表了吧: 第三步:创建 Student 实体类和 StudentMapper 映射类 在【cn.wmyskxz.springboot】下新建一个【pojo】包,然后在其下创建一个 Student 类: public class Student { private Integer id; private Integer student_id; private String name; private Integer age; private String sex; private Date birthday; /* getter and setter */ } 在【cn.wmyskxz.springboot】下新建一个【mapper】包,然后在其下创建一个 StudentMapper 映射类: package cn.wmyskxz.springboot.mapper; import cn.wmyskxz.springboot.pojo.Student; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Select; import java.util.List; @Mapper public interface StudentMapper { @Select("SELECT * FROM student") List<Student> findAll(); } 第四步:编写 StudentController 在【cn.wmyskxz.springboot】下新建一个【controller】包,然后在其下创建一个 StudentController : package cn.wmyskxz.springboot.controller; import cn.wmyskxz.springboot.mapper.StudentMapper; import cn.wmyskxz.springboot.pojo.Student; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import java.util.List; /** * Student 控制器 * * @author: @我没有三颗心脏 * @create: 2018-05-08-下午 20:25 */ @Controller public class StudentController { @Autowired StudentMapper studentMapper; @RequestMapping("/listStudent") public String listStudent(Model model) { List<Student> students = studentMapper.findAll(); model.addAttribute("students", students); return "listStudent"; } } 第五步:编写 listStudent.jsp 文件 我们简化一下 JSP 的文件,仅显示两个字段的数据: <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <table align='center' border='1' cellspacing='0'> <tr> <td>id</td> <td>name</td> </tr> <c:forEach items="${students}" var="s" varStatus="st"> <tr> <td>${s.id}</td> <td>${s.name}</td> </tr> </c:forEach> </table> 第六步:重启服务器运行 因为往 pom.xml 中新增加了依赖的包,所以自动重启服务器没有作用,我们需要手动重启一次,然后在地址输入:localhost:8080/listStudent 查看效果: 以上。 springMVC和springboot的区别 Spring 框架就像一个家族,有众多衍生产品例如 boot、security、jpa等等。但他们的基础都是Spring 的 ioc和 aop ioc 提供了依赖注入的容器 aop ,解决了面向横切面的编程,然后在此两者的基础上实现了其他延伸产品的高级功能。Spring MVC是基于 Servlet 的一个 MVC 框架 主要解决 WEB 开发的问题,因为 Spring 的配置非常复杂,各种XML、 JavaConfig、hin处理起来比较繁琐。于是为了简化开发者的使用,从而创造性地推出了Spring boot,约定优于配置,简化了spring的配置流程。 说得更简便一些:Spring 最初利用“工厂模式”(DI)和“代理模式”(AOP)解耦应用组件。大家觉得挺好用,于是按照这种模式搞了一个 MVC框架(一些用Spring 解耦的组件),用开发 web 应用( SpringMVC )。然后有发现每次开发都写很多样板代码,为了简化工作流程,于是开发出了一些“懒人整合包”(starter),这套就是 Spring Boot。 Spring MVC的功能 Spring MVC提供了一种轻度耦合的方式来开发web应用。 Spring MVC是Spring的一个模块,式一个web框架。通过Dispatcher Servlet, ModelAndView 和 View Resolver,开发web应用变得很容易。解决的问题领域是网站应用程序或者服务开发——URL路由、Session、模板引擎、静态Web资源等等。 Spring Boot的功能 Spring Boot实现了自动配置,降低了项目搭建的复杂度。 众所周知Spring框架需要进行大量的配置,Spring Boot引入自动配置的概念,让项目设置变得很容易。Spring Boot本身并不提供Spring框架的核心特性以及扩展功能,只是用于快速、敏捷地开发新一代基于Spring框架的应用程序。也就是说,它并不是用来替代Spring的解决方案,而是和Spring框架紧密结合用于提升Spring开发者体验的工具。同时它集成了大量常用的第三方库配置(例如Jackson, JDBC, Mongo, Redis, Mail等等),Spring Boot应用中这些第三方库几乎可以零配置的开箱即用(out-of-the-box),大部分的Spring Boot应用都只需要非常少量的配置代码,开发者能够更加专注于业务逻辑。 Spring Boot只是承载者,辅助你简化项目搭建过程的。如果承载的是WEB项目,使用Spring MVC作为MVC框架,那么工作流程和你上面描述的是完全一样的,因为这部分工作是Spring MVC做的而不是Spring Boot。 对使用者来说,换用Spring Boot以后,项目初始化方法变了,配置文件变了,另外就是不需要单独安装Tomcat这类容器服务器了,maven打出jar包直接跑起来就是个网站,但你最核心的业务逻辑实现与业务流程实现没有任何变化。 所以,用最简练的语言概括就是: Spring 是一个“引擎”; Spring MVC 是基于Spring的一个 MVC 框架 ; Spring Boot 是基于Spring4的条件注册的一套快速开发整合包。 参考文章 https://www.cnblogs.com/ThinkVenus/p/8026633.htmlhttps://www.jianshu.com/p/f8b0b8616d4fhttps://blog.csdn.net/qq_29229567/article/details/89209719https://www.jianshu.com/p/ffe5ebe17c3ahttps://blog.csdn.net/qq_30258957/article/details/81700960 微信公众号 个人公众号:黄小斜 黄小斜是跨考软件工程的 985 硕士,自学 Java 两年,拿到了 BAT 等近十家大厂 offer,从技术小白成长为阿里工程师。 作者专注于 JAVA 后端技术栈,热衷于分享程序员干货、学习经验、求职心得和程序人生,目前黄小斜的CSDN博客有百万+访问量,知乎粉丝2W+,全网已有10W+读者。 黄小斜是一个斜杠青年,坚持学习和写作,相信终身学习的力量,希望和更多的程序员交朋友,一起进步和成长! 原创电子书:关注微信公众号【黄小斜】后回复【原创电子书】即可领取我原创的电子书《菜鸟程序员修炼手册:从技术小白到阿里巴巴Java工程师》这份电子书总结了我2年的Java学习之路,包括学习方法、技术总结、求职经验和面试技巧等内容,已经帮助很多的程序员拿到了心仪的offer! 程序员3T技术学习资源: 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 “资料” 即可免费无套路获取,包括Java、python、C++、大数据、机器学习、前端、移动端等方向的技术资料。 技术公众号:Java技术江湖 如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的微信公众号【Java技术江湖】 这是一位阿里 Java 工程师的技术小站。作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发! (关注公众号后回复”Java“即可领取 Java基础、进阶、项目和架构师等免费学习资料,更有数据库、分布式、微服务等热门技术学习视频,内容丰富,兼顾原理和实践,另外也将赠送作者原创的Java学习指南、Java程序员面试指南等干货资源) Java工程师必备学习资源: 一些Java工程师常用学习资源,关注公众号后,后台回复关键字 “Java” 即可免费无套路获取。 ​

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

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文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册