天火

天火

成都
31 posts
Spring Cloud 微服务开发指南
spring cloud

Spring Cloud 微服务开发指南

如同 Spring Boot 在 Java Web 开发领域中的统治地位,Spring Cloud 在 Java 微服务开发领域中同样处于垄断地位。软件系统从单体升级到微服务架构,随之会出现各种分布式系统所特有的问题,包括服务注册与发现、限流熔断、调用追踪、单点登录等。Spring Cloud 提供了各种组件来解决这些问题,本文将通过升级改造一个单体 API 服务为微服务架构来讲解部分核心组件的用法。

  • 天火
    天火
Spring Boot API 服务测试指南
spring boot

Spring Boot API 服务测试指南

Spring Boot 除了简化了 Spring 应用的开发,同时也简化了 Spring 应用的测试。它内置支持各种常用测试工具,包括 Spring Test、JUnit、TestNG、Mockito、AssertJ 等。本文将讲解如何编写单元测试和集成测试来保障 Spring Boot API 应用不同层级代码的质量,其中会涉及到使用嵌入式的 H2 数据库来测试 Repository,通过 Mock 依赖接口来对用例进行单元测试,以及对应用整体进行 API 集成测试。

  • 天火
    天火
Spring Boot API 服务开发指南
spring boot

Spring Boot API 服务开发指南

Spring Boot 大大简化了使用 Spring 框架开发 Web 应用时的配置工作,使用它只需添加相关依赖包,即可零配置或少量配置来运行一个 Web 应用。本文将带领大家使用 Spring Boot 来开发一个 API 服务,同时支持 REST 和 GraphQL 两种协议。其中涉及到使用 Querydsl 来替换 JPQL 以便以类型安全的方式动态构建 SQL,自定义 Spring Security 以支持 REST API 的认证和授权,使用切面(Aspect)来保护 GraphQL API 的安全,以及自定义 GraphQL 标量类型等。

  • 天火
    天火
干净架构最佳实践
干净架构

干净架构最佳实践

干净架构(The Clean Architecture)是 Bob 大叔在 2012 年提出的一种适用于复杂业务系统的软件架构方式。干净架构的理念非常精炼,其中最核心的就是向内依赖原则。由于其并没有规定实施细节,因此采用不同语言和框架的软件系统都可以采用这种架构方式。这带来了很大的灵活性,但同时也增加了开发人员的实践难度。本文以一个 Java 语言(Spring Boot 框架)开发的 API 服务,以及一个 Dart 语言(Flutter 框架)开发的移动应用为例,来阐述干净架构的具体实施,期望对大家理解干净架构有所帮助。

  • 天火
    天火
使用 IoC 容器来简化业务对象的管理
控制反转

使用 IoC 容器来简化业务对象的管理

有过复杂业务应用编写经验的开发人员都知道业务对象的创建是一件比较麻烦的事儿。这些应用中存在着大量的业务对象,它们之间有着复杂的依赖关系,导致模块之间很容易出现循环依赖。此外,有些对象还有单例要求,依赖之间还有顺序要求,这些更加重了问题的严重性。这种情况下就需要有一种手段来简化业务对象的管理,包括创建和获取,IoC(Inversion of Control)容器正是为此而生。IoC 容器要求被管理的对象支持依赖注入(Dependency Injection),以便给这些对象注入其依赖的对象。本文先对控制反转和依赖注入的概念作简单介绍,然后重点讲解它们在各种语言里的实际用法。

  • 天火
    天火
叽歪课程 - NextJS + AntD React 应用开发实战
叽歪课程

叽歪课程 - NextJS + AntD React 应用开发实战

NextJS 是一个 React 应用框架,无需做任何配置就可让你的应用获得服务端渲染、自动代码分割、客户端路由、代码热加载等特性。AntD 是蚂蚁金服开源的一个 React 组件库,提供了数十个功能强大而灵活的组件。NextJS + AntD,让你十分钟之内可以开始编写你的第一行业务代码,几天时间就能开发完成一个简单的网站。

  • 天火
    天火
叽歪课程 - Flutter 移动应用开发实战
叽歪课程

叽歪课程 - Flutter 移动应用开发实战

