当前位置:首页 > 编程笔记 > 正文
已解决

实用篇-服务拆分及远程调用

来自网友在路上 150850提问 提问时间:2023-10-27 15:25:32阅读次数: 50

最佳答案 问答题库508位专家为你答疑解惑

一、服务拆分

服务拆分(也叫项目拆分)

注意事项:

  • 不同的微服务,不要重复开发相同的业务
  • 要求微服务之间数据独立,不要访问其他微服务的数据库
  • 微服务可用将自己的业务暴漏为接口,供其他服务调用

1. Cloud-Demo拆分

首先有一个已经写好的项目工程,为cloud-demo.zip,需要把这个压缩包解压并导入进idea,然后就是根据功能来拆分这个项目。这个项目的原有结构如下:

cloud-demo是父工程,里面有两个模块是order-service、user-service,这俩模块分别的作用是根据id查询订单、根据id查询用户。这俩模块就是所谓的微服务,分是订单服务和用户服务

项目下载地址:https://download.csdn.net/download/m0_63732435/88475934

2. SQL导入

项目SQL文件下载地址:https://download.csdn.net/download/m0_63732435/88475940

3. IEDA导入项目

IDEA打开文件夹,然后连接数据库

启动服务,分别启动OrderApplication和UserApplication服务

然后访问接口

 

如果上述操作都成功,那么项目的准备工作就做好了。

可以看到,我们的项目有两个服务,分别是用户服务和订单服务,两个服务都遵循了微服务拆分的原则:单一职责,并且数据库也做了分离,每个服务的数据库都是分隔开的

下面将在这个Demo进行练习,如何正确使用微服务项目

二、服务远程调用

案例: 根据订单id查询订单功能

需求: 根据订单id查询订单的同时,把订单所属的用户信息一起返回

难点: 订单表、用户表在两个数据库,不是同一个数据库。订单业务、用户业务在两个项目,不是同一个项目

解决: 服务远程调用

1. 接口暴露

用户项目对外暴露了一个Restful接口,如下

@GetMapping("/{id}")

2. 发送请求

使用Spring提供的RestTemplate工具,作用是发送http请求

可以在订单项目使用Spring提供的RestTemplate工具,作用是发送http请求,也就是在订单项目向用户项目发送http请求,用户项目就会返回数据给订单项目

具体操作:

第一步: 在订单项目的OrderApplication引导类,添加如下

package cn.itcast.order;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
public class OrderApplication {public static void main(String[] args) {SpringApplication.run(OrderApplication.class, args);}/*** 创建RestTemplate并注入Spring容器* @return*/@Beanpublic RestTemplate restTemplate(){return new RestTemplate();}}

第二步: 在订单项目的OrderService类,添加如下

package cn.itcast.order.service;import cn.itcast.order.mapper.OrderMapper;
import cn.itcast.order.pojo.Order;
import cn.itcast.order.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;import java.sql.PreparedStatement;@Service
public class OrderService {@Autowiredprivate OrderMapper orderMapper;@Autowiredprivate RestTemplate restTemplate;public Order queryOrderById(Long orderId) {// 1.查询订单Order order = orderMapper.findById(orderId);//2.利用RestTemplate发起http请求,查询用户//2.1 url路径String url = "http://localhost:8081/user/" + order.getUserId();//这个方法第一个参数是访问路径,第二个参数是把响应得到的Json数据封装成实体类对象User user = restTemplate.getForObject(url, User.class);//3.封装user到Orderorder.setUser(user);// 4.返回return order;}}

3. 测试

启动OrderApplication服务

访问刚才访问过的接口

可以看到响应回来的订单数据里面有对应关联的用户的相关信息 

三、总结

跨服务的远程调用其实就是发送一次http请求,首先是在Spring容器里面注入RestTemplate对象,然后在你发送请求的类里面自动装配这个RestTemplate对象,并且在方法里面调用这个RestTemplate对象,第一个参数是路径,第二个参数是你想拿到什么类型的数据

查看全文

99%的人还看了

猜你感兴趣

版权申明

本文"实用篇-服务拆分及远程调用":http://eshow365.cn/6-26127-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!