1.项目构建
1.1 新建module
接下来,我们进行服务模块的构建:


2.sp02-itemservice 商品服务

2.1 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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>springcloud1</artifactId>
<groupId>cn.study</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>sp02-itemservice</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>sp02-itemservice</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<!--依sp01-commons公共类-->
<groupId>cn.study</groupId>
<artifactId>sp01-commons</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-bus</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream-binder-rabbit</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
</dependencies>
</project>
2.2 application.yml
# application.yml
# yml - yaml - yet another markup language
# 腋毛
# 向注册中心注册的名字
spring:
application:
name: item-service
# item 8001, user 8101, order 8201
server:
port: 8001
2.3 ItemServiceImpl
package cn.study.sp02.service;
import cn.study.entity.Item;
import cn.study.service.ItemService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
@Service
@Slf4j
public class ItemServiceImpl implements ItemService {
@Override
public List<Item> getItems(String orderId) {
log.info("获取订单商品列表,orderId="+orderId);
List<Item> list = new ArrayList<>();
list.add(new Item(1, "商品1", 1));
list.add(new Item(2, "商品2", 5));
list.add(new Item(3, "商品3", 2));
list.add(new Item(4, "商品4", 4));
list.add(new Item(5, "商品5", 1));
return list;
}
@Override
public void decreaseNumber(List<Item> items) {
for (Item item : items) {
log.info("减少库存:"+item);
}
}
}
2.4 ItemController
package cn.study.sp02.controller;
import cn.study.entity.Item;
import cn.study.service.ItemService;
import cn.study.web.util.JsonResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@Slf4j
public class ItemController {
@Autowired
private ItemService itemService;
// 获取订单的商品列表
@GetMapping("/{orderId}")
public JsonResult<List<Item>> getItems(
@PathVariable String orderId) {
List<Item> items = itemService.getItems(orderId);
return JsonResult.build().code(200).data(items);
}
// 减少商品库存
// @RequestBody 接收 post 请求的协议体数据
@PostMapping("/decreaseNumber")
public JsonResult<?> decreaseNumber(
@RequestBody List<Item> items) {
itemService.decreaseNumber(items);
return JsonResult.build().code(200).msg("减少库存成功");
}
//空方法,只是为了处理图标请求,所有网站的图标都默认放在此目录,可以自行进行测试
@GetMapping("/favicon.ico")
public void ico(){
}
}
2.5 Spring MVC 接收参数的几个注解

2.6 访问测试
根据orderid,查询商品:http://localhost:8001/8

减少商品库存:http://localhost:8001/decreaseNumber

使用postman,POST发送以下格式数据:[{"id":1, "name":"abc", "number":23},{"id":2, "name":"def", "number":11}]

在主项目SpringCloud1下新建api.http:

3.sp03-userservice 用户服务