Flutter 是新一代的跨平台 UI 框架,由 Google 出品。不同于 React Native 这类采用 Hybrid 架构的框架,Flutter 的架构升级是革命性的。Flutter 从渲染引擎往上都由自己实现,因此可控性更强,跨平台的适应性也更好,在性能上更是媲美于原生应用。除了跨移动平台,Flutter 还计划跨桌面和 Web 平台,发展前景良好,值得投入时间和精力去学习。

  • 天火
    天火
JW Flutter Demo 之 TabBar 导航
flutter

JW Flutter Demo 之 TabBar 导航

TabBar 导航通过页面底部固定的几个 Tab 来在应用的不同功能模块之间切换,每个 Tab 内都有一个嵌套的导航器,这样每个 Tab 内的页面导航不会影响到其它 Tab。通过综合使用嵌套的 Navigator 和 Stack 可以实现这种导航方式,但同时还需要处理一些小问题,比如 Android 返回键对内层 Navigator 不起作用,以及 Tab 切换时焦点没有随之切换等。 本文属于 JW Flutter Demo 文章系列,

  • 天火
    天火
JW Flutter Demo 之 Drawer 导航
flutter

JW Flutter Demo 之 Drawer 导航

编写任何一个正式的移动应用,第一步都需要考虑如何组织项目代码(目录结构),以及各个页面之间的跳转和返回(导航)。JW Flutter Demo(JWFD) 应用也是如此,本次我们就来完成这一部分的开发工作。 本文属于 JW Flutter Demo 文章系列,相关代码已在 GitHub 开源 JW Flutter Demo。如果想全面深入学习 Flutter,欢迎选购笔者制作的视频课程 Flutter 移动应用开发实战。 目录结构 JWFD 应用的目录结构如下:

  • 天火
    天火
云原生监控系统 Prometheus 入门
prometheus

云原生监控系统 Prometheus 入门

Prometheus 是一个开源监控系统,它前身是 SoundCloud 的告警工具包。从 2012 年开始,许多公司和组织开始使用 Prometheus。该项目的开发人员和用户社区非常活跃,越来越多的开发人员和用户参与到该项目中。目前它是一个独立的开源项目,且不依赖于任何公司。为了强调这点和明确该项目治理结构,Prometheus 在 2016 年继Kurberntes 之后,加入了 云原生计算基金会(Cloud Native Computing Foundation)。 Prometheus 介绍 主要特性 之所以

  • 天火
    天火
Netty 高性能网络协议服务器开发
netty

Netty 高性能网络协议服务器开发

本文通过一个实例来讲解如何使用 Netty 框架来开发网络协议服务器,项目使用 Gradle 工具来构建和运行,并且支持 Docker 部署。项目代码已在 GitHub 开源,JW Netty Demo。 Netty 简介 Netty 是一个异步、事件驱动的网络应用框架,使用它可以快速开发出可维护良好的、高性能的网络协议服务器。它大幅简化和流程化了网络编程,比如 TCP 和 UDP 套接字服务器开发。难能可贵的是,在保证快速和易用性的同时,

  • 天火
    天火
Tornado API 服务开发
tornado

Tornado API 服务开发

本文讲述如何使用 Tornado Web 框架来开发一个简单的 API 服务,以及如何使用 Docker 工具来构建镜像和部署服务。项目代码已在 GitHub 开源,JW Tornado Demo。 Tornado 介绍 Tornado 是一个 Python Web 框架,同时也是一个异步网络库。通过使用非阻塞网络 IO,它可以轻松处理上万连接,这使得它非常适合长轮询、WebSockets,以及需要为每一个用户维护一个连接的应用。 Tornado

  • 天火
    天火
Git + Docker 多环境自动化部署
devops

Git + Docker 多环境自动化部署

日常项目开发过程中,一般都有多套环境,比如开发、测试和生产。各个环境部署的代码版本不一致,手动一个个来部署效率低且容易出错。如果项目采用了敏捷开发方式,可能每天需要部署几十次。手动方式更加不可行,因此必须要把多环境的部署工作自动化。本文将介绍在笔者参与项目中实际推行的一种方案,供大家参考。 整体方案 当开发人员 push 代码到 develop、release 和 master 分支时将自动触发构建 Docker 镜像,然后部署到分支对应的开发环境。 Git 分支模型 每套环境部署的代码版本都不一样,还在开发中的功能只能部署到开发环境,已经开发完成的功能可以部署到测试环境,测试通过的功能才能部署到生产环境。

  • 天火
    天火
