本周 Spring (PCF 1.6 特别版!) - 2015 年 11 月 3 日

工程 | Josh Long | 2015 年 11 月 03 日 | ...

欢迎阅读最新一期的 This Week in Spring!本周我在保加利亚索菲亚参加 我最喜欢的活动之一,盛大的 Java2Days

上周发布了 (终于!) Pivotal Cloud Foundry 1.6,其中包含了一年半多备受期待的功能和重大工作。新版本包含(除 许多其他功能 外)对平台托管的 GitLab、JFrog Artifactory 和 CloudBees Jenkins CI 的支持;对微服务基础设施的支持,包括 Spring Cloud Config Server 和 Spring Cloud Eureka;以及对 Docker 容器镜像和 .NET 应用的支持;以及 对在 Microsoft Azure 上运行的支持。此版本 充满了 针对持续安全地将软件交付到生产环境而优化的各种功能,而且我……

本周 Spring (JavaOne 2015 特别版) - 2015 年 10 月 27 日

工程 | Josh Long | 2015 年 10 月 28 日 | ...

欢迎阅读最新一期的 This Week in Spring!本周我和 Pivotal 团队的其他成员一起在旧金山参加 JavaOne 2015。本周 Pivotal Spring 团队全员出动,快来驻足打个招呼吧!

本周在线提供了一些很棒的新的 SpringOne2GX 2015 录音以及一些很棒的社区内容,所以我们开始吧!

React.js 和 Spring Data REST:第五部分 - 安全

工程 | Greg L. Turnquist | 2015 年 10 月 28 日 | ...
要查看此代码的更新,请访问我们的 React.js 和 Spring Data REST 教程

上一节中,您通过 Spring Data REST 的内置事件处理器和 Spring Framework 的 WebSocket 支持,使应用程序能够动态响应其他用户的更新。但任何应用程序如果不进行整体安全保护,确保只有授权用户才能访问 UI 和其背后的资源,都是不完整的。

您可以随时从这个仓库中获取代码并跟着做。本节内容以上一节的应用为基础,并增加了一些内容。

将 Spring Security 添加到项目中

开始之前,您需要在项目的 pom.xml 文件中添加几个依赖项

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
    <groupId>org.thymeleaf.extras</groupId>
    <artifactId>thymeleaf-extras-springsecurity4</artifactId>
</dependency>

这引入了 Spring Boot 的 Spring Security starter 以及一些额外的 Thymeleaf 标签,用于在网页中进行安全查找。

定义安全模型

在过去的章节中,您使用了一个很棒的工资系统。在后端声明内容并让 Spring Data REST 处理繁重工作非常方便。下一步是为需要建立安全控制的系统建模。

如果这是一个工资系统,那么只有经理才能访问它。因此,首先建模一个 Manager 对象

@Data
@ToString(exclude = "password")
@Entity
public class Manager {
public static final PasswordEncoder PASSWORD_ENCODER = new BCryptPasswordEncoder();

private @Id @GeneratedValue Long id;

private String name;

private @JsonIgnore String password;

private String[] roles;

public void setPassword(String password) {
	this.password = PASSWORD_ENCODER.encode(password);
}

protected Manager() {}

public Manager(String name, String password, String... roles) {

	this.name = name;
	this.setPassword(password);
	this.roles = roles;
}

}

  • PASSWORD_ENCODER 是加密新密码或在比较前对输入的密码进行加密的方式。
  • idnamepasswordroles 定义了限制访问所需的参数。
  • 定制的 setPassword() 确保密码不会以明文形式存储。

设计安全层时有一个关键点需要记住。保护正确的数据位(如密码),切勿让它们被打印到控制台、写入日志或通过 JSON 序列化导出。

  • @ToString(exclude = "password") 确保 Lombok 生成的 toString() 方法不会打印出密码。
  • 应用于 password 字段的 @JsonIgnore 可防止 Jackson 序列化此字段。

创建经理的仓库

Spring Data 在管理实体方面非常出色。为何不创建一个仓库来处理这些经理呢?

