一,Dubbo的配置方式和覆盖策略
-
JVM System Properties,-D 参数
-
Externalized Configuration,外部化配置
-
ServiceConfig、ReferenceConfig 等编程接口采集的配置
-
本地配置文件 dubbo.properties
编程配置方式:
1,Spring XML配置
<!-- dubbo-provier.xml --> <dubbo:application name="demo-provider"/> <dubbo:config-center address="zookeeper://127.0.0.1:2181"/> <dubbo:registry address="zookeeper://127.0.0.1:2181" simplified="true"/> <dubbo:metadata-report address="redis://127.0.0.1:6379"/> <dubbo:protocol name="dubbo" port="20880"/> <bean id="demoService" class="org.apache.dubbo.samples.basic.impl.DemoServiceImpl"/> <dubbo:service interface="org.apache.dubbo.samples.basic.api.DemoService" ref="demoService"/>
// AnnotationService服务实现 @Service public class AnnotationServiceImpl implements AnnotationService { @Override public String sayHello(String name) { System.out.println("async provider received: " + name); return "annotation: hello, " + name; } }
## dubbo.properties dubbo.application.name=annotation-provider dubbo.registry.address=zookeeper://127.0.0.1:2181 dubbo.protocol.name=dubbo dubbo.protocol.port=20880
3,Spring Boot配置
例:
## application.properties # Spring boot application spring.application.name=dubbo-externalized-configuration-provider-sample # Base packages to scan Dubbo Component: @com.alibaba.dubbo.config.annotation.Service dubbo.scan.base-packages=com.alibaba.boot.dubbo.demo.provider.service # Dubbo Application ## The default value of dubbo.application.name is ${spring.application.name} ## dubbo.application.name=${spring.application.name} # Dubbo Protocol dubbo.protocol.name=dubbo dubbo.protocol.port=12345 ## Dubbo Registry dubbo.registry.address=N/A ## DemoService version demo.service.version=1.0.0
4,Dubbo API配置
例:
public static void main(String[] args) throws IOException { ServiceConfig<GreetingsService> service = new ServiceConfig<>(); service.setApplication(new ApplicationConfig("first-dubbo-provider")); service.setRegistry(new RegistryConfig("multicast://224.5.6.7:1234")); service.setInterface(GreetingsService.class); service.setRef(new GreetingsServiceImpl()); service.export(); System.out.println("first-dubbo-provider is running."); System.in.read();}
二,dubbo的高可用配置
-
监控中心宕机不影响使用,只是丢失部分采样数据
-
数据库宕机后,注册中心仍然可以提供缓存提供服务查询,但不能注册新服务
-
注册中心集群部署后,任意一台宕机后,将自动切换到另一台
-
注册中心全部宕机后,服务提供者和服务消费者仍然可以通过本地缓存通信
-
服务提供者无状态,任意一台宕掉后,不影响使用
-
服务提供者全部宕机,服务消费者应用将无法使用,并无线重连等待服务提供者恢复正常状态
一,zookeeper宕机与dubbo直连
<dubbo:reference id="xxxService" interface="com.alibaba.xxx.XxxService" url="dubbo://localhost:20890" />
@DubboReference(url = "")
二,集群模式下dubbo的负载均衡策略
-
随机,按权重设置随机概率。
-
在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。
-
轮询,按公约后的权重设置轮询比率。
-
存在慢的提供者累积请求的问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。
-
最少活跃调用数,相同活跃数的随机,活跃数指调用前后时间。
-
使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数时间差越大。
-
一致性 Hash,相同参数的请求总是发到同一提供者。
-
当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。
-
缺省只对第一个参数 Hash,如果要修改,请配置 <dubbo:parameter key="hash.arguments" value="0,1" />
-
缺省用 160 份虚拟节点,如果要修改,请配置 <dubbo:parameter key="hash.nodes" value="320" />
<dubbo:service interface="..." loadbalance="roundrobin" />
<dubbo:reference interface="..." loadbalance="roundrobin" />
<dubbo:service interface="..."> <dubbo:method name="..." loadbalance="roundrobin"/> </dubbo:service>
<dubbo:reference interface="..."> <dubbo:method name="..." loadbalance="roundrobin"/> </dubbo:reference>
三,服务的熔断和服务的降级
一,服务雪崩
-
突增的并发访问:比如爬虫或者黑客攻击
-
程序BUG:比如出现死锁,死循环,资源未释放
-
硬件问题:机器宕机,光纤断掉,断电等
二,服务熔断
三,服务降级
-
延迟服务:定时任务处理,或者使用MQ延时处理,例:大量用户服务B服务,B服务可以通过MQ消息队列,进行缓冲
-
页面降级:页面点击按钮全部置成无效,或者页面显示维护状态
-
关闭非核心服务:比如电商可以关闭推荐服务,运费险,广告等,保证主线程的核心服务下单付款
-
写降级:就是不保证强一致性,比如秒杀抢购,可以只进行Cache的更新返回,然后通过MQ异步扣除库存DB,保证最终的一致性,将DB降为Cache
-
读降级:多级缓存模式,如果后端服务有问题,可以降级为只读缓存,这种方式适用于对读一致性要求不高的场景
-
mock=force:return+null 表示消费方对该服务的方法调用都直接返回 null 值,不发起远程调用。用来屏蔽不重要服务不可用时对调用方的影响(在消费者端降级)
-
还可以改为 mock=fail:return+null 表示消费方对该服务的方法调用在失败后,再返回 null 值,不抛异常。用来容忍不重要服务不稳定时对调用方的影响。
四,服务容错
<dubbo:service cluster="failsafe" />
<dubbo:reference cluster="failsafe" />
<dubbo:service retries="2" />
<dubbo:reference retries="2" />
② Failfast Cluster
③ Failsafe Cluster
④ Failback Cluster
⑤ Forking Cluster
⑥ Broadcast Cluster
三,整合Hystrix
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> <version>1.4.4.RELEASE</version> </dependency>
@EnableDubbo @EnableHystrix//开启服务容错 @SpringBootApplication public class BootServerProviderApplication { public static void main(String[] args) { SpringApplication.run(BootServerProviderApplication.class, args); } }
@Service//暴露服务 @DubboService public class UserServiceimpl implements UserService { @HystrixCommand//使用Hystrix来带来这个方法的异常 public List<UserAdress> getbean() { if(Math.random()>0.5){ throw new RuntimeException(); } UserAdress wql1 = new UserAdress("WQL", "湖南衡阳!"); UserAdress wql2 = new UserAdress("FQ","深圳"); List<UserAdress> list = new ArrayList<UserAdress>(); list.add(wql1); list.add(wql2); return list; }}
@Controller public class OrderAddress { @DubboReferenc UserService userService; @HystrixCommand(fallbackMethod ="err" )//fallbackMethod回调方法,一旦调用远程服务出错,调用会调方法 public List<UserAdress> getwql(){ return userService.getbean(); } @GetMapping(value = "/") @ResponseBody public List<UserAdress> err(){//定义回调方法 return Arrays.asList(new UserAdress("回调方法","测试回调")); }}
三,启动时检查
Dubbo默认启动时会检测服务是否可用,不可用时会抛出异常,Spring的初始化会失败,以便在项目上线前发现问题,默认 check="true"
也可以通过chack = "true"关闭检查,比如:测试时,有些服务不关心,或者出现服务循环依赖必须一方先启动
如果Spring容器懒加载,或者通过API编程延迟引用服务,要关闭check,否则服务临时不可用时,会抛出异常
Spring配置check:
1,关闭某个服务的启动时检测(在reference引用服务中关闭):
<dubbo:reference interface="com.foo.BarService" check="false" />
2,关闭所以服务的启动时检测(在cunsumer消费者中关闭):
<dubbo:consumer check="false" />
3,关闭注册中心的启动时检查
<dubbo:registry check="false" />
配置说明:
dubbo.reference.check=false,强制改变所有 reference 的 check 值,就算配置中有声明,也会被覆盖。 dubbo.consumer.check=false,是设置 check 的缺省值,如果配置中有显式的声明,如:<dubbo:reference check="true"/>,不会受影响。 dubbo.registry.check=false,前面两个都是指订阅成功,但提供者列表是否为空是否报错,如果注册订阅失败时,也允许启动,需使用此选项,将在后台定时重试。
例:关闭服务提供者provider,测试服务消费者的情况
1,默认check=true时:关闭provider,启动consumer报错
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'orderAddress': Injection of @DubboReference dependencies is failed; nested exception is java.lang.IllegalStateException: Failed to check the status of the service com.example.bootserverprovider.service.UserService. No provider available for the service com.example.bootserverprovider.service.UserService from the url zookeeper://192.168.68.152:2181/org.apache.dubbo.registry.RegistryService?anyhost=true&application=boot-server-consumer&check=false&deprecated=false&dubbo=2.0.2&dynamic=true&generic=false&init=false&interface=com.example.bootserverprovider.service.UserService&metadata-type=remote&methods=getbean&pid=15588&qos.enable=false®ister.ip=192.168.68.1&release=2.7.8&remote.application=boot-server-provider&side=consumer&sticky=false×tamp=1625072365565 to the consumer 192.168.68.1 use dubbo version 2.7.8 at com.alibaba.spring.beans.factory.annotation.AbstractAnnotationBeanPostProcessor.postProcessPropertyValues(AbstractAnnotationBeanPostProcessor.java:146) ~[spring-context-support-1.0.8.jar:na]
2,check=false时,启动consumer:正常启动
四,多版本
在 Dubbo 中为同一个服务配置多个版本
当一个接口实现,出现不兼容升级时,可以用版本号过渡,版本号不同的服务相互间不引用。
可以按照以下的步骤进行版本迁移:
1,在低压力时间段,先升级一半提供者为新版本
2,再将所有消费者升级为新版本
3,然后将剩下的一半提供者升级为新版本
老版本服务提供者配置: <dubbo:service interface="com.foo.BarService" version="1.0.0" /> 新版本服务提供者配置: <dubbo:service interface="com.foo.BarService" version="2.0.0" /> 老版本服务消费者配置: <dubbo:reference id="barService" interface="com.foo.BarService" version="1.0.0" /> 新版本服务消费者配置: <dubbo:reference id="barService" interface="com.foo.BarService" version="2.0.0" />
详细情况请去dubbo官网
Comments | NOTHING
Warning: Undefined variable $return_smiles in /www/wwwroot/wql_luoqin_ltd/wp-content/themes/Sakura/functions.php on line 1109