前置条件
package 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 service.GreetingService;
import service.impl.GreetingServiceImpl;
import java.io.IOException;
public class ApiProvider {
public static void main(String[] args) throws IOException {
//1.设置ServiceConfig实例
ServiceConfig<GreetingService> serviceServiceConfig = new ServiceConfig<>();
//2.设置应用程序配置
serviceServiceConfig.setApplication(new ApplicationConfig("first-dubbo-provider"));
//3.设置注册中心
RegistryConfig registryConfig = new RegistryConfig("zookeeper://81.68.187.197:30002");
serviceServiceConfig.setRegistry(registryConfig);
//4.设置接口以及实现类
serviceServiceConfig.setInterface(GreetingService.class);
serviceServiceConfig.setRef(new GreetingServiceImpl());
serviceServiceConfig.setProtocol(new ProtocolConfig("dubbo",-1)); //随机端口,因为idea可以开启并行执行代码
//5.设置分组与版本
serviceServiceConfig.setVersion("1.0.0");
serviceServiceConfig.setGroup("dubbo");
serviceServiceConfig.setTimeout(50000);
//分别有 random, leastactive, consistenthash, roundrobin
serviceServiceConfig.setLoadbalance("random");
//6.设置线程池策略
//HashMap<String, String> parameters = new HashMap<>();
//parameters.put("threadpool","mythreadpool");
//serviceServiceConfig.setParameters(parameters);
// AsyncContext
//7.导出
serviceServiceConfig.export();
System.out.println("success");
System.in.read();
}
}
public class ApiConsumer {
public static void main(String[] args) {
//9.创建服务引用对象实例
ReferenceConfig<GreetingService> referenceConfig = new ReferenceConfig<>();
//10.设置应用程序信息
referenceConfig.setApplication(new ApplicationConfig("first-dubbo-consumer"));
//11.设置服务注册中心
referenceConfig.setRegistry(new RegistryConfig("zookeeper://81.68.187.197:30002"));
//12.设置服务接口和超时时间
referenceConfig.setInterface(GreetingService.class);
referenceConfig.setTimeout(5000);
//13.设置自定义负载均衡策略与集群容错策略
//14.设置版本和分组
referenceConfig.setVersion("1.0.0");
referenceConfig.setGroup("dubbo");
//此处设置负载均衡策略
//15.引用服务
GreetingService greetingService = referenceConfig.get();
//16.设置隐式参数
RpcContext.getContext().setAttachment("company", "liyuan company");
System.out.println(greetingService.sayHello("liyuan"));
}
//注意若仅有一个服务提供者,那就不会调用负载均衡,因此须有多个服务提供者才行
//若消费端以及提供端均设置了负载均衡,以消费端为准;
负载均衡策略 | 效果 | |
---|---|---|
random | 随机 | |
roundrobin | 轮询 | 通过变换提供方权重实现 |
leastactive | 最少活跃数 | 过滤出所有调用次数等于最小调用次数的服务提供者 |
consistenthash | 一致性哈希环 | 寻找环上顺时针第一个最大的值 |
1. 实现LoadBalance策略
package configuration;
import com.alibaba.dubbo.common.URL;
import com.alibaba.dubbo.rpc.Invocation;
import com.alibaba.dubbo.rpc.Invoker;
import com.alibaba.dubbo.rpc.cluster.loadbalance.AbstractLoadBalance;
import java.util.List;
public class MyLoadBalance extends AbstractLoadBalance {
private static int count = 0;
@Override
protected <T> Invoker<T> doSelect(List<Invoker<T>> invokers, URL url, Invocation invocation) {
return invokers.get(count++ % invokers.size());
}
}
2.