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

我们参考上一节中讲到的创建SpringCloudAlibaba工程模板的步骤,在工程下在创建三个子模块,创建过程中勾选相同的依赖项

这三个子模块也是三个独立的可执行的工程,他们的用途分别为:
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

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

既然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
@Repository
public 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; @DubboService
public class PersonServiceImpl implements PersonService { @Autowired
PersonMapper 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

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <dependency>
<groupId>com.example</groupId>
<artifactId>dubbo-nacos-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
consumer作为外部可访问的web服务,自然需要持有web相关依赖项
同时,与provicer相同,其与api模块保持依赖关系
package com.example.dubbonacosconsumer.controller; import com.example.dubbonacosapi.model.Person;
import com.example.dubbonacosapi.service.PersonService;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import java.util.List; @RestController
@RequestMapping("/person")
public class PersonController {
@DubboReference
PersonService service; @PostMapping("/insert")
public Integer insert(Person person) {
return service.insert(person);
} @PostMapping("/update")
public Integer update(Person person) {
return service.update(person);
} @PostMapping("/delete")
public Integer delete(int id) {
return service.delete(id);
} @GetMapping("/select")
public List<Person> select() {
return service.select();
}
}
留意PersonService的引入方式:不再是@Autowired,而是变更为@DubboReference —— 这是唯一的区别!
4. Consumer和Provider的配置项
这里我们依然沿用上一节讲到的知识——以nacos作为配置中心
二者同时仅在本地保留一个bootstrap.properties配置文件,application.properties托管给nacos

# Nacos帮助文档: https://nacos.io/zh-cn/docs/concepts.html
# Nacos认证信息
spring.cloud.nacos.config.username=nacos
spring.cloud.nacos.config.password=nacos
spring.cloud.nacos.config.contextPath=/nacos
# 设置配置中心服务端地址
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
# Nacos 配置中心的namespace。需要注意,如果使用 public 的 namcespace ,请不要填写这个值,直接留空即可
# spring.cloud.nacos.config.namespace= # 应用名称
spring.application.name=dubbo-nacos-consumer
# Nacos帮助文档: https://nacos.io/zh-cn/docs/concepts.html
# Nacos认证信息
spring.cloud.nacos.config.username=nacos
spring.cloud.nacos.config.password=nacos
spring.cloud.nacos.config.contextPath=/nacos
# 设置配置中心服务端地址
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
# Nacos 配置中心的namespace。需要注意,如果使用 public 的 namcespace ,请不要填写这个值,直接留空即可
# spring.cloud.nacos.config.namespace= # 应用名称
spring.application.name=dubbo-nacos-provider
内容均为nacos相关配置,以及各自声明了自己的应用名称(spring.application.name)
然后是他们在nacos上托管的配置数据:

注意,新创建配置的Data Id需要与他们的应用名称同名

provider需要持有mysql相关配置

consumer作为controller的持有者,需要声明外部的可访问端口
全部的移植工作到这里就完毕了!
我们分别执行provider、consumer两个独立进程
此时我们打开nacos服务列表,会看到dubbo-nacos-consumer、dubbo-nacos-provider两个执行中的服务

执行结果如下:

怎么样?是不是非常神奇?我们只改动了两个注解,原本还是一个整体的工程就被一分为二了,并且是两个可以彼此独立运转在两台独立机器上的服务
—— 这就是微服务的神奇之处!
借助于强大的SpringCloudAlibaba,我们不仅可以对所有的业务实现统合拆分,充分调动团队人员配置各司其职各自编写自己的服务模块,
更大的意义在于我们可以充分调动多台独立设备的技能,使之串联为一个庞大服务集群,较之于单台机器实现整个架构性能成千上万倍的飞跃!
但是,微服务带来研发、管理、性能便捷的同时,整个集群也在运维层面面对了前所未有的挑战,最明显的:
consumer在业务上依赖于后端的provider,如果provider运转不正常,前方的consumer又该如何自处?!
围绕这个问题,又有新的概念诞生了——【限流、熔断、容错、服务降级】
properties
2流高手速成记(之七):基于Dubbo&Nacos的微服务简要实现的更多相关文章
- 2流高手速成记(之六):从SpringBoot到SpringCloudAlibaba
咱们接上回 2流高手速成记(之五):Springboot整合Shiro实现安全管理 - 14号程序员 - 博客园 (cnblogs.com) 身边常有朋友说:小项目用PHP.大项目用Java(这里绝无 ...
- 2流高手速成记(之八):基于Sentinel实现微服务体系下的限流与熔断
我们接上回 上一篇中,我们进行了简要的微服务实现,也体会到了SpringCloudAlibaba的强大和神奇之处 我们仅改动了两个注释,其他全篇代码不变,原来的独立服务就被我们分为了provider和 ...
- 2流高手速成记(之五):Springboot整合Shiro实现安全管理
废话不多说,咱们直接接上回 上一篇我们讲了如何使用Springboot框架整合Nosql,并于文章最后部分引入了服务端Session的概念 而早在上上一篇中,我们则已经讲到了如何使用Springboo ...
- 2流高手速成记(之三):SpringBoot整合mybatis/mybatis-plus实现数据持久化
接上回 上一篇我们简单介绍了基于SpringBoot实现简单的Web开发,本节来看Web开发中必不可少的内容--数据持久化 先看项目结构: 1. 创建数据表 打开mysql,打开数据库 test (没 ...
- 2流高手速成记(之四):SpringBoot整合redis及mongodb
最近很忙,好不容易才抽出了时间,咱们接上回 上次我们主要讲了如何通过SpringBoot快速集成mybatis/mybatis-plus,以实现业务交互中的数据持久化,而这一切都是基于关系型数据库(S ...
- 基于Dubbo框架构建分布式服务(一)
Dubbo是Alibaba开源的分布式服务框架,我们可以非常容易地通过Dubbo来构建分布式服务,并根据自己实际业务应用场景来选择合适的集群容错模式,这个对于很多应用都是迫切希望的,只需要通过简单的配 ...
- 基于Dubbo框架构建分布式服务
Dubbo是Alibaba开源的分布式服务框架,我们可以非常容易地通过Dubbo来构建分布式服务,并根据自己实际业务应用场景来选择合适的集群容错模式,这个对于很多应用都是迫切希望的,只需要通过简单的配 ...
- [转载] 基于Dubbo框架构建分布式服务
转载自http://shiyanjun.cn/archives/1075.html Dubbo是Alibaba开源的分布式服务框架,我们可以非常容易地通过Dubbo来构建分布式服务,并根据自己实际业务 ...
- Dubbo Ecosystem - 从微服务框架到微服务生态
从微服务框架到微服务生态,这是微服务发展的必然趋势,也是Dubbo社区满足开发者更高效的构建微服务体系期望的使命和担当. 近期,Apache Dubbo PPMC 望陶(社区昵称:ralf0131)做 ...
随机推荐
- Learn Dijkstra For The Last Time
博客链接:https://www.codein.icu/learn-dijkstra/ Introduction Dijkstra 算法是用于求解非负权图单源最短路的经典算法. 市面上的大部分教程都仅 ...
- 概述:基于事件的优化方法 / 事件驱动优化 / Event-Based Optimization / EBO
大家好,我是月出 本文基于这篇综述,介绍了 事件驱动优化(Event-Based Optimization, EBO). 事件驱动优化,是一种建模现实场景.做优化的思路,理论和 MDP / 强化学习很 ...
- VM虚拟机安装
VM虚拟机安装 1.安装vm虚拟机软件 1.1 双击打开虚拟机文件 1.2 根据向导安装 下一步 安装好了 不要着急点完成在 安装目录中有许可证. 1.3激活操作 2.虚拟机原理简介 3. 新建虚拟机 ...
- 如何实现Windows平台RTMP播放器/RTSP播放器播放窗口添加OSD文字叠加
好多开发者在做Windows平台特别是单屏多画面显示时,希望像监控摄像机一样,可以在播放画面添加OSD台标,以实现字符叠加效果,大多开发者可很轻松的实现以上效果,针对此,本文以大牛直播SDK (Git ...
- PostgreSQL 修改执行计划 GroupAggregate 为 HashAggregate
1.前言 PostgreSQL 聚合算法有两种,HashAggregate and GroupAggregate .我们知道GroupAggregate 需要对记录进行排序,而 HashAggrega ...
- KingbaseES 逻辑备份还原加密
KingbaseEs 支持在sys_dump备份时使用key进行加密.在sys_restore时,如果没提供key,或者key值不对,将无法进行恢复. [kingbase@dbhost03 ~]$ s ...
- 【读书笔记】C#高级编程 第九章 字符串和正则表达式
(一)System.String类 System.String是一个类,专门用于存储字符串,允许对字符串进行许多操作.C#提供了关键字string和相关的语法,以便使用这个类更轻松. 例子: 使用运算 ...
- IEEE浮点数向偶数舍
CSAPP 向偶数舍入初看上去好像是个相当随意的目标--有什么理由偏向取偶数呢?为什么不始终把位于两个可表示的值中间的值都向上舍入呢?使用这种方法的一个问题就是很容易假想到这样的情景:这种方法舍入 ...
- 第六章:Django 综合篇 - 14:Django 日志
Django使用Python内置的logging模块实现它自己的日志系统. 如果你没有使用过logging模块,请参考Python教程中的相关章节. 直达链接<logging模块详解>. ...
- 谈谈对K8S CNI、CRI和CSI插件的理解