本节内容会用到之前给大家讲过的这两篇:

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又该如何自处?!

围绕这个问题,又有新的概念诞生了——【限流、熔断、容错、服务降级】

Sentinel要来咯~ 敬请期待!

properties

2流高手速成记(之七):基于Dubbo&Nacos的微服务简要实现的更多相关文章

  1. 2流高手速成记(之六):从SpringBoot到SpringCloudAlibaba

    咱们接上回 2流高手速成记(之五):Springboot整合Shiro实现安全管理 - 14号程序员 - 博客园 (cnblogs.com) 身边常有朋友说:小项目用PHP.大项目用Java(这里绝无 ...

  2. 2流高手速成记(之八):基于Sentinel实现微服务体系下的限流与熔断

    我们接上回 上一篇中,我们进行了简要的微服务实现,也体会到了SpringCloudAlibaba的强大和神奇之处 我们仅改动了两个注释,其他全篇代码不变,原来的独立服务就被我们分为了provider和 ...

  3. 2流高手速成记(之五):Springboot整合Shiro实现安全管理

    废话不多说,咱们直接接上回 上一篇我们讲了如何使用Springboot框架整合Nosql,并于文章最后部分引入了服务端Session的概念 而早在上上一篇中,我们则已经讲到了如何使用Springboo ...

  4. 2流高手速成记(之三):SpringBoot整合mybatis/mybatis-plus实现数据持久化

    接上回 上一篇我们简单介绍了基于SpringBoot实现简单的Web开发,本节来看Web开发中必不可少的内容--数据持久化 先看项目结构: 1. 创建数据表 打开mysql,打开数据库 test (没 ...

  5. 2流高手速成记(之四):SpringBoot整合redis及mongodb

    最近很忙,好不容易才抽出了时间,咱们接上回 上次我们主要讲了如何通过SpringBoot快速集成mybatis/mybatis-plus,以实现业务交互中的数据持久化,而这一切都是基于关系型数据库(S ...

  6. 基于Dubbo框架构建分布式服务(一)

    Dubbo是Alibaba开源的分布式服务框架,我们可以非常容易地通过Dubbo来构建分布式服务,并根据自己实际业务应用场景来选择合适的集群容错模式,这个对于很多应用都是迫切希望的,只需要通过简单的配 ...

  7. 基于Dubbo框架构建分布式服务

    Dubbo是Alibaba开源的分布式服务框架,我们可以非常容易地通过Dubbo来构建分布式服务,并根据自己实际业务应用场景来选择合适的集群容错模式,这个对于很多应用都是迫切希望的,只需要通过简单的配 ...

  8. [转载] 基于Dubbo框架构建分布式服务

    转载自http://shiyanjun.cn/archives/1075.html Dubbo是Alibaba开源的分布式服务框架,我们可以非常容易地通过Dubbo来构建分布式服务,并根据自己实际业务 ...

  9. Dubbo Ecosystem - 从微服务框架到微服务生态

    从微服务框架到微服务生态,这是微服务发展的必然趋势,也是Dubbo社区满足开发者更高效的构建微服务体系期望的使命和担当. 近期,Apache Dubbo PPMC 望陶(社区昵称:ralf0131)做 ...

随机推荐

  1. React报错之Invalid hook call

    正文从这开始~ 总览 导致"Invalid hook call. Hooks can only be called inside the body of a function compone ...

  2. [CF1523C] Compression and Expansion (DP/贪心)

    C. Compression and Expansion 题面 一个合法的表单由横向 N N N 行数字链,纵向一层或多层数字链组成,第 k k k 层的数字链(可以想象为前面打了 k k k 个制表 ...

  3. 【java】学习路径16-重写Object方法(equals()等)

    在平时开发中,想要比较自定义类对象中的特定成员时,我们需要逐一手动比较,非常不方便. 举个栗子,我们有两个cafe对象,我们想比较两杯咖啡的价格是否一样,一般来说我们使用getter()来比较,但是这 ...

  4. JDBC连接池&JDBCTemplate

    今日内容 1. 数据库连接池 2. Spring JDBC : JDBC Template 数据库连接池 1. 概念:其实就是一个容器(集合),存放数据库连接的容器. 当系统初始化好后,容器被创建,容 ...

  5. Ubuntu locale设置

    /bin/bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8) 解决方法: 1 sudo locale-gen &q ...

  6. Springboot shiro JWT集成总结

    SpringBoot Shiro JWT 1.建表 DDL.sql CREATE TABLE `t_user` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, ` ...

  7. git revert总结

    git revert git revert 是一种创建一次新的commit 来回退某次或某几次commit的一种方式 命令 // 创建一个新的commit,这个commit会删除(下面)commit- ...

  8. vivo 全球商城:电商平台通用取货码设计

    vivo官网商城开发团队 - Zhou Longjian 一.背景 随着O2O线上线下业务的不断扩展,电商平台也在逐步完善交易侧相关的产品功能.在最近的需求版本中,业务方为进一步提升用户的使用体验,规 ...

  9. 【gRPC】C++异步服务端客户端API实例及代码解析

    对于同步API而言,程序的吞吐量并不高.因为在每次发送一个gRPC请求时,会阻塞整个线程,必须等待服务端的ack回到客户端才能继续运行或者发送下一个请求,因此异步API是提升程序吞吐量的必要手段. g ...

  10. 使用 Dockerfile 的一些最佳实践