第一天 B
服务拆分及远程调用
服务拆分:
有一些需要注意的细节:
1.不同的微服务,不要重复开发相同的业务
2.微服务的数据是要保持独立的,每个微服务都有自己的数据库。
3.微服务可以把自己的业务暴露为接口,供其他微服务进行使用。
注意:在单体架构开发的方面我们可能会用到大量的重复业务功能,在微服务开发中我们应当学会去避免这样的事情发生。
如图所示,该案例分为两部分:订单和用户两部分,需要进行分为两个微服务,一个是关于订单的,而另外一个是关于用户的,对于他们获得对方的数据就要通过对方的接口得到对方的独立数据库中的数据。这与单体架构的服务模式完全不同。注意:他们的数据库也是分开的!
远程调用:
远程调用的原理就相当于发送了一个http请求从而得到了在对应服务中的方法与数据。
如何在服务中发送类似http请求:
1.先注册RestTemplate:先在要进行远程调用的applicat中注入一个restTemplate;
@MapperScan注解加在application上,相当于在每个mapper类上注释一个@Mapper;
2.在要进行调用的ServiceImpl实现类里面加入rest Template的方法,同时要在其中加入
@Resource
private RestTemplate restTemplate;
//如何用restTemplate发送HTTP请求
//1.写入url地址
String url = "http://localhost/8081/user/"+orders.getUserId();
//2.使用restTemplate发送请求
User user = restTemplate.getForObject(url , user.class);
//3.封装到order中
order.setUser(user);
//4.返回值
return order;
这里有几个点要注意:
1.url地址是发送请求至关重要的部分。
2.restTemplate方法中的getForObject对应的是GetMapping的方法;而postForObject方法则对应着PostMapping方法。
3.在getForMapping方法中的user.class可以让得到的值变成User的类型。
提供者和消费者:
1.服务提供者:在一次服务远程调用中,业务被进行调用。(提供接口给别的服务进行使用)
2.服务消费者:在一次服务远程调用中,用到了别的服务中的业务。(使用了别的服务的接口)
在这个demo中,order Service是消费者,而userService是提供者。
question:
当A调用B,而B调用C,那B是属于消费者还是提供者呢?
解:B既是消费者也是提供者,消费者和提供者是一个相对的关系。