我们先使用Spring Boot实现一个微服务,业务非常简单:
1.商品微服务,通过商品id查询商品的微服务
2.订单微服务,通过订单id查询订单数据,同时需要调用商品微服务查询出订单详情数据对应的商品数据。
说明:
1.对于商品微服务而言,商品微服务是服务的提供者,订单微服务是服务的消费者。
2.对于订单微服务而言,订单微服务是服务的提供者,人是服务的消费者。
商品微服务的实现
我们新建一个Maven项目,然后开始编码(工具使用的IntelliJ IDEA,版本为2017.3)。首先修改配置信息:
pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.test</groupId>
<artifactId>MySpringCloudProject01</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<java.version>1.8</java.version>
</properties>
<!-- 配置信息 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.14.RELEASE</version>
</parent>
<dependencies>
<!-- 加入web的支持 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>
application.properties中配置端口:
server.port=8081
然后编写相关代码:
实体类Item.java:
public class Item {
private Long id; //唯一标识
private String title; //商品标题
private String pic; //图片的pic地址
private String desc; //描述信息
private Long price; //价格
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getPic() {
return pic;
}
public void setPic(String pic) {
this.pic = pic;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public Long getPrice() {
return price;
}
public void setPrice(Long price) {
this.price = price;
}
public Item() {
}
public Item(Long id, String title, String pic, String desc, Long price) {
this.id = id;
this.title = title;
this.pic = pic;
this.desc = desc;
this.price = price;
}
@Override
public String toString() {
return "Item{" +
"id=" + id +
", title='" + title + '\'' +
", pic='" + pic + '\'' +
", desc='" + desc + '\'' +
", price=" + price +
'}';
}
}
ItemService.java:
@Service
public class ItemService {
private static final Map<Long, Item> MAP = new HashMap <Long, Item>();
//准备一些假数据
static {
MAP.put(1L, new Item(1L, "商品标题1", "http://pic1", "description1", 1000L));
MAP.put(2L, new Item(2L, "商品标题2", "http://pic2", "description2", 2000L));
MAP.put(3L, new Item(3L, "商品标题3", "http://pic3", "description3", 3000L));
MAP.put(4L, new Item(4L, "商品标题4", "http://pic4", "description4", 4000L));
MAP.put(5L, new Item(5L, "商品标题5", "http://pic5", "description5", 5000L));
MAP.put(6L, new Item(6L, "商品标题6", "http://pic6", "description6", 6000L));
}
/**
* 根据商品id查询数据
* @param id
* @return
*/
public Item queryItemById(Long id){
return MAP.get(id);
}
}
ItemController.java:
@RestController
public class ItemController {
@Autowired
private ItemService itemService;
//@RequestMapping(value = "/item/id", method = RequestMethod.GET)
@GetMapping(value = "/item/{id}")
public Item queryItemById(@PathVariable(name = "id") Long id){
return itemService.queryItemById(id);
}
}
启动类App.java:
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
【注意:启动类在最外层的包中(启动会扫描启动类所在的包和子包中的类)】
代码效果:
启动App.java,然后在浏览器中输入http://localhost:8081/item/1,然后看到如下结果:
项目结构图如下:
订单微服务的实现
我们新建一个maven项目,然后pom.xml中配置信息和上面商品的相同。
application.properties:
server.port=8082
itcast.item.url=http://localhost:8081/item/
相关代码:
实体类Order.java:
public class Order {
private String orderId; //订单id
private Long userId; //用户id
private Date createDate; //创建时间
private Date updateDate; //修改时间
private List<OrderDetail> orderDetails; //订单详情
public String getOrderId() {
return orderId;
}
public void setOrderId(String orderId) {
this.orderId = orderId;
}
public Long getUserId() {
return userId;
}
public void setUserId(Long userId) {
this.userId = userId;
}
public Date getCreateDate() {
return createDate;
}
public void setCreateDate(Date createDate) {
this.createDate = createDate;
}
public Date getUpdateDate() {
return updateDate;
}
public void setUpdateDate(Date updateDate) {
this.updateDate = updateDate;
}
public List <OrderDetail> getOrderDetails() {
return orderDetails;
}
public void setOrderDetails(List <OrderDetail> orderDetails) {
this.orderDetails = orderDetails;
}
public Order() {
}
public Order(String orderId, Long userId, Date createDate, Date updateDate, List <OrderDetail> orderDetails) {
this.orderId = orderId;
this.userId = userId;
this.createDate = createDate;
this.updateDate = updateDate;
this.orderDetails = orderDetails;
}
@Override
public String toString() {
return "Order{" +
"orderId='" + orderId + '\'' +
", userId=" + userId +
", createDate=" + createDate +
", updateDate=" + updateDate +
", orderDetails=" + orderDetails +
'}';
}
}
实体类OrderDetail.java:
public class OrderDetail {
private String orderId; //订单id
private Item item; //商品
public String getOrderId() {
return orderId;
}
public void setOrderId(String orderId) {
this.orderId = orderId;
}
public Item getItem() {
return item;
}
public void setItem(Item item) {
this.item = item;
}
public OrderDetail() {
}
public OrderDetail(String orderId, Item item) {
this.orderId = orderId;
this.item = item;
}
@Override
public String toString() {
return "OrderDetail{" +
"orderId='" + orderId + '\'' +
", item=" + item +
'}';
}
}
把上面的Item.java也拷贝到Order和OrderDetail所在包下。
OrderController.java:
@RestController
public class OrderController {
@Autowired
private OrderService orderService;
@GetMapping(value = "/order/{orderId}")
public Order queryOrderById(@PathVariable(name = "orderId") String orderId){
return orderService.queryOrderById(orderId);
}
}
OrderService.java:
@Service
public class OrderService {
private static final Map<String, Order> MAP = new HashMap<String, Order>();
static {
//构造测试数据
Order order = new Order();
order.setOrderId("12345");
order.setCreateDate(new Date());
order.setUpdateDate(order.getCreateDate());
order.setUserId(1L);
//构建OrderDetail集合对象
List<OrderDetail> orderDetails = new ArrayList <OrderDetail>();
//此处没有商品的数据,需要使用商品微服务来获取
Item item = new Item();
item.setId(1L);
orderDetails.add(new OrderDetail(order.getOrderId(), item));
item = new Item();
item.setId(2L);
orderDetails.add(new OrderDetail(order.getOrderId(), item));
//将OrderDetail数据集合设置给Order对象
order.setOrderDetails(orderDetails);
//将Order对象添加到Map中
MAP.put(order.getOrderId(), order);
}
@Autowired
ItemService itemService;
/**
* 根据订单id查询商品数据
* @param orderId
* @return
*/
public Order queryOrderById(String orderId){
Order order = MAP.get(orderId);
/**
* 获取Order对象中所有的OrderDetail,然后进行遍历,获取每一个OrderDetail对象,
* 然后从OrderDetail对象中获取商品id,然后调用商品微服务查询商品信息
*/
List<OrderDetail> orderDetails = order.getOrderDetails();
for (OrderDetail orderDetail: orderDetails) {
Long id = orderDetail.getItem().getId();
Item item = itemService.queryItemById(id);
orderDetail.setItem(item);
}
//返回
return order;
}
}
将上面的ItemService拷贝到OrderService所在包下。
启动类App.java:
@SpringBootApplication
public class App {
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
然后我们测试一下,在启动了商品的App.java后,再启动订单的App.java,启动成功后,在浏览器中输入:http://localhost:8082/order/12345 ,我们可以看到以下效果:
项目结构图如下:
这样,一个简单的项目便完成了。
注:以上为【黑马程序员|java进阶教程Spring Cloud微服务解决方案】视频的学习笔记,侵删。