通过了解Spring Cloud Config Server的配置以及使用Vault存储敏感数据的方式,继续你的微服务之旅。抽丝剥茧 细说架构那些事——【优锐课】
在“使用Spring Boot和Spring Cloud的微服务-第1部分:概述”中,我们简要介绍了什么是微服务以及如何使用SpringBoot和SpringCloud构建微服务。
在这篇文章中,我们将学习:
• Spring Cloud Config和Vault有什么需求?
• 如何创建我们的第一个微服务:目录服务
• 如何创建Spring Cloud Config Server
• 如何使用Vault存储敏感数据
使用Spring Boot和Spring Cloud的微服务
Spring Boot已经提供了许多选项来外部化配置属性。但是,一旦启动应用程序,你将无法在运行时更改那些属性值。你需要更新属性并重新启动应用程序,以使这些更改生效。
在微服务世界中,可能会有大量的微服务,并且这些微服务的多个实例正在运行。手动甚至使用自动脚本更新配置属性并重新启动所有这些实例可能不可行。Spring Cloud Config解决了这个问题。
我们可以创建一个Spring Cloud Config Server,该服务器提供所有微服务的配置值。我们可以使用git,svn,database或Consul作为后端来存储配置参数。然后,我们可以在我们的微服务中配置Spring Cloud Config服务器的位置,以便在启动应用程序时它将加载所有属性。除此之外,每当我们更新属性时,我们都可以在微服务中调用/ refresh REST端点,以便它可以重新加载配置更改,而无需重新启动应用程序。
在我们的应用程序中,我们还需要配置各种敏感数据,例如数据库凭据,密钥,令牌等。显然,我们不想将它们存储为纯文本格式。更好的方法是将它们以加密格式存储,并且Spring Cloud Config Server提供了加密和解密数据的功能。更好的是,我们应该使用Vault之类的安全数据存储工具。Spring Cloud还提供了与Vault的集成,因此我们可以在Vault中存储任何敏感的配置属性。
让我们从我们的第一个微服务开始,即目录服务。使用Web,JPA,MySQL,Actuator,DevTools和Lombok启动器创建一个SpringBoot应用程序。到目前为止,典型的SpringBoot应用程序还算不错。
首先,让我们实现一个REST端点以提供产品数据,然后将其重构为使用Cloud Config Server。我们将使用Docker并将MySQL作为Docker容器运行。
docker-compose.yml
version: '3'
services:
mysqldb:
image: mysql:5.7
container_name: mysqldb
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: admin
MYSQL_DATABASE: catalog
如下配置application.properties中的数据源属性:
server.port=8181
logging.level.com.sivalabs=debug
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/catalog?useSSL=false
spring.datasource.username=root
spring.datasource.password=admin
spring.datasource.initialization-mode=always
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
//expose all the Actuator endpoints
management.endpoints.web.exposure.include=*
创建JPA实体Product.java,如下所示:
import lombok.Data;
import javax.persistence.*;
@Data
@Entity
@Table(name = "products")
public class Product {
@Id @GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(nullable = false, unique = true)
private String code;
@Column(nullable = false)
private String name;
private String description;
private double price;
}
创建Spring Data JPA存储库ProductRepository.java,如下所示:
import com.sivalabs.catalogservice.entities.Product;
import org.springframework.data.jpa.repository.JpaRepository;
import java