react native

React Native跨平台移动应用开发实战 - 打包发布

本文隶属于文章系列 React Native跨平台移动应用开发实战 ,讲解应用打包和发布到应用市场。 iOS打包 发布到AppStore 安卓打包 发布到GooglePlay和国内安卓市场 iOS打包 在Xcode 8里就可以完成打包和上传安装包到AppStore,但在打包之前需要到Apple开发者网站配置好证书、应用信息和Provision文件等。 打开 Apple Developer 网站,选择“Account”,然后选择“Certificates, Identifiers & Profiles”,就能看到如下界面。 在这里需要完成以下几项任务: 在Certificates下创建Distribution证书 在Identifiers下新建一个App ID 在Provisioning Profiles下为Distribution创建配置文件 以上配置完成后,打开Xcode 8,确保设备一栏选择的是“Generic iOS Device”,然后选择Product > Archive打包。打包完成后的界面显示如下,这个时候的包还没有签名。选择右边的“

  • 天火
    天火
react native

React Native跨平台移动应用开发实战 - 首页

本文隶属于文章系列 React Native跨平台移动应用开发实战 ,讲解首页如何开发。首页相对来说比较复杂,用到了RN的 ScrollView 和 ListView 组件。学完首页后,其它页面类似,因此关于功能开发方面的讲解到此结束。 RN的ListView在ScrollView的基础上做了很多性能优化,以保证在列表项非常复杂和列表很长的时候仍然能够保证页面滚动的流畅性。当然与此相伴,在使用上也会更复杂。 在页面里引入ListView组件。 在componentWillMount里创建ListView的DataSource,注意必需指定rowHasChanged来帮助ListView判断列表项是否需要重新渲染。 在componentWillReceiveProps里更新DataSource,否则即便数据发生了变化,列表也不会更新。 下拉刷新的时候,在列表上方显示Loading图标。 在列表滚动到结尾时,加载更多数据。 首页组件挂载后,获取列表数据,刷新导航。因为导航里的城市和运动信息可动态修改,所以需要刷新导航来动态生成,而不是由Layout来生成固定的。为了保证流畅度,所有操作都在导航动画完成之后进行。

  • 天火
    天火
react native

React Native跨平台移动应用开发实战 - 注册登录

本文隶属于文章系列 React Native跨平台移动应用开发实战 ,讲解用户注册和登录。由于篇幅所限,后面关于功能的讲解中我们重点关注component部分的代码,container、action和reducer代码请查阅Github上的公开库 zqc-app-demo。 注册登录选择页 注册 登录 注册登录选择页 启动时如果检测到没有登录,则进入此页让用户选择注册新帐号还是使用现有帐号登录。退出登录后也应进入此页。 注册 为了避免让用户反感注册过程中填写资料,应尽量减少必填信息,并且分步骤让用户填写,而不是在一个页面中填写完所有,从视觉上让用户觉得轻松一些。对于移动应用来说,最好使用手机号注册,方便日后联系用户。如果使用手机号注册,需要验证手机号的真实性。 有关表单数据校验、网络请求和缓存方面的技术资料可阅读前一篇文章 React Native跨平台移动应用开发实战 - 数据同步。 第一步,填写手机号和密码 表单数据将实时校验,填写错误时将在导航下方给予用户提示。 第二步,验证手机号 为了防止用户频繁请求发送验证码,需要增加最短时间间隔限制,服务端也需要作限制。 第三步,完善资料

  • 天火
    天火
react native

React Native跨平台移动应用开发实战 - 数据同步

