消费者类:
@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 支持对所有的服务提供者进行操作 资源消耗很大 通知所有提供者更新缓存或日志等本地资源信息
幂等性:指的是每次调用都会产生相同的结果,即不会对数据进行写操作(增删改)
配置方式:容错配置分为两个粒度:接口级别,方法级别
服务方配置: