网站seo工作内容,大学做视频网站,wordpress的标题怎么修改,沈阳妇科医生哪个好1、为什么需要dubbo#xff1f;#xff08;为了解决什么问题#xff1f;#xff09; 架构演变 1 单一应用架构 2 应用和数据库单独部署 3 应用和数据库集群部署 4 数据库压力变大#xff0c;读写分离 5 使用缓存技术加快速度 6 数据库分库分表 7 应用分为不同的类型拆分 …1、为什么需要dubbo为了解决什么问题 架构演变 1 单一应用架构 2 应用和数据库单独部署 3 应用和数据库集群部署 4 数据库压力变大读写分离 5 使用缓存技术加快速度 6 数据库分库分表 7 应用分为不同的类型拆分
应用之间的关系已经十分复杂产生了以下问题
当服务越来越多服务 URL 配置管理变得非常困难F5硬件负载均衡器的单点压力也越来越大。服务间依赖关系复杂应用的启动顺序复杂、应用的架构关系复杂服务的调用量越来越大服务的容量问题就暴露出来这个服务需要多少机器支撑什么时候该加机器2、Dubbo是什么dubbo技术架构 节点角色 节点 角色说明 Provider 暴露服务的服务提供方 Consumer 调用远程服务的服务消费方 Registry 服务注册与发现的注册中心 Monitor 统计服务的调用次数和调用时间的监控中心 Container 服务运行容器
Dubbo架构简单来说其实是生产者-消费者模型。进一步在这种模型上加上了注册中心和监控中心用于管理提供方提供的url以及管理整个过程。
发布订阅过程
启动容器加载运行服务提供者。服务提供者在启动时在注册中心发布注册自己提供的服务。服务消费者在启动时在注册中心订阅自己所需的服务。
如果考虑失败或变更的情况就需要考虑下面的过程。
注册中心返回服务提供者地址列表给消费者如果有变更注册中心将基于长连接推送变更数据给消费者。服务消费者从提供者地址列表中基于软负载均衡算法选一台提供者进行调用如果调用失败再选另一台调用。服务消费者和提供者在内存中累计调用次数和调用时间定时每分钟发送一次统计数据到监控中心。
3、Dubbo如何使用
3.1 定义服务提供者
新建provider提供者模块定义如下接口 /** * xml方式服务提供者接口 */ public interface ProviderService { String SayHello(String word); }
实现类 /** * xml方式服务提供者实现类 */ public class ProviderServiceImpl implements ProviderService{ public String SayHello(String word) { return word; } }
3.2 服务暴露
导入maven依赖 ?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd modelVersion4.0.0/modelVersion groupIdcom.test/groupId artifactIddubbo-provider/artifactId version1.0-SNAPSHOT/version dependencies dependency groupIdjunit/groupId artifactIdjunit/artifactId version3.8.1/version scopetest/scope /dependency !-- https://mvnrepository.com/artifact/com.alibaba/dubbo -- dependency groupIdcom.alibaba/groupId artifactIddubbo/artifactId version2.6.6/version /dependency dependency groupIdorg.apache.zookeeper/groupId artifactIdzookeeper/artifactId version3.4.10/version /dependency dependency groupIdcom.101tec/groupId artifactIdzkclient/artifactId version0.5/version /dependency dependency groupIdio.netty/groupId artifactIdnetty-all/artifactId version4.1.32.Final/version /dependency dependency groupIdorg.apache.curator/groupId artifactIdcurator-framework/artifactId version2.8.0/version /dependency dependency groupIdorg.apache.curator/groupId artifactIdcurator-recipes/artifactId version2.8.0/version /dependency /dependencies /project
进行服务暴露暴露接口xml 配置方法
首先在项目 resource 目录下创建 META-INF.spring 包然后再创建 provider.xml 文件 ?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beans xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xmlns:dubbohttp://code.alibabatech.com/schema/dubbo xsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd !--当前项目在整个分布式架构里面的唯一名称计算依赖关系的标签-- dubbo:application nameprovider ownercp dubbo:parameter keyqos.enable valuetrue/ dubbo:parameter keyqos.accept.foreign.ip valuefalse/ dubbo:parameter keyqos.port value55555/ /dubbo:application dubbo:monitor protocolregistry/ !--dubbo这个服务所要暴露的服务地址所对应的注册中心-- !--dubbo:registry addressN/A/-- dubbo:registry addressN/A / !--当前服务发布所依赖的协议webserovice、Thrift、Hessain、http-- dubbo:protocol namedubbo port20880/ !--服务发布的配置需要暴露的服务接口-- dubbo:service interfacecom.dubbo.provider.service.ProviderService refproviderService/ !--Bean bean定义-- bean idproviderService classcom.dubbo.provider.service.ProviderServiceImpl/ /beans
发布接口通过 ClassPathXmlApplicationContext 拿到我们刚刚配置好的 xml 然后调用 context.start() 方法启动 package com.dubbo.provider; import com.alibaba.dubbo.config.ApplicationConfig; import com.alibaba.dubbo.config.ProtocolConfig; import com.alibaba.dubbo.config.RegistryConfig; import com.alibaba.dubbo.config.ServiceConfig; import com.alibaba.dubbo.container.Main; import com.dubbo.provider.service.ProviderService; import com.dubbo.provider.service.ProviderServiceImpl; import org.springframework.context.support.ClassPathXmlApplicationContext; import java.io.IOException; /** * xml方式启动 * */ public class App { public static void main( String[] args ) throws IOException { //加载xml配置文件启动 ClassPathXmlApplicationContext context new ClassPathXmlApplicationContext(META-INF/spring/provider.xml); context.start(); System.in.read(); // 按任意键退出 } }
3.2 定义消费消费者
新建消费者consumer模块先通过点对点方式 ?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beans xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xmlns:dubbohttp://code.alibabatech.com/schema/dubbo xsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd !--当前项目在整个分布式架构里面的唯一名称计算依赖关系的标签-- dubbo:application nameconsumer ownercp/ !--dubbo这个服务所要暴露的服务地址所对应的注册中心-- !--点对点的方式-- dubbo:registry addressN/A / !--dubbo:registry addresszookeeper://localhost:2181 checkfalse/-- !--生成一个远程服务的调用代理-- !--点对点方式-- dubbo:reference idproviderService interfacecom.dubbo.provider.service.ProviderService urldubbo://localhost:20880/com.dubbo.provider.service.ProviderService/ !--dubbo:reference idproviderService interfacecom.dubbo.provider.service.ProviderService/-- /beans
导入maven依赖同服务端类似 ?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd modelVersion4.0.0/modelVersion groupIdcom.test/groupId artifactIddubbo-consumer/artifactId version1.0-SNAPSHOT/version dependencies dependency groupIdcom.test/groupId artifactIddubbo-provider/artifactId version1.0-SNAPSHOT/version /dependency dependency groupIdjunit/groupId artifactIdjunit/artifactId version3.8.1/version scopetest/scope /dependency !-- https://mvnrepository.com/artifact/com.alibaba/dubbo -- dependency groupIdcom.alibaba/groupId artifactIddubbo/artifactId version2.6.6/version /dependency dependency groupIdorg.apache.zookeeper/groupId artifactIdzookeeper/artifactId version3.4.10/version /dependency dependency groupIdcom.101tec/groupId artifactIdzkclient/artifactId version0.5/version /dependency dependency groupIdio.netty/groupId artifactIdnetty-all/artifactId version4.1.32.Final/version /dependency dependency groupIdorg.apache.curator/groupId artifactIdcurator-framework/artifactId version2.8.0/version /dependency dependency groupIdorg.apache.curator/groupId artifactIdcurator-recipes/artifactId version2.8.0/version /dependency /dependencies /project
调用服务 package com.dubbo.consumer; import com.alibaba.dubbo.config.ApplicationConfig; import com.alibaba.dubbo.config.ReferenceConfig; import com.alibaba.dubbo.config.RegistryConfig; import com.dubbo.provider.service.ProviderService; import org.springframework.context.support.ClassPathXmlApplicationContext; import java.io.IOException; /** * xml的方式调用 * */ public class App { public static void main( String[] args ) throws IOException { ClassPathXmlApplicationContext contextnew ClassPathXmlApplicationContext(consumer.xml); context.start(); ProviderService providerService (ProviderService) context.getBean(providerService); String str providerService.SayHello(hello); System.out.println(str); System.in.read(); } }
3.4 加入zookeeper作为注册中心
在前面的操作中没有使用任何注册中心用一种直连的方式进行。实际都是使用 dubbo zookeeper 的方式使用 zookeeper 作为注册中心这里介绍 zookeeper 作为注册中心的使用方法。对前面的案例进行改造
3.4.1 服务提供者修改
修改provider.xml文件 ?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beans xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xmlns:dubbohttp://code.alibabatech.com/schema/dubbo xsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd !--当前项目在整个分布式架构里面的唯一名称计算依赖关系的标签-- dubbo:application nameprovider ownercp dubbo:parameter keyqos.enable valuetrue/ dubbo:parameter keyqos.accept.foreign.ip valuefalse/ dubbo:parameter keyqos.port value55555/ /dubbo:application dubbo:monitor protocolregistry/ !--dubbo这个服务所要暴露的服务地址所对应的注册中心-- !--dubbo:registry addressN/A/-- dubbo:registry addresszookeeper://localhost:2181 checkfalse/ !--当前服务发布所依赖的协议webserovice、Thrift、Hessain、http-- dubbo:protocol namedubbo port20880/ !--服务发布的配置需要暴露的服务接口-- dubbo:service interfacecom.dubbo.provider.service.ProviderService refproviderService/ !--Bean bean定义-- bean idproviderService classcom.dubbo.provider.service.ProviderServiceImpl/ /beans
3.4.2 服务消费者修改
修改 consumer.xml ?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beans xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xmlns:dubbohttp://code.alibabatech.com/schema/dubbo xsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd !--当前项目在整个分布式架构里面的唯一名称计算依赖关系的标签-- dubbo:application nameconsumer ownercp/ !--dubbo这个服务所要暴露的服务地址所对应的注册中心-- !--点对点的方式-- !--dubbo:registry addressN/A /-- dubbo:registry addresszookeeper://localhost:2181 checkfalse/ !--生成一个远程服务的调用代理-- !--点对点方式-- !--dubbo:reference idproviderService interfacecom.dubbo.provider.service.ProviderService urldubbo://192.168.234.1:20880/com.dubbo.provider.service.ProviderService/-- dubbo:reference idproviderService interfacecom.dubbo.provider.service.ProviderService/ /beans
总结加入zookeeper和直接点对点方式的区别就是将 dubbo 发布的 url 注册到了 zookeeper消费端从 zookeeper 消费zookeeper 相当于一个中介给消费者提供服务。
3.5注解配置方式
前面使用xml文件配置方式这里使用注解配置方式现在微服务都倾向于这种方式这也是以后发展的趋势 0配置是以后的趋势。那么如何对 dubbo 使用注解的方式呢
3.5.1 服务提供者注解配置
接口 package com.dubbo.provider.service.annotation; /** * 注解方式接口 */ public interface ProviderServiceAnnotation { String SayHelloAnnotation(String word); }
实现类 package com.dubbo.provider.service.annotation; import com.alibaba.dubbo.config.annotation.Service; /** * 注解方式实现类 */ Service(timeout 5000) public class ProviderServiceImplAnnotation implements ProviderServiceAnnotation{ public String SayHelloAnnotation(String word) { return word; } }
1、Service 用来配置 Dubbo 的服务提供方。
2、通过 Spring 中 Java Config 的技术Configuration和 annotation 扫描EnableDubbo来发现、组装、并向外提供 Dubbo 的服务。 package com.dubbo.provider.configuration; import com.alibaba.dubbo.config.ApplicationConfig; import com.alibaba.dubbo.config.ProtocolConfig; import com.alibaba.dubbo.config.ProviderConfig; import com.alibaba.dubbo.config.RegistryConfig; import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * 注解方式配置 */ Configuration EnableDubbo(scanBasePackages com.dubbo.provider.service.annotation) public class DubboConfiguration { Bean // #1 服务提供者信息配置 public ProviderConfig providerConfig() { ProviderConfig providerConfig new ProviderConfig(); providerConfig.setTimeout(1000); return providerConfig; } Bean // #2 分布式应用信息配置 public ApplicationConfig applicationConfig() { ApplicationConfig applicationConfig new ApplicationConfig(); applicationConfig.setName(dubbo-annotation-provider); return applicationConfig; } Bean // #3 注册中心信息配置 public RegistryConfig registryConfig() { RegistryConfig registryConfig new RegistryConfig(); registryConfig.setProtocol(zookeeper); registryConfig.setAddress(localhost); registryConfig.setPort(2181); return registryConfig; } Bean // #4 使用协议配置这里使用 dubbo public ProtocolConfig protocolConfig() { ProtocolConfig protocolConfig new ProtocolConfig(); protocolConfig.setName(dubbo); protocolConfig.setPort(20880); return protocolConfig; } } 分析通过 EnableDubbo 指定在com.dubbo.provider.service.annotation 下扫描所有标注有 Service 的类。
通过 Configuration 将 DubboConfiguration 中所有的 Bean 通过 Java Config 的方式组装出来并注入给 Dubbo 服务也就是标注有 Service 的类。这其中就包括了
ProviderConfig服务提供方配置
ApplicationConfig应用配置
RegistryConfig注册中心配置
ProtocolConfig协议配置
启动服务 package com.dubbo.provider; import com.alibaba.dubbo.config.spring.context.annotation.DubboComponentScan; import com.dubbo.provider.configuration.DubboConfiguration; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import sun.applet.Main; import java.io.IOException; /** * 注解启动方式 */ public class AppAnnotation { public static void main(String[] args) throws IOException { AnnotationConfigApplicationContext context new AnnotationConfigApplicationContext(DubboConfiguration.class); context.start(); System.in.read(); } }
3.5.2 服务消费者注解配置
引用服务 package com.dubbo.consumer.Annotation; import com.alibaba.dubbo.config.annotation.Reference; import com.dubbo.provider.service.annotation.ProviderServiceAnnotation; import org.springframework.stereotype.Component; /** * 注解方式的service */ Component(annotatedConsumer) public class ConsumerAnnotationService { Reference private ProviderServiceAnnotation providerServiceAnnotation; public String doSayHello(String name) { return providerServiceAnnotation.SayHelloAnnotation(name); } }
引入依赖 dependency groupIdcom.test/groupId artifactIddubbo-provider/artifactId version1.0-SNAPSHOT/version /dependency
组装服务端消费者 package com.dubbo.consumer.configuration; import com.alibaba.dubbo.config.ApplicationConfig; import com.alibaba.dubbo.config.ConsumerConfig; import com.alibaba.dubbo.config.RegistryConfig; import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import java.util.HashMap; import java.util.Map; /** * 注解配置类 */ Configuration EnableDubbo(scanBasePackages com.dubbo.consumer.Annotation) ComponentScan(value {com.dubbo.consumer.Annotation}) public class ConsumerConfiguration { Bean // 应用配置 public ApplicationConfig applicationConfig() { ApplicationConfig applicationConfig new ApplicationConfig(); applicationConfig.setName(dubbo-annotation-consumer); MapString, String stringStringMap new HashMapString, String(); stringStringMap.put(qos.enable,true); stringStringMap.put(qos.accept.foreign.ip,false); stringStringMap.put(qos.port,33333); applicationConfig.setParameters(stringStringMap); return applicationConfig; } Bean // 服务消费者配置 public ConsumerConfig consumerConfig() { ConsumerConfig consumerConfig new ConsumerConfig(); consumerConfig.setTimeout(3000); return consumerConfig; } Bean // 配置注册中心 public RegistryConfig registryConfig() { RegistryConfig registryConfig new RegistryConfig(); registryConfig.setProtocol(zookeeper); registryConfig.setAddress(localhost); registryConfig.setPort(2181); return registryConfig; } }
发起调用 package com.dubbo.consumer; import com.dubbo.consumer.Annotation.ConsumerAnnotationService; import com.dubbo.consumer.configuration.ConsumerConfiguration; import com.dubbo.provider.service.ProviderService; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import java.io.IOException; /** * 注解方式启动 * */ public class AppAnnotation { public static void main( String[] args ) throws IOException { AnnotationConfigApplicationContext context new AnnotationConfigApplicationContext(ConsumerConfiguration.class); context.start(); // 启动 ConsumerAnnotationService consumerAnnotationService context.getBean(ConsumerAnnotationService.class); String hello consumerAnnotationService.doSayHello(annotation); // 调用方法 System.out.println(result: hello); // 输出结果 } }
3.6 主要使用场景
3.6.1 启动时检查
Dubbo 缺省会在启动时检查依赖的服务是否可用不可用时会抛出异常阻止 Spring 初始化完成以便上线时能及早发现问题默认 checktrue。
3.6.2 集群容错 集群模式 说明 使用方法 Failover Cluster 失败自动切换当出现失败重试其它服务器。通常用于读操作但重试会带来更长延迟。可通过 retries2 来设置重试次数(不含第一次)。 clusterxxx xxx集群模式名称 例如clusterfailover Failfast Cluster 快速失败只发起一次调用失败立即报错。通常用于非幂等性的写操作比如新增记录。 Failsafe Cluster 失败安全出现异常时直接忽略。 Failback Cluster 失败自动恢复后台记录失败请求定时重发。通常用于消息通知操作。 Forking Cluster 并行调用多个服务器只要一个成功即返回。通常用于实时性要求较高的读操作但需要浪费更多服务资源。可通过 forks2 来设置最大并行数。 Broadcast Cluster 广播调用所有提供者逐个调用任意一台报错则报错。通常用于通知所有提供者更新缓存或日志等本地资源信息。
3.6.3 直连服务提供者
直连就是点对点方式绕过注册中心。在开发及测试环境下只测试指定服务提供者只需要直接连接服务端的地即可这种方式简单。