SpringCloud 微服務消費者之間相互調用的方式


在微服務架構中,業務都會被拆分成一個獨立的服務。Spring cloud有兩種服務調用方式,一種是ribbon+restTemplate,另一種是feign

搭建服務注冊中心可以參考:https://www.cnblogs.com/wanghy898/p/11167301.html 啟動服務注冊中心

啟動配置中心服務可以參考:https://www.cnblogs.com/wanghy898/p/11167465.html 啟動分布式配置中心

自己在git服務器上新建自己的配置文件:

新建兩個springboot項目sell-product和sell-order兩個服務並分別在2個服務的pom.xml文件中引入核心依賴:

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</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-bus-amqp</artifactId>
</dependency>
<!-- alibaba的druid數據庫連接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.14</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>

<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.4</version>
</dependency>


在sell-produc服務中的bootstrap.yml文件中添加配置信息:

server:
  port: 8083
#以下是從統一配置中心獲取
spring:
  application:
    name: product
 # 由於配置了公共配置 所以直接從公共配置中心拉取即可
  cloud:
    config:
      discovery:
        enabled: true
        service-id: SELL-CONFIG #代表引用公共配置服務
      profile: dev #此處生產環境也可以不用填寫

在sell-order服務中的bootstrap.yml文件中添加配置信息:

server: port: 8084 #以下是從統一配置中心獲取 spring: application: name: order # 由於配置了公共配置 所以直接從公共配置中心拉取即可 cloud: config: discovery: enabled: true service-id: SELL-CONFIG #代表引用公共配置服務 profile: dev #此處生產環境也可以不用填寫

運行sql腳本(mysql)創建 product表和order表,數據隨便插入幾條測試

--------------------product表------------------------------

CREATE TABLE `product_info` (
`product_id` varchar(32) NOT NULL,
`product_name` varchar(64) NOT NULL COMMENT '商品名稱',
`product_price` decimal(8,2) NOT NULL COMMENT '單價',
`product_stock` int(11) NOT NULL COMMENT '庫存',
`product_description` varchar(64) DEFAULT NULL COMMENT '描述',
`product_icon` varchar(512) DEFAULT NULL COMMENT '小圖',
`product_status` tinyint(3) DEFAULT '0' COMMENT '商品狀態,0正常1下架',
`category_type` int(11) NOT NULL COMMENT '類目編號',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改時間',
PRIMARY KEY (`product_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--------------------order表------------------------------

CREATE TABLE `order_master` (
`order_id` varchar(32) NOT NULL,
`buyer_name` varchar(32) NOT NULL COMMENT '買家名字',
`buyer_phone` varchar(32) NOT NULL COMMENT '買家電話',
`buyer_address` varchar(128) NOT NULL COMMENT '買家地址',
`buyer_openid` varchar(64) NOT NULL COMMENT '買家微信openid',
`order_amount` decimal(8,2) NOT NULL COMMENT '訂單總金額',
`order_status` tinyint(3) NOT NULL DEFAULT '0' COMMENT '訂單狀態, 默認為新下單',
`pay_status` tinyint(3) NOT NULL DEFAULT '0' COMMENT '支付狀態, 默認未支付',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改時間',
PRIMARY KEY (`order_id`),
KEY `idx_buyer_openid` (`buyer_openid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

sell-product服務中實體類Product:

@Data
@TableName("product_info")
public class Product {

    private String productId;

    private String productName;

    private BigDecimal productPrice;

    private int productStock;

    private String productDescription;

    private String productIcon;

    private int productStatus;

    private int categoryType;

    private Date createTime;

    private Date updateTime;

}
View Code

sell-order服務中實體類Order:

import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

@TableName("order_master")
@Data
public class Order {

    private String orderId;

    private String buyerName;

    private String buyerPhone;

    private String buyerAddress;

    private String buyerOpenid;

    private String orderAmount;

    private String orderStatus;

    private String payStatus;

    private String createTime;

    private String updateTime;

}
View Code

sell-order服務中mapper:

import com.baomidou.mybatisplus.core.mapper.BaseMapper; import wanghy.com.cn.entity.Order; public interface OrderMapper extends BaseMapper<Order> { }

sell-product服務中mapper:

import com.baomidou.mybatisplus.core.mapper.BaseMapper; import wanghy.com.cn.entity.Product; public interface ProductMapper extends BaseMapper<Product> { }

sell-product服務 service層實現

public class ProductServiceImpl implements IProductService {

    @Autowired
    private ProductMapper productMapper;

    @Override
    public ServerResponse<Object> getProducts() {

        QueryWrapper<Product> queryWrapper = new QueryWrapper<>();
        List<Product> products = productMapper.selectList(queryWrapper);
        return ServerResponse.sucess("獲取產品列表成功", products);
    }
}

sell-order服務 service層實現

@Service
public class OrderServiceImpl implements IOrderService {

    @Autowired

    private OrderMapper orderMapper;

    @Override
    public ServerResponse<Object> getOrders() {
        QueryWrapper<Order> wrapper = new QueryWrapper<>();
        List<Order> orders = orderMapper.selectList(wrapper);
        return ServerResponse.sucess("獲取數據成功",orders);
    }
}

在sell-order服務的controller中想調用sell-product服務中的服務:

方式一:在sell-order服務中通過rest的方式調用sell-product服務:

@RestController
@RequestMapping("/order")
@Slf4j
public class OrderController {

@Autowired
private RestTemplate restTemplate;

@RequestMapping("/orderList")
public ServerResponse<Object> getOrders() {

Object object = restTemplate.getForObject("http://PRODUCT/product/productList",String.class);
log.info("數據為:{}",object);
return object;
}
}

方式二:在sell-order服務中通過feign的方式調用sell-product服務:

創建一個包feignClients,再創建一個interface ProductClient

@FeignClient(name = "PRODUCT") public interface ProductClient { @RequestMapping("/product/productList") public Object getProducts(); }

然后在controller中調用即可

@RestController @RequestMapping("/order") @Slf4j public class OrderController {  @Autowired private ProductClient productClient;
@RequestMapping("/products") public Object getProductInfoList() { Object object = productClient.getProducts(); return ServerResponse.sucess("成功", object); } }

在啟動類中加入

在兩個服務的啟動類中都加入以下依賴:

@SpringCloudApplication //替代@SpringBootApplication @EnableDiscoveryClient
@MapperScan("wanghy.com.cn.mapper") //掃描mappper
@EnableFeignClients(basePackages = "wanghy.com.cn.feinClients") //加上此注解用於feign client的調用
public class SellProductApplication { public static void main(String[] args) { SpringApplication.run(SellProductApplication.class, args); }
    @Bean
@LoadBalanced //基於rest+ribbon的調用方式需要加此注解
    public RestTemplate restTemplate(){
return new RestTemplate();
}
}

 啟動進行測試。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM