Spring Cloud Alibaba系列之分布式服务组件:Dubbo的疑难解答
Posted javatiange
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Cloud Alibaba系列之分布式服务组件:Dubbo的疑难解答相关的知识,希望对你有一定的参考价值。
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:服务提供者和服务消费者定时将保存在内存中的服务调用次数和服务调用时间推送给监控中心
如果你觉得自己学习效率低,缺乏正确的指导,可以加入资源丰富,学习氛围浓厚的技术圈一起学习交流吧!
[Java架构群]
群内有许多来自一线的技术大牛,也有在小厂或外包公司奋斗的码农,我们致力打造一个平等,高质量的JAVA交流圈子,不一定能短期就让每个人的技术突飞猛进,但从长远来说,眼光,格局,长远发展的方向才是最重要的。
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.8SpringBoot2.3.7.RELEASESpringCloud(Hoxton.SR9)SpringCloudAlibaba2.2.2.RELEASEMaven 3.2+
- 开发工具IntelliJ IDEAsmartGit
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
写在最后
最近我整理了整套《JAVA核心知识点总结》,说实话,作为一 名 Java 程序员,不论你需不需要面试都应该好好看下这份资料。拿到手总是不亏的~我的不少粉丝也因此拿到腾讯字节快手offer,点击下面图片↓直达领取
好了,以上就是本文的全部内容了,如果觉得有收获,记得三连,我们下期再见。
以上是关于Spring Cloud Alibaba系列之分布式服务组件:Dubbo的疑难解答的主要内容,如果未能解决你的问题,请参考以下文章
SpringCloud - Spring Cloud Alibaba 之 SkyWalking 分布式链路跟踪;服务,端点,实例;IDEA配置;告警(十三)
Spring Cloud Alibaba | 微服务分布式事务之Seata
Spring Cloud Alibaba 系列之 Gateway(网关)
SpringCloud - Spring Cloud Alibaba 之 Seata分布式事务服务;TCC事务模式机制(二十三)
SpringCloud - Spring Cloud Alibaba 之 Skywalking 分布式链路跟踪;下载安装,应用
SpringCloud - Spring Cloud Alibaba 之 Seata分布式事务服务;AT事务模式(二十)