Dubbo进阶 (2)

消费者类:

@Component public class SayHelloConsumer { @Reference private HelloService helloService; public void sayHello(){ String jack = helloService.sayHello("jack"); System.out.println(jack); } }

执行测试:

public class ConsumerApplication { public static void main(String[] args) { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ConsumerConfiguration.class); SayHelloConsumer consumer = context.getBean(SayHelloConsumer.class); consumer.sayHello(); }

可以发现消费者不需要指定ProtocolConfig,主要服务端固定端口即可;

使用properties配置

相比xml和api的方式,properties是体量是最轻的,在面对一些简单配置时可以采用properties

服务提供者

在resource下提供名为dubbo.properties的文件,内容如下:

dubbo.application.name=my-service dubbo.application.owner=jerry dubbo.protocol.dubbo.port=1099 dubbo.registry.address=zookeeper://10.211.55.6:2181

配置类:

@Configuration @EnableDubbo(scanBasePackages = "com.yyh.service") @PropertySource("classpath:/dubbo.properties") public class AnnotationAndPropperties { }

测试代码:

public class ProviderApplication { public static void main(String[] args) throws IOException { annotationAndPropConfig(); System.out.println("服务已启动 按任意键退出"); System.in.read();//阻塞 主线程 保持运行 } private static void annotationAndPropConfig() { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AnnotationAndPropperties.class); context.start(); } } 消费者

同样提供properties文件,但不需要指定protocol

dubbo.application.name=my-service dubbo.application.qos.enable=false dubbo.application.owner=jerry dubbo.registry.address=zookeeper://10.211.55.6:2181

配置类:

@EnableDubbo @Configuration @ComponentScan("com.yyh.consumer") @PropertySource("classpath:/dubbo.properties") public class AnnotationAndPropConfiguration { }

消费者类:

@Component public class SayHelloConsumer { @Reference private HelloService helloService; public void sayHello(){ String jack = helloService.sayHello("jack"); System.out.println(jack); } }

测试类:

public class ConsumerApplication { public static void main(String[] args) { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ConsumerConfiguration.class); SayHelloConsumer consumer = context.getBean(SayHelloConsumer.class); consumer.sayHello(); }

强调:注解使用时,扫描服务的实现类使用dubbo提供的EnableDubbo注解,而扫描其他bean用的是spring的ComponentScan注解;

常用配置项 1.启动时检查

默认情况下,dubbo在启动时会自动检查依赖(作为消费者)的服务是否可用,若服务不可用则直接抛出异常并阻止容器正常初始化,但在一些情况下我们会希望先启动程序,因为服务可能会在之后的时间里变为可用的;

启动检查注册中心 <!--启动程序时是否检查注册中心的可用性--> <dubbo:registry protocol="zookeeper" check="true" address="10.211.55.8:2181,10.211.55.7:2181,10.211.55.6:2181"/> 启动检查服务提供方(对所有提供者) <!--这里的启动指的是从容器中获取一个服务方的代理对象时 即getBean()时是否检查--> <dubbo:consumer check="false"/> 启动检查服务提供方(对某个提供者) <!--这里的启动指的是从容器中获取一个服务方的代理对象时 即getBean()时是否检查--> <dubbo:reference interface="com.yyh.service.HelloService" />

properties文件写法:

java -Ddubbo.reference.com.foo.BarService.check=false #强制修改所有reference的check java -Ddubbo.reference.check=false #当reference的check为空时有效 java -Ddubbo.consumer.check=false java -Ddubbo.registry.check=false 2.集群容错

在后续的使用中我们可能会对某一个服务部署多个示例形成集群,随着项目的运行时间越来越常,一些服务几点可能会宕机或是由于网络原因暂时不可用,集群容错可指定在调用服务失败时dubbo要采取的行为;

dubbo提供以下6种容错机制:

策略名称 优点 缺点 主要应用场景
failover(默认)   对调用者屏蔽调用失败的信息   额外资源开销,资源浪费   通讯环境良好,并发不高的场景  
failfast   业务快速感知失败状态进行自主决策   产生较多报错的信息   非幂等性操作,需要快速感知失败的场景  
failsafe   即使失败了也不会影响核心流程   对于失败的信息不敏感,需要额外的监控   旁路系统,失败不影响核心流程正确性的场景  
failback   失败自动异步重试   重试任务可能堆积   对于实时性要求不高,且不需要返回值的一些异步操作  
forking   并行发起多个调用,降低失败概率   消耗额外的机器资源,需要确保操作幂等性   资源充足,且对于失败的容忍度较低,实时性要求高的场景  
broadcast   支持对所有的服务提供者进行操作   资源消耗很大   通知所有提供者更新缓存或日志等本地资源信息  

幂等性:指的是每次调用都会产生相同的结果,即不会对数据进行写操作(增删改)

配置方式:

容错配置分为两个粒度:接口级别,方法级别

服务方配置:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpjwyg.html