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微服务解决方案】视频的学习笔记,侵删。

猜你喜欢

转载自blog.csdn.net/wangruoao/article/details/83027470
今日推荐