接下来,我们使用Spring Boot来搭建一个微服务程序,程序的结构如图1-10所示。
图1-10
首先新建一个Project,使用Spring Initializr来引入依赖,如图1-11所示。
图1-11
点击“Next”按钮,在新窗口关于项目描述的栏目中填入以下信息:
· Group:输入项目的包名。
· Aritifact:输入项目的名称。
· Version:版本信息,默认0.0.1-SNAPSHOT。
其他信息默认即可。
填入项目信息之后,需要在项目中添加依赖,勾选Spring Web模块,如图1-12所示。
图1-12
导入以后,建议在pom.xml文件后面,添加aliyun的Maven仓库地址,可以更快地下载依赖:
因为案例需要访问数据库表,还需要引入spring-boot-starter-data-jpa、com.h2database等依赖包,完整依赖部分的pom.xml代码如下所示:
示例代码1-16 pom.xml
在classpath下添加两个文件:
· schema.sql:是默认创建数据表的SQL文件。
· data.sql:是默认初始化数据的SQL文件。
两个文件在项目中的位置如图1-13所示。
图1-13
本案例以电影数据为例,首先创建一张电影表movie,并插入几条影片数据。
在classpath:schema.sql中添加以下内容:
示例代码1-17 schema.sql
drop table movie if exists; create table movie( id bigint generated by default as identity, name varchar(50), author varchar(50) );
注意
本案例采用的数据库是H2,H2是一个用Java开发的嵌入式数据库,它本身只是一个类库,即只有一个jar文件,可以直接嵌入到应用项目中。Generated by default as identify为H2的语法,意思是指id的值为自动生成。
在classpsth:data.sql中添加以下初始化数据:
insert into movie values(1,'红高粱','张艺谋'); insert into movie values(2,'让子弹飞一会儿','姜文');
开发与数据库表movie对应的实体类Movie,代码如下:
示例代码1-18 Movie.java
package cn.mrchi.springcloud.entity; //导入的包略… @Entity @Table(name="movie") public class Movie { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private Long id; @Column private String name; @Column private String author; //get/set方法略… }
注意DAO接口是JpaRepository的子类,具体作用是访问数据库,代码如下:
示例代码1-19 pom.xml
package cn.mrchi.springcloud.repository; //省略一些imports… @Repository(value="movieRepository") public interface MovieRepository extends JpaRepository<Movie, Long> { }
JpaRepository接口包含CRUD等操作,来自于Spring Data JPA。Spring Data JPA是在实现了JPA规范的基础上封装的一套JPA应用框架。虽然ORM框架都实现了JPA规范,但是在不同的ORM框架之间切换,仍然需要编写不同的代码;而使用Spring Data JPA能够方便我们在不同的ORM框架之间进行切换,而不需要更改代码。Spring Data JPA旨在通过统一ORM框架的访问持久层的操作,来提高开发效率。Spring Data JPA提供了许多供开发者使用的接口,而JpaRepository是开发中最常使用的接口,主要继承了PagingAndSortRepository,对返回值类型做了适配。
业务层对应的MovieService代码如下:
示例代码1-20 MovieService.java
注意
需要将movieRepository注入到Service。
最后开发控制层的Controller类,里面定义方法访问某个id对应的电影,代码如下:
示例代码1-21 MovieController.java
classpath目录下的application.properties或application.yml都可以作为Spring Boot的配置文件。其中application.yml语言的操作更方便,且在开发环境下,还可以提示帮助。yml配置文件在项目中位置如图1-14所示。
图1-14
添加以下内容,注意缩进格式:
示例代码1-22 application.yml(文件中部分代码)
修改类SpringcloudMovieServerApplication,添加一些注解,代码如下:
示例代码1-23 SpringcloudMovieServerApplication.java
@EntityScan用来扫描和发现指定包及其子包中的Entity定义,@EnableJpaRepositories用来扫描和发现指定包及其子包中的Repository定义。如果多处使用@EnableJpaRepositories,它们的basePackages集合不能有交集,并且要能覆盖所有需要的Repository定义。
在SpringcloudMovieServerApplication类上右击,在弹出的快捷菜单中选择Run选项,如图1-15所示。
图1-15
启动成功以后,显示如图1-16所示。
图1-16
访问:
http://localhost:6789/movie/1 http://localhost:6789/movie/2
显示结果:
{"id":2,"name":"让子弹飞一会儿","author":"姜文"}
至此,Spring Boot程序已经开发完成了。
首先新建一个Project,使用Spring Initializr来引入依赖,如图1-17所示。
图1-17
这里只需要Web模块即可,只涉及Server端的访问。
创建一个与Server端相同的JavaBean,只是不需要添加JPA的注解。
示例代码1-24 Movie .java
package cn.mrchi.springcloud.entity; public class Movie { private Long id; private String name; private String author; }
客户端Controller代码是通过Restful方式对服务端进行调用的,此处采用了RestTemplate类进行调用,具体代码如下:
示例代码1-25 MovieClientController.java
上面的URL是通过硬编码写到代码中的,当然URL也可以配置到application.yml中,文件中添加如下内容:
#用户配置 movie: url: http://localhost:6789/movie/
然后就可以在Controller中引用movie.url了,代码如下:
修改classpath:application.yml配置文件,因为这是一个Web应用,所以只需要配置端口即可,项目根目录下找到配置文件,如图1-18所示。
图1-18
内容如下:
server: port: 6799
以下实现两个操作:
(1)添加@ComponentScan注解。
(2)使用@Bean声明RestTemplate的SpringBean。
具体启动类代码如下:
示例代码1-26 SpringcloudMovieClientApplication.java
RestTemplate是Spring用于同步Client端的核心类,它简化了与HTTP服务的通信,并满足Restful原则,程序代码可以给它提供URL,并提取结果。默认情况下,RestTemplate默认依赖JDK的HTTP连接工具。当然我们也可以通过setRequestFactory属性切换到不同的HTTP源,比如Apache HttpComponents、Netty和OkHttp。此处RestTemplate主要用来访问Server端程序。
@ComponentScan注解用来扫描basePackage下面所有带有@Component的类。
访问客户端地址:http://localhost:6799/movie/client/2。
注意访问的端口为6799。
返回:
{"id":2,"name":"让子弹飞一会儿","author":"姜文"}
至此,一个完整的Spring Boot程序就完成了。这里的客户端和服务端是两个不同的微服务,通过RestTemplate可以进行访问。