本博客的例子代码可以在github找到下载链接:代码下载

SpringBoot、SpringCloud Alibaba系列博客专栏:链接

1、分布式理论

1.1、分布式基本定义

《分布式系统原理与范型》定义:

“分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像单个相关系统”

分布式系统(distributed system)是建立在网络之上的软件系统。

1.2、架构发展演变

架构的发展是由最初的单一应用架构构建的,一般就是ORM框架方便数据库操作。

不过随着系统越来越复杂,单一应用架构会变得难以维护,所以架构逐渐演变出了垂直应用架构,所谓垂直应用架构其实就是安装业务模板进行拆分,比如可以安装业务将一个电商系统分为订单模块,用户信息管理模块,商品管理模块等等,这时候MVC框架就派上用场,MVC框架可以协助系统更好的按业务拆分,不过业务拆分后虽然是比单一应用架构更好维护了。

不过随着系统越来约复杂,发现很多共用的模块很难复用起来,这时候分布式服务架构登场了,分布式架构是将一些核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,当应用需要时,就去服务中心调服务就可以,而实现这种服务注册的肯定是RPC框架了。

当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率,这时候就需要流动计算架构(SOA)[ Service Oriented Architecture],用于提高机器利用率的资源调度,SOA是一个治理中心,综上所述,到目前,软件系统架构演变经历了:单一应用架构->垂直应用架构->分布式应用架构->流动计算架构,下面Dubbo官网的图片可以很好的描述

1.3、什么是RPC?

RPC概念

RPC【Remote Procedure Call】是指远程过程调用,是一种进程间通信方式,他是一种技术的思想,而不是规范。它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数,而不用程序员显式编码这个远程调用的细节。

RPC核心模块

RPC有两个核心模块:通信和序列化

2、什么是Dubbo框架?

2.1、Apache Dubbo 定义

Apache Dubbo (incubating) |ˈdʌbəʊ| 是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。

官网:

http://dubbo.apache.org/

2.2、Dubbo角色

  • Provider:暴露服务的服务提供者

  • Container:服务运行的容器

  • Consumer:调用远程服务的消费者

  • Registry:服务注册和发现的注册中心

  • Minitor:统计服务调用次数和时间的监控中心

2.3、Apache Dubbo原理

Dubbo的服务治理:

Dubbo原理图片,图片来自Dubbo官网:

调用过程:

下面根据我的理解说明一下

  • 0:服务器容器负责启动、加载、运行服务提供者

  • 1:服务提供者在启动后就可以向注册中心暴露服务

  • 2:服务消费者在启动后就可以向注册中心订阅想要的服务

  • 3:注册中心向服务消费者返回服务调用列表

  • 4:服务消费者基于软负载均衡算法调用服务提供者的服务,这个服务提供者有可能是一个服务提供者列表,调用那个服务提供者就是根据负载均衡来调用了

  • 5:服务提供者和服务消费者定时将保存在内存中的服务调用次数和服务调用时间推送给监控中心

3、Dubbo Spring Cloud

3.1 概念定义

Spring Cloud Alibaba Dubbo是Spring Cloud Alibaba项目中的一个,扩展了分布式服务调用能力,不仅能使 Apache Dubbo 和 OpenFeign 共存,还允许 Spring Cloud 标准调用底层通过 Dubbo 支持的通讯协议传输

3.2、功能特性对比

功能特征直接引用官网的归纳:

4、实验环境准备

  • 环境准备:

    • 64bit JDK 1.8
    • SpringBoot2.3.7.RELEASE
    • SpringCloud(Hoxton.SR9)
    • SpringCloudAlibaba2.2.2.RELEASE
    • Maven 3.2+
  • 开发工具
    • IntelliJ IDEA
    • smartGit

5、API工程创建

使用maven命令

mvn archetype:generate -DgroupId=com.example.springcloud -DartifactId=dubbo-sample-api -Dversion=0.0.1-SNAPSHOT -DinteractiveMode=false

也可以自己创建一个maven项目



创建好的pom配置文件参考:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example.springcloud</groupId>
<artifactId>artifact-dubbo-sample-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>artifact-dubbo-sample-api</name>
<description>Demo project for Spring Boot</description>
<packaging>jar</packaging> <dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies> </project>

写个api接口:

package com.example.springcloud.api.service;

/**
* <pre>
* ApiService
* </pre>
*
* <pre>
* @author mazq
* 修改记录
* 修改后版本: 修改人: 修改日期: 2021/01/19 14:57 修改内容:
* </pre>
*/
public interface ApiService {
String echo(String message);
}

6、启动Nacos服务中心

详情可以参考官网:https://nacos.io/zh-cn/docs/quick-start.html,需要先下载nacos服务端源码,下载源码后编译启动项目:

window+R启动cmd窗口,cd到nacos server的bin目录,linux系统直接使用cd ${nacos_server_home}/bin

