新書推薦:
《
初平:汉末群雄混战(190—195)
》
售價:HK$
53.9
《
建安:官渡大决战(196—200)
》
售價:HK$
53.9
《
权力的图像——近代的中国海图与交流
》
售價:HK$
184.8
《
中亚民族史
》
售價:HK$
184.8
《
人工智能与智能制造:概念与方法 [美]马苏德·索鲁什 [美]理查德·D.布拉茨
》
售價:HK$
140.8
《
中平:东汉王朝大崩溃(184—189)
》
售價:HK$
53.9
《
基于鲲鹏的分布式图分析算法实战
》
售價:HK$
108.9
《
中国历史研究入门(全二册)
》
售價:HK$
283.8
|
編輯推薦: |
《全栈技能修炼:使用Angular和SpringBoot打造全栈应用》将大量的技术思想贯穿于前、后端这两条主线中。
前端:Angular
后端:Spring Boot 框架、Spring Security 安全框架
数据库:MongoDB、Elasticsearch 和 Redis
函数式编程、响应式编程(RxJS)、Redux等理念
Swagger、JaVers 等工具及 Rest、WebSocket、微服务等概念
|
內容簡介: |
本书涉及很多平台、框架和类库等,主要有前端使用的Angular,后端使用的Spring Boot框架、Spring Security安全框架,数据库涉及MongoDB、Elasticsearch和Redis。此外,还会学习函数式编程、响应式编程(RxJS)、Redux等理念,Swagger、JaVers等工具及Rest、WebSocket、微服务等概念。一本书是无法深入这些技术细节的,这也不是本书的目标。希望通过本书,可以帮助读者开启一扇门,真正掌握这些让人眼花缭乱的编程语言、框架、平台、IDE等技术背后的编程思想。
|
關於作者: |
王?M,资深开发人员、创业者,曾经在多家软件公司任项目经理、项目总监、部门经理,后创立成都索课科技有限公司、沈阳推码科技科技有限公司等。在多年的开发经历中用JavaC#JavascriptTypescript 等语言开发了多种类型的项目,积累了丰富的开发经验。乐于分享,发布大量技术文章。
|
目錄:
|
第1章 技术的选型和环境搭建 1
1.1 技术选型 1
1.1.1 前端框架选型 2
1.1.2 后端框架选型 3
1.1.3 数据库选型 3
1.2 环境搭建 5
1.2.1 基础开发环境安装 5
1.2.2 IDE 的选择 7
1.2.3 字体的选择 8
1.2.4 定义通用的代码格式 9
1.3 工程项目的结构 10
1.3.1 前端项目 10
1.3.2 后端项目 13
1.3.3 整体项目工程的文件结构 14
第2章 使用Angular快速构造前端原型 17
2.1 Angular 基础概念 17
2.1.1 安装 Angular CLI 17
2.1.2 依赖性注入 22
2.1.3 组件 27
2.1.4 指令 28
2.1.5 管道 30
2.1.6 模块 31
2.1.7 模板驱动型表单 33
2.1.8 响应式表单 46
2.2 Angular Material 介绍 55
2.2.1 组件类别 55
2.2.2 布局控件:Sidenav 57
2.2.3 Flex 布局和 Angular Flex-layout 60
2.2.4 封装 HeaderFooterSidebar 62
2.3 添加主题支持 78
2.3.1 Material Design 中对于主题的约束 79
2.3.2 主题的明与暗 79
2.3.3 Angular Material 中的主题 80
2.4 容器化 Angular 应用 83
2.4.1 什么是容器 83
2.4.2 安装 Docker 84
2.4.3 镜像仓库加速 85
2.4.4 创建 Angular 的 Docker 镜像 85
2.4.5 启动容器 87
2.4.6 使用 docker-compose 组织复杂的环境配置 88
2.4.7 使用 .dockerignore 文件 91
第3章 何谓后端 92
3.1 创建一个 Spring Boot 工程 93
3.1.1 通过 Gradle 创建 93
3.1.2 通过 Maven 创建 99
3.1.3 通过 IDE 创建 103
3.1.4 工程项目的组织 105
3.2 API 的构建可以如此简单 109
3.2.1 API 工程结构 109
3.2.2 领域对象 111
3.2.3 构造 Controller 112
3.2.4 启动服务 113
3.2.5 测试 API 115
3.3 MongoDB 支撑的 API 116
3.3.1 什么是 NoSQL 116
3.3.2 MongoDB 的集成 119
3.3.3 HATEOAS 124
3.3.4 魔法的背后 129
3.3.5 让后端也能热更新 132
3.4 容器化后端 135
3.4.1 手动创建镜像 135
3.4.2 使用 Gradle 自动化 Docker 任务 137
3.4.3 使用 docker-compose 组合服务 141
3.4.4 IDEA 中的 Gradle 支持 142
3.4.5 在容器中调试 143
第4章 登录鉴权功能的构建 145
4.1 模块化和组件化 145
4.1.1 登录的领域模型构建 145
4.1.2 前端页面设计 147
4.2 响应式编程初探 166
4.2.1 不同的视角 166
4.2.2 实现一个计数器 169
4.2.3 为什么要使用 Rx 177
4.2.4 Observable 的性质 178
4.2.5 RxJS 的调试 180
4.3 前端服务层 184
4.3.1 构建伪服务 184
4.3.2 构建聪明组件 188
4.3.3 路由处理 192
4.4 完成忘记密码前端设计 194
4.4.1 使用 RxJS 打造短信验证码控件 194
4.4.2 忘记密码向导笨组件 199
4.4.3 忘记密码的聪明组件 203
第5章 构建后端API 205
5.1 HyperMedia API 与传统 API 205
5.1.1 领域对象 205
5.1.2 API的可见控制 211
5.1.3 传统的 API 实现模式 218
5.2 Spring Data 中的查询 221
5.2.1 基础概念Repository 221
5.2.2 查询方式 223
5.2.3 复杂类型查询 226
5.2.4 自定义查询 228
5.2.5 自定义 Repository 229
5.3 Controller 的构建 230
5.3.1 改造 TaskRepo 和 UserRepo 230
5.3.2 实现 Controller 231
5.3.3 登录 234
5.3.4 注册 235
5.3.5 忘记密码第一步:验证手机 236
5.3.6 忘记密码第二步:重置密码 244
5.3.7 API 的异常处理 246
5.4 构建安全的 API 接口 255
5.4.1 为什么要保护 API 256
5.4.2 什么是JWT 256
5.4.3 JWT的生成和解析 259
5.4.4 权限的设计 260
5.4.5 使用 Spring Security 规划角色安全 261
5.4.6 在 Spring Boot 中启用 Spring Security 265
5.4.7 改造用户对象 266
5.4.8 构建 JWT token 工具类 268
5.4.9 如何检查任何请求的授权信息 272
5.4.10 得到用户信息 275
5.4.11 配置 Spring Security 277
5.4.12 使用 JWT 进行 API 访问 292
5.5 跨域和 API 文档 305
5.5.1 跨域解决方案CORS 305
5.5.2 API 文档 309
第6章 前端和API的配合 322
6.1 响应式的 HTTP API 处理 322
6.1.1 Angular 中的 HTTP 服务 322
6.1.2 Angular 的开发环境配置 323
6.1.3 在前端服务中使用 HttpClient 327
6.1.4 更改注册表单控件 331
6.2 RxJs进阶 332
6.2.1 改造登录表单 332
6.2.2 RxJs的高阶操作符 333
6.2.3 合并操作符 339
6.3 HTTP 拦截 342
6.3.1 实现一个简单的 HttpInterceptor 342
6.3.2 鉴权HttpInterceptor 343
6.3.3 一个日志拦截器 345
6.4 Angular 路由 346
6.4.1 基准锚链接 346
6.4.2 Router 模块的简介 347
6.4.3 获取父路由的参数 354
6.4.4 获得前一个路由 354
6.4.5 Activated Route 354
6.5 安全守卫 355
6.5.1 激活守卫 356
6.5.2 激活子路由守卫 357
6.5.3 加载守卫 358
6.5.4 退出守卫 359
6.5.5 数据预获取守卫 359
第7章 后端不只是API 361
7.1 缓存 361
7.1.1 配置 Cache 362
7.1.2 常用的缓存注解 364
7.1.3 测试缓存是否生效 366
7.2 Redis 作为缓存框架 368
7.2.1 Redis 的安装配置 369
7.2.2 在 Spring Boot 中集成 Redis 370
7.2.3 Redisson 373
7.3 使用 ElasticSearch 提升搜索性能 375
7.3.1 配置 375
7.3.2 构建用户查询 API 379
7.4 Spring Boot Actuator 和数据审计 390
7.4.1 初窥审计事件 390
7.4.2 实现应用的数据审计 394
7.4.3 JaVers 和 Spring Boot 集成 396
7.5 WebSocket 实时通信服务 401
7.5.1 HTTP 和 WebSocket 的区别和联系 402
7.5.2 何时使用 WebSocket 403
7.5.3 STOMP 403
7.5.4 WebSocket 配置 404
7.5.5 WebScoket 安全 406
7.5.6 建立一个实时消息 Controller 409
7.5.7 测试 WebSocket 409
7.6 Spring Boot 的自动化测试 411
第8章 前端的工程化 422
8.1 使用 Redux 管理状态 423
8.1.1 何时需要使用 Redux 423
8.1.2 Redux 的核心概念 424
8.1.3 在 Angular 中使用 Redux 429
8.1.4 Selector状态选择器 434
8.2 使用 Effects管理的副作用 437
8.3 使用 @ngrxentity 提升生产效率 441
8.4 服务端渲染 446
8.4.1 Angular Universal 的工作机理 447
8.4.2 安装依赖 447
8.4.3 添加服务器端渲染模块 448
8.4.4 使用 Node.js Express 构建服务器 450
8.4.5 服务器端渲染中出现重复请求的处理 453
第9章 Spring Cloud打造微服务 455
9.1 微服务的体系架构 455
9.1.1 服务即组件 456
9.1.2 微服务架构下的组织机构变化 456
9.1.3 产品化服务 458
9.1.4 持续集成和持续发布 458
9.1.5 监控和报警 458
9.1.6 Spring Cloud 项目依赖 459
9.2 配置服务和发现服务 461
9.2.1 配置中心是什么 461
9.2.2 发现服务 465
9.3 监控服务和路由服务 472
9.3.1 Spring Boot Admin 473
9.3.2 路由服务 478
9.4 微服务的远程调用 485
9.4.1 Feign Client 485
9.4.2 负载均衡 490
附录A 常见云服务使用问题汇总 492
|
內容試閱:
|
推荐序
认识王芃是因为他的文章。
对我这样的惫懒中年人来说,要坚持不懈地写文章实在是有点难,每每提笔都难以成章宁可靠写程序来麻醉自己。这,或许是另一种形式的中年危机?
但同样已届中年的王芃却能笔耕不辍,他不仅擅长写文章、写书,还经营着一家公司,让人叹服。
对于程序员来说,道路千万条,热忱第一条。无论你是希望像我一样在技术的道路上一条道走到黑,还是像王芃一样技术、业务、管理兼修,首先要具备的就是对技术的满腔热忱。
全栈,是技术领域的一条 Hard Way,选择它,你就要付出很多额外的努力并非是996,而是通过更多、更努力的思考(工作955,思考724)。其回报则是在多年之后,每当别人提起你时都会不禁赞叹:瞧那位 Hardcore 的程序员!没有付出就没有回报。相对于少数几条 Hard Way 来说,世界上还有无数条 Easy Way。如果你对 Hard Way 有着恐惧或犹疑,那么,请放下这本书,随便拿起一本21天精通。
如果这都没有吓跑你,那么我要向你透露一个价值连城的秘密全栈并不难。至少,对勤于思考的人来说,全栈是一个自然而然的结果,并不需要额外的代价。你之所以曾经觉得全栈难,是因为眼界受到限制。
现在,请听我说。
武侠小说里常常会说打通任督二脉之后功力大增,为什么打通任督二脉如此重要?因为它们统率着全身的经脉,它们是一切经脉的根本。相对于其他经脉来说,任督二脉很简单,但也最难打通。
全栈也是如此。经过多年的发展,技术体系变得非常庞杂看看层出不穷的技术知识图就知道了,但是你是否曾注意到很多同样的思想被到处套用?不仅在同一个技术体系内如此,跨体系的套用其实更加明显。比如 RxJS 的事件流、后端的 MessageQueue 与现在大热的 Serverless 架构在深层思想上有着千丝万缕的联系。有了这种眼光,你不仅可以更轻松地跨领域学习,更重要的是,你会拥有极为难得的预见力。而技术预见力,能让你领先别人三年哪怕半路在树下睡一觉都不用怕果然是我这种惫懒中年人的上佳之选啊。当然,如果你是仍有着雄心壮志的青年,应该会更明白预见力的价值,有朝一日,你的预见力甚至不会再局限于技术。
与通常的理解不同,在我看来,全栈,不是特定技术的组合,而是一种思维方式,一种眼界。即使这本书讲的是 Angular SpringBoot,即使我是在 Angular 领域的 Google 开发者专家,我仍然要郑重提醒你阅读时请跳出具体的技术,努力从更高的层次上理解它。
全栈,就是技术的任督二脉。它把大量的技术思想贯穿在前后端这两条主线中。它们既有区别,又有联系。既不会抽象到让你找不到具体的例子去理解这些思想,也不会狭隘到让你只知其然而不知其所以然。所以,如果你曾是个前端开发者,那么请了解下 Java 的注解及其对 Spring 演化的影响,思考下POJO 注解的模式为什么会流行起来。如果你曾是个后端开发者,那么请了解一下 RxJS 在前端的应用,及其与 MessageQueue 的共同点,了解下Filter 和 Interceptor 的共同点及其背后的思想。而无论你是前端开发者还是后端开发者,思考下 Java 与 TypeScript 这两种语言背后的设计思想都会让你受益匪浅。
总之,不要囿于门户之见。没有前端工程师,也没有后端工程师,一个有技术追求的程序员,首先要是一个工程师。工程师的思维与热忱,才是你最宝贵的财富。
是为序。
雪狼汪志成
ThoughtWorks 高级咨询师,Google Developer Expert
二十年码农,全栈工程师,儒生,Angular 中文文档译者
2019.05.14
前言
全栈的目的并不是一个人搭建起一个复杂的商业应用,在现代软件大工程化的今天,这个目标既没有必要,也没有价值。全栈的概念对笔者来说是一个不断扩充视野、持续学习的过程,通过不同语言、不同框架、不同平台的学习,知道什么是好的软件设计,什么是好的 UIUE设计,什么是好的编程习惯;了解在不同的模型中,对同一个问题是怎样解决的,有什么优点和缺点。
让人眼花缭乱的编程语言、框架、平台、IDE 等,其实就是开发人员的工具箱。学会这些工具的使用不只是为了成为一个熟练的技术员,更重要的是,知道现实世界的问题是什么,对应的解决方案有哪些,然后才是选择合适的工具高效地解决问题。如今,在开源成为一个趋势的时代,对比其他行业来说,我们在使用这些工具的同时,还可以看到打造这些工具的开发者是如何思考问题、解决问题的。这个学习过程可以让我们打开眼界,也可以让我们在面对未知领域时有自信去探索。
如今,很多优秀的编程思想都会被各个平台吸收,比如约定优于配置、函数式编程、响应式编程,以及以注解方式为代表的元数据编程模型等。Java这么成熟的平台也在不断地吸收新的元素,让自己更酷一些:Java 1.5引入了注解,Java 8引入了Collectors、Stream等函数式编程的元素。而一个好的框架也一定会得到多个平台、语言的支持,比如响应式编程的框架 Rx,最初只是微软为 .Net 平台开发的一套框架,但现在已经可以用18种编程语言实现了。
很多时候,随着接触的技术面的拓宽,你会发现在一个陌生平台或框架中,有太多令你会心一笑的东西,因为理念是相通的。在Angular中Interceptor的概念和Spring中Interceptor的概念如出一辙。如果你熟悉RxJS,那么对于Spring Reactor就很快可以使用了,这是因为背后的思想是一样的。所以说,随着你见识的提高,对于新知识的掌握速度也会越来越快。
本书涉及很多平台、框架和类库等,主要有前端使用的 Angular,后端使用的 Spring Boot 框架、Spring Security 安全框架,数据库涉及MongoDB、Elasticsearch 和 Redis。此外,还会学习函数式编程、响应式编程(RxJS)、Redux 等理念,Swagger、JaVers 等工具及 Rest、WebSocket、微服务等概念。
但一本书是无法深入这些技术细节的,这也不是笔者的目标。这本书想做的是希望帮助读者开启一扇门,读者读完本书后,如果觉得某个自己没有接触过的框架也不是那么可怕了,那么笔者的目的就达到了。不再对某个领域望而却步,其实就为你拓开了一片新天地。行万里路,读万卷书,这个道理在技术领域也是一样的,各种平台、框架、语言就像是路上的各种自然景观或人文景观,笔者愿意和你一起领略这多彩多姿的景色、升华自己的思想。
说句实话,虽然本书名字中有全栈,但是笔者以为全栈这个词还是有失偏颇的,给人的感觉好像样样通、样样松。确实,如果只是每方面都涉猎一些,确实无法做到各方面都精通,在某一个领域成为专家需要坚持不懈地进行学习和总结。但是任何一个领域学到一定程度时,就会发现在其他平台或编程语言上有类似的理念和思想,这些是相通的,已经超越语言和平台了。而这些恰恰又是在某个领域继续深入需要的一个台阶,持续学习的一个必要因素是不惧新的知识,而全栈学习就是要穿越这扇门,本书的目的就是想和你一起穿越这扇门。
作 者
|
|