当前位置: 首页 > news >正文

玉溪哪有网站建设开发互联网工程有限公司

玉溪哪有网站建设开发,互联网工程有限公司,网站有了备案号之后能做什么,邢台网站建设最新报价目录 RPC理论概述 RPC的基本思想 RPC的实现组成部分 RPC的实现流程 RPC的核心思想 RPC调用分类 初识Dubbo Dubbo特性 Dubbo设计架构 zookeeper环境搭建 搭建注册中心环境 搭建监控中心环境 Dubbo入门案例(Dubbo Spring) 实现步骤 搭建中介者组件共享资源 打包为jar#xf… 目录 RPC理论概述 RPC的基本思想 RPC的实现组成部分 RPC的实现流程 RPC的核心思想 RPC调用分类 初识Dubbo Dubbo特性  Dubbo设计架构  zookeeper环境搭建 搭建注册中心环境 搭建监控中心环境 Dubbo入门案例(Dubbo Spring) 实现步骤 搭建中介者组件共享资源  打包为jar共享数据 服务提供者为共享Service实现具体逻辑  服务消费者为共享Service实现具体逻辑  导入远程调用依赖 服务提供者注册服务到Zookeeper上 测试注册是否成功  服务消费者到Zookeeper上订阅服务实例化共享Service 测试订阅是否成功 Dubbo与SpringBoot整合 导入以下依赖  配置 application.properties直接CV模板吧 服务提供者配置 服务消费者配置 重点服务提供者和消费者的启动类上都要开启Dubbo功能 服务暴露 / 订阅 服务提供者暴露服务 服务消费者订阅服务 Dubbo配置 覆盖策略 配置启动时检查  配置全局超时配置 SpringBoot与Dubbo整合的三种方式  使用默认application.properties和注解的方式 引入dubbo.xml配置文件  使用注解API的方式 高可用  zookeeper宕机与Dubbo直连 zookeeper宕机 Dubbo直连         Dubbo的直连Direct Connection指的是消费者直接连接到指定的服务提供者而不通过注册中心进行服务的发现和路由。 应用场景 直连配置 集群下dubbo负载均衡配置 Random LoadBalance 基于权重的随机负载均衡机制 RoundRobin LoadBalance 基于权重的轮询负载均衡机制 LeastActive LoadBalance最少活跃数负载均衡机制  ConsistentHash LoadBalance一致性hash 负载均衡机制 ShortestResponse LoadBalance 权重配置 1、静态配置 2、动态配置 选型建议  服务降级 什么是服务降级? 解决策略 集群容错  容错模式 整合hystrix 配置spring-cloud-starter-netflix-hystrix 案例实践 配置Provider端 Dubbo原理 RPC原理 netty通信原理 大白话体会Dubbo原理 服务暴露原理 服务订阅原理 RPC理论概述 远程过程调用Remote Procedure Call简称RPC是一种通信协议和编程技术用于实现分布式系统中的不同进程或计算机之间的相互调用。 RPC的基本思想 在一个进程中的代码可以通过像调用本地函数一样调用远程计算机上的函数。在RPC中客户端调用远程服务的过程就像调用本地函数一样简单而不需要关心底层细节。 RPC的实现组成部分 客户端发起远程调用的一方向远程服务请求执行某个函数或方法。服务端提供远程服务的一方接收客户端的调用请求并执行相应的函数或方法。接口定义语言IDL客户端和服务端之间通信需要定义一个接口IDL用于描述函数或方法的参数与返回值类型以确保双方对接口的理解一致。序列化在网络上传输数据时需要将数据按照一定的格式进行编码和解码序列化将数据转换为可传输的二进制数据而反序列化则将接收到的二进制数据还原为原始数据。网络通信RPC通过网络进行客户端和服务端的通信可以使用传输层协议如TCP、HTTP等来传输数据。服务注册与发现在分布式环境中需要有一种机制来管理和发现可用的服务通常使用服务注册与发现机制来实现如使用ZooKeeper、Consul等。 RPC的实现流程 Client像调用本地服务似的调用远程服务Client stub接收到调用后将方法、参数序列化客户端通过sockets将消息发送到服务端Server stub 收到消息后进行解码将消息对象反序列化Server stub 根据解码结果调用本地的服务本地服务执行(对于服务端来说是本地执行)并将结果返回给Server stubServer stub将返回结果打包成消息将结果消息对象序列化服务端通过sockets将消息发送到客户端Client stub接收到结果消息并进行解码将结果消息发序列化客户端得到最终结果。 RPC的核心思想 通过封装网络通信的细节使得客户端和服务端之间的远程调用过程更加简洁、透明。它可以加速开发过程并方便地构建分布式系统。不过需要注意的是RPC并不是解决所有分布式系统问题的万能工具仍然需要根据具体的业务要求和场景选择适合的技术和架构。 RPC调用分类 同步调用客户方等待调用执行完成并返回结果。异步调用客户方调用后不用等待执行结果返回但依然可以通过回调通知等方式获取返回结果。若客户方不关心调用返回结果则变成单向异步调用单向调用不用返回结果。 初识Dubbo Dubbo 是一款高性能、轻量级的开源Java RPC框架它提供了三大核心能力面向接口的远程方法调用智能容错和负载均衡服务自动注册和发现。分布式系统是将一个系统拆分为多个不同的服务 Dubbo特性  1服务注册中心 相比Hessian类RPC框架Dubbo有自己的服务中心 写好的服务可以注册到服务中心 客户端从服务中心寻找服务然后再到相应的服务提供者机器获取服务。通过服务中心可以实现集群、负载均衡、高可用(容错) 等重要功能。服务中心一般使用 zookeeper 实现也有redis和其他一些方式。以使用zookeeper作为服务中心为例服务提供者启动后会在zookeeper的/dubbo节点下创建提供的服务节点包含服务提供者ip、port等信息。服务提供者关闭时会从zookeeper中移除对应的服务。服务使用者会从注册中心zookeeper中寻找服务同一个服务可能会有多个提供者Dubbo会帮我们找到合适的服务提供者也就是针对服务提供者的负载均衡。 2负载均衡 当同一个服务有多个提供者在提供服务时客户端如何正确的选择提供者实现负载均衡呢dubbo也给我们提供了几种方案 random 随机选提供者并可以给提供者设置权重roundrobin 轮询选择提供者leastactive 最少活跃调用数相同活跃数的随机活跃数指调用前后计数差。使慢的提供者收到更少请求因为越慢的提供者的调用前后计数差会越大。consistenthash 一致性hash相同参数的请求发到同一台机器上。 3简化测试允许直连提供者         在开发阶段为了方便测试通常系统客户端能指定调用某个服务提供者那么可以在引用服务时加一个url参数去指定服务提供者。 配置如下 dubbo:reference idxxxServiceinterfacecom.alibaba.xxx.XxxServiceurldubbo://localhost:20890/4服务版本服务分组 在Dubbo配置文件中可以通过制定版本实现连接制定提供者也就是通过服务版本可以控制服务的不兼容升级当同一个服务有多种实现时可以使用服务分组进行区分。 Dubbo设计架构  服务提供者Provider暴露服务的服务提供方服务提供者在启动时向注册中心注册自己提供的服务。服务消费者Consumer: 调用远程服务的服务消费方服务消费者在启动时向注册中心订阅自己所需的服务服务消费者从提供者地址列表中基于软负载均衡算法选一台提供者进行调用如果调用失败再选另一台调用。注册中心Registry注册中心返回服务提供者地址列表给消费者如果有变更注册中心将基于长连接推送变更数据给消费者。监控中心Monitor服务消费者和提供者在内存中累计调用次数和调用时间定时每分钟发送一次统计数据到监控中心。 zookeeper环境搭建 搭建注册中心环境 Dubbo官方文档: http://dubbo.apache.org/en-us/docs/user/quick-start.html 在zookeeper官网下载zookeeperhttp://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.14/ 在bin文件下启动zkServer.cmd会有报错处理需要在condif文件中将zoo_sample.cfg文件复制一份将名字改为zoo.cfg。在zookeeper的文件夹下创建data文件夹打开zoo.cfg修改datadir将dataDir数据保存为我们自定义的文件中(此步骤可省略)  配置完毕后我们再次在conf下启动zkServer.cmd这次可以成功启动 继续运行zkCli.cmd可以连接到zookeeper的服务器。 此时我们zookeeper的注册中心及环境以及搭建完毕。 搭建监控中心环境 下载dubbo-admin dubbo-admin下载地址 https://github.com/apache/dubbo-admin/tree/master 解压后进入目录修改指定zookeeper地址 进入如下地址 dubbo-admin-master\dubbo-admin\src\main\resources\application.properties 将zookeeper的监控中心的地址配置为本地端口 #注册中心的地址 dubbo.registry.addresszookeeper://127.0.0.1:2181配置完毕后我们在dubo-zookeeper\dubbo-admin-master\dubbo-admin文件夹下cmd打包测试下。 mvn clean package在target文件中打包完成的jar包 cmd命令 java -jar dubbo-admin-0.0.1-SNAPSHOT.jar  运行打包好的jar包 启动成功后可以看到一个7001的端口  此时我们的zookeeper的服务都为启动状态在浏览器中访问 localhost:7001访问到注册中心输入账号密码root。 此时我们zookeeper监控中心的配置完成。注意要访问到监控中心一定要启动zookeeper注册中心的启动类 Dubbo入门案例(Dubbo Spring) 基于以下图实现服务 提供者、消费者 实现步骤 将涉及了组件间交互的一些共有资源比如Bean、Service接口独立写在第三方中介人组件上将该中介人组件打包为jar包引入到服务提供者和消费者的pom文件中这样子就可以实现这些资源的共享在服务提供者和消费者的组件中实现对应的服务实现逻辑ServiceImpl类导入相关的依赖Dubbo Zookeeper服务提供者配置好要将自己的哪个接口的哪个实现类注册到Zookeeper注册中心的哪个位置上服务消费者配置好自己要去Zookeeper注册中心要订阅什么服务生成代理对象实例化共享Service 搭建中介者组件共享资源  将 提供者 和 消费者 项目中的需要进行远程调用的 Service接口类 和 实体类复制到中介者组件gmail-interface相关的文件包下 打包为jar共享数据 把服务提供者和消费者项目中引入以下依赖其实就是相当于把整个中介者组件都纳入进类库中 dependencygroupIdcom.lemon.gmail/groupIdartifactIdgmail-interface/artifactIdversion1.0-SNAPSHOT/version/dependency服务提供者为共享Service实现具体逻辑  UserServiceImp public class UserServiceImpl implements UserService {public ListUserAddress getUserAddressList(String userId) {UserAddress address1 new UserAddress(1, 河南省郑州巩义市宋陵大厦2F, 1, 安然, 150360313x, Y);UserAddress address2 new UserAddress(2, 北京市昌平区沙河镇沙阳路, 1, 情话, 1766666395x, N);return Arrays.asList(address1,address2);} }服务消费者为共享Service实现具体逻辑  OrderServiceImpl public class OrderServiceImpl implements OrderService {public void initOrder(String userID) {//查询用户的收货地址xxxxxxxxx} }导入远程调用依赖 !--dubbo--dependencygroupIdcom.alibaba/groupIdartifactIddubbo/artifactIdversion2.6.2/version/dependency!--注册中心是 zookeeper引入zookeeper客户端--dependencygroupIdorg.apache.curator/groupIdartifactIdcurator-framework/artifactIdversion2.12.0/version/dependency服务提供者注册服务到Zookeeper上 ?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:dubbohttp://code.alibabatech.com/schema/dubboxsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsdhttp://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd!--1、指定当前服务/应用的名字(同样的服务名字相同不要和别的服务同名)--dubbo:application nameuser-service-provider/dubbo:application!--2、指定注册中心的位置--!--dubbo:registry addresszookeeper://127.0.0.1:2181/dubbo:registry--dubbo:registry protocolzookeeper address127.0.0.1:2181/dubbo:registry!--3、指定通信规则通信协议? 服务端口--dubbo:protocol namedubbo port20880/dubbo:protocol!--4、暴露服务 让别人调用 ref指向服务的真正实现对象--dubbo:service interfacecom.lemon.gmail.service.UserService refuserServiceImpl/dubbo:service!--服务的实现--bean iduserServiceImpl classcom.lemon.gmail.service.impl.UserServiceImpl/bean /beans测试注册是否成功 编写一个ProviderApplication启动类程序运行测试配置 public class MailApplication {public static void main(String[] args) throws IOException {ClassPathXmlApplicationContext applicationContext new ClassPathXmlApplicationContext(provider.xml);applicationContext.start();System.in.read();} }仿照前面的 zookeeper环境搭建 的步骤启动zookeeper注册中心的的zkServer.cmd、和zkCli.cmd服务在dubbo-admin target中cmd运行 java -jar dubbo-admin-0.0.1-SNAPSHOT.jar再次启动项目我们可以看到在zookeeper中已经发现服务提供者。 服务消费者到Zookeeper上订阅服务实例化共享Service ?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:dubbohttp://dubbo.apache.org/schema/dubboxmlns:contexthttp://www.springframework.org/schema/contextxsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsdhttp://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsdhttp://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd!--包扫描--context:component-scan base-packagecom.lemon.gmail.service.impl/!--指定当前服务/应用的名字(同样的服务名字相同不要和别的服务同名)--dubbo:application nameorder-service-consumer/dubbo:application!--指定注册中心的位置--dubbo:registry addresszookeeper://127.0.0.1:2181/dubbo:registry!--指定interface调用远程暴露的服务生成远程服务代理初始化本地共享Service id自定义是消费者的订阅id--dubbo:reference interfacecom.lemon.gmail.service.UserService iduserService/dubbo:reference /beansDI注入代理Bean就好 Service public class OrderServiceImpl implements OrderService {// 直接注入就好订阅的该接口实现类服务已经被拉取下来放到Spring中管理了Autowiredpublic UserService userService;public void initOrder(String userID) {//查询用户的收货地址ListUserAddress userAddressList userService.getUserAddressList(userID);//为了直观的看到得到的数据以下内容也可不写System.out.println(当前接收到的userId userID);System.out.println(**********);System.out.println(查询到的所有地址为);} }测试订阅是否成功 编写一个ConsumerApplication启动类程序运行测试配置 public class ConsumerApplication {public static void main(String[] args) {ClassPathXmlApplicationContext applicationContext new ClassPathXmlApplicationContext(consumer.xml);OrderService orderService applicationContext.getBean(OrderService.class);//调用方法查询出数据orderService.initOrder(1);System.out.println(调用完成...);System.in.read();} }注意消费者的运行测试需要先启动提供者。 启动服务提供者、消费者。及zookeeper的和dubbo-admin查看监控信息。 localhost:7001 Dubbo与SpringBoot整合 导入以下依赖  其实根本不需要导入啥因为Dubbo和Zookeeper依赖都在spring-boot-starter里内置了导入个共享组件的jar包就差不多了 parentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion2.0.4.RELEASE/versionrelativePath //parentdependencies// 共享组件的JardependencygroupIdcom.lemon.gmail/groupIdartifactIdgmail-interface/artifactIdversion1.0-SNAPSHOT/version/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter/artifactId/dependencydependencygroupIdcom.alibaba.boot/groupIdartifactIddubbo-spring-boot-starter/artifactIdversion0.2.0/version/dependency/dependencies配置 application.properties直接CV模板吧 服务提供者配置 照着写就行 dubbo.application.nameboot-user-service-provider dubbo.registry.address127.0.0.1:2181 dubbo.registry.protocolzookeeperdubbo.protocol.namedubbo dubbo.protocol.port20880 #暴露服务不需要在这写直接在想要暴露的ServiceImpl类上加个注解标注就好 服务消费者配置 照着写就行 server.port8081 dubbo.application.nameboot-order-service-consumer dubbo.registry.addresszookeeper://127.0.0.1:2181#连接监控中心 注册中心协议 dubbo.monitor.protocolregistry重点服务提供者和消费者的启动类上都要开启Dubbo功能 EnableDubbo //开启基于注解的dubbo功能 SpringBootApplication public class BootProviderApplication {public static void main(String[] args) {SpringApplication.run(BootProviderApplication.class, args);} } 服务暴露 / 订阅 当服务提供者使用Service注解标注时Dubbo会将标注的服务接口类型暴露给Zookeeper注册中心供服务消费者发现和调用。服务消费者通过Reference注解来引用服务接口Dubbo会根据接口类型与注册中心中已注册的提供者进行匹配。 服务提供者暴露服务 com.alibaba.dubbo.config.annotation.Service //dubbo的服务暴露 Service public class UserServiceImpl implements UserService {public ListUserAddress getUserAddressList(String userId) {UserAddress address1 new UserAddress(1, 河南省郑州巩义市宋陵大厦2F, 1, 安然, 150360313x, Y);UserAddress address2 new UserAddress(2, 北京市昌平区沙河镇沙阳路, 1, 情话, 1766666395x, N);return Arrays.asList(address1,address2);} }服务消费者订阅服务 Service public class OrderServiceImpl implements OrderService {Reference //引用远程提供者服务UserService userService;public ListUserAddress initOrder(String userID) {xxxxx} }Dubbo配置 dubbo配置官网参考http://dubbo.apache.org/zh-cn/docs/user/references/xml/dubbo-service.html 覆盖策略 在Dubbo中配置的覆盖策略是指当多个配置来源中存在同名配置项时如何进行优先级顺序及合并处理的策略。 JVM 启动 -D 参数优先这样可以使用户在部署和启动时进行参数重写比如在启动时需改变协议的端口。XML 次之如果在 XML 中有配置则 dubbo.properties 中的相应配置项无效。Properties 最后相当于缺省值只有 XML 没有配置时dubbo.properties 的相应配置项才会生效通常用于共享公共配置比如应用名dubbo.protocol.namedubbo。  配置启动时检查  Dubbo 缺省会在启动时检查依赖的服务是否可用不可用时会抛出异常阻止 Spring 初始化完成以便上线时能及早发现问题默认 check“true” 可以通过 check“false” 关闭检查比如测试时有些服务不关心或者出现了循环依赖必须有一方先启动。 另外如果你的 Spring 容器是懒加载的或者通过 API 编程延迟引用服务请关闭 check否则服务临时不可用时会抛出异常拿到 null 引用如果 check“false”总是会返回引用当服务恢复时能自动连上。 讲人话就是Dubbo默认会在启动后对所有注册进来的服务提供者和消费者进行检测如果发现有的服务不可用的时候直接初始化错误启动不了一点。但是如果你想有的就是不可用也能启动的时候就关掉这个启动时检查 !--配置当前消费者的统一规则,当前所有的服务都不启动时检查--dubbo:consumer checkfalse/dubbo:consumer!--SpringBoot中配置如下——————————————————————————--# properties文件配置方式 dubbo.consumer.checkfalse# yml文件配置方式 dubbo:consumer:check: false 配置全局超时配置 全局超时配置配置在dubbo.properties dubbo:provider timeout5000 /指定接口以及特定方法超时配置单位为毫秒值 dubbo:provider interfacecom.foo.BarService timeout2000dubbo:method namesayHello timeout3000 / /dubbo:provider以下是SpringBoot项目中的配置方式—————————————————————————————————————————— dubbo.application.timeout5000/*如果需要为特定接口或特定方法设置不同的超时时间可以使用Dubbo的org.apache.dubbo.config.annotation.Method注解。*/Service public class UserServiceImpl implements UserService {Method(timeout 3000)Overridepublic User getUserById(Long id) {// ...} 配置原则 Dubbo推荐在服务提供方Provider上配置尽量多的Consumer端属性主要基于以下两个原则 1. 服务提供方更清楚服务性能参数作为服务提供方通常具有更全面的服务运行环境和性能监控可以更准确地了解服务的实际情况。因此在服务提供方上配置调用的超时时间、合理的重试次数等参数可以更好地适应服务的性能需求。 例如在Provider配置中设置超时时间为5秒和重试次数为3次 properties dubbo.provider.timeout5000 dubbo.provider.retries3  这样服务提供方告知消费方的是超时时间为5秒和最多重试3次意味着消费方在默认情况下会使用这些配置。 2. Provider配置作为Consumer的缺省值如果消费方没有显式地配置相关属性Dubbo会使用Provider配置作为Consumer的默认值以保持一致。这样的设计可以避免在每个Consumer端都重复配置相同的属性减少配置的复杂性和出错的可能性。 例如在Provider上配置超时时间和重试次数 properties dubbo.provider.timeout5000 dubbo.provider.retries3  如果消费方没有显式地在Consumer端配置这些属性那么Dubbo将使用Provider上的超时时间和重试次数作为Consumer的默认值即在Consumer端实际调用时会使用Provider端配置的超时时间和重试次数。 综合起来通过在Provider端配置Consumer属性可以提供默认值消费方在不需要特定配置时可以复用Provider端的配置避免重复配置。而如果消费方有特定的需求可以覆盖Provider的设置以满足特定的业务需求。这样的配置原则可以提高配置的灵活性和可维护性。 SpringBoot与Dubbo整合的三种方式  使用默认application.properties和注解的方式 导入dubbo-starter在application.properties配置属性使用Service注解来暴露服务使用Reference来引用服务。具体可参考 Dubbo整合SpringBoot这里截取部分代码方便理解。 属性在application.properties中配置 服务提供方使用Service注解暴露服务 部分配置如“timeout”等可以在注解上添加 服务消费方使用Reference注解来引用服务 在启动类上加注解EnableDubbo  引入dubbo.xml配置文件  保留 dubbo.xml 配置文件;导入 dubbo-starter 依赖使用 在启动类 ImportResource 导入 dubbo 的配置文件即可同时不需要使用 service 来暴露服务了 使用注解API的方式 依旧使用Service注解来暴露服务使用Reference来引用服务。同时使用注解API的方式来替代xml配置文件中的标签将每一个组件手动创建到容器中让dubbo来扫描其他的组件。 注解类的配置主要有三点①注解类加注解Configuration②每个注解项添加Bean注入到容器中③准确使用注解API。 Configuration public class MyDubboConfig {//dubbo:application nameboot-user-service-provider/dubbo:applicationBeanpublic ApplicationConfig applicationConfig() {ApplicationConfig applicationConfig new ApplicationConfig();applicationConfig.setName(user-service-provider);return applicationConfig;}//dubbo:registry protocolzookeeper address127.0.0.1:2181/dubbo:registryBeanpublic RegistryConfig registryConfig() {RegistryConfig registryConfig new RegistryConfig();registryConfig.setProtocol(zookeeper);registryConfig.setAddress(127.0.0.1:2181);return registryConfig;} 使用DubboComponentScan注解指定dubbo扫描路径。 高可用  zookeeper宕机与Dubbo直连 zookeeper宕机 zookeeper注册中心宕机还可以消费dubbo暴露的服务 当Zookeeper注册中心宕机时仍然可以消费Dubbo暴露的服务的原因是Dubbo在启动时会将服务提供者的基本信息如IP地址、端口等注册到Zookeeper中但一旦注册成功服务提供者与消费者之间的直接通信并不依赖于Zookeeper的实时可用性。 Dubbo的服务提供者在启动时会连接到Zookeeper注册中心并将自己的服务信息注册到Zookeeper节点中。消费者在查找可用的服务提供者时会通过Zookeeper获取可用的服务列表。一旦获取到可用的服务列表后会缓存到本地。消费者会直接与提供者建立连接进行通信而不再依赖Zookeeper的通信。  需要注意的是如果Zookeeper注册中心在服务提供者启动之前就已经宕机服务提供者将无法将自己的信息注册到Zookeeper中这将导致消费者无法获取到可用的服务列表。 具体来说Dubbo使用了一个内置的缓存机制来存储服务提供者的信息。这个内置的缓存是基于JVM内存的数据结构通常是使用HashMap或ConcurrentHashMap实现的。当Dubbo消费者获取到可用的服务列表后会将服务提供者的信息缓存到这个内置的缓存中。 由于存储在JVM内存中Dubbo的缓存机制是将服务提供者的信息存储在消费者进程的堆内存中。这种缓存方式可以快速地进行本地查找和访问并且不需要网络通信、磁盘读写等开销能够提供较低的延迟和更高的性能。         请注意Dubbo的缓存机制仅存储了服务提供者的基本信息如IP地址、端口号等而不会存储具体的服务实例。当需要实际调用服务时Dubbo消费者会根据缓存的服务提供者信息在运行时动态选择一个可用的服务实例进行调用。这样Dubbo实现了服务发现与负载均衡的功能。 注册中心对等集群任意一台宕掉后将自动切换到另一台注册中心全部宕掉后服务提供者和服务消费者仍能通过本地缓存通讯 Dubbo直连 Dubbo的直连Direct Connection指的是消费者直接连接到指定的服务提供者而不通过注册中心进行服务的发现和路由。 通常情况下Dubbo的消费者会通过注册中心获取可用的服务列表并根据负载均衡策略选择其中一个服务提供者进行调用。这种方式下消费者和服务提供者之间的通信是通过注册中心进行的。 然而有时候我们可能需要绕过注册中心直接连接到指定的服务提供者。这种情况下消费者会直接使用在配置中指定的服务提供者的地址进行通信而不再通过注册中心进行服务的发现和路由。 应用场景 使用直连的方式可以具有以下一些应用场景和优势 调试和开发环境在开发和调试阶段我们可能希望只与特定的服务提供者进行交互以方便调试和测试。使用直连的方式我们可以直接指定服务提供者的地址无需依赖注册中心。 特定路由需求某些特殊的业务需求可能需要直连特定的服务提供者。比如可能希望将某个重要的服务请求直接发送给指定的服务提供者以确保服务质量或满足特定的安全需求。 直连配置 要使用Dubbo的直连功能可以在消费者的配置中指定服务提供者的地址。例如在Dubbo XML配置文件中可以使用url属性直接指定服务提供者的地址 dubbo:reference idxxxService interfacecom.xxx.XXXService urldubbo://xxx.xxx.xxx.xxx:20880/ 另外在SpringBoot的Dubbo注解配置中也可以使用url属性指定直连地址 Reference(url dubbo://xxx.xxx.xxx.xxx:20880) private XXXService xxxService; 集群下dubbo负载均衡配置 在集群负载均衡时Dubbo 提供了多种均衡策略 Random LoadBalance 基于权重的随机负载均衡机制 随机按权重设置随机概率。 在一个截面上碰撞的概率高但调用量越大分布越均匀而且按概率使用权重后也比较均匀有利于动态调整提供者权重。  RoundRobin LoadBalance 基于权重的轮询负载均衡机制 每次有请求到达时Dubbo会根据权重选择一个可用的服务提供者。通过轮询的方式依次遍历服务提供者列表。遍历时根据服务提供者的权重决定选择的次数权重高的服务提供者会被选择的次数更多。如果某个服务提供者不可用Dubbo会将其权重减小避免过多的请求被路由到该服务提供者上。  加权轮询过程过程中如果某节点权重过大会存在某段时间内调用过于集中的问题。 例如 ABC 三节点有如下权重{A: 3, B: 2, C: 1} 那么按照最原始的轮询算法调用过程将变成A A A B B C LeastActive LoadBalance最少活跃数负载均衡机制  加权最少活跃调用优先活跃数越低越优先调用相同活跃数的进行加权随机。活跃数指调用前后计数差针对特定提供者请求发送数 - 响应返回数表示特定提供者的任务堆积量活跃数越低代表该提供者处理能力越强。使慢的提供者收到更少请求因为越慢的提供者的调用前后计数差会越大相对的处理能力越强的节点处理更多的请求。 ConsistentHash LoadBalance一致性hash 负载均衡机制 一致性 Hash相同参数的请求请求同一个服务的多个实例时根据携带的参数进行绑定总是发到同一提供者。当某一台提供者挂时原本发往该提供者的请求基于虚拟节点平摊到其它提供者不会引起剧烈变动。 ShortestResponse LoadBalance 加权最短响应优先在最近一个滑动窗口中响应时间越短越优先调用。相同响应时间的进行加权随机。使得响应时间越快的提供者处理更多的请求。缺点可能会造成流量过于集中于高性能节点的问题。 这里的响应时间 某个提供者在窗口时间内的平均响应时间窗口时间默认是 30s。 权重配置 1、静态配置 在服务暴露时指定权重 Component Service(weight 100) //设置权重静态 public class UserServiceImpl implements UserService {Overridepublic ListUserAddress getUserAddressList(String userId) {UserAddress address1 new UserAddress(1, 北京市昌平区宏福科技园综合楼3层, 1, 李老师, 010-56253825, Y);UserAddress address2 new UserAddress(2, 深圳市宝安区西部硅谷大厦B座3层深圳分校, 1, 王老师, 010-56253825, N);return Arrays.asList(address1, address2);} }2、动态配置 在服务提供者管理页面可以给应用动态配置权重 选型建议  Random LoadBalance随机负载均衡 使用场景适用于服务提供者之间资源相似、请求处理能力均衡的情况。选型建议当服务提供者之间的性能相近没有特别明显的负载差异时可采用该策略具有简单、随机的特点。 RoundRobin LoadBalance轮询负载均衡 使用场景适用于服务提供者之间资源相似、请求处理能力均衡的情况。选型建议当服务提供者之间的性能相近希望实现请求的均匀分配时可采用该策略具有公平、轮询的特点。 LeastActive LoadBalance最少活跃数负载均衡 使用场景适用于服务提供者之间资源不均衡、请求处理能力有差异的情况。选型建议当服务提供者之间的性能存在差异希望将请求尽量分配给负载较低的服务提供者时可采用该策略避免资源集中于负载较高的服务提供者。 ConsistentHash LoadBalance一致性哈希负载均衡 使用场景适用于服务提供者集群规模变化频繁、动态扩容缩容的情况。选型建议当服务提供者集群规模动态变化节点增减频繁时可采用该策略。该策略在增减节点时只影响局部映射不会造成整体的调整成本。 ShortestResponse LoadBalance最短响应时间负载均衡 使用场景适用于关注请求响应时间、希望快速获取响应的场景。选型建议当关注请求的响应时间并希望选择最快响应的服务提供者时可采用该策略。 服务降级 什么是服务降级? 当服务器压力剧增的情况下根据实际业务情况及流量对一些服务和页面有策略的不处理或换种简单的方式处理从而释放服务器资源以保证核心交易正常运作或高效运作。 解决策略 mockforce:returnnull 表示消费方对该服务的方法调用都直接返回 null 值不发起远程调用。用来屏蔽不重要服务不可用时对调用方的影响。mockfail:returnnull 表示消费方对该服务的方法调用在失败后再返回 null 值不抛异常。用来容忍不重要服务不稳定时对调用方的影响。 集群容错  在集群调用失败时Dubbo 提供了多种容错方案缺省为 failover 重试。 容错模式 Failover Cluster 失败自动切换当出现失败重试其它服务器。通常用于读操作但重试会带来更长延迟。可通过 retries“2” 来设置重试次数(不含第一次)。 Failfast Cluster 快速失败只发起一次调用失败立即报错。通常用于非幂等性的写操作比如新增记录。 Failsafe Cluster 失败安全出现异常时直接忽略。通常用于写入审计日志等操作。 Failback Cluster 失败自动恢复后台记录失败请求定时重发。通常用于消息通知操作。 Forking Cluster 并行调用多个服务器只要一个成功即返回。通常用于实时性要求较高的读操作但需要浪费更多服务资源。可通过 forks“2” 来设置最大并行数。 Broadcast Cluster 广播调用所有提供者逐个调用任意一台报错则报错 [2]。通常用于通知所有提供者更新缓存或日志等本地资源信息。 整合hystrix Hystrix 旨在通过控制那些访问远程系统、服务和第三方库的节点从而对延迟和故障提供更强大的容错能力。Hystrix具备拥有回退机制和断路器功能的线程和信号隔离请求缓存和请求打包以及监控和配置等功能 配置spring-cloud-starter-netflix-hystrix spring boot官方提供了对hystrix的集成直接在pom.xml里加入依赖 dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-netflix-hystrix/artifactIdversion1.4.4.RELEASE/version /dependency然后在Application类上增加 EnableHystrix 来启用hystrix starter  SpringBootApplication EnableHystrix //开启服务容错功能 public class ProviderApplication {...启动方法 }案例实践 配置Provider端 在Dubbo的Provider上增加HystrixCommand配置这样子调用就会经过Hystrix代理。 Service(version 1.0.0) public class HelloServiceImpl implements HelloService {HystrixCommand(commandProperties {// 这里就是一些自定义的配置这个可以参考官方文档进行配置HystrixProperty(name circuitBreaker.requestVolumeThreshold, value 10),HystrixProperty(name execution.isolation.thread.timeoutInMilliseconds, value 2000) })Overridepublic String sayHello(String name) {// System.out.println(async provider received: name);// return annotation: hello, name;throw new RuntimeException(Exception to show hystrix enabled.);} }配置Consumer端 对于Consumer端则可以增加一层method调用并在method上配置HystrixCommand。当调用出错时会走到fallbackMethod reliable的调用里。注意这个传入的时方法的全限定位置如果时本类的方法直接写名字就好注意这个回调方法的参数和原方法一样 Reference(version 1.0.0)private HelloService demoService;HystrixCommand(fallbackMethod reliable)public String doSayHello(String name) {return demoService.sayHello(name);}public String reliable(String name) {return hystrix fallback value;}Dubbo原理 RPC原理 一次完整的RPC调用流程同步调用异步另说如下 服务消费方client调用以本地调用方式调用服务client stub接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体client stub找到服务地址并将消息发送到服务端server stub收到消息后进行解码server stub根据解码结果调用本地的服务这里主要是采用了反射的机制获取到代理对象来进行方法调用本地服务执行并将结果返回给server stubserver stub将返回结果打包成消息并发送至消费方client stub接收到消息并进行解码服务消费方得到最终结果。 dubbo只用了两步1和8中间的过程是透明的看不到的。RPC框架的目标就是要2~8这些步骤都封装起来这些细节对用户来说是透明的不可见的。 netty通信原理 什么你怎么知道我也写了Netty的全套详细笔记!https://blog.csdn.net/weixin_73077810/article/details/133743849 大白话体会Dubbo原理 服务暴露原理 总结起来Dubbo服务暴露的原理就是服务提供者将自己的服务接口实现注册到Dubbo的注册中心而消费者通过注册中心获取到服务提供者的地址然后建立与服务提供者的连接并发送请求。服务提供者接收到请求后进行相应的处理并将处理结果返回给消费者。通过Dubbo的中间层实现了服务提供者和消费者之间的解耦和远程调用。 服务提供者将自己的服务接口实现注册到Dubbo的注册中心如Zookeeper等。这一步是通过配置文件或者编程方式完成的。 服务提供者在启动时将自己的服务接口信息以及对应的服务实现发布到注册中心类Hash表结构。这样消费者就可以通过注册中心获取到服务提供者的地址和相关信息。 消费者通过Dubbo的注册中心查找到服务提供者的地址和相关信息。 消费者根据获取到的服务提供者地址建立与服务提供者的连接。这一步可以使用Dubbo框架提供的远程通信协议如Dubbo协议来建立连接。 消费者向服务提供者发送请求包括需要调用的服务方法、参数等信息。 服务提供者接收到请求后根据请求内容进行相应的处理并返回结果给消费者。 消费者接收到服务提供者的响应结果并进行相应的处理。 服务订阅原理 总结起来Dubbo服务订阅的原理是消费者向注册中心发送订阅请求获取到所需服务的提供者地址和相关信息建立连接后进行服务调用。通过注册中心的协调作用实现了服务的发布和订阅使得消费者能够找到并调用所需的远程服务。 服务提供者将自己的服务接口信息和相关配置注册到Dubbo的注册中心。这个注册中心可以是Zookeeper等分布式协调系统。将服务注册到注册中心后相当于宣告自己提供了哪些服务。 服务消费者启动时会向注册中心发送订阅请求告诉注册中心自己需要订阅哪些服务即需要调用哪些远程服务。比如消费者可能需要订阅User服务、Order服务等。 注册中心收到消费者的订阅请求后会查找并返回与这些服务相关的服务提供者的地址和相关信息。这样消费者就能获取到调用所需服务的地址。 消费者根据获取到的服务提供者地址建立与服务提供者之间的连接通常是基于TCP协议的长连接。这样消费者就能够通过网络与服务提供者进行通信。 一旦消费者建立了与服务提供者的连接就可以通过调用服务提供者的接口方法来消费相应的服务。
http://www.yayakq.cn/news/2825/

相关文章:

  • wordpress 用ip访问seo营销是指
  • 网站历史权重查询不会写程序如何做网站
  • 怎么做报名网站wordpress 图片延迟
  • 深圳做网站龙华新科温州市网络科技有限公司
  • 如何优化网站到首页优化做网站横幅 的网站推荐几个
  • 案例网站有哪些做文案公众号策划兼职网站
  • 免费建站平台哪家好网站改版需要多少钱
  • 北京国际建设集团网站网站商城定制网站建设
  • 贵州省建设厅考证官方网站网店美工培训教程
  • 网站建设组织discuz 网站搬家
  • 更换网站需要备案吗装饰公司手机网站
  • 网站开发及建设做门户网站的公司
  • 如何高效建设品牌网站百度收录网站多久
  • 网站建设推进会免费的网站程序
  • 北京做网站建设的公司有哪些个人网站备案 照片
  • 营销型网站制作方案宝塔做的网站网页打不开
  • 宝山做网站中国建设银行网站登录
  • 怎么查网站备案信息查询中山网站改版
  • 濮阳网站注册上海移动端网络推广哪家强
  • 网站建设有技术的公司邯郸大名网站建设
  • 速拓科技是做网站网上推广的平台有哪些
  • 谷歌网站开发客户怎么去推广一个app
  • 赤峰做网站建设的企业郑州编程培训机构排名前十
  • 专注集团网站建设辽宁同鑫建设有限公司网站
  • 成都市建设部官方网站wordpress免费有趣插件
  • 金融投资公司网站建设论文wordpress个性首页
  • 网站开发公司企业购物网站模板带后台
  • 屏蔽阿里云网站吗响应式网站建设开发公司
  • 大连网站模板建站wordpress拖拽式
  • 各类网站导航网页页面建设方案