一 OpenFeign的作用
聲明式Http客戶端,用於微服務之間的調用,集成Ribbon的負載均衡。
二 用戶微服務
1.entity
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Date;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder(toBuilder = true)
@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
public class User implements Serializable{
//實體參數
private String id;
private String name;
private Integer money;
private Date createTime;
}
2.dao
import com.study.cloudalibaba.entity.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Update;
@Mapper
public interface UserDao {
@Update("UPDATE t_user SET money=money-#{money} WHERE id=#{id}")
public void decrease(User user);
}
3.service
import com.study.cloudalibaba.dao.UserDao;
import com.study.cloudalibaba.entity.User;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service
public class UserService {
@Resource
private UserDao userDao;
public void decrease(User user){
userDao.decrease(user);
}
}
4.controller
import com.study.cloudalibaba.entity.User;
import com.study.cloudalibaba.service.UserService;
import com.study.cloudalibaba.vo.JsonVo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@RestController
@Slf4j
public class UserController {
@Resource
private UserService userService;
@RequestMapping(value = "/user/decrease")
public JsonVo<User> decrease(@RequestParam("id") String id,@RequestParam("money") Integer money) {
userService.decrease(User.builder().id(id).money(money).build());
JsonVo<User> result = JsonVo.<User>builder()
.code(200)
.message("扣減餘額成功")
.build();
return result;
}
}
三 商品微服務
1.entity
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Date;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder(toBuilder = true)
@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
public class Product implements Serializable{
//實體參數
private String id;
private String name;
private Integer price;
private Integer stock;
private Date createTime;
}
2.dao
import com.study.cloudalibaba.entity.Product;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Update;
@Mapper
public interface ProductDao {
@Update("UPDATE t_product SET stock=stock-#{stock} WHERE id=#{id}")
public void decrease(Product product);
}
3.service
import com.study.cloudalibaba.dao.ProductDao;
import com.study.cloudalibaba.entity.Product;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service
public class ProductService {
@Resource
private ProductDao productDao;
public void decrease(Product product){
productDao.decrease(product);
}
}
4.controller
import com.study.cloudalibaba.entity.Product;
import com.study.cloudalibaba.service.ProductService;
import com.study.cloudalibaba.vo.JsonVo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@RestController
@Slf4j
public class ProductController {
@Resource
private ProductService productService;
@RequestMapping(value = "/product/decrease")
public JsonVo<Product> decrease(@RequestParam("id") String id,@RequestParam("stock") Integer stock) {
productService.decrease(Product.builder().id(id).stock(stock).build());
JsonVo<Product> result = JsonVo.<Product>builder()
.code(200)
.message("扣減庫存成功")
.build();
return result;
}
}
四 訂單微服務
1.entity
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Date;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder(toBuilder = true)
@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
public class Order implements Serializable{
//實體參數
private String id;
private String userId;
private String productId;
private Integer amount;
private Date createTime;
}
2.dao
import com.study.cloudalibaba.entity.Order;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Update;
@Mapper
public interface OrderDao {
@Insert("INSERT INTO t_order (id, userId, productId,amount,createTime) VALUES (#{id}, #{userId}, #{productId},#{amount},#{createTime})")
public void save(Order order);
}
3.service
import com.study.cloudalibaba.dao.OrderDao;
import com.study.cloudalibaba.entity.Order;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service
public class OrderService {
@Resource
private OrderDao orderDao;
@Resource
private UserFeignService userFeignService;
@Resource
private ProductFeignService productFeignService;
public void save(Order order){
//這個只是測試,用戶買了1件商品,花了10塊錢
//添加訂單
orderDao.save(order);
//扣賬戶餘額
userFeignService.decrease(order.getUserId(),10);
//扣庫存數量
productFeignService.decrease(order.getProductId(),order.getAmount());
}
}
import com.study.cloudalibaba.vo.JsonVo;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
@FeignClient(value = "cloudalibaba-user")
public interface UserFeignService {
@PostMapping(value = "/user/decrease")
JsonVo decrease(@RequestParam("id") String id,@RequestParam("money") Integer money);
}
import com.study.cloudalibaba.vo.JsonVo;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
@FeignClient(value = "cloudalibaba-product")
public interface ProductFeignService {
@PostMapping(value = "/product/decrease")
JsonVo decrease(@RequestParam("id") String id, @RequestParam("stock") Integer stock);
}
4.controller
import com.study.cloudalibaba.entity.Order;
import com.study.cloudalibaba.service.OrderService;
import com.study.cloudalibaba.vo.JsonVo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.Date;
import java.util.UUID;
@RestController
@Slf4j
public class OrderController {
@Resource
private OrderService orderService;
@RequestMapping(value = "/order/save")
public JsonVo<Order> save(@RequestParam("userId") String userId,@RequestParam("productId") String productId,@RequestParam("amount") Integer amount) {
orderService.save(Order.builder()
.id(UUID.randomUUID().toString().replaceAll("-",""))
.userId(userId)
.productId(productId)
.amount(amount)
.createTime(new Date())
.build());
JsonVo<Order> result = JsonVo.<Order>builder()
.code(200)
.message("下訂單成功")
.build();
return result;
}
}
五 IDEA 開啓Run Dashboard管理
1.找到右上角面板,選擇Edit Configurations
2.選擇Templates,點擊右邊的+號,選擇Spring Boot,點確定
依次啓動用戶微服務,商品微服務,訂單微服務
六 將用戶微服務,商品微服務,訂單微服務分別上傳到192.168.1.1,192.168.1.2,192.168.1.3服務器,並分別啓動
nohup java -jar cloudalibaba-user.jar >log.file 2>&1 &
nohup java -jar cloudalibaba-product.jar >log.file 2>&1 &
nohup java -jar cloudalibaba-order.jar >log.file 2>&1 &
隨便訪問1臺服務器測試:http://192.168.1.1:9003/order/save?userId=1&productId=1&amount=1