在本系列研讨会中,我们将使用spring boot,docker构建一些微服务,然后将它们部署到kubernetes中。 因此,让我们开始吧。
首先,我们需要定义一个问题陈述。 可以说我们要建立一个订单管理系统。
识别域
第一步将是了解需要哪些域,为简单起见,假设我们需要以下域:
命令
产品展示
客户或用户 购物车
现在我们知道我们正在构建什么,让我们开始开发。
在本研讨会中,我们将使用以下内容
用于微服务的Spring Boot
数据库的Postgres
构建的摇篮 Docker容器
第一微服务:产品
让我们为产品构建第一个微服务,我们将其称为产品服务,其中将包含产品的详细信息。
步骤1:使用spring初始化程序设置spring boot应用程序。
转到https://start.spring.io/
并使用Java
和SpringBoot 2.1.0
生成gradle
项目,并提供以下值:
群组ID:com.anirudhbhatnagar
工件:productService
dependecies:Web,Jpa,postgresSQL
单击生成项目,然后下载压缩的项目。 创建一个名为“ order_management_system”的新目录。 将项目解压缩到一个文件夹中,然后将其内容复制到这个新目录中。
将项目导入到您喜欢的IDE中,我们很容易开始。 通过在终端中运行项目来检查安装程序是否运行正常:
./gradlew build
由于DataSourceBeanCreationException,构建将失败,这是因为我们在项目中添加了PostgresSQL依赖关系,但没有通过提供数据库凭证及其uri配置数据源。 让我们在下一步中做。
步骤2:配置数据库
我们需要一个数据库来保存产品服务的产品详细信息。
为此,我们需要两件事: –正在运行的postgres数据库 –在Spring配置其详细信息 首先创建一个本地postgres数据库。 我们可以使用docker映像来运行本地postgres DB。 为了使postgres数据库服务器作为docker映像运行,我们需要在系统中安装docker。 使用此链接在您的mac中安装docker(在Windows和Linux中可以找到类似的链接)。 在您的机器上安装docker之后。 拉出最新的postgres映像,然后在本地运行。 我们还将使用用户名和密码初始化数据库。 在终端中运行以下命令:
$ docker run --name oms_postgres -p 5432:5432 -e POSTGRES_USER=dbuser -e POSTGRES_DB=products_db -e POSTGRES_PASSWORD=password -d postgres
这将在您本地的端口5432上启动一个postgres服务器,并用用户名“ dbuser”和密码“ password”初始化一个空的数据库“ postgres_db”。 一旦数据库启动并运行,我们现在将配置Spring Boot应用程序的数据源。 使用Spring Boot的一种方法(也许是最简单的一种方法)是在application.properties文件中定义数据源URI和数据库凭据。 Spring Boot将使用这些凭据自动配置数据源。
打开项目中的application.properties文件,然后添加以下内容:
spring.datasource.url=jdbc:postgresql://localhost:5432/products_db
spring.datasource.username=dbuser
spring.datasource.password=password
spring.jpa.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
现在,我们已经为应用程序配置了数据库,让我们再次运行gradle构建。 建立:
./gradlew build
如果一切正常,那么这次构建应该可以通过。 跑 :
./gradlew bootRun
现在,我们将在以下位置运行一个应用程序: http:// localhost:8080 /,但是由于我们尚未实现任何服务,因此它将提供一个404。为了使其正常工作,请添加一些代码。
注意:如果您使用的是postgres版本,则可能会出现以下错误:
java.sql.SQLFeatureNotSupportedException: Method org.postgresql.jdbc.PgConnection.createClob() is not yet implemented.
出现此异常是因为Atomikos支持的JPA(休眠)正在尝试验证PostgreSQL CLOB功能。 JDBC驱动程序未实现此功能,因此驱动程序会引发不重要的异常。 要解决此问题,请将以下内容添加到application.properties文件中:
spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true
这将禁用驱动程序的功能检测(无论如何我们都不会使用此功能)
步骤3:在产品服务中添加代码
现在我们的服务和数据库已设置完毕,我们可以开始为产品服务编写一些代码。 在“ com.anirudhbhatnagar.productService”包中创建一个名为“ domain”的包,并创建一个新的Java类“ Product”,其属性为:
id
name
description
sku
Lombok
我们将使用Lombok为我们的bean添加构造函数,getter,setter和builder方法。 要使用lombok,请将其依赖项添加到build.gradle文件中:
compileOnly 'org.projectlombok:lombok:1.18.4'
在“产品”类上添加注释
@Entity
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Getter
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;
private String description;
private String sku;
}
注释的含义:
1. @Entity告诉spring boot JPA将此类视为一个实体,并将其持久保存在数据库中。
2. @Builder –这个lmobok注释将builder方法添加到我们的类中,以使用Builder模式创建对象。 3. @AllArgsConstructor –此lmobok批注将所有参数构造函数添加到类中,Builder方法需要此方法。 4. @NoArgsConstructor –该lmobok批注为该类添加了默认构造函数,JPA需要此构造函数来获取实体。 5. @Getter –这个lombok注释将getters添加到类中的所有字段,这是获取产品的各个属性所必需的,Jackson也使用此方法对字段进行序列化/反序列化。
为了在数据库中创建该表,我们需要将jpa hibernate auto-ddl设置为true。 为此,将以下行添加到application.properties文件:
spring.jpa.hibernate.ddl-auto =创建
我们还在字段Id中添加了@GeneratedValue和@Id,以告诉hibernate在表中创建新条目时自动为id生成值。
添加控制器
添加一个控制器以实现公开的Web服务,并使用Jackson来对请求进行序列化/反序列化。 在“ com.anirudhbhatnagar.productService”包中创建一个名称为“ controller”的包,并在其中创建一个新的Java类“ ProductController”。
用“ @RestController”注释该类,以将该类扩展为公开Web服务的Servlet。 用注解“ @GetMapping”创建端点
@RestController
public class ProductController {
@GetMapping("/products")
public List getProducts() {
return Collections.EMPTY_LIST;
}
@PostMapping("/products")
public Product save(@RequestBody Product product) {
return null;
}
}
添加存储库
添加JPA存储库以将产品持久存储在数据库中。 在“ com.anirudhbhatnagar.productService”包中创建一个名称为“ repository”的包,并在其中创建一个新接口“ ProductRepository”:
public interface ProductRepository extends JpaRepository {
}
将productRepository注入ProductController,以便我们可以使用ProductController中的productRepository将在控制器中接收到的产品请求对象传递到存储库以进行获取和持久化。
@RestController
public class ProductController {
private ProductRepository productRepository;
@Autowired
public ProductController(ProductRepository productRepository) {
this.productRepository = productRepository;
}
@GetMapping("/products")
public List getProducts() {
return productRepository.findAll();
}
@PostMapping("/products")
public Product save(@RequestBody Product product) {
return productRepository.save(product);
}
}
现在,我们已经启动了产品服务,并在以下端点上运行:
GET / products –获取所有产品
POST / products –创建新产品
在这里查看整个代码。
Dockerise应用
在应用程序的根文件夹中创建一个名为“ dockerFile”的文件,并将以下内容添加到其中:
FROM openjdk:8-jdk-alpine
VOLUME /tmp
COPY build/libs/*.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
EXPOSE 8080
建立:
docker build .
跑 :
docker run -p 8080:8080 [image-id]
这应该在localhost:8080启动服务
测试应用程序:
使用邮递员或任何其他类似工具,提交此请求以创建产品:
Http POST http:// localhost:8080 / products。 标头:Content-Type application / json
{
"name" : "Nike shoes",
"description" : "mens shoes size 10",
"sku" : "1234asc"
}
可以通过以下方式获取产品:GET http:// localhost:8080 / products
在下一个研讨会中,我们将研究以下内容:
Spring Cloud,用于服务发现和客户端负载平衡的功能区
OpenFeign客户端
Kubernetes用于容器管理 API网关翻译自: https://www.javacodegeeks.com/2018/11/spring-microservices-docker-kubernetes.html