./startup.sh -m standalone

window系统使用命令startup.cmd -m standalone

启动成功,访问:http://127.0.0.1:8848/nacos,账号密码都是nacos



登录成功,来到主页:

7、服务提供者工程创建

新建项目,使用阿里的service url:



选择jdk版本,打包方式:



选择组件:



自动生成项目:加上@EnableDiscoveryClient支持服务注册到nacos


package com.example.springcloud.provider.nacosdiscovery; import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.context.annotation.Configuration; @EnableDiscoveryClient
@Configuration
public class NacosDiscoveryConfiguration {
}

使用@DubboService提供dubbo服务:

package com.example.springcloud.provider.service;

import com.example.springcloud.api.service.ApiService;
import org.apache.dubbo.config.annotation.DubboService;
import org.apache.dubbo.config.annotation.Service; /**
* <pre>
* EchoServiceImpl
* </pre>
*
* <pre>
* @author mazq
* 修改记录
* 修改后版本: 修改人: 修改日期: 2021/01/19 15:13 修改内容:
* </pre>
*/
@DubboService
public class EchoServiceImpl implements ApiService {
@Override
public String echo(String message) {
return String.format("echo:%s",message);
}
}

application.properties配置:

# 应用名称
spring.application.name=dubbo-provider-sample # dubbo 协议
dubbo.protocol.id=dubbo
dubbo.protocol.name=dubbo
# dubbo 协议端口( -1 表示自增端口,从 20880 开始)
dubbo.protocol.port=-1
# Dubbo 消费端订阅服务端的应用名,多个服务提供者用逗号分隔
# 这里订阅"自己",会被忽略掉,请根据实际情况添加
dubbo.cloud.subscribed-services=dubbo-provider-sample
# dubbo 服务扫描基准包
dubbo.scan.base-packages=com.example.springcloud.provider # Actuator Web 访问端口
management.server.port=8082
management.endpoints.jmx.exposure.include=*
management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=always # 应用服务 WEB 访问端口
server.port=8080 # Nacos帮助文档: https://nacos.io/zh-cn/docs/concepts.html
# Nacos认证信息
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
# Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
# 注册到 nacos 的指定 namespace,默认为 public
spring.cloud.nacos.discovery.namespace=public

启动项目,到nacos服务查看服务

8、服务消费者工程创建

新建一个dubbo-consumer-sample服务消费者工程,创建过程和服务提供者工程一样,不过配置需要进行修改,避免端口冲突

# 应用名称
spring.application.name=dubbo-consumer-sample # 应用服务 WEB 访问端口
server.port=9090 # Actuator Web 访问端口
management.server.port=9091
management.endpoints.jmx.exposure.include=*
management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=always # Nacos帮助文档: https://nacos.io/zh-cn/docs/concepts.html
# Nacos认证信息
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
# Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
# 注册到 nacos 的指定 namespace,默认为 public
spring.cloud.nacos.discovery.namespace=public # Dubbo服务配置
# dubbo 协议
dubbo.protocol.id=dubbo
dubbo.protocol.name=dubbo
# dubbo 协议端口( -1 表示自增端口,从 20880 开始)
dubbo.protocol.port=-1
# Dubbo 消费端订阅服务端的应用名,多个服务提供者用逗号分隔
dubbo.cloud.subscribed-services=dubbo-provider-sample

使用@DubboReference订阅服务:

package com.example.springcloud.consumer;

import com.example.springcloud.api.service.ApiService;
import org.apache.dubbo.config.annotation.DubboReference;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController; @SpringBootApplication
@RestController
public class DubboConsumerSampleApplication { @DubboReference
private ApiService echoService; @GetMapping("/echo")
public String echo(String message) {
return echoService.echo(message);
} public static void main(String[] args) {
SpringApplication.run(DubboConsumerSampleApplication.class, args);
} }



linux测试接口使用命令curl,window直接到浏览器或者postman测试:

curl http://127.0.0.1:9090/echo?message=nacos
echo:nacos

9、博客参考资料

