# dubbo-example **Repository Path**: jonathanzyf/dubbo-example ## Basic Information - **Project Name**: dubbo-example - **Description**: No description available - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2019-08-30 - **Last Updated**: 2021-01-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Dubbo 示例工程 ## 介绍 dubbo sample 包含 consumer、provider、api三个部分,api是公用接口和模型数据,provider中是@Java code配置风格的服务提供者;consumer是@Java code风格的服务调用者,主要包含模拟Mock、存根stub、负载均衡loadbalance、容错cluster、超时timeout等内容。 ## 配置 > provider |类型|配置|值|说明| |---|---|---|---| |ApplicationConfig|name|dubbo-demo-provider|| |RegistryConfig|protocol|zookeeper|| |RegistryConfig|address|127.0.0.1:2181|| |ProtocolConfig|name|dubbo|| |ProtocolConfig|port|20880|| |ProviderConfig|timeout|1500|| |ProviderConfig|cluster|failover|failover、failfast、failsafe、failback、forking| |ProviderConfig|mock|未设置|| |ProviderConfig|stub|未设置|| > consumer |类型|配置|值|说明| |---|---|---|---| |ApplicationConfig|name|dubbo-demo-consumer|| |RegistryConfig|protocol|zookeeper|| |RegistryConfig|address|127.0.0.1:2181|| |ConsumerConfig|timeout|1000|| |ConsumerConfig|check|false|| |ConsumerConfig|load balance|roundrobin|random、roundrobin、leastactive| |ConsumerConfig|cluster|failfast|failover、failfast、failsafe、failback、forking| |ConsumerConfig|stub|true|| |ConsumerConfig|mock|true|| |ReferenceConfig|methods|query:timeout:2000|| ## 注册中心Zookeeper 通过zkCli.sh可以查看Zookeeper内节点信息。 1. 当启动dubbo-demo-provider后,通过`ls /dubbo/com.sample.dubbo.demo.api.CustomerService/providers`可以查看服务提供者信息。 ``` [dubbo://10.6.232.113:20880/com.sample.dubbo.demo.api.CustomerService?anyhost=true&application=dubbo-demo-provider&bean.name=ServiceBean:com.sample.dubbo.demo.api.CustomerService&cluster=failover&deprecated=false&dubbo=2.0.2&dynamic=true&generic=false&interface=com.sample.dubbo.demo.api.CustomerService&methods=find,query,save,delete&pid=6187®ister=true&release=2.7.3&side=provider&timeout=1000×tamp=1609417149166] ``` |配置|内容|值| |---|---|---| |协议|dubbo|| |IP|10.6.232.113|| |端口|20880|| |服务|com.sample.dubbo.demo.api.CustomerService|| |应用|application|dubbo-demo-provider| |容错|cluster|failover| |接口|interface|com.sample.dubbo.demo.api.CustomerService| |方法|methods|find,query,save,delete| |进程|pid|6187| |提供/消费|side|provider| |超时|timeout|1000| 2.当启动dubbo-demo-consumer后,通过`ls /dubbo/com.sample.dubbo.demo.api.CustomerService/consumers`可以查看服务消费者信息。 ``` [consumer://10.6.232.113/com.sample.dubbo.demo.api.CustomerService?application=dubbo-demo-consumer&category=consumers&check=false&cluster=failfast&dubbo=2.0.2&interface=com.sample.dubbo.demo.api.CustomerService&lazy=false&loadbalance=roundrobin&methods=find,query,save,delete&mock=true&pid=6266&release=2.7.3&side=consumer&sticky=false&stub=true×tamp=1609417284305] ``` |配置|内容|值| |---|---|---| |协议|consumer|| |IP|10.6.232.113|| |服务|com.sample.dubbo.demo.api.CustomerService|| |应用|application|dubbo-demo-consumer| |类型|category|consumers| |检查提供者|check|false| |容错|cluster|failfast| |延迟连接|lazy|false| |负载均衡|loadbalance|roundrobin| |接口|interface|com.sample.dubbo.demo.api.CustomerService| |方法|methods|find,query,save,delete| |本地伪装|mock|true| |粘滞连接|sticky|false| |本地存根|stub|true| |进程|pid|6266| |提供/消费|side|consumer| ## Mock机制 触发: 1. 当一个可用的下游服务都没有时,触发Mock处理;如果有一个下游服务,但服务总是抛出异常,不会触发Mock处理;下游服务抛出异常,也相当于服务处于可用状态 2. 如果timeout时,触发Mock处理 Mock类: 1. 可以通过setMock方法设置mock类,优先级Consumer设置>Provider设置 2. 如果未设置mock类,但是执行setMock(true),并且与接口相同的包内有 接口名+Mock 结尾的实现类,则此类为mock类。 MockClusterInvoker参考代码: ```java public class MockClusterInvoker implements Invoker { public Result invoke(Invocation invocation) throws RpcException { Result result = null; String value = directory.getUrl().getMethodParameter(invocation.getMethodName(), MOCK_KEY, Boolean.FALSE.toString()).trim(); if (value.length() == 0 || value.equalsIgnoreCase("false")) { //no mock result = this.invoker.invoke(invocation); } else if (value.startsWith("force")) { if (logger.isWarnEnabled()) { logger.warn("force-mock: " + invocation.getMethodName() + " force-mock enabled , url : " + directory.getUrl()); } //force:direct mock result = doMockInvoke(invocation, null); } else { //fail-mock try { result = this.invoker.invoke(invocation); } catch (RpcException e) { if (e.isBiz()) { throw e; } if (logger.isWarnEnabled()) { logger.warn("fail-mock: " + invocation.getMethodName() + " fail-mock enabled , url : " + directory.getUrl(), e); } result = doMockInvoke(invocation, e); } } return result; } } ```