3.1 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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>springcloud</artifactId>
<groupId>cn.study</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>sp03-userservice</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>sp03-userservice</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<!--依sp01-commons公共类-->
<groupId>cn.study</groupId>
<artifactId>sp01-commons</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-bus</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream-binder-rabbit</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
</dependencies>
</project>
3.2 application.yml
- 其中 sp.user-service.users 属性为自定义属性,提供用于测试的用户数据
# 应用名称
spring:
application:
name: user-service
# 应用服务 WEB 访问端口
# 8001 8101 8201
server:
port: 8101
# 自定义配置属性
# 用户的demo数据(测试用的数据)
# 用json格式 "[{7,abc,123},{8...},{9...}]"
sp:
user-service:
users: "[{\"id\":7, \"username\":\"abc\",\"password\":\"123\"},
{\"id\":8, \"username\":\"def\",\"password\":\"456\"},
{\"id\":9, \"username\":\"ghi\",\"password\":\"789\"}]"
eureka:
client:
service-url:
# 可以从云服务商购买不同地点的注册中心服务器
defaultZone: http://eureka1:2001/eureka
3.3 UserServiceImpl
package cn.study.sp03.service;
import cn.study.entity.User;
import cn.study.service.UserService;
import cn.study.web.util.JsonUtil;
import com.fasterxml.jackson.core.type.TypeReference;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
@Slf4j
public class UserServiceImpl implements UserService {
@Value("${sp.user-service.users}")
private String userJson;
@Override
public User getUser(Integer userId) {
// userJson-->List<User>
//jackson api提供了可以直接转换List<User>的方法,利用继承的语法来写转换类型
List<User> list = JsonUtil.from(userJson, new TypeReference<List<User>>() {});
//遍历集合,查找用户id是useId的用户,找到直接返回
for (User user : list) {
if(user.getId().equals(userId)){
return user;
}
}
//找不到,没有这个用户的话,直接返回一个写死的用户
return new User(userId,"用户名"+userId,"密码"+userId);
}
@Override
public void addScore(Integer userId, Integer score) {
log.info("增加用户积分,userId="+userId+",score="+score);
}
}
3.4 UserController
package cn.study.sp03.controller;
import cn.study.entity.User;
import cn.study.service.UserService;
import cn.study.web.util.JsonResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@RestController
@Slf4j
public class UserController {
@Autowired
private UserService userService;
//获取用户
@GetMapping("/{userId}")
public JsonResult<User> getUser(@PathVariable Integer userId){
User user = userService.getUser(userId);
return JsonResult.build().code(200).data(user);
}
//增加积分
//访问路径:http://localhost:8101/8/score?score=1000
@GetMapping("/{userId}/score")
public JsonResult<?> addScore(@PathVariable Integer userId,
Integer score) {
userService.addScore(userId, score);
return JsonResult.build().code(200).msg("增加积分成功");
}
//空方法,只是为了处理图标请求
@GetMapping("/favicon.ico")
public void ico(){
}
}
3.5 访问测试
根据userid查询用户信息:http://localhost:8101/8

根据userid,为用户增加积分:http://localhost:8101/8/score?score=100

4.sp04-orderservice 订单服务


4.1 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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>springcloud</artifactId>
<groupId>cn.study</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>sp04-orderservice</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>sp04-orderservice</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>cn.study</groupId>
<artifactId>sp01-commons</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-bus</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream-binder-rabbit</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
</dependencies>
</project>
4.2 application.yml
# 应用名称
spring:
application:
name: order-service
# 应用服务 WEB 访问端口
server:
port: 8201
eureka:
client:
service-url:
# 可以从云服务商购买不同地点的注册中心服务器
defaultZone: http://eureka1:2001/eureka
4.3 OrderServiceImpl
package cn.study.sp04.service;
import cn.study.entity.Order;
import cn.study.service.OrderService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@Service
@Slf4j
public class OrderServicerImpl implements OrderService {
// TODO: (标准注释格式,表示未来要完成的工作)
// TODO: 远程调用商品,获取商品列表
// TODO: 远程调用用户,获取用户数据
@Override
public Order getOrder(String orderId) {
log.info("获取订单,orderId="+orderId);
Order order = new Order();
order.setId(orderId);
//order.setItems(商品列表);
//order.setUser(用户);
return order;
}
@Override
public void addOrder(Order order) {
log.info("添加订单:"+order);
// TODO: 远程调用商品,减少库存
// TODO: 远程调用用户,增加积分
}
}
4.4 OrderController
package cn.study.sp04.controller;
import cn.study.entity.Item;
import cn.study.entity.Order;
import cn.study.entity.User;
import cn.study.service.OrderService;
import cn.study.web.util.JsonResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import java.util.Arrays;
@RestController
@Slf4j
public class OrderController {
@Autowired
private OrderService orderService;
@GetMapping("/{orderId}")
public JsonResult<Order> getOrder(@PathVariable String orderId){
Order order = orderService.getOrder(orderId);
return JsonResult.build().code(200).data(order);
}
@GetMapping("/add")
public JsonResult<?> addOrder(){
Order order = new Order();
order.setId("as4df65s4f6sa46f4sa6");
order.setItems(Arrays.asList(new Item[]{
new Item(1,"商品1",1),
new Item(2,"商品2",2),
new Item(3,"商品3",3),
new Item(4,"商品4",4),
new Item(5,"商品5",5),
new Item(6,"商品6",6)
}));
order.setUser(new User(8,null,null));
orderService.addOrder(order);
return JsonResult.build().code(200).msg("添加订单成功");
}
//空方法,只是为了处理图标请求
@GetMapping("/favicon.ico")
public void ico(){
}
}
4.5 访问测试
根据orderid,获取订单:http://localhost:8201/123abc

保存订单,观察控制台日志输出:http://localhost:8201/add

本文详细介绍了如何使用SpringBoot构建三个微服务项目,包括sp02-itemservice商品服务、sp03-userservice用户服务和sp04-orderservice订单服务,涉及POM.xml配置、YAML应用配置、服务实现与控制器,以及Eureka服务发现和SpringMVC注解的使用。
418

被折叠的 条评论
为什么被折叠?



