Java 开发者得力助手,深刻实践 Spring Boot

简单易用的 Spring Boot,无疑是 Java 开发初学者的指路明灯,更是资深 Java 开发者的得力助手。快速开发是研发 Spring Boot 的初衷,这不可是一个开发团队的终生追求,也是一个企业解放生产力、提升生产效率的保障。前端

Spring Boot 的组件化整合规则,完美地整合了云应用开发工具,使其在云计算领域中处于领先地位,为建立高可用和高性能的服务提供了更加简便和快捷的方法。java

Spring Boot 是从 Spring 框架发展起来的,因此对于使用 Spring 框架的庞大用户群体来讲,随着 Spring Boot 的普及使用,将使众多开发者成为它的拥趸。git

所以,在 OSC 第 135 期高手问答中,咱们策划了“深刻实践 Spring Boot”的主题,并邀请了@快意开发(陈韶健)做为高手嘉宾。shell

本文整理了本期高手问答中一些与 Spring Boot 相关的精彩问答。数据库

1、Spring Boot 适用场景

1. 企业项目开发的时候,Spring Boot 有哪些使用场景呢,已知的坑是什么呢?json

SSO,分布式文件系统,微服务使用等等,在企业版应用中,这些都是很是顶用的。若是硬说有坑的话,就是服务多了,服务部署和运维管理必需要上一个档次,不然就会显得混乱起来。后端

2. 我的感受,从快速构建方面确实很高效,并且这样框架也是通过了不少实践以后,结晶的产品。可是,对于新人来讲,直接应用 Spring Boot,仍是感受不是很理想,可能会使新人对于 Spring 框架的理解上产生阻碍。对于 Spring Boot 自己,仍是很是不错的,云部署,快速构建都很不错。个人问题是,公司对于 Spring Boot 的应用有什么要求吗?通常开发会在什么状况下使用它?对于企业级的开发是否也有要求?api

Spring Boot 对背景知识没有特别要求,对于新人来讲,搭建好项目让其跟随开发,更加容易入手。对于公司的要求,主要看工程的规模和部署的方式,若是使用 Docker 部署并须要设置负载均衡等对运维人员和服务器的要求会高一些。tomcat

3. 常常看到 Spring Boot 和微服务关联起来,是由于 Spring Boot 开发和部署比较快么,能具体说说么?安全

Spring Boot 确实是以快速开发为目标而设计的,它的简单易用的特性确实减轻了开发者的负担,从而能够提升开发的生产率。你的问题须要全面理解一下 Spring Boot,能够经过它的官方网站进行一些了解。

完整的参考 DEMO — 不写一行代码即运行一个应用

4. 这个框架适合开发什么类型的项目

最适合用来开发 Web 应用项目。

2、Spring Boot 与 jar

1. 已经使用 Spring Boot 有几个月了,也开始在使用 Spring Boot 搭建公司的基础系统。我理解的 Spring Boot 应该是提倡以 jar 的形式部署,但这种方式在包的体积过大的状况下部署太慢了,以前咱们的业务和服务器都在国外,上传的时候速度慢得一塌糊涂,除了改为 war 发布,还有什么其余办法么?

其实最好的方式,仍是使用 jar,而后结合使用 Docker 来发布。若是一个项目的 jar 包过大的话,要看看形成这种状况的主要缘由是什么。是否是 jar 包中包含的资源文件太多,仍是项目包含的业务太复杂,若是是前种缘由,考虑优化一些图片资源,或者使用分布式文件系统来存储图片资源。若是是后一种缘由,是否是考虑将原项目使用模块化方式进行细分。

@采蘑菇的大叔 贡献的 DEMO http://git.oschina.net/icer/iblog。用 SpringBoot 搭了个架子,整合了 freemarker 和 mybatis。

2. Spring Boot 集成了服务器,以 jar 文件发布,减小对外部文件和环境依赖。但长期集成致使体积过大,这的确是个问题,能不能考虑作一些工具对 jar 进行减肥呢?

