郑州网站关键字优化,优设网app官方下载,大型旅游网站源码 织梦,昆明百度小程序一、基础
分布式理论
什么是分布式系统#xff1f;
在《分布式系统原理与范型》一书中有如下定义#xff1a;“分布式系统是若干独立计算机的集合#xff0c;这些计算机对于用户来说就像单个相关系统”#xff1b;
分布式系统是由一组通过网络进行通信、为了完成共同的…一、基础
分布式理论
什么是分布式系统
在《分布式系统原理与范型》一书中有如下定义“分布式系统是若干独立计算机的集合这些计算机对于用户来说就像单个相关系统”
分布式系统是由一组通过网络进行通信、为了完成共同的任务而协调工作的计算机节点组成的系统。分布式系统的出现是为了用廉价的、普通的机器完成单个计算机无法完成的计算、存储任务。其目的是利用更多的机器处理更多的数据。
分布式系统distributed system是建立在网络之上的软件系统。
首先需要明确的是只有当单个节点的处理能力无法满足日益增长的计算、存储任务的时候且硬件的提升加内存、加磁盘、使用更好的CPU高昂到得不偿失的时候应用程序也不能进一步优化的时候我们才需要考虑分布式系统。因为分布式系统要解决的问题本身就是和单机系统一样的而由于分布式系统多节点、通过网络通信的拓扑结构会引入很多单机系统没有的问题为了解决这些问题又会引入更多的机制、协议带来更多的问题。。。
随着互联网的发展网站应用的规模不断扩大常规的垂直应用架构已无法应对分布式服务架构以及流动计算架构势在必行急需一个治理系统确保架构有条不紊的演进。
在Dubbo的官网文档有这样一张图 单一应用架构
当网站流量很小时只需一个应用将所有功能都部署在一起以减少部署节点和成本。此时用于简化增删改查工作量的数据访问框架(ORM)是关键。 适用于小型网站小型管理系统将所有功能都部署到一个功能里简单易用。
缺点
1、性能扩展比较难
2、协同开发问题
3、不利于升级维护
垂直应用架构
当访问量逐渐增大单一应用增加机器带来的加速度越来越小将应用拆成互不相干的几个应用以提升效率。此时用于加速前端页面开发的Web框架(MVC)是关键。 通过切分业务来实现各个模块独立部署降低了维护和部署的难度团队各司其职更易管理性能扩展也更方便更有针对性。
缺点 公用模块无法重复利用开发性的浪费
分布式服务架构
当垂直应用越来越多应用之间交互不可避免将核心业务抽取出来作为独立的服务逐渐形成稳定的服务中心使前端应用能更快速的响应多变的市场需求。此时用于提高业务复用及整合的**分布式服务框架(RPC)**是关键。 流动计算架构
当服务越来越多容量的评估小服务资源的浪费等问题逐渐显现此时需增加一个调度中心基于访问压力实时管理集群容量提高集群利用率。此时用于提高机器利用率的资源调度和治理中心(SOA)**[ Service Oriented Architecture]**是关键。 RPC
RPC【Remote Procedure Call】是指远程过程调用是一种进程间通信方式他是一种技术的思想而不是规范。它允许程序调用另一个地址空间通常是共享网络的另一台机器上的过程或函数而不用程序员显式编码这个远程调用的细节。即程序员无论是调用本地的还是远程的函数本质上编写的调用代码基本相同。
也就是说两台服务器AB一个应用部署在A服务器上想要调用B服务器上应用提供的函数/方法由于不在一个内存空间不能直接调用需要通过网络来表达调用的语义和传达调用的数据。为什么要用RPC呢就是无法在一个进程内甚至一个计算机内通过本地调用的方式完成的需求比如不同的系统间的通讯甚至不同的组织间的通讯由于计算能力需要横向扩展需要在多台机器组成的集群上部署应用。RPC就是要像调用本地的函数一样去调远程函数。
推荐阅读文章
RPC基本原理 步骤解析 RPC两个核心模块通讯序列化。 二、Dubbo
官网 Apache Dubbo 是一款 RPC 服务开发框架用于解决微服务架构下的服务治理与通信问题。使用 Dubbo 开发的微服务原生具备相互之间的远程地址发现与通信能力 利用 Dubbo 提供的丰富服务治理特性可以实现诸如服务发现、负载均衡、流量调度等服务治理诉求。Dubbo 被设计为高度可扩展用户可以方便的实现流量拦截、选址的各种定制逻辑。 Dubbo的前世今生 Apache Dubbo 最初是为了解决阿里巴巴内部的微服务架构问题而设计并开发的在十多年的时间里它在阿里巴巴公司内部的很多业务系统的到了非常广泛的应用。最早在 2008 年阿里巴巴就将 Dubbo 捐献到开源社区它很快成为了国内开源服务框架选型的事实标准框架得到了业界更广泛的应用。在 2017 年Dubbo 被正式捐献 Apache 软件基金会并成为 Apache 顶级项目开始了一段新的征程。 基本概念 服务提供者Provider暴露服务的服务提供方服务提供者在启动时向注册中心注册自己提供的服务。
服务消费者Consumer: 调用远程服务的服务消费方服务消费者在启动时向注册中心订阅自己所需的服务服务消费者从提供者地址列表中基于软负载均衡算法选一台提供者进行调用如果调用失败再选另一台调用。
注册中心Registry注册中心返回服务提供者地址列表给消费者如果有变更注册中心将基于长连接推送变更数据给消费者。
监控中心Monitor服务消费者和提供者在内存中累计调用次数和调用时间定时每分钟发送一次统计数据到监控中心 调用关系说明
l 服务容器负责启动加载运行服务提供者。
l 服务提供者在启动时向注册中心注册自己提供的服务。
l 服务消费者在启动时向注册中心订阅自己所需的服务。
l 注册中心返回服务提供者地址列表给消费者如果有变更注册中心将基于长连接推送变更数据给消费者。
l 服务消费者从提供者地址列表中基于软负载均衡算法选一台提供者进行调用如果调用失败再选另一台调用。
l 服务消费者和提供者在内存中累计调用次数和调用时间定时每分钟发送一次统计数据到监控中心。 三、搭建ZooKeeper注册中心 zookeeper下载 从cmd窗口进入Zookeeper文件夹下的bin目录执行zkServer.cmd启动 如果报错提示 zoo.cfg 文件缺失( zoo.cfg file is missing )则进入zookeeper-conf将 zoo_sample.cfg 复制一份命名为 zoo.cfg 重新启动。 启动成功出现zookeeper字样 可能遇到问题闪退 ! 解决方案编辑zkServer.cmd文件末尾添加pause 。这样运行出错就不会退出会提示错误信息方便找到原因。 注意几个重要位置 dataDir./ 临时数据存储的目录可写相对路径 clientPort2181 zookeeper的端口号 修改完成后注意重新启动zookeeper 使用 zkCli.cmd 测试 ls /列出zookeeper根下保存的所有节点 create –e /age 18创建一个age节点值为18 get /age获取/age节点的值 四、搭建Dubbo管理后台 从github上拉取/直接下载解压 这是一个前后端分离的项目 部署 dubbo-admin-server 在项目目录下打包 dubbo-admin-server mvn clean package -Dmaven.test.skiptrue第一次打包过程缓慢 执行 dubbo-admin-master\dubbo-admin-server\target 下的 dubbo-admin-server-0.5.0.jar ( 注意需提前启动ZooKeeper ) java -jar dubbo-admin-server-0.5.0.jar部署 dubbo-admin-ui cmd窗口进入dubbo-admin-ui执行以下命令下载依赖( 注意需有node环境 ) npm install下载完毕后执行启动命令 npm run dev注意 前后端项目应注意端口号对接。 进入控制后台 用户名/密码默认均为root登录即可 五、Spring Boot 整合 Dubbo ZooKeeper
启动 Zookeeper创建项目
新建立一个初始项目父项目 可以是Maven项目也可以是空项目
groupIdcom.jmd/groupIdartifactIddubbo-zookeeper/artifactIdversion1.0-SNAPSHOT/versionpackagingpom/packagingmodulesmodulepublic-interface/modulemoduleprovider/modulemoduleconsumer/module/modulespropertiesmaven.compiler.source11/maven.compiler.sourcemaven.compiler.target11/maven.compiler.target/properties搭建好基础项目后还需创建 public-interface (公共接口、provider 服务提供者、consumer 服务消费者三个子模块 新建 Spring Boot 项目时勾选 web再添加dubbo和zookeeper依赖即可
dependencies!-- 公共API --dependencygroupIdcom.jmd/groupIdartifactIdpublic-interface/artifactIdversion0.0.1-SNAPSHOT/version/dependency!-- Dubbo --dependencygroupIdorg.apache.dubbo/groupIdartifactIddubbo-spring-boot-starter/artifactIdversion3.1.8/version/dependency!-- ZooKeeper --dependencygroupIdorg.apache.curator/groupIdartifactIdcurator-framework/artifactIdversion5.3.0/versionexclusions!--排除这个log4j--exclusiongroupIdlog4j/groupIdartifactIdlog4j/artifactId/exclusion/exclusions/dependencydependencygroupIdorg.apache.curator/groupIdartifactIdcurator-recipes/artifactIdversion5.3.0/version/dependencydependencygroupIdorg.apache.curator/groupIdartifactIdcurator-x-discovery/artifactIdversion5.3.0/version/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-tomcat/artifactIdscopeprovided/scope/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependency/dependencies定义服务接口
在 public-interface 公共API模块下定义服务接口
package com.jmd.publicinterface.service;/*** Created with IntelliJ IDEA.* User: JiangMingda* Time: 2023/7/5 005 10:26* File: TicketService* Description: 定义服务接口*/
public interface TicketService {String getTicket();
} 服务接口 Dubbo 中沟通消费端和服务端的桥梁 定义了 getTicket 这个方法。后续服务端发布的服务消费端订阅的服务都是围绕着这个 public-interface 服务接口展开的。 定义服务端的实现
在 **provider **服务提供者模块下实现服务接口
package com.jmd.provider.sercive;import com.jmd.publicinterface.service.TicketService;
import org.apache.dubbo.config.annotation.DubboService;/*** Created with IntelliJ IDEA.* User: JiangMingda* Time: 2023/7/5 005 10:28* File: TicketServiceImpl* Description: 服务实现类*/DubboService
public class TicketServiceImpl implements TicketService {Overridepublic String getTicket() {return 一张去拉萨的火车票;}
} 定义了服务接口之后可以在服务端这一侧定义对应的实现这部分的实现相对于消费端来说是远端的实现本地没有相关的信息。 注在TicketServiceImpl 类中添加了 DubboService 注解通过这个配置可以基于 Spring Boot 去发布 Dubbo 服务。 配置 yaml 配置文件
服务提供者
dubbo:application:name: providerprotocol:name: dubboport: -1registry:address: zookeeper://127.0.0.1:2181
server:port: 8085
服务消费者
dubbo:application:name: consumerprotocol:name: dubboport: -1registry:address: zookeeper://127.0.0.1:2181
server:port: 8086 在这个配置文件中定义了 Dubbo 的应用名、Dubbo 协议信息、Dubbo 使用的注册中心地址。 注意 服务端口占用问题编写测试类
package com.jmd.consumer;import com.jmd.consumer.service.UserService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;SpringBootTest
class ConsumerApplicationTests {Autowiredprivate UserService userService;Testvoid contextLoads() {userService.buyTicket();}} 配置启动类并启动服务进行测试
package com.jmd.provider;import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;SpringBootApplication
EnableDubbo
public class ProviderApplication {public static void main(String[] args) {SpringApplication.run(ProviderApplication.class, args);}} 在两个模块的启动类上添加EnableDubbo注解开启dubbo的自动配置 结果 OK