一、服务拆分
服务拆分(也叫项目拆分)
注意事项:
- 不同的微服务,不要重复开发相同的业务
- 要求微服务之间数据独立,不要访问其他微服务的数据库
- 微服务可用将自己的业务暴漏为接口,供其他服务调用
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
*/
@Bean
public 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 {
@Autowired
private OrderMapper orderMapper;
@Autowired
private 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到Order
order.setUser(user);
// 4.返回
return order;
}
}
3. 测试
启动OrderApplication服务
访问刚才访问过的接口
可以看到响应回来的订单数据里面有对应关联的用户的相关信息
三、总结
跨服务的远程调用其实就是发送一次http请求,首先是在Spring容器里面注入RestTemplate对象,然后在你发送请求的类里面自动装配这个RestTemplate对象,并且在方法里面调用这个RestTemplate对象,第一个参数是路径,第二个参数是你想拿到什么类型的数据