上一文的代码 HttpUtils.http(sevName, ctx.path())
(来自 "solon.cloud.httputils" 插件的工具类),内部是通过 sevName 获取对应服务负载均衡,并最终获取服务实例地址。内部接口调用:
//根据服务名获取“负载均衡”
LoadBalance loadBalance = LoadBalance.get(sevName);
//根据分组和服务名获取“负载均衡”
LoadBalance loadBalance = LoadBalance.get(groupName, sevName);
负载均衡是 Rpc 开发和服务集群调用时,必不可少的元素。
内核层面提供了两个接口。插件中 “solon.cloud.httputils”,“nami” 都是使用它们对服务进行调用:
接口 | 说明 |
---|---|
LoadBalance | 负载均衡接口 |
LoadBalance.Factory | 负载均衡工厂接口 |
要获取一个服务的实例地址,只需要使用(在定制开发时,可能用得着):
//开发时要注意不存在服务的可能
LoadBalance loadBalance = LoadBalance.get(sevName);
//输出的结果,例:"http://12.0.1.2.3:8871" 、"ws://120.1.1.2:9871"(协议头://地址:端口)
String server = loadBalance.getServer();
已有的实现方案是:"solon.cloud" 插件的 CloudLoadBalanceFactory。实现是无感知的,且是动态更新了(一般是实时或延时几秒)。引入 Solon Cloud Discovery 相关的组件,即可使用。
还可以根据需要,进行微略调整(一般没啥必要):
@Configuration
public class Config{
@Bean
public CloudLoadStrategy loadStrategy(){
return new CloudLoadStrategyDefault(); //默认为轮询
//return new CloudLoadStrategyIpHash(); //ip希哈
}
}
更多的策略,可以自己定义。比如在 k8s 里直接使用 k8s sev 地址:
//关于策略自定义,v2.2.6 后支持
@Component
public class CloudLoadStrategyImpl impl CloudLoadStrategy{
@Override
public String getServer(Discovery discovery){
//即通过服务名,获取k8s的服务地址
return K8sUtil.getServer(discovery.service());
}
}
//只是示意一下 //具体可以参考 CloudLoadBalanceFactory 实现
@Component
public class LoadBalanceFactoryImpl implements LoadBalance.Factory{
@Override
public LoadBalance create(String group, String service){
if("local".equals(service)){
return LoadBalanceImpl();
}
}
}
//只是示意一下 //具体可以参考 CloudLoadBalance 实现
public class LoadBalanceImpl implements LoadBalance{
@Override
public String getServer(){
return "http://127.0.0.1"
}
}
//找一个 Solon Cloud Discovery 适配插件参考下
public class CloudDiscoveryServiceImpl implements CloudDiscoveryService{
...
}
如果您发现该资源为电子书等存在侵权的资源或对该资源描述不正确等,可点击“私信”按钮向作者进行反馈;如作者无回复可进行平台仲裁,我们会在第一时间进行处理!
添加我为好友,拉您入交流群!
请使用微信扫一扫!