Spring Cloud Alibaba系列之分布式服务组件Dubbo的更多相关文章

  1. Spring Cloud Alibaba系列(一)nacos作为服务注册中心

    Spring Cloud Alibaba各组件版本关系 Spring Cloud Alibaba Version Sentinel Version Nacos Version RocketMQ Ver ...

  2. Spring Cloud Alibaba+Nacos搭建微服务架构

    1. Spring Cloud Alibaba 简介    Spring Cloud Alibaba是阿里巴巴为分布式应用提供的一站式解决方案,能够更方便快捷地搭建分布式平台,nacos拥有着替换eu ...

  3. Spring Cloud Alibaba系列(二)nacos作为服务配置中心

    Nacos 提供用于存储配置和其他元数据的 key/value 存储,为分布式系统中的外部化配置提供服务器端和客户端支持.使用 Spring Cloud Alibaba Nacos Config,您可 ...

  4. Spring Cloud Alibaba系列(四)使用gateway作为服务网关

    什么是网关 在微服务架构里,服务的粒度被进一步细分,各个业务服务可以被独立的设计.开发.测试.部署和管理.这时,各个独立部署单元可以用不同的开发测试团队维护,可以使用不同的编程语言和技术平台进行设计, ...

  5. Spring Cloud Alibaba 整合 Nacos 实现服务配置中心

    在之前的文章 <Nacos 本地单机版部署步骤和使用> 中,大家应该了解了 Nacos 是什么?其中 Nacos 提供了动态配置服务功能 一.Nacos 动态配置服务是什么? 官方是这么说 ...

  6. 阿里巴巴开源 Spring Cloud Alibaba,加码微服务生态建设

    本周,Spring Cloud联合创始人Spencer Gibb在Spring官网的博客页面宣布:阿里巴巴开源 Spring Cloud Alibaba,并发布了首个预览版本.随后,Spring Cl ...

  7. Spring Cloud Alibaba(2)---RestTemplate微服务项目

    RestTemplate微服务项目 前言 因为要运用 Spring Cloud Alibaba 开源组件到分布式项目中,所以这里先搭建一个不通过 Spring Cloud只通过 RestTemplat ...

  8. Spring Cloud Alibaba 实战 之 Nacos 服务注册和发现

    服务注册与发现,服务发现主要用于实现各个微服务实例的自动化注册与发现,是微服务治理的核心,学习 Spring Cloud Alibaba,首先要了解框架中的服务注册和发现组件——Nacos. 一.Sp ...

  9. Spring Cloud Alibaba系列(五)sentinel实现服务限流降级

    一.sentinel是什么 sentinel的官方名称叫分布式系统的流量防卫兵.Sentinel 以流量为切入点,从流量控制.熔断降级.系统负载保护等多个维度保护服务的稳定性.在Spring Clou ...

随机推荐

  1. linux下更新gcc

    1 下载源码 链接 目前最新为9.2版本. 2 解压 tar -zxvf gcc-9.2.0.tar.gz cd gcc-9.2.0 3 download_prerequisites脚本 运行这个脚本 ...

  2. matlab结构体、数组和单元数组类型的创建

    matlab结构体.数组和单元数组类型的创建 @ 目录 matlab结构体.数组和单元数组类型的创建 matlab结构体类型 数组类型 单元数组类型 matlab结构体类型 通过字段赋值创建结构体 创 ...

  3. 使用Tensorflow Object Detection进行训练和推理

    整体流程(以PASCAL VOC为例) 1.下载PASCAL VOC2012数据集,并将数据集转为tfrecord格式 2.选择并下载预训练模型 3.配置训练文件configuration(所有的训练 ...

  4. 09- monkey命令详解

    安装模拟器 如果你没有手机可以安装个模拟器,如果有手机了,忽略此步骤. 1.下载模拟器:http://www.xyaz.cn/ 2.安装:直接默认安装. 3.打开安卓模拟器,设置-关于手机-点击版本号 ...

  5. PAT 乙级 -- 1001 -- 害死人不偿命的(3n+1)猜想

    题目: 卡拉兹(Callatz)猜想: 对任何一个自然数n,如果它是偶数,那么把它砍掉一半:如果它是奇数,那么把(3n+1)砍掉一半.这样一直反复砍下去,最后一定在某一步得到n=1.卡拉兹在1950年 ...

  6. hdu5012 水搜索

    题意:       给你一个正方体的初始状态和末状态,问你是否可以再6步之内转到这个状态,有四种转的方式,如果你面对的是正方向的正前方,那么转的方式就是 顺时针,逆时针,上,下. 思路:        ...

  7. UVA11991第k次出现的v的下标

    题意:      给你一个有n个数的数字序列,然后有m组询问,每组询问是问第k次出现的v在序列里的小标是多少? 思路:      简单题目,直接开个二维的容器就行了,标记出现次数可以开个数组或者是一维 ...

  8. Linux系统登录相关

    whoami:查看当前用户 who:查看当前登录系统的所有用户 tty指的是主机的图形化界面的面板 pts/x指的是远程ssh连接的窗口 who -b:主机的上一次启动时间 w:显示已经登陆系统的用户 ...

  9. Jmeter和Postman做接口测试的区别,孰优孰劣?

    区别1:用例组织方式 不同的目录结构与组织方式代表不同工具的测试思想,学习一个测试工具应该首先了解其组织方式. Jmeter的组织方式相对比较扁平,它首先没有WorkSpace(工作空间)的概念,直接 ...

  10. @Scheduled 实现定时任务

    @Scheduled注解实现定时任务 一.创建一个Springboot项目在启动类里加上@EnableScheduling 二.在写的定时任务的类上加上@Component把该类交由springboo ...