这就要分析一下形成 jar 过大的缘由是什么,若是是由于资源文件太多形成的,那就要优化一些图片的设计,或使用其它方式来连接资源文件,若是是由于一个项目包含的业务太多太复杂形成的,就要考虑是否能够将项目进行拆分。

3. 若是是用 Spring Boot 来作成 jar 服务启动,怎么衡量服务粒度。由于每一个服务都要运行 Spring,或者也会加个 dubbo 的依赖等等。跑起多个实例,这就重复了。其实就是单体应用跟分布式应用的点。

主要仍是看你怎样配置服务,若是使用 Spring Cloud 的服务发现来管理服务,能够经过负载均衡的配置支持多个服务同时对外提供服务。

4. Spring Boot 一样支持以标准的 war 方式部署应用,只是在启动类上须要进行细微的调整,并不强调始终以 jar 方式部署。

Spring Boot 应该是鼓励以 jar 的方式部署,随着 Spring Boot 一块儿来的应该是想推进微服务。我的看法,仅供讨论。(@采蘑菇的大叔

5. 使用 Spring Boot 的时候,页面文件会被打包到 jar 中,若是只更新页面文件,又要对 jar 进行打包上传。有没有简单的方法?相似原先的 Tocmat 部署就能够直接修改页面文件。不须要重启的方法?

可使用 war 方式部署 。

6. Spring Boot 项目如何作到 libs jar 和  app jar 分开,不少时候,我只是更新应用层代码,本地编译好上传上去,启动的时候经过脚本启动,那么如何将 libs 和 app 分别打包并启动呢?

使用 war 方式发布就能够实现你的要求。

3、Spring Boot 与 Docker

1. 请简单介绍一下 Spring Boot 和 Docker 结合

真要简单地说:将 Spring Boot 项目打包成 jar,而后经过 Docker 进行部署。用 Spring Boot 开发的项目,很是适合用 Docker 来部署。

这两个东西之间没有任何关系。Spring Boot 主要的目的是简化开发和部署过程当中配置文件的使用,使用了不少约定俗成的规则,按照这些约定的规则来开发,能够大大减小配置文件的使用,甚至彻底不使用配置文件都是可能的。Docker 只是把运行环境,像 OS、JVM、Nginx 等等打包到一块儿的个工具而已。把 Spring Boot 生成的可执行的 jar 包放进这个运行环境中来运行。这两个工具都只是简化了开发和运维的繁杂过程,使用了不少自动化处理的技术而已。(@清靜無虞

2. Spring Boot 从开发到部署的最佳实践 ,是否必须依赖容器技术,如何平滑过渡到 Docker 容器上?

Spring Boot 并不依赖 Docker 容器,也可使用 war 方式或者按照传统的方式直接使用文件系统来发布,只是使用 Docker,更能发挥它在各个方面优点。

3. 能分享下 Spring Cloud 和 Docker 部署方面的经验吗?

使用 Docker 发布 Spring Boot 项目(https://my.oschina.net/syic/blog/799656

4、旧的项目迁移至 Spring Boot

1. 旧的项目转到 Spring Boot 有什么条件?

不须要什么条件,使用 Spring Boot,最好是对原来的项目进行从新设计,或者使得原来的逻辑进行重建。

2. 是否是微服务架构比较适合用 Spring Boot?那对于老的系统或代码,怎么转到 Spring Boot?

全部使用 Web 方式开发的项目都适合使用 Spring Boot 框架,并从中获益,微服务开发是它的一大特点。旧系统的代码不能转换,可使用原来的业务逻辑进行重建。

5、与相关的项目对比

1. 几年前作开发仍是用的 Spring,包括 Spring 的 Bean 工厂方案还有 SpringMVC,如今主要业务的开发通常用的公司自研框架,因此对 Spring 感受比较生疏了,我就想了解了解,Spring Boot 同几年前的 Spring 相比,都有哪些方面的发展和变化,能大概讲讲吗?

Spring Boot 是在 Spring 的基础创建起来的,保留了 Spring 的一些精髓,同时也摒弃了一些糟粕,表如今:

  1. 统一工程配置,能够不使用 XML 配置
  2. 使用一些组件,具备自动配置的功能
  3. 内嵌了 Tomcat,性能指标等服务
  4. 更方便独立部署或使用 Docker 配置成高可用和高性能的平台

2. Spring Boot 与传统 SSH 框架的主要区别在哪些方面?

Spring Boot 能最大限度地简化配置,也能够嵌入 Tcomcat 等服务,而且在开发企业级应用、分布式应用等方面更加驾轻就熟,更加难能难得的是使用很是简单,很是适合快速开发的须要,符合软件工程构件化发展的目标。

3. Spring Boot 和 Spring MVC 有什么区别?

Spring MVC 仍是属于 Spring 框架的,Spring Boot 是在 Spring 的基础之上创建的一个全新开发框架。

4. Spring Boot 构建微服务,和目前一些新的例如 light java framework , sparkjava 在构建微服务上有什么优点?

在 Spring Boot 家族中,使用云应用开发工具集 Spring Cloud 开发微服务应用,具备得天独厚的优点。这里所说的微服务,是指功能强大,业务单一的分布式应用系统,并不是简单指项目的微型结构。

5. 用了 Spring Boot 是否是就不用再搞 Spring、SpringMVC、Hibernate、Struts、MyBatis 这些了?

对的,十分正确。对于数据库来讲,使用 JPA 就能一网打尽了。

6. Spring Boot 仍是很喜欢的,简化了很多配置,但实际中微服务的划分是个问题。

服务的划分这个和 Spring Boot 没有任何关系。微服务的一个难点就是服务的划分,有些服务是按技术特色来划分,好比像 push 服务、sms 服务等。有些是按业务特色来划分,像订单服务等,有些根据实际状况还进行服务的分层。

7. 使用 Spring Boot,其余的必须框架还须要配置吗?

若是使用 Maven 或其它项目管理工具,均可以在工程配置引用依赖包。

6、使用中遇到的问题

1. Spring Boot 有多种 Web 容器如默认的 Tomcat, Undertow 等,从综合上使用哪个性能更好。Undertow 如何像 Tomcat同样配置 http 自动跳转到 https?

跟 Tomcat 相比,Jetty 会显得更加小巧一些,可是综合来看,仍是使用默认的 Tomcat 比较实在。

Undertow 比 Tomcat 性能要好得多,https 通常不须要在 Undertow 这一层来配。通常都会在 Undertow 以前加一个 Nginx,在 Nginx中配置就好了。(@清靜無虞

性能测试 Undertow 比 Tomcat 稍好一些。稳妥能够用 Tomcat,想改换一下思路能够用 Undertow。http redirect to https 用 Undertow 有折中的办法是引入 Spring Security。不过通常仍是应该前端配 Nginx 或者 Apache Http Server 对外开放 https 服务,内部用 http 作反向代理通道协议。(@二的基本算合格

http://menelic.com/2016/01/06/java-rest-api-benchmark-tomcat-vs-jetty-vs-grizzly-vs-undertow/看了这个博客,虽然 Tomcat 慢一些,可是实际业务中 Tomcat 并不会是瓶颈,使用 Tomcat 也是一个很好的选择,毕竟使用了这么多年了,对各项配置也比较熟悉了。(@梦朝思夕

2.

  1. 我用 Spring Boot 好久了,从 1.2.5 开始用,最近一个项目预计使用分布式高可用,我也把该弄的框架都弄好了,但是最后客户取消分布式高可用,采用传统模式。Java 只负责后台接口,APP 接受数据,我如今有个权限问题,原来用的 Spring Security 作的权限先后端分离,如今只有接口,这个权限怎么进行管理,我看里面有回答说用 Spring Cloud 进行权限控制,这个 Cloud 对传统模式是否繁重?
  2. 定时任务的调度,自有 Quartz 调度是否支持集群,多个节点(非集群 ng 分发),可是定时任务我想让他集群,不容许多个节点都启动调度任务,只能某一节点不能执行其余节点才能触发,这个须要用 zookeeper 之类工具进行监测么?

对于企业级应用来讲,权限管理建议使用 SSO 的方式来实现,这在《深刻实践 Spring Boot》一书中有实际的使用实例,主要也是使用了 Spring Security 和 OAuth2 的技术。

Zookeeper 和 Spring-Cloud-Eureka 同样,都是一个服务注册和发现的管理工具,而 Spring-Cloud-Eureka 在 Spring Boot 中使用,更加适合用来调度使用 Spring Cloud 开发的微服务。至于你所说的定时任务调度,应该不属于这个范围吧。

折腾权限会有个 csrf 的问题,楼主要是弄好了分享一下心得呗。问题:开启 csrf 的话,渲染页面模版的时候,会生成一个 csrf 字符串,若是 post 提交能够带上,但若是写出是 json 的接口,就取不到这个 csrf 了,那么在提交 post 请求的时候就会报一个 csrf 相关的错误。(@朋也

3. Spring Boot 如何更好的更简洁的实现多表关联查询?

在实体建模时为多表创建关联关系,这样查询一个实体对象时就能够连带查出它关联的其它对象,即实现多表关联查询。

4.

  1. 使用 Spring Boot 搭建的微服务是否考虑服务之间的权限,例如访问权限,若须要,Spring Boot 自己有提供比较好的解决方案吗?
  2. Spring Boot 目前对于 Spring Cloud 生态有很好的支持和定制化吗?

Spring Boot 及其前身 Spring,对于任何第三方都能提供很好的支持,更不用说对 Spring Cloud 的支持了。对于系统的安全管理和访问控制,推荐使用 Spring Cloud 的 SSO,它与 Spring Boot 框架可以达到很是融洽的效果。

5. 在使用 Spring Boot 来开发公司产品的时候,根据业务进行拆分,这样最后部署的时候会出现 N 个 jar。这样的状况下,除了用 Docker 来部署还有别的什么方式吗?在部署方面有没有哪些须要注意的地方?

N 好像有点大吧,原来的工程分红十几个项目,已经很不错了。使用 Spring Boot 的好处是,能够统一项目配置,和使用发现服务,并更好地管理负载均衡,提升系统的高可用性。

6. 请问用 jar 的方式发布,如何在系统重启后能自动启动?

Spring Boot 打包的是个可运行的 jar,使用 Java 命令来启动。写个 shell 脚原本启动就好了,把 shell 脚本设置为开机运行。无论使用哪一种方式部署,自动启动都须要编写脚原本实现。(@清靜無虞

7. 在 Spring Boot 中,如何经过参数配置,设置 Tomcat 的 maxConnections 属性?

在 Spring Boot 的配置文件中好像没有这个配置参数,若是必定要这个配置,也能够将项目用 war 方式发布,而后像之前配置 Tomcat 同样配置。

8. Spring Boot 作 REST API 开发如何?若是 Controller 接受的参数模型比较复杂,基本是对象一层套一层,那如何定制这类的 API 接口?

  1. 在存储库接口中使用注解 @RepositoryRestResource,就能直接提供 Rest API
  2. 在控制器中使用 @RestController,其中所定义的 URL 就同时是一个 Rest 资源

9. Spring Boot 在开发阶段有热部署吗?相似 JRebel 那种

若是设置成链接 Tomcat 服务器来启动应用,能够设置成热部署的方式。

有关 Spring Boot 的相关问答内容至此结束。开源中国的技术问答区上面活跃着不少技术大牛,欢迎各位在上面踊跃提问和回答。

相关文章
相关标签/搜索