Nacos+Dubbo项目搭建简明教程

2020-11-05 09:47:32  晓掌柜  版权声明:本文为站长原创文章,转载请写明出处


一、背景


    此前公司项目和个人项目都是使用的springboot为主进行开发,但是随着业务的复杂度增加已经新技术的影响,项目一步步向分布式进行转型。罗马城不是一天天建成的,这个转型也不是一蹴而就的,但是会向着这个方向做持续性的工作同时也会记录各种点滴分享出来共同进步!


二、Nacos和Dubbo


    2.1、Nacos概述

        ① Nacos:一个易于构建原生应用服务发现、配置管理和服务的管理平台

        ② 这里附上Nacos的官方链接 Nacos手册(官网应该是第一文档阅读选择)

    2.2、Dubbo概述

        ① 虽则互联网的发展,传统的垂直应用架构已经逐渐不能满足需求,分布式服务架构势在必行。

           于是乎Dubbo营运而生。

        ② 这里再次附上Dubbo的官方地址:Dubbo快速启动

    2.3、环境搭建

        Nacos和Dubbo的搭建不在这里最赘述了,网上有很多有用的教程。

       (可能后续也会出一版针对安装的处理,但不是现在哈...)


三、我之于分布式


    3.1、我想要的分布式系统

        在我的预期中,整个系统会有如下的几点:

            ① 使用Maven父子多模块共亨,模块间可互相依赖(不能失去原则的进行依赖

            ② 整体模块分为:Commons(通用处理集中放置)、API(所有的api接口定义)、Model(所有的POJO)、

               Provider(根据模块实现做接口实现)、Consumer(根据业务组装业务实现)

    3.2、各模块间分工

        ① Commons作为所有模块通用的集中,如邮件发送、消息推送、文件上传等。然后通过maven进行依赖,

           比如说客户模块可依赖于Commons模块来进行资料的上传、单据业务模块可依赖于Commons做消息推送

           及业务处理...

        ② Model模块作为所有POJO的盛放,所有的数据库实体对应Entity,所有的前端参数的接收对应VO,

           所有的数据返回对应DTO。同时以module来作为每个模块的分类处理,比如:用户的model包含,

           数据库实体Entity和前端VO和数据返回的DTO。

        ③ Api模块作为所有的接口盛放,但是不做业务实现。同样使用model来作为不同模块之间的一个分类

           处理,比如:sys代表系统级别模块,order代表单据类模块等。另外项目继承MP,

           在接口中要继承IService。

        ④ Provider模块作为接口的实现,模块与Api进行对应。这里需要有Dao和Service,其中Dao继承

           BaseMapper,Service只有对接口的业务实现。Service中继承MP的ServiceImpl同时实现Api接口

          (注意,这里的@Service是Dubbo的不要于Spring的有混淆),复杂业务做SQL实现。

        ⑤ Consumer模块根据业务需要进行处理,它依赖于各个基础模块同时根据业务需要整合。

           比如:单据的业务模块需要依赖于Commons,同时使用@Reference注入客户的Api、业务员的Api等。

           这里注意@Reference和@Autowire的区别。值得一提的是,Consumer中也要有Service接口和实现类以

           作为特殊的业务处理。


四、项目的搭建


    4.1、创建maven项目

        新建Maven项目如:GMH

    4.2、创建子项目

        在父项目下创建子的Mavne项目,如:GMH_Api

    4.3、相关yml配置

        yml核心配置文件如下:        

        
        nacos:
config:
server-addr: 127.0.0.1:8848
discovery:
server-addr: 127.0.0.1:8848

dubbo:
# 配置服务信息
application:
name: dubbo-xa-XXX
# 禁用QOS同一台机器可能会有端口冲突现象
qos-enable: false
qos-accept-foreign-ip: false
consumer:
# 设置超时时间为10s
timeout: 10000
# 关闭消费者启动前检测
check: false
registry:
address: nacos://127.0.0.1:8848
# 启动前检查
check: false
# 设置协议-协议由提供方指定消费方被动接受
protocol:
name: dubbo
# 这里使用-1来进行自动分配
port: -1
# 可以通过配置host指定网卡的选择(多网卡情况下)
#host: 47.XX.198.16


    4.4、Api模块代码示例        

        
        public interface MailApi extends IService<MailEntity> {

/**
* 功能描述: 邮件订阅
* Param: [mailEntity]
* Return: com.com.xa.guangmuhua_api.modules.commons.utils.R
*/
R saveMail(MailEntity mailEntity);

}


    4.5、生产者Dao和Service代码示例        

        
        /**    
* @author XA
* date 2020/6/29 23:01
* description 邮件订阅dao
* params
* return
*/
@Mapper
public interface MailDao extends BaseMapper<MailEntity> {

}


        
        /**
* @author XA
* date 2020/6/29 22:32
* description 邮件订阅业务类
* params
* return
*/ /* 注意:这个生产者中的service注解是dubbo的 */ @Service
public class MailServiceImpl extends ServiceImpl<MailDao, MailEntity> {

@Transactional(rollbackFor = Exception.class)
public R saveMail(MailEntity mailEntity) {
if(this.lambdaQuery().eq(MailEntity::getMail, mailEntity.getMail()).list().size() > 0){
return R.error("您已有订阅记录,无需重复操作!");
}
if(this.save(mailEntity)){
return R.ok();
};
return R.error("订阅失败!");
}
}


    4.6、Customer包含的Controller和Service代码示例

        
        public interface ArticleService{

/**
* 功能描述:增加文章阅读量
* Param: [articleId]
* Return: com.com.xa.guangmuhua_api.modules.commons.utils.R
*/
R addReadingVolumeById(Integer articleId); }

        /* 注意:这个消费者中的service注解是spring的 */
        @Service
public class ArticleServiceImpl implements ArticleService {

@Reference(check = false)
private ArticleApi articleApi;

@Override
public R addReadingVolumeById(Integer articleId) {
return articleApi.addReadingVolumeById(articleId);
}


        
        @RestController
@RequestMapping("/article")
@Api("文章接口")
public class ArticleController {

@Autowired
private ArticleService articleService;

/**
* 功能描述:获取文章总数
* Param: []
* Return: int
*/
@GetMapping("/getArticleTotal")
@ApiOperation("获取文章总数")
public @ResponseBody R getArticleTotal(){
return R.ok().put("data",articleService.count());
}
}

    PS:基础项目的搭建,无论是官网或是网上有有现成案例,这里仅供参考!


五、注意事项


    5.1、@Service注解

        @Service在生产者中是Dubbo的,在消费者中是Spring的。

    5.2、服务器IP

        如果是Nacos注册到云服务器上,要注意Host中IP的配置

    5.3、依赖注入

        @Reference是远程引用,@Autowire是本地引用

    5.4、路径

        注意Application所在的路径一致

    5.5、版本兼容

        Dubbo2.7.6有时会报错服务未注册或黑名单,降级为2.7.5可解决


六、nacos的启动与关闭


    ① windows环境下,可通过安装目录bin文件夹下的startup.cmd和shutdown.cmd来进行。

    ② 也可以使用nssm制作成服务,以服务的形式运行

    ③ linux环境下,同样找到nacos的bin目录(可以使用whereis命令)

       开启:./startup.sh -m standalone &

       关闭:./shutdown.sh


    更多精彩请关注guangmuhua.com


最新评论: