内容简介:gRPC 是google开源的非常优秀的RPC框架,支持PYTHON/JAVA/PHP/GO/C/C++/C#/NODEJS/RUBY 等编程语言,在跨语言调用十分方便。在产品环境,通常要部署多个RPC服务,已提高可用性,以及响应速度。但是 在负载均衡方面不如dubbo的组件那么丰富,但是其提供了服务发现的接口, 可以通过实现其接口,灵活实现负载均衡功能。下面通过本地配置文件,启动时注册可用的服务,可以快速实现负载均衡功能。
gRPC 是google开源的非常优秀的RPC框架,支持PYTHON/JAVA/PHP/GO/C/C++/C#/NODEJS/RUBY 等编程语言,在跨语言调用十分方便。
在产品环境,通常要部署多个RPC服务,已提高可用性,以及响应速度。但是 在负载均衡方面不如dubbo的组件那么丰富,但是其提供了服务发现的接口, 可以通过实现其接口,灵活实现负载均衡功能。
下面通过本地配置文件,启动时注册可用的服务,可以快速实现负载均衡功能。
grpc: hosts: host1:8080,host2:8080 复制代码
GRPC channel 创建
ManagedChannelBuilder
// 设置连接的目标地址
.forTarget("local")
// 设置地址服务
.nameResolverFactory(new LocalNameResolverProvider(configInterface))
.enableRetry()
.maxRetryAttempts(5)
.keepAliveTime(5, TimeUnit.MINUTES)
.keepAliveWithoutCalls(true)
.keepAliveTimeout(10, TimeUnit.MINUTES)
.idleTimeout(24, TimeUnit.HOURS)
// 设置轮询策略
.loadBalancerFactory(RoundRobinLoadBalancerFactory.getInstance())
.usePlaintext()
.build();
复制代码
- forTarget 设置连接RPC服务的地址,比如"127.0.0.1:8080"
- nameResolverFactory 服务发现
- LocalNameResolverProvider 服务提供者
- loadBalancerFactory 设置负载均衡策略
- RoundRobinLoadBalancerFactory 轮询策略
nameResolverFactory 配置方式
-
GRPC client 通过
loadBalancerFactory来设置负载均衡的策略,这里选择RoundRobinLoadBalancerFactory,即服务轮询策略。 -
通过
nameResolverFactory配置地址服务的发现方式,通过NameResolverProvider来实现服务的注册与发现。 -
服务提供者类
// 需要实现NameResolverProvider抽象类中的相关方法
public class LocalNameResolverProvider extends NameResolverProvider {
private final ConfigInterface configInterface;
@Inject
public LocalNameResolverProvider(ConfigInterface configInterface) {
this.configInterface = configInterface;
}
// 服务是否可用
@Override
protected boolean isAvailable() {
return true;
}
// 优先级默认5
@Override
protected int priority() {
return 5;
}
// 服务发现类
@Nullable
@Override
public NameResolver newNameResolver(URI targetUri, Attributes params) {
return new LocalNameResolver(configInterface);
}
// 服务协议
@Override
public String getDefaultScheme() {
return "local";
}
}
复制代码
- 服务发现类
public class LocalNameResolver extends NameResolver {
private final ConfigInterface configInterface;
@Inject
public LocalNameResolver(ConfigInterface configInterface) {
this.configInterface = configInterface;
}
@Override
public String getServiceAuthority() {
return "none";
}
// 配置可用服务,RPC在调用的时候,轮询选择这里配置的可用的服务地址列表
@Override
public void start(Listener listener) {
LogUtils.info("LocalNameResolver start ...");
ArrayList<EquivalentAddressGroup> addressGroups = new ArrayList<EquivalentAddressGroup>();
// 获取rpc地址的配置列表
// 地址格式 host1:8080,host2:8081
Map<String, Object> config = (Map<String, Object>) this.configInterface.getRpcConfig().get("grpc");
String[] hosts = config.get("hosts").toString().split(",");
for (String host : hosts) {
if (host.trim().length() > 0) {
String[] address = host.split(":");
List<SocketAddress> socketAddresses = new ArrayList<SocketAddress>();
socketAddresses.add(new InetSocketAddress(address[0], Integer.parseInt(address[1])));
addressGroups.add(new EquivalentAddressGroup(socketAddresses));
}
}
listener.onAddresses(addressGroups, Attributes.EMPTY);
}
@Override
public void shutdown() {
}
}
复制代码
- 通过以上配置, 在进行RPC调用的时候,会轮询选择注册的服务地址
- 添加新的可用服务节点需要更新配置文件
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Programming in Haskell
Graham Hutton / Cambridge University Press / 2007-1-18 / GBP 34.99
Haskell is one of the leading languages for teaching functional programming, enabling students to write simpler and cleaner code, and to learn how to structure and reason about programs. This introduc......一起来看看 《Programming in Haskell》 这本书的介绍吧!