1. 程式人生 > >Spring Cloud學習筆記之微服務實現(一)(Spring Boot+IDEA)

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微服務解決方案】視訊的學習筆記,侵刪。