一、服务提供者与服务消费者
使用微服务构建的是分布式系统,微服务之间通过网络进行通信。我们使用服务提供者与服务消费者来描述微服务之间的调用关系。
名称
定义
服务提供者
服务的被调用方(为其他服务提供服务的服务)
服务消费者
服务的调用方(依赖其他服务的服务)
例如,在电影售票系统中,用户向电影微服务发起了一个购票的请求。在进行购票的业务操作前,电影微服务需要调用用户微服务的接口,查询当前用户的余额是多少,是不是符合购票标准等。在这种场景下,用户微服务就是一个服务提供者,电影微服务则是一个服务消费者。
就以该场景,先来编写一个用户微服务,然后编写一个电影微服务。
二、编写服务提供者
编写一个服务提供者(用户微服务),该服务可通过主键查询用户信息。开发测试阶段,使用Spring Data JPA作为持久化层框架,使用H2作为数据库。
创建一个Maven项目,它的ArtifactId是movieticketing-provider-user,对应pom.xml的内容如下:
4.0.0
com.bingbinlee.springcloud
movieticketing-provider-user
jar
1.0-SNAPSHOT
org.springframework.boot
spring-boot-starter-parent
1.4.3.RELEASE
UTF-8
1.8
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-data-jpa
com.h2database
h2
org.springframework.boot
spring-boot-starter-actuator
org.springframework.cloud
spring-cloud-starter-eureka
org.springframework.cloud
spring-cloud-dependencies
Camden.SR4
pom
import
org.springframework.boot
spring-boot-maven-plugin
其中,spring-boot-starter-web提供了SpringMVC的支持;spring-boot-starter-data-jpa提供了Spring Data JPA的支持。
在项目中建立文件夹DB存放schema.sql,内容如下:
drop table user if exists;
create table user (
id bigint generated by default as identity,
username varchar(40),
name varchar(20),
age int(3),
balance decimal(10,2),
primary key(id)
);
insert into user (id, username, name, age, balance) values(1, 'user1', "张三", 20, 100.00);
insert into user (id, username, name, age, balance) values(2, 'user2', "李四", 30, 200.00);
insert into user (id, username, name, age, balance) values(3, 'user3', "王麻子", 40, 300.00);
创建用户实体类:
package com.bingbinlee.springcloud.micro.entity;
import javax.persistence.*;
import java.math.BigDecimal;
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column
private String username;
@Column
private String name;
@Column
private Integer age;
@Column
private BigDecimal balance;
public Long getId() {
return this.id;
}
public void setId(Long id) {
this.id = id;
}
public String getUsername() {
return this.username;
}
public void setUsername(String username) {
this.username = username;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return this.age;
}
public void setAge(Integer age) {
this.age = age;
}
public BigDecimal getBalance() {
return this.balance;
}
public void s