# 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 ## 一、单体架构和分布式架构 ### 单体架构 一个系统业务量很小的时候所有代码都放在一个项目中就好了,然后这个项目部署在一台服务器上,整个项目所有的服务都由这台服务器提供。 ![输入图片说明](D1.png) #### 优点:部署方便,操作简单。 #### 缺点: 1. 服务性能存在瓶颈 2. 代码量庞大,系统臃肿,牵一发动全身 3. 单点故障问题 ### 分布式架构 分布式架构就是将一个完整的的系统,按照业务功能,拆分成一个个独立的子系统,在分布式结构中,每个子系统被称为“服务”。这些子系统可以独立运行在web容器中,它们之间通过RPC方式通信。 ![输入图片说明](D2.png) ![输入图片说明](D3.png) ## 二、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地址,并且能够平滑添加或删除服务提供者。 ![输入图片说明](D4.png) ### Dubbo支持的协议 Dubbo协议、Hessian协议、HTTP协议、RMI协议、WebService协议、Thrift协议、Memcached协议、Redis协议 ### Dubbo工作流程 ![输入图片说明](D5.png) ## 四、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都可 ![输入图片说明](D6.png) ![输入图片说明](D7.png) 先创建一个父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 ``` ![输入图片说明](D8.png) ![输入图片说明](D9.png) 3. dubbo-api模块代码 dubbo-api主要是通用内容 ![输入图片说明](D10.png) 4. dubbo-provider模块代码 提供功能实现的代码 ![输入图片说明](D11.png) 在resources文件下,新建一个applicationContext-provider.xml文件 配置4个内容 1. 这个名随便起一个都行,后面会被注册中心管理 `` 选apache的application ![输入图片说明](D13.png) 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 ``` 启动类 创建工厂,启动工厂 后期的服务需要长期驻留在内存中,也就是阻塞在我们的程序中,因为不知道客户端什么时候访问我 ![输入图片说明](D12.png) 当出现这个代表启动运行成功 ![输入图片说明](D14.png) 5. dubbo-consumer模块代码 在resources文件下,新建一个applicationContext-consumer.xml文件 配置2个内容 只配置名字,不关闭dubbo的qos监控会导致,端口冲突,虽然也不影响项目运行 ![输入图片说明](D15.png) ![输入图片说明](D18.png) ``` ``` 通过dubbo获取远端的rpc服务,url是dubbo-provider运行之后在输出台上有显示 `` 在resources文件下,也要新建一个日志的配置文件,log4j.properties,跟dubbo-provider的一样 启动类 创建工厂,通过getBean的方式来获取远端的rpc服务,然后就是后续功能的调用 System.in.read()也能起到阻塞的效果 ![输入图片说明](D16.png) 当出现这个代表启动运行成功 ![输入图片说明](D17.png) ## 六、服务注册中心Zookeeper安装 ### Windows 解压apache-zookeeper-3.8.0-bin.tar.gz到Zookeeper文件夹 打开apache-zookeeper-3.8.0-bin文件夹,在里面新建两个文件夹data和log ![输入图片说明](Z1.png) 打开conf文件夹,复制zoo_sample.cfg文件,并且粘贴重命名为zoo.cfg文件 ![输入图片说明](Z2.png) 用记事本打开zoo.cfg文件,将dataDir的路径配置成你data文件夹的路径,并且加入dataLogDir,将dataLogDir的路径配置成log文件夹的路径 ![输入图片说明](Z3.png) 打开bin文件夹 ![输入图片说明](Z4.png) 先双击zkServer.cmd,出现下图,表示启动成功 ![输入图片说明](Z5.png) ![输入图片说明](Z6.png) 先双击zkCli.cmd,出现下图,表示安装成功 ![输入图片说明](Z7.png) ![输入图片说明](Z8.png) ### 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` ![输入图片说明](Z9.png) 断开连接 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` ![输入图片说明](Z10.png)