@RepositoryRestResource(exported = false)
public interface ManagerRepository extends Repository<Manager, Long> {
Manager save(Manager manager);

Manager findByName(String name);

}

您不需要继承通常的 CrudRepository,因为它包含太多方法。相反,您需要保存数据(也用于更新)并查找现有用户。因此,您可以使用 Spring Data Common 的最小 Repository 标记接口。它不包含任何预定义的操作。

Spring Data REST 默认会导出它找到的任何仓库。您不希望这个仓库被暴露用于 REST 操作!应用 @RepositoryRestResource(exported = false) 注解可以阻止它被导出。这可以防止该仓库被服务以及任何元数据。

将员工与他们的经理关联

安全建模的最后一部分是将员工与经理关联。在此领域中,一个员工可以有一个经理,而一个经理可以有多个员工

@Data
@Entity
public class Employee {
private @Id @GeneratedValue Long id…

STS 中的 Spring Boot Dashboard - 第三部分:Spring Boot Devtools 重载

工程 | Martin Lippert | 2015 年 10 月 22 日 | ...

欢迎回来,Spring 社区!

欢迎阅读关于 Spring Tool Suite 中新 Spring Boot Dashboard 系列的最后一篇文章。在这一部分中,我们将深入探讨如何将 Spring Boot Devtools 与 boot dashboard 结合使用。同样,此功能是 Spring Boot 1.3 中新增的,因此您需要使用该版本才能使用以下功能。

快速部署代码更改

对于本地应用,使用 Spring Boot Devtools 非常简单直接。一旦您将 Spring Boot Devtools 作为依赖项添加到项目中(在上下文菜单的 Spring 类别中有一个简单的菜单选项),并启动您的应用,它将监听本地配置和类文件的更改,并自动为您触发应用的重启。您甚至不需要自己重启应用,Spring Boot Devtools 会自动为您完成。由于 STS/Eclipse 在您保存文件时会生成和更新类文件,因此在 STS 中工作时,这一切都会自动发生。

如果您在像 Cloud Foundry 这样的远程运行时环境上运行 Spring Boot 应用,情况会更有趣。原则上,您也可以在这样的远程环境中 使用 Spring Boot Devtools,但这需要更多一些工作。好消息是 Spring Boot Dashboard 可以帮助您解决这个问题。

一旦您通过 boot dashboard 在 Cloud Foundry 上部署或重启(并因此更新)一个 classpath 中包含 Spring Boot Devtools 的 Spring Boot 应用,boot dashboard 将自动在 CF 上为该应用配置远程使用 devtools。这主要包括设置一个远程密钥 - 以允许远程 devtools 访问它。

一旦启用了 devtools 的 boot 应用在 Cloud Foundry 上运行,您可以轻松地为其启动 boot devtools 远程客户端应用。该客户端应用在您的本地机器上运行,并连接到 Cloud Foundry 上的远程应用。它会监视文件更改,将更改上传到 Cloud Foundry 上的应用,并触发 Cloud Foundry 上应用的重启。

由于远程客户端应用将监视您本地机器上项目中的文件更改,您可以像往常一样继续在 IDE 中工作。更改的文件会自动由远程客户端应用更新到 Cloud Foundry 上的应用版本。一旦这些更改的文件存储到 Cloud Foundry 上的应用中,Cloud Foundry 上的对应端将重启 boot 应用。这对于新编译的源代码和更改的资源文件都有效。

即使您的项目部署在远程云运行时环境中,这也能让您在开发时实现快速迭代周期。

云端调试

除了自动重启功能外,Spring Boot Devtools 还支持在云运行时环境中对远程应用进行全面调试。STS 中的 Spring Boot Dashboard 也支持此功能。如果您的应用 classpath 中包含 Spring Boot Devtools,您可以点击 Cloud Foundry 应用实例的(重)调试按钮。这将在 Cloud Foundry 上以调试模式重启应用,自动在您的机器上启动相应的远程客户端应用,并连接 Eclipse 调试器。

您可以像调试本地应用一样调试在云运行时环境中运行的应用,包括设置断点、检查变量,甚至热插拔代码。但是,对于在调试模式下运行的应用,自动重启功能不可用(目前是由于 boot devtools 的技术限制)。

如果您尝试对 Cloud Foundry 上的应用进行远程调试,您会注意到调试速度显著变慢。这是因为 JVM 的远程调试协议通过 HTTP 连接进行隧道传输,而远程调试协议并非为此设计。我们正在通过使用不同的传输机制来改进这一点。但在 Cloud Foundry 上对应用进行远程调试应该是您很少做的事情。对于更频繁的调试,您可能需要考虑在本地运行和调试应用,并通过我们在本系列博客上一部分中描述的 ngrok 隧道功能将其连接到应用程序服务的其余部分。

结论

这结束了关于 Spring Boot Dashboard 的系列博客文章,它是 Spring Tool Suite 自 3.7.1 版本以来新增的功能。请告知我们您使用 dashboard 的体验。

本周 Spring (SpringOne2GX 回放 / Pieter Humphrey 特别版!) - 2015 年 10 月 21 日

工程 | Josh Long | 2015 年 10 月 21 日 | ...

欢迎阅读最新一期的 This Week in Spring!这是(众多周中的)第一周,超赞的 Pieter Humphrey 发布了大量 SpringOne2GX 2015 视频供我们畅快观看!本周丰盛的综述内容大部分归功于 Pieter 细致的转码、上传和发布 SpringOne2GX 2015 视频 - 谢谢 Pieter!因此,事不宜迟,让我们看看本周的精选内容,其中包括大量来自 SpringOne2GX 的内容,包括..

SpringOne2GX 2015 回放:使用 Grails 启动 IoT

工程 | Pieter Humphrey | 2015 年 10 月 19 日 | ...

录制于 SpringOne2GX 2015。

讲者:Colin Harrington, OCI Web

幻灯片:http://www.slideshare.net/SpringCentral/booting-iot-with-grails

在云、虚拟化、容器化、微服务和纳微服务的世界中,我们讨论向上扩展、向外扩展和解耦我们的系统,但通常会忽略向下扩展到嵌入式平台。在我们摒弃笨重的单体 Web 容器的同时,我们也看到了强大且低成本的嵌入式 Linux 设备(如 RaspberryPi)的兴起。

STS 中的 Spring Boot Dashboard - 第二部分:使用 Cloud Foundry

工程 | Martin Lippert | 2015 年 10 月 15 日 | ...

欢迎回来,Spring 社区!

作为关于 Spring Tool Suite 中新 Spring Boot Dashboard 系列博客文章的第二部分,我们将超越工作空间中的本地应用,转而看看部署到云运行时环境中的远程应用。如果您错过了第一部分,请先阅读它以熟悉 STS 中的 boot dashboard。

云运行时支持

我们在 Boot Dashboard 中支持的首个远程目标是 Cloud Foundry。Boot Dashboard 的设计和实现都没有限制它成为唯一受支持的远程目标,它只是我们首先着手实现的。

我们的目标是提供类似于本地应用的体验,让您可以轻松地与 Cloud Foundry 上的 Spring Boot 应用进行交互、启动、停止、更新和查找日志输出。因此,您可以使用工具栏中的大加号图标向 boot dashboard 添加 Cloud Foundry 部分。

输入凭据并选择组织/空间后,boot dashboard 中会出现一个新部分,列出部署到此 Cloud Foundry 空间的应用程序。您可以看到应用程序的名称以及已配置和正在运行的实例数量。

基本操作对于 CF 上的一个或多个应用的工作方式与本地应用非常相似或相同。您可以跳转到控制台输出,它将显示在 STS/Eclipse 的控制台视图中,您可以启动和停止应用,可以双击它们以打开正在运行应用的浏览器窗口,可以为应用配置默认路径,还可以添加/删除这些应用的标签。如果选择 boot dashboard 中跨这些目标部分的多个条目,您甚至可以跨目标执行某些操作(例如启动和停止)。

除了适用于本地和 Cloud Foundry 应用程序的通用操作外,还有一些专门针对 Cloud Foundry 应用程序的额外操作。例如,boot dashboard 允许您完全删除 Cloud Foundry 上的应用程序,或轻松跳转到 Web 控制台。

部署到 Cloud Foundry

到目前为止,我们讨论了 Cloud Foundry 上的现有应用。但是如何将您的应用部署到 Cloud Foundry 呢?有多种方法,可以使用 CLI 或 Cloud Foundry 的 Eclipse 插件。boot dashboard 为您提供了另一种选择:您可以将您的 Spring Boot 应用直接拖放 onto the Cloud Foundry target in the dashboard and it will deploy the Spring Boot app to CF. This is as easy as its sounds.

如果您的应用包含 manifest.yml 文件,该文件将用于配置 Cloud Foundry 上的应用。这通常包含应用的名称、域、内存设置、实例数量以及可能更多的内容。

如果您的项目中没有 manifest.yml 文件,部署操作将在对话框中提示您输入部署应用所需的基本信息。

但请注意:如果项目包含 manifest.yml 文件,它将用于部署和配置应用。您可能通过 Web 控制台对 CF 配置所做的更改,下次使用 boot dashboard 重启/重新部署/更新应用时将会丢失。要么将所有配置都放在 manifest.yml 文件中,要么完全不使用它 - 至少目前如此。我们将努力改进此功能,以更灵活的方式处理 manifest.yml 文件以及对应用配置的外部更改,但这将在 STS 的未来版本中完成。

应用部署后,boot dashboard 将在工作空间中的项目与 Cloud Foundry 上已部署的应用之间保持关联(并在 boot dashboard 中显示此关联)。

保持工作空间项目与 Cloud Foundry 上的应用之间的这种关联使得对应用的更改变得更加容易。如果您在工作空间中更改代码,然后点击 CF 上应用的(重)启动按钮,boot dashboard 将自动将应用(更改)重新推送到 Cloud Foundry。

一旦您将应用部署到 Cloud Foundry 上,您通常不需要同时在本地处理所有内容。您通常专注于应用程序的特定部分,有时甚至希望同时使用两者:一些服务在 Cloud Foundry 上运行,一些服务在您本地机器的 IDE 中运行。但它们如何交互呢?

为混合部署建立本地服务隧道

作为一项早期实验,我们在 boot dashboard 中内置了一个特定功能,让您可以使用 CF 上的所有服务和应用,并让它们调用在您本地机器上运行的单个服务。这样,您可以专注于您环境中的单个项目,并继续使用 Cloud Foundry 处理其余部分。您可以在本地快速迭代并处理代码 - 并在与 Cloud Foundry 上的其他部分一起工作时进行测试。这难道不棒吗?

这种工作方式是:您已经有一个微服务的服务发现机制。目前,我们为此功能支持 Eureka 服务发现服务。您可以使用一个名为“(重)启动并通过 ngrok 暴露应用”的特殊操作来启动您的本地 Spring Boot 应用。执行此操作将(重)启动您机器上的本地应用。同时,此操作将使用 ngrok 服务为该应用创建一个公共可见的隧道。结果,您会得到一个公共可见的 URL,该 URL 将所有流量路由到您的本地机器以及在您本地机器上运行的本地 Spring Boot 应用。该应用会自动配置为使用此公共可见的隧道 URL 向远程 Eureka 注册。

该服务的客户端现在将从 Eureka 获取此隧道 URL,而不是(或除了)可能已在 Cloud Foundry 上运行的服务默认实例 - 并且将调用您本地运行的服务,而不是 CF 上的服务。您可以快速迭代或甚至调试您的本地服务。

这种混合部署场景显然不适用于生产或团队环境,在这些环境中多人同时使用 CF 上的应用程序。但它对于测试和开发环境非常有用。

对 Cloud Foundry 的支持仅仅是一个起点。Spring Boot Dashboard 绝非仅限于或专注于 Cloud Foundry。未来可能会添加其他远程云运行时环境。我们接下来将致力于支持的运行时环境之一是 Lattice,但也非常欢迎其他运行时环境。如果您有兴趣在这方面进行协作,请告知我们。Spring Boot Dashboard 是基于 EPL 的开源项目,我们非常乐意与您合作开发更多功能并为其添加更多云运行时环境的支持。

展望

本系列的第三部分将向您介绍 Spring Boot Devtools 的内置支持,以及如何在 Boot Dashboard 中使用它们来快速修改您的应用(即使在 CF 上),以及如何在 CF 上进行远程调试。

React.js 和 Spring Data REST:第四部分 - 事件

工程 | Greg L. Turnquist | 2015 年 10 月 13 日 | ...
要查看此代码的更新,请访问我们的 React.js 和 Spring Data REST 教程

上一节中,您引入了条件更新以避免在编辑相同数据时与其他用户发生冲突。您还学习了如何在后端使用乐观锁对数据进行版本控制。如果有人编辑了同一记录,您会收到提示,以便您可以刷新页面并获取更新。

这很好。但您知道更好的方法是什么吗?让 UI 在其他人更新资源时动态响应。

在本节中,您将学习如何使用 Spring Data REST 的内置事件系统来检测后端的变化,并通过 Spring 的 WebSocket 支持将更新发布给所有用户。然后,您将能够在数据更新时动态调整客户端。

您可以随时从这个仓库中获取代码并跟着做。本节内容以上一节的应用为基础,并增加了一些内容。

为项目添加 Spring WebSocket 支持

开始之前,您需要在项目的 pom.xml 文件中添加一个依赖项

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

这引入了 Spring Boot 的 WebSocket starter。

使用 Spring 配置 WebSocket

Spring 提供了强大的 WebSocket 支持。需要认识到的是,WebSocket 是一种非常低级的协议。它提供的功能仅限于在客户端和服务器之间传输数据。建议使用子协议(本节使用 STOMP)来实际编码数据和路由。

以下代码用于配置服务器端的 WebSocket 支持

@Component
@EnableWebSocketMessageBroker
public class WebSocketConfiguration extends AbstractWebSocketMessageBrokerConfigurer {
static final String MESSAGE_PREFIX = "/topic";

@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
	registry.addEndpoint("/payroll").withSockJS();
}

@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
	registry.enableSimpleBroker(MESSAGE_PREFIX);
	registry.setApplicationDestinationPrefixes("/app");
}

}

  • @EnableWebSocketMessageBroker 开启 WebSocket 支持。
  • AbstractWebSocketMessageBrokerConfigurer 提供了一个方便的基类来配置基本功能。
  • MESSAGE_PREFIX 是您将添加到每个消息路由前的命名空间前缀。
  • registerStompEndpoints() 用于配置后端供客户端和服务器连接的端点(/payroll)。
  • configureMessageBroker() 用于配置用于在服务器和客户端之间中继消息的 broker。

通过此配置,现在可以利用 Spring Data REST 事件并通过 WebSocket 发布它们。

订阅 Spring Data REST 事件

Spring Data REST 根据仓库上发生的操作生成多个应用事件。以下代码展示了如何订阅其中一些事件

@Component
@RepositoryEventHandler(Employee.class)
public class EventHandler {
private final SimpMessagingTemplate websocket;

private final EntityLinks entityLinks;

@Autowired
public EventHandler(SimpMessagingTemplate websocket, 
			EntityLinks entityLinks) {
	this.websocket = websocket;
	this…

本周 Spring - 2015 年 10 月 13 日

工程 | Josh Long | 2015 年 10 月 13 日 | ...

欢迎阅读最新一期的 This Week in Spring!本周我在波兰克拉科夫参加 JDD,然后将前往俄罗斯圣彼得堡参加 Joker 大会

我们有很多内容要介绍,所以马上开始吧!

获取 Spring 新闻邮件

订阅 Spring 新闻邮件,保持连接

订阅

领先一步

VMware 提供培训和认证,助您加速进步。

了解更多

获取支持

Tanzu Spring 提供 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件,只需一份简单的订阅。

了解更多

即将举行的活动

查看 Spring 社区中所有即将举行的活动。

查看全部