弄浪的鱼

在数据库的增删改查操作中,用的最多的就是查询操作了,查询操作又可以分成一对一查询、一对多查询和多对多查询。一个人属于一个部门,查询人的时候要查出他的部门,这是一对一查询;一辆车有四个轱辘,查询车的时候要查出这四个轱辘,这是一对多查询;一个学生选了多门课,一门课也是被多个学生选的,学生与课程之间用一张关联表来联系,这是多对多查询。

本文介绍 Mybatis 是如何处理这几种查询方式的,包括以下三个部分:

  1. Mybatis 一对一查询
  2. Mybatis 一对多查询
  3. Mybatis 多对多查询
  4. discriminator 鉴别器映射

上一篇文章 RestTemplate实现服务之间的调用中调到了使用 RestTemplate 跨应用调用 Restful 形式的接口。这样的方式存在两个弊端:一是 URL 需要硬编码,二是服务挂掉之后没有备用措施。

Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务注册和发现。Eureka由两个组件组成:Eureka服务器和Eureka客户端。Eureka服务器用作服务注册服务器。Eureka客户端是一个java客户端,用来简化与服务器的交互、作为轮询负载均衡器,并提供服务的故障切换支持。

Eureka的服务注册与发现

如上图所示,Eureka 中有三种角色

  • Eureka Server:注册中心,提供服务的注册和发现
  • Service Provide:服务提供者,将自身的服务注册到 Eureka Server
  • Service Consumer:服务消费者,从 Eureka Server 中获取注册表,调用 Provider 的服务

开始系统学习微服务相关的知识点,现在微服务中的主流框架是 Spring Cloud 和 Dubbo,因为公司用的是 Spring Cloud,我就从 Spring Cloud 着手实战微服务。

先来看两个服务之间的调用,Spring Boot 是怎么帮我们做的?存在什么弊端?要如何解决?

RestTemplate

Spring Boot 在 org.springframework.web.client.RestTemplate 中提供了 RestTemplate 能够帮助我们调用 Restful 形式的服务接口。

Spring MVC执行流程

简单来说:客户端发送请求 -> 前端控制器 DispatcherServlet 接受客户端请求 -> 找到处理器映射 HandlerMapping 解析请求对应的 Handler -> HandlerAdapter 会根据 Handler 来调用真正的处理器来处理请求,并处理相应的业务逻辑 -> 处理器返回一个模型视图 ModelAndView -> 视图解析器进行解析 -> 返回一个视图对象 -> 前端控制器 DispatcherServlet 渲染数据(Model)-> 将得到视图对象返回给用户。

记得一年前 Spring Cloud、Docker + k8s 才刚才火起来呀,当时公司的系统刚转成 Docker 部署,使用的分布式框架任然是 Dubbo。

现在也就相隔一年半, JD 上 Spring Cloud 已经成标配了,份额看着比 Dubbo 还大。Docker + k8s 也已经是一个加分项被写在 JD 上了。

为了知识体系的完整性,今天撸了一个 Spring Cloud 的 Demo。