## 微服务学习
第一天;
认识:
微服务是一种经过良好架构设计的分布式架构方案,微服务架构特征:
单一职责:微服务拆分粒度更小,每一个服务都对应唯一的业务能力,做到单一职责,避免重复业务开发
面向服务:微服务对外暴露业务接口。
自治:团队独立、技术独立、数据独立、部署独立
隔离性强:服务调用做好隔离、容错、降级,避免出现级联问题
感受:
这是第一次去学习微服务,之前做的项目练习都是单体架构,所有的功能都集中在一起开发,然后再打包发布,感觉太繁琐了,其实在我看来微服务就是把各个功能分开开发,每一个功能在开发过程中不会相互影响
总结:
微服务需要根据业务模块拆分,做到单一职责,不要重复开发相同业务
微服务可以将业务暴露为接口,供其它微服务使用
不同微服务都应该有自己独立的数据库
下边是案例:
这是一个简单的maven项目,其中里边是三个子模块,数据库部分就不展示了
order-service:
相当于一个订单类,就是从数据库中根据订单号来返回订单信息
Slf4j
@RestController
@RequestMapping("/order")
public class OrderController {
@Autowired
private OrderService orderService;
@GetMapping("/{orderId}")
public Order queryOrderByUserId(@PathVariable("orderId") Long orderId) {
// 根据id查询订单并返回
return orderService.queryOrderById(orderId);
}
}
页面展示:
user-service:
就是一个用户信息类,有用户名,和地址.
@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
/**
* 路径: /user/110
*
* @param id 用户id
* @return 用户
*/
@GetMapping("/{id}")
public User queryById(@PathVariable("id") Long id) {
return userService.queryById(id);
}
}
页面展示:
问题:
这是分模块开发,要是我们想要在输出订单信息的时候要输出对应的user应该怎么做?
其实要是在单体模式开发的话就是再查一次数据库就行,但这是多个模块微服务开发,按照微服务的原则order的模块里边不应该出现查询user数据库等之类的功能,这时候就用到了服务远程调用:
RestTemplate:
RestTemplate类可用于在应用中调用rest服务,它简化了与http服务的通信方式,统一了RESTful的标准,封装了http链接, 我们只需要传入url及返回值类型即可。相较于之前常用的HttpClient,RestTemplate是一种更优雅的调用RESTful服务的方式。
首先要进行在配置注册:
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
其次要修改order-service中的方法:
public Order queryOrderById(Long orderId) {
// 1.查询订单
Order order = orderMapper.findById(orderId);
//利用RsetTemplate发起http,进行远程调用
//地址
String url="http://127.0.0.1/user/"+order.getUserId();
User user = restTemplate.getForObject(url, User.class);
order.setUser(user);
// 4.返回
return order;
}
这样就可以实现服务远程调用了。重要的是符合微服务的要求:
不开发相同业务,在order里边只开发order类型,而不能为了user去访问其他数据库。