本文隶属于文章系列 React Native跨平台移动应用开发实战 ,讲解应用和服务端之间如何同步数据。一方面应用里用户输入的数据需要提交到服务端,另一方面应用也需要从服务端获取其他用户提交的数据。涉及的工作包括表单数据验证,请求服务端API,缓存服务端响应数据等。这些是纯技术层面的工作,不涉及具体业务逻辑,但却是后面业务逻辑开发工作开展的前提。 表单数据验证 请求API 缓存数据 表单数据验证 以登录页面为例,表单数据验证效果如下。在用户输入的同时,会实时验证输入数据。如果验证失败,将在导航栏下方给予提示。这种验证方式比提交数据后由服务端来验证并反馈给用户在体验方面更好。当然处于安全考虑,服务端数据验证仍然需要。 在用户输入过程中,监听变化,如果数据发生变化则调用saveInput来保存新数据。保存数据的同时会调用validateInput来验证数据,验证结果保存在store的error.input属性下。 如果验证结果不为空,表示输入有误,Layout里的输入错误组件会显示出来。 请求API RN的 Networking 支持 Fetch API来执行网络请求。相比于XHR,fetch更强大和灵活。为了让应用里的网络请求更简单和统一,以及在请求前后添加一些全局操作,

  • 天火
    天火
react native

React Native跨平台移动应用开发实战 - 启动

本文隶属于文章系列 React Native跨平台移动应用开发实战 ,讲解应用的启动,启动需要完成检测网络、获取位置、加载持久化数据、检查登录状态等工作。 入口 Store创建与持久化 引导页 入口 入口文件负责store的创建和加载路由,然后就进入路由里定义的初始页,也就是引导页Bootstrap。可以看到iOS和安卓的入口文件内容一样,都是调用setup来完成。setup里创建store,并加载路由,然后应用就进入到引导页。 Store创建与持久化 Redux的store支持通过插件来扩展其功能。 我们使用 Logger for Redux 来打印每个action及其作用前后的状态,方便出现问题时分析到底是哪个action引起。 另外还使用了 Redux Persist 来持久化store到存储,以便应用重启后能恢复到上次退出时的状态,提升应用进入速度,还可以借此支持离线模式。注意,一些临时性的状态不要持久化,比如错误提示、进度提示、网络状态等,以免引起错乱。可以通过添加相关数据项到插件的“blacklist”里来避免持久化。

  • 天火
    天火
react native

React Native跨平台移动应用开发实战 - 布局和导航

本文隶属于文章系列 React Native跨平台移动应用开发实战 ,讲解应用整体层面的一些东西,包括布局、导航,以及错误、进度、Loading等信息显示。 布局 导航 进度提示 Loading 错误提示 布局 先来看一下完整的布局是怎样的一个效果。如下图所示,最顶部是状态栏和导航,下方紧接着的是进度条(有后台任务处理时出现,比如图片压缩),然后是内容区,页面中间是Loading图标(表明有网络请求正在进行),偏下方的位置是错误信息(出错时才有),最底部是Tab栏。 一个好的布局既要灵活满足不同页面的需求,比如有的页面没有导航条,有的没有Tab栏,还能尽量让页面不关心这些全局的界面元素。一个应用里的页面尽量使用同一个布局,这样能避免许多重复性的工作,也便于日后调整和修改。 下面是在球场的布局文件,完整的请点击底部链接查看。从中可以看到进度条、错误提示、Loading图标都是在需要的时候才会出现,导航和Tab栏也都可以控制是否显示。 导航 RN的 Navigator 做得比较底层,

  • 天火
    天火
react native

React Native跨平台移动应用开发实战 - 技术栈

本文隶属于文章系列 React Native跨平台移动应用开发实战 ,介绍RN应用开发用到的各项技术。读者在进行RN应用开发前,需要掌握这些技术。RN应用开发里面,RN只负责UI的绘制和跟原生系统的通信,对于一个完整的应用来说,还有许多技术层面的东西需要考虑,包括导航、应用状态管理和持久化、数据缓存、网络请求、错误处理等。 JavaScript Flexbox Layout React Redux 项目结构 JavaScript RN使用的JS引擎(下文提到引擎时如无特别说明即为该引擎)为Safari浏览器使用的引擎,当在Chrome浏览器里远程调试时,既然是运行在浏览器里,那就当然是V8引擎了。这两个引擎支持的JS语言特性非常相似,但也不排除会遇到两者行为不一致的地方,开发过程中应当避免使用这些特定于平台的特性。完整的说明详见官方文档,JavaScript Runtime。 RN支持的JS特性范围横跨ES5、ES6和ES7,具体特性列表可参考官方文档。引擎并不直接支持这些特性,RN使用 [Babel](Babel JavaScript compiler) 来进行语法转换,

  • 天火
    天火