之七 2流高手速成记:基于Dubbo&Nacos的微服务简要实现

本节内容会用到之前给大家讲过的这两篇:
2流高手速成记(之六):从SpringBoot到SpringCloudAlibaba
2流高手速成记(之三):SpringBoot整合mybatis/mybatis-plus实现数据持久化
链接挂出来,方便咱们中途对比着看
老规矩,先放出本节的项目结构:

之七 2流高手速成记:基于Dubbo&Nacos的微服务简要实现

文章插图
我们参考上一节中讲到的创建SpringCloudAlibaba工程模板的步骤,在工程下在创建三个子模块,创建过程中勾选相同的依赖项
之七 2流高手速成记:基于Dubbo&Nacos的微服务简要实现

文章插图
这三个子模块也是三个独立的可执行的工程,他们的用途分别为:
dubbo-nacos-provider:服务(Service)提供方
dubbo-nacos-consumer:消费方 , 服务的调用者
dubbo-nacos-api:接口及模型类定义,同时作为前边二者的依赖方
接下来,我们共同见证神奇的一幕:
大家都知道,我们在第三节中实现的工程是一个结构相对完备(包含Service、Controller,View由Postman替代)且可以直接执行的独立进程
本节我们依靠上一节讲到的微服务技术,以几乎不改变原有代码为前提,将其一分为三:
provider和consumer分别独立执行
consumer借助微服务技术完成对provider的调用
api模块是二者的依赖项,并非可执行的进程
1. Service接口、Model声明迁移到dubbo-nacos-api
之七 2流高手速成记:基于Dubbo&Nacos的微服务简要实现

文章插图
package com.example.dubbonacosapi.model;import java.io.Serializable;public class Person implements Serializable {private Integer id = 0;private String name = "";public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}}package com.example.dubbonacosapi.service;import com.example.dubbonacosapi.model.Person;import java.util.List;public interface PersonService {Integer insert(Person person);Integer update(Person person);Integer delete(int id);List<Person> select();}因为api的作用仅是构成provider、consumer的二者依赖,所以其仅是持有相关声明即可
Person类及PersonService在原有代码基础上保持不变!
2. Service接口实现类、Mapper声明(mybatis-plus)迁移到dubbo-nacos-provider
之七 2流高手速成记:基于Dubbo&amp;Nacos的微服务简要实现

文章插图
既然provider保有mybatis-plus访问mysql的能力,所以相关的依赖必定不可或缺
<!-- 引入mybatis、mybatis-plus、mysql等依赖 --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.2</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.2</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>com.example</groupId><artifactId>dubbo-nacos-api</artifactId><version>0.0.1-SNAPSHOT</version></dependency>引入的方式和第三节讲到的方式一样
此外还包含了对于刚才我们创建的dubbo-nacos-api的依赖,引入非常的方便
package com.example.dubbonacosprovider.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;import com.example.dubbonacosapi.model.Person;import org.apache.ibatis.annotations.Mapper;import org.springframework.stereotype.Repository;@Mapper@Repositorypublic interface PersonMapper extends BaseMapper<Person> {}package com.example.dubbonacosprovider.service.impl;import com.example.dubbonacosapi.model.Person;import com.example.dubbonacosapi.service.PersonService;import com.example.dubbonacosprovider.mapper.PersonMapper;import org.apache.dubbo.config.annotation.DubboService;import org.springframework.beans.factory.annotation.Autowired;import java.util.List;@DubboServicepublic class PersonServiceImpl implements PersonService {@AutowiredPersonMapper mapper;public Integer insert(Person person) {return mapper.insert(person);}public Integer update(Person person) {return mapper.updateById(person);}public Integer delete(int id) {return mapper.deleteById(id);}public List<Person> select() {return mapper.selectList(null);}}Mapper的声明没有任何变化 , 而PersonServiceImpl依然保有对接口PersonService的实现,区别在于后者来自api模块
唯一的区别在于PesonServiceImpl类的注解,由原有的@Service变更为@DubboService —— 这是唯一的区别!
3. Controller迁移到dubbo-nacos-consumer

推荐阅读