Spring Cloud學習筆記之微服務實現(一)(Spring Boot+IDEA)
我們先使用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微服務解決方案】視訊的學習筆記,侵刪。