無廢話7小時學會使用Spring Cloud Alibaba(4)OpenFeign使用

一 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


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章