# dubbo
**Repository Path**: chen-yingfu/dubbo
## Basic Information
- **Project Name**: dubbo
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2024-11-02
- **Last Updated**: 2024-11-08
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Dubbo
## 一、单体架构和分布式架构
### 单体架构
一个系统业务量很小的时候所有代码都放在一个项目中就好了,然后这个项目部署在一台服务器上,整个项目所有的服务都由这台服务器提供。

#### 优点:部署方便,操作简单。
#### 缺点:
1. 服务性能存在瓶颈
2. 代码量庞大,系统臃肿,牵一发动全身
3. 单点故障问题
### 分布式架构
分布式架构就是将一个完整的的系统,按照业务功能,拆分成一个个独立的子系统,在分布式结构中,每个子系统被称为“服务”。这些子系统可以独立运行在web容器中,它们之间通过RPC方式通信。


## 二、RPC
RPC(Remote Procedure Call)远程过程调用,它是一种通过网络从远程计算机程序上请求服务。
PRC就是让你用别人家的东西跟像自己家的一样。
### RPC两个作用
1. 屏蔽远程调用跟本地调用的区别,让我们感觉就是调用项目内的方法。
2. 隐藏底层网络通信的复杂性,让我们更加专注业务逻辑。
### 常用的RPC框架
阿里的 Dubbo/Dubbox、Google gRPc、Spring Cloud.
## 三、Dubbo简介
Apache Dubbo是一款高性能、轻量级的开源服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。
### Dubbo作用
1. 透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。
2. 软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,降低成本,减少单点。
3. 服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者。

### Dubbo支持的协议
Dubbo协议、Hessian协议、HTTP协议、RMI协议、WebService协议、Thrift协议、Memcached协议、Redis协议
### Dubbo工作流程

## 四、Dubbo3升级的核心内容
1. 易用性
开箱即用易用性高,如 Java 版本的面向接口代理特性能实现本地透明调用功能丰富,基于原生库或轻量扩展即可实现绝大多数的微服务治理能力。更加完善了多语言支持(GO PYTHON RUST)
2. 超大规模微服务实践
高性能通信(Triple GRPC;)
高可扩展性(SPI多种序列化方式 多种协议)
丰富的服务治理能力。
超大规模集群实例水平扩展
3. 云原生
容器调度平台(Kubernetes)
将服务的组织与注册交给底层容器平台,如 Kubernetes,这是更云原生的方式。
Service Mesh
原有Mesh结构中通过Sidecar完成负载均衡、路由等操作,但是存在链路的性能损耗大,现有系统迁移繁琐等问题。 Dubbo3引入Proxyless Mesh,直接和控制面交互[istio]通信。集成ServiceMesh更为方便,效率更高。
## 五、dubbo-demo编写
### springMVC
1. 创建项目
建议maven3.8.x,不要太高版本(不稳定),jdk1.8和17都可


先创建一个父maven工程dubbo-demo,然后创建三个子maven模块分别为dubbo-api(通用内容,比如entity和service)、dubbo-provider(功能提供者)和dubbo-consumer(功能消费者)
2. 引入依赖(pom.xml文件)
dubbo-demo的pom.xml文件引入以下依赖
```
org.projectlombok
lombok
1.18.28
org.slf4j
slf4j-api
1.7.32
ch.qos.logback
logback-core
1.2.11
org.apache.dubbo
dubbo
3.2.0
org.apache.curator
curator-x-discovery
5.2.0
org.apache.zookeeper
zookeeper
3.6.3
```
dubbo-provide和dubbo-consumer分别引入dubbo-api的依赖
```
com.cyfdubbo
dubbo-api
1.0-SNAPSHOT
```


3. dubbo-api模块代码
dubbo-api主要是通用内容

4. dubbo-provider模块代码
提供功能实现的代码

在resources文件下,新建一个applicationContext-provider.xml文件
配置4个内容
1. 这个名随便起一个都行,后面会被注册中心管理
``
选apache的application

2. 网络通信
网络通信问题,consumer和provider是两个不同的应用,需要跨虚拟机的,也就是跨进程,也就需要网络通信,要想provicer中的UserServiceImpl中的login方法被consumer调用的话就需要通过网络通信来进行调用,而网络通信是离不开协议的,所以这边需要设置rpc相应的协议。用dubbo自己定义的协议,端口用dubbo默认的20880端口
``
3. 要使用provider里面的UserServiceImpl的方法,需要创建他的对象
``
4. 最后发布rpc服务
``
最后在resources文件下,新建一个日志的配置文件,log4j.properties
```
log4j.rootLogger=DEBUG, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
```
启动类
创建工厂,启动工厂
后期的服务需要长期驻留在内存中,也就是阻塞在我们的程序中,因为不知道客户端什么时候访问我

当出现这个代表启动运行成功

5. dubbo-consumer模块代码
在resources文件下,新建一个applicationContext-consumer.xml文件
配置2个内容
只配置名字,不关闭dubbo的qos监控会导致,端口冲突,虽然也不影响项目运行


```
```
通过dubbo获取远端的rpc服务,url是dubbo-provider运行之后在输出台上有显示
``
在resources文件下,也要新建一个日志的配置文件,log4j.properties,跟dubbo-provider的一样
启动类
创建工厂,通过getBean的方式来获取远端的rpc服务,然后就是后续功能的调用
System.in.read()也能起到阻塞的效果

当出现这个代表启动运行成功

## 六、服务注册中心Zookeeper安装
### Windows
解压apache-zookeeper-3.8.0-bin.tar.gz到Zookeeper文件夹
打开apache-zookeeper-3.8.0-bin文件夹,在里面新建两个文件夹data和log

打开conf文件夹,复制zoo_sample.cfg文件,并且粘贴重命名为zoo.cfg文件

用记事本打开zoo.cfg文件,将dataDir的路径配置成你data文件夹的路径,并且加入dataLogDir,将dataLogDir的路径配置成log文件夹的路径

打开bin文件夹

先双击zkServer.cmd,出现下图,表示启动成功


先双击zkCli.cmd,出现下图,表示安装成功


### Linux
拉取zookeeper镜像
`docker pull zookeeper`
启动zookeeper
`docker run --name zk -d -p 2181:2181 zookeeper:3.7.1`
查看是否运行成功
`docker ps`
登录虚拟容器
`docker exec -it zk sh`
连接本地zookeeper
`zkCli.sh`

断开连接
Ctrl+c
退出虚拟容器
Ctrl+d
## 七、安装Dubbo-admin可视化工具
下载Dubbo-Admin镜像
`docker pull docker.io/apache/dubbo-admin`
创建目录
```
mkdir -p /user/dubbo-admin
cd /user/dubbo-admin
```
编写properties文件
`vi myapplication.properties`
配置文件内容,配置的IP用内网
```
# dubbo-admin-server/src/main/resources/application.properties
server.port=38080
dubbo.protocol.port=30880
dubbo.application.qos-port=32222
admin.registry.address=zookeeper://192.168.0.205:2181
admin.config-center=zookeeper://192.168.0.205:2181
admin.metadata-report.address=zookeeper://192.168.0.205:2181
admin.root.user.name=root
admin.root.user.password=root
```
运行命令启动Dubbo-admin
`docker run -it --rm -v /usr/dubbo-admin/myapplication.properties:/dubbo-admin/myapplication.properties -p 38080:38080 apache/dubbo-admin`
浏览器输入服务器公网IP,进入服务
`http://116.205.108